UNPKG

1.34 MBJavaScriptView Raw
1(function (require, global) {
2require = (function (cache, modules, cx) {
3var loader = function (r) {
4if (!modules[r]) throw new Error(r + ' is not a module');
5return cache[r] ? cache[r].exports : ((cache[r] = {
6exports: {}
7}, cache[r].exports = modules[r].call(cx, require, cache[r], cache[r].exports)));
8};
9loader.modules = modules;
10return loader;
11})({}, {
12"entry.js": function (require, module, exports) {
13var chai, checkChildStructure, creator, elementSuffix, expect, i, j, len, len1, nonElementSuffix, ref, ref1, ref2, ref3, ref4, restartSandbox, sandbox;
14this.dimensions = require("simulate.coffee");
15this.Dom = this.DOM = window.quickdom;
16mocha.setup('tdd');
17mocha.slow(400);
18mocha.timeout(12000);
19if (!window.location.hostname) {
20mocha.bail();
21}
22chai = require("node_modules/chai/index.js");
23chai.use(require("node_modules/chai-style/sources/index.js"));
24chai.config.truncateThreshold = 1e3;
25({expect} = chai);
26sandbox = null;
27restartSandbox = function () {
28if (sandbox) {
29sandbox.parentElement.removeChild(sandbox);
30}
31sandbox = document.createElement('div');
32sandbox.id = 'sandbox';
33sandbox.setAttribute('style', 'border:1px solid; padding:20px; box-sizing:border-box');
34return document.body.appendChild(sandbox);
35};
36checkChildStructure = function (main) {
37return function (...children) {
38var child, i, index, len;
39expect(main.children.length).to.equal(children.length);
40for ((index = i = 0, len = children.length); i < len; index = ++i) {
41child = children[index];
42expect(main.children[index]).to.equal(child);
43expect(child.el.parentNode).to.equal(main.el);
44expect(child.parent).to.equal(main);
45}
46};
47};
48suite("QuickDom", function () {
49setup(restartSandbox);
50test("Version Property", function () {
51var packageVersion;
52packageVersion = "1.0.89";
53return expect(Dom.version).to.equal(packageVersion);
54});
55suite("Element Creation", function () {
56test("Basic Creation", function () {
57var div;
58div = Dom('div');
59expect(typeof div).to.equal('object');
60expect(typeof div.el).to.equal('object');
61expect(div.el).to.be.instanceOf(window.HTMLDivElement);
62expect(div.parent).to.be.undefined;
63return expect(div.children.length).to.equal(0);
64});
65test("Shortcuts", function () {
66var i, len, type, types;
67expect(Dom.a().el.constructor).to.equal(Dom('a').el.constructor);
68expect(Dom.link().el.constructor).to.equal(Dom('a').el.constructor);
69expect(Dom.anchor().el.constructor).to.equal(Dom('a').el.constructor);
70expect(Dom.div().el.constructor).to.equal(Dom('div').el.constructor);
71expect(Dom.text().el.constructor).to.equal(Dom('text').el.constructor);
72expect(Dom.span().el.constructor).to.equal(Dom('span').el.constructor);
73expect(Dom.h4().el.constructor).to.equal(Dom('h4').el.constructor);
74expect(Dom.header().el.constructor).to.equal(Dom('header').el.constructor);
75expect(Dom.footer().el.constructor).to.equal(Dom('footer').el.constructor);
76expect(Dom.section().el.constructor).to.equal(Dom('section').el.constructor);
77expect(Dom.button().el.constructor).to.equal(Dom('button').el.constructor);
78expect(Dom.input().el.constructor).to.equal(Dom('input').el.constructor);
79types = ['a', 'div', 'text', 'span', 'h4', 'header', 'footer', 'section', 'button', 'input'];
80for ((i = 0, len = types.length); i < len; i++) {
81type = types[i];
82expect(Dom[type]().el.constructor.name).not.to.contain('Unknown');
83}
84});
85test("Basic options", function () {
86var A, B, C, D, E, F, G, H, I, J, obj;
87A = Dom.div({
88class: 'abc-123',
89props: {
90'abc': 123,
91'def': 456
92}
93});
94B = Dom.div({
95id: 'B',
96className: 'abc-123',
97attrs: {
98'data-abc': 123,
99'data-def': 456
100}
101});
102C = Dom.input({
103type: 'text',
104name: 'abc',
105value: 'hello'
106});
107D = Dom.input({
108type: 'checkbox',
109checked: true
110});
111E = Dom.option({
112name: 'abc',
113value: 'hello',
114selected: true
115});
116F = Dom.link({
117href: 'https://google.com/'
118});
119G = Dom.anchor({
120url: 'https://google.com/'
121});
122H = Dom.text('Some text');
123I = Dom.img({
124src: 'https://google.com/'
125});
126J = Dom.div({
127relatedInstance: obj = {
128a: 1
129}
130});
131expect(A.el.className).to.equal('abc-123');
132expect(A.el.abc).to.equal(123);
133expect(A.el.def).to.equal(456);
134expect(B.el.className).to.equal('abc-123');
135expect(B.el.id).to.equal('B');
136expect(B.el.getAttribute('data-abc')).to.equal('123');
137expect(B.el.getAttribute('data-def')).to.equal('456');
138if (B.el.dataset) {
139expect(B.el.dataset.abc).to.equal('123');
140}
141expect(C.el.type).to.equal('text');
142expect(C.el.name).to.equal('abc');
143expect(C.el.value).to.equal('hello');
144expect(D.el.checked).to.equal(true);
145expect(E.el.name).to.equal('abc');
146expect(E.el.selected).to.equal(true);
147expect(F.el.href).to.equal('https://google.com/');
148expect(G.el.href).to.equal('https://google.com/');
149expect(H.el.nodeType).to.equal(3);
150expect(H.el.textContent).to.equal('Some text');
151expect(I.el.src).to.equal('https://google.com/');
152expect(J.related).to.equal(obj);
153return expect(J.options.related).to.equal(obj);
154});
155test("Creation w/ children", function () {
156var A, B;
157A = Dom.div(null, 'Some text');
158B = Dom.div(null, Dom.span(), 'Some text', Dom.span());
159expect(A.el.childNodes.length).to.equal(1);
160expect(A.el.children.length).to.equal(0);
161expect(A.el.childNodes[0].nodeType).to.equal(3);
162expect(A.el.childNodes[0].textContent).to.equal('Some text');
163expect(A.children.length).to.equal(1);
164expect(B.el.childNodes.length).to.equal(3);
165expect(B.el.children.length).to.equal(2);
166expect(B.el.childNodes[0].nodeType).to.equal(1);
167expect(B.el.childNodes[0].nodeName.toLowerCase()).to.equal('span');
168expect(B.el.childNodes[1].nodeType).to.equal(3);
169expect(B.el.childNodes[1].textContent).to.equal('Some text');
170expect(B.el.childNodes[2].nodeType).to.equal(1);
171expect(B.el.childNodes[2].nodeName.toLowerCase()).to.equal('span');
172return expect(B.children.length).to.equal(3);
173});
174test("Array syntax", function () {
175var section;
176section = Dom(['section', {
177style: {
178display: 'inline'
179}
180}, ['div', null, 'childA'], ['span', null, ['strong', null, 'childB']], ['div', null, 'childC', ['span', null, 'childC_1'], ['span', null, 'childC_2']]]).appendTo(sandbox);
181expect(section).not.to.equal(void 0);
182expect(section.raw).to.have.style('display', 'inline');
183expect(section.children.length).to.equal(3);
184expect(section.children[0].children.length).to.equal(1);
185expect(section.children[1].children.length).to.equal(1);
186expect(section.children[2].children.length).to.equal(3);
187expect(section.children[2].children[1].children.length).to.equal(1);
188expect(section.children[2].children[2].children.length).to.equal(1);
189expect(section.children[0].text).to.equal('childA');
190expect(section.children[1].text).to.equal('childB');
191expect(section.children[2].text).to.equal('childCchildC_1childC_2');
192expect(section.children[2].children[1].text).to.equal('childC_1');
193return expect(section.children[2].children[2].text).to.equal('childC_2');
194});
195test("Existing Element", function () {
196var A, B, C, divRaw;
197divRaw = document.createElement('div');
198A = Dom(divRaw);
199B = Dom(divRaw);
200C = Dom(A);
201expect(A.el).to.equal(divRaw);
202expect(B.el).to.equal(divRaw);
203expect(C.el).to.equal(divRaw);
204expect(A).to.equal(B);
205expect(B).to.equal(C);
206return expect(C).to.equal(divRaw._quickElement);
207});
208test("Existing Element w/ Options", function () {
209var div, divRaw;
210divRaw = document.createElement('div');
211divRaw.id = 'A';
212div = Dom(divRaw, {
213id: 'B',
214class: 'abc-123'
215});
216expect(divRaw.id).to.equal('B');
217expect(divRaw.className).to.equal('abc-123');
218div = Dom(div, {
219id: 'C',
220class: 'def-456'
221});
222expect(divRaw.id).to.equal('C');
223return expect(divRaw.className).to.equal('def-456');
224});
225test("Existing Element from array-like objects", function () {
226var A, B, C, parent, rawA, rawB, rawC;
227rawA = document.createElement('div');
228rawB = document.createElement('div');
229rawC = document.createElement('div');
230parent = document.createElement('section');
231parent.appendChild(rawA);
232parent.appendChild(rawB);
233parent.appendChild(rawC);
234A = Dom([rawA, rawB, rawC]);
235B = Dom(parent.querySelectorAll('div'));
236C = Dom(B);
237expect(A.el).to.equal(rawA);
238expect(B.el).to.equal(rawA);
239expect(C.el).to.equal(rawA);
240expect(A).to.equal(B);
241expect(B).to.equal(C);
242return expect(C).to.equal(rawA._quickElement);
243});
244test("Document node", function () {
245var doc;
246doc = Dom(document);
247expect(doc).not.to.be.undefined;
248expect(doc.raw).to.equal(document);
249expect(doc.parent).to.equal(void 0);
250expect(doc.children.length).to.equal(1);
251expect(Dom(sandbox).parents).not.to.contain(doc);
252return expect(Dom(sandbox).parents).to.contain(doc.children[0]);
253});
254test("Window object", function () {
255var win;
256win = Dom(window);
257expect(win).not.to.be.undefined;
258expect(win.raw === window).to.be.true;
259expect(win.parent).to.equal(void 0);
260expect(win.children).to.equal(void 0);
261expect(win.append).to.equal(void 0);
262expect(win.html).to.equal(void 0);
263expect(win.style).to.equal(void 0);
264return expect(Dom(sandbox).parents).not.to.contain(win);
265});
266test("Creation w/ styling", function () {
267var computedStyle, div;
268div = Dom.div({
269style: {
270'width': '10px',
271'height': 15,
272'lameo': '19px',
273'background-color': 'blue',
274'backgroundSize': 'cover'
275}
276});
277sandbox.appendChild(div.el);
278computedStyle = getComputedStyle(div.el);
279expect(div.style.lameo).to.equal(void 0);
280expect(computedStyle.lameo).to.equal(void 0);
281expect(computedStyle.width).to.equal('10px');
282expect(computedStyle.height).to.equal('15px');
283expect(computedStyle.backgroundColor).not.to.equal('');
284return expect(computedStyle.backgroundSize).to.equal('cover');
285});
286test("SVG elements can be created via a '*' in the element's type string", function () {
287var regDiv, svgBad, svgDiv, svgGood, svgPolyBad, svgPolyGood;
288svgBad = Dom('svg').el;
289svgGood = Dom('*svg').el;
290svgPolyBad = Dom('polyline').el;
291svgPolyGood = Dom('*polyline').el;
292svgDiv = Dom('*div').el;
293regDiv = Dom('div').el;
294expect(svgBad).to.be.instanceOf(HTMLUnknownElement);
295expect(svgPolyBad).to.be.instanceOf(HTMLUnknownElement);
296expect(svgGood).to.be.instanceOf(SVGSVGElement);
297expect(svgPolyGood).to.be.instanceOf(SVGPolylineElement);
298return expect(svgDiv.constructor).not.to.equal(regDiv.constructor);
299});
300test("QuickDom.html() accepts an html string which would be parsed and converted into a QuickBatch instance", function () {
301var htmlString;
302htmlString = "<div>firstChildText</div><span>secondChildText</span> textNode <strong>abc123</strong>";
303window.batch = Dom.html(htmlString);
304expect(typeof batch).to.equal('object');
305expect(batch.constructor.name).to.equal('QuickBatch');
306expect(batch.elements.length).to.equal(4);
307expect(batch.elements[0].type).to.equal('div');
308expect(batch.elements[1].type).to.equal('span');
309expect(batch.elements[2].type).to.equal('text');
310expect(batch.elements[3].type).to.equal('strong');
311expect(batch.elements[0].text).to.equal('firstChildText');
312expect(batch.elements[1].text).to.equal('secondChildText');
313expect(batch.elements[2].text).to.include('textNode');
314return expect(batch.elements[3].text).to.equal('abc123');
315});
316test("Method/Property aliases", function () {
317var div;
318div = Dom('div');
319expect(div.raw).to.equal(div.el);
320expect(div[0]).to.equal(div.el);
321expect(div.css).to.equal(div.style);
322expect(div.replaceWith).to.equal(div.replace);
323expect(div.removeListener).to.equal(div.off);
324return expect(div.removeListener('eventA'));
325});
326return test("user-defined methdods/getters/setters", function () {
327var divA, divB;
328divA = Dom.div();
329divB = Dom.div({
330methods: {
331scrollTop: {
332get: function () {
333return this.raw.scrollTop;
334}
335},
336weight: {
337get: function () {
338return this.raw.weight;
339}
340},
341value: {
342get: function () {
343return this.raw.value;
344},
345set: function (value) {
346return this.raw.value = value;
347}
348},
349name: true,
350bigIndex: function () {
351return this.index * 10;
352}
353}
354});
355sandbox.append(divA);
356sandbox.append(divB);
357divA.raw.value = divB.raw.value = 'abc';
358expect(typeof divA.scrollTop).to.equal('undefined');
359expect(typeof divB.scrollTop).to.equal('number');
360expect(typeof divA.value).to.equal('undefined');
361expect(typeof divB.value).to.equal('string');
362expect(typeof divA.name).to.equal('undefined');
363expect(typeof divB.name).to.equal('undefined');
364expect(typeof divA.bigIndex).to.equal('undefined');
365expect(typeof divB.bigIndex).to.equal('function');
366expect(divB.scrollTop).to.equal(divB.raw.scrollTop);
367divB.raw.weight = '1';
368expect(divB.weight).to.equal('1');
369divB.weight = '2';
370expect(divB.weight).to.equal('1');
371expect(divB.value).to.equal('abc');
372divB.value = '123';
373expect(divB.value).to.equal('123');
374return expect(divB.bigIndex()).to.equal(divB.index * 10);
375});
376});
377suite("Events", function () {
378test("Events can be listened to via the .on method", function () {
379var div, emitCountA, emitCountB;
380emitCountA = emitCountB = 0;
381div = Dom.div();
382div.on('myClick', function (event) {
383expect(typeof event).to.equal('object');
384expect(event.type).to.equal('myClick');
385return emitCountA++;
386});
387div.el.emitEvent('myClick');
388expect(emitCountA).to.equal(1);
389div.el.emitEvent('myClick');
390expect(emitCountA).to.equal(2);
391div.on('myClick', function (event) {
392return emitCountB++;
393});
394div.el.emitEvent('myClick');
395expect(emitCountB).to.equal(1);
396expect(emitCountA).to.equal(3);
397div.el.emitEvent('myClick');
398expect(emitCountB).to.equal(2);
399return expect(emitCountA).to.equal(4);
400});
401test("Events can be emitted via the .emit method", function () {
402var div, emitCountA, emitCountB;
403emitCountA = emitCountB = 0;
404div = Dom.div();
405div.on('myEvent', function () {
406return emitCountA++;
407});
408div.el.addEventListener('myEvent', function () {
409return emitCountB++;
410});
411expect(emitCountA).to.equal(0);
412expect(emitCountB).to.equal(0);
413div.emit('myEvent');
414expect(emitCountA).to.equal(1);
415expect(emitCountB).to.equal(1);
416div.el.emitEvent('myEvent');
417expect(emitCountA).to.equal(2);
418return expect(emitCountB).to.equal(2);
419});
420test("Event handlers can be manually invoked with a custom arg via the .emitPrivate method", function () {
421var arg, div, emitCountA, emitCountB;
422emitCountA = emitCountB = 0;
423arg = null;
424div = Dom.div();
425div.on('myEvent', function () {
426emitCountA++;
427return arg = arguments[0];
428});
429div.el.addEventListener('myEvent', function () {
430return emitCountB++;
431});
432expect(emitCountA).to.equal(0);
433expect(emitCountB).to.equal(0);
434expect(arg).to.equal(null);
435div.emitPrivate('myEvent');
436expect(emitCountA).to.equal(1);
437expect(emitCountB).to.equal(0);
438expect(arg).to.equal(void 0);
439div.emitPrivate('myEvent', 'abc123');
440expect(emitCountA).to.equal(2);
441expect(emitCountB).to.equal(0);
442expect(arg).to.equal('abc123');
443div.el.emitEvent('myEvent');
444expect(emitCountA).to.equal(3);
445expect(emitCountB).to.equal(1);
446expect(arg).not.to.equal('abc123');
447return expect(typeof arg).to.equal('object');
448});
449test("Booleans can be passed for the 2nd and 3rd args of .emit to control event.bubbles and event.cancelable", function () {
450var div, emitCountA, emitCountB, emitCountC;
451emitCountA = emitCountB = emitCountC = 0;
452div = Dom.div();
453div.on('eventA', function (event) {
454emitCountA++;
455expect(event.bubbles).to.be.true;
456return expect(event.cancelable).to.be.true;
457});
458div.on('eventB', function (event) {
459emitCountB++;
460expect(event.bubbles).to.be.false;
461return expect(event.cancelable).to.be.true;
462});
463div.on('eventC', function (event) {
464emitCountC++;
465expect(event.bubbles).to.be.false;
466return expect(event.cancelable).to.be.false;
467});
468div.emit('eventA');
469div.emit('eventB', false);
470div.emit('eventC', false, false);
471expect(emitCountA).to.equal(1);
472expect(emitCountB).to.equal(1);
473return expect(emitCountC).to.equal(1);
474});
475test("A data object can be passed as the 4th arg of .emit which will be extended onto the event object", function () {
476var div, event;
477div = DOM.div();
478event = null;
479div.on('mousedown', function (e) {
480return event = e;
481});
482expect(event).to.equal(null);
483div.emit('mousedown');
484expect(event.type).to.equal('mousedown');
485expect(event.custom).to.equal(void 0);
486div.emit('mousedown', null, null, {
487custom: 'custom',
488abc: 123
489});
490expect(event.type).to.equal('mousedown');
491expect(event.custom).to.equal('custom');
492expect(event.abc).to.equal(123);
493div.emit('mousedown', null, null, true);
494expect(event.type).to.equal('mousedown');
495return expect(event.custom).to.equal(void 0);
496});
497test("Event listeners can be removed via the .off method", function () {
498var div, emitCountA, emitCountB, emitCountC, emitCountD, eventCB;
499emitCountA = emitCountB = emitCountC = emitCountD = 0;
500div = Dom.div();
501div.on('myEvent', function () {
502return emitCountA++;
503});
504div.on('myEvent', eventCB = function () {
505return emitCountB++;
506});
507div.on('anotherEvent', function () {
508return emitCountC++;
509});
510div.el.addEventListener('myEvent', function () {
511return emitCountD++;
512});
513expect(emitCountA).to.equal(0);
514expect(emitCountB).to.equal(0);
515expect(emitCountC).to.equal(0);
516expect(emitCountD).to.equal(0);
517div.emit('myEvent');
518div.emit('anotherEvent');
519expect(emitCountA).to.equal(1);
520expect(emitCountB).to.equal(1);
521expect(emitCountC).to.equal(1);
522expect(emitCountD).to.equal(1);
523div.off('myEvent', eventCB);
524div.emit('myEvent');
525div.emit('anotherEvent');
526expect(emitCountA).to.equal(2);
527expect(emitCountB).to.equal(1);
528expect(emitCountC).to.equal(2);
529expect(emitCountD).to.equal(2);
530div.on('myEvent', function () {
531return emitCountB++;
532});
533div.off('myEvent');
534div.emit('myEvent');
535div.emit('anotherEvent');
536expect(emitCountA).to.equal(2);
537expect(emitCountB).to.equal(1);
538expect(emitCountC).to.equal(3);
539expect(emitCountD).to.equal(3);
540div.on('myEvent', function () {
541return emitCountA++;
542});
543div.on('myEvent', function () {
544return emitCountB++;
545});
546div.off();
547div.emit('myEvent');
548div.emit('anotherEvent');
549expect(emitCountA).to.equal(2);
550expect(emitCountB).to.equal(1);
551expect(emitCountC).to.equal(3);
552return expect(emitCountD).to.equal(4);
553});
554test("Events can be named via a '<event>.<name>' syntax which can be used to remove listeners later on without the original callbacks", function () {
555var attachListeners, div, emitCountA, emitCountB;
556emitCountA = emitCountB = 0;
557div = Dom.div().appendTo(sandbox);
558attachListeners = function () {
559div.on('myEvent.someName', function () {
560return emitCountA++;
561});
562return div.on('myEvent', function () {
563return emitCountB++;
564});
565};
566attachListeners();
567expect(emitCountA).to.equal(0);
568expect(emitCountB).to.equal(0);
569div.emit('myEvent');
570expect(emitCountA).to.equal(1);
571expect(emitCountB).to.equal(1);
572div.emit('myEvent.someName');
573expect(emitCountA).to.equal(1);
574expect(emitCountB).to.equal(1);
575div.off('myEvent.someOtherName');
576div.emit('myEvent');
577expect(emitCountA).to.equal(2);
578expect(emitCountB).to.equal(2);
579div.off('myEvent.someName');
580div.emit('myEvent');
581expect(emitCountA).to.equal(2);
582expect(emitCountB).to.equal(3);
583div.off('myEvent');
584attachListeners();
585div.emit('myEvent');
586expect(emitCountA).to.equal(3);
587expect(emitCountB).to.equal(4);
588div.off('myEvent');
589div.emit('myEvent');
590expect(emitCountA).to.equal(3);
591return expect(emitCountB).to.equal(4);
592});
593test("Multiple events can be registered/deregistered at once using whitespace separators", function () {
594var div, emitCount;
595emitCount = 0;
596div = Dom.div();
597div.on('one two three', function () {
598return emitCount++;
599});
600expect(emitCount).to.equal(0);
601div.emit('one');
602expect(emitCount).to.equal(1);
603div.emit('two');
604expect(emitCount).to.equal(2);
605div.emit('three');
606expect(emitCount).to.equal(3);
607div.off('one three');
608div.emit('one');
609expect(emitCount).to.equal(3);
610div.emit('two');
611expect(emitCount).to.equal(4);
612div.emit('three');
613expect(emitCount).to.equal(4);
614div.off();
615div.emit('one');
616div.emit('two');
617div.emit('three');
618div.on('one two three.someName', function () {
619return emitCount++;
620});
621div.on('one two three', function () {
622return emitCount++;
623});
624expect(emitCount).to.equal(4);
625div.emit('one');
626expect(emitCount).to.equal(6);
627div.emit('two');
628expect(emitCount).to.equal(8);
629div.emit('three');
630expect(emitCount).to.equal(10);
631div.off('two \tone.someName');
632div.emit('one');
633expect(emitCount).to.equal(11);
634div.emit('two');
635expect(emitCount).to.equal(12);
636div.emit('three');
637expect(emitCount).to.equal(14);
638div.off('one three');
639div.emit('one');
640expect(emitCount).to.equal(14);
641div.emit('two');
642expect(emitCount).to.equal(15);
643div.emit('three');
644return expect(emitCount).to.equal(15);
645});
646test("Events can be listened for once via the .once method", function () {
647var div, emitCountA, emitCountB;
648emitCountA = emitCountB = 0;
649div = Dom.div();
650div.once('myClick', function (event) {
651expect(typeof event).to.equal('object');
652return expect(event.type).to.equal('myClick');
653});
654div.on('myClick', function () {
655return emitCountA++;
656});
657div.once('myClick', function () {
658return emitCountB++;
659});
660expect(emitCountA).to.equal(0);
661expect(emitCountB).to.equal(0);
662div.el.emitEvent('myClick');
663expect(emitCountA).to.equal(1);
664expect(emitCountB).to.equal(1);
665div.el.emitEvent('myClick');
666expect(emitCountA).to.equal(2);
667expect(emitCountB).to.equal(1);
668div.once('myClick', function (event) {
669return emitCountB++;
670});
671div.el.emitEvent('myClick');
672expect(emitCountA).to.equal(3);
673expect(emitCountB).to.equal(2);
674div.el.emitEvent('myClick');
675expect(emitCountA).to.equal(4);
676return expect(emitCountB).to.equal(2);
677});
678test("Pre-defined event listeners can be passed in options.events", function () {
679var div, divB, emitContext, emitCount, listeners;
680emitCount = 0;
681emitContext = null;
682listeners = {
683'one two three': function () {
684return emitCount++;
685},
686'four': function () {
687return emitCount++;
688},
689'five': function () {
690return emitContext = this;
691}
692};
693div = Dom.div({
694events: listeners
695});
696expect(emitCount).to.equal(0);
697div.emit('one');
698expect(emitCount).to.equal(1);
699div.emit('two');
700expect(emitCount).to.equal(2);
701div.emit('three');
702expect(emitCount).to.equal(3);
703div.emit('four');
704expect(emitCount).to.equal(4);
705div.off('one three');
706div.emit('one');
707expect(emitCount).to.equal(4);
708div.emit('two');
709expect(emitCount).to.equal(5);
710div.emit('three');
711expect(emitCount).to.equal(5);
712div.emit('five');
713expect(emitContext).to.equal(div);
714div.off();
715div.emit('one');
716div.emit('two');
717div.emit('three');
718div.emit('four');
719expect(emitCount).to.equal(5);
720divB = Dom.div({
721events: listeners
722});
723divB.emit('one');
724divB.emit('three');
725expect(emitCount).to.equal(7);
726expect(emitContext).to.equal(div);
727divB.emit('five');
728return expect(emitContext).to.equal(divB);
729});
730test("the inserted event will be privately emitted when the element is inserted into the DOM", function () {
731var div, invokeCount, masterParentB, parentA, parentB, parentC;
732invokeCount = 0;
733parentA = Dom.section();
734parentB = Dom.section();
735masterParentB = Dom.div();
736parentC = Dom.section().appendTo(sandbox);
737div = Dom.div();
738div.on('inserted', function (el) {
739expect(this).to.equal(div);
740expect(el).to.equal(div.parent);
741return expect(invokeCount++).to.equal(0);
742});
743expect(invokeCount).to.equal(0);
744div.appendTo(parentA);
745expect(invokeCount).to.equal(0);
746div.appendTo(parentB.appendTo(masterParentB));
747expect(invokeCount).to.equal(0);
748parentA.appendTo(sandbox);
749expect(invokeCount).to.equal(0);
750div.appendTo(parentC);
751expect(invokeCount).to.equal(1);
752div.detach();
753div.appendTo(parentB.appendTo(sandbox));
754expect(invokeCount).to.equal(1);
755expect(div.parent).to.equal(parentB);
756div.on('inserted', function () {
757return expect(invokeCount++).to.equal(1);
758});
759expect(invokeCount).to.equal(2);
760expect(div.parent).to.equal(parentB);
761div.appendTo(parentC);
762expect(invokeCount).to.equal(2);
763expect(div.parent).to.equal(parentC);
764div.detach();
765div.appendTo(parentA);
766div.on('inserted', function () {
767return invokeCount++;
768});
769expect(invokeCount).to.equal(3);
770div.detach();
771div.appendTo(parentB);
772return expect(invokeCount).to.equal(3);
773});
774return test("QuickElement.replace will trigger the inserted event", function () {
775var A, B, invokeCount, parent;
776invokeCount = 0;
777parent = Dom.section().appendTo(sandbox);
778A = Dom.div();
779B = Dom.div();
780B.on('inserted', function (el) {
781expect(this).to.equal(B);
782expect(el).to.equal(B.parent);
783return expect(invokeCount++).to.equal(0);
784});
785expect(invokeCount).to.equal(0);
786expect(A.parent).to.equal(void 0);
787expect(B.parent).to.equal(void 0);
788parent.append(A);
789expect(invokeCount).to.equal(0);
790expect(A.parent).to.equal(parent);
791expect(B.parent).to.equal(void 0);
792A.replace(B);
793expect(invokeCount).to.equal(1);
794expect(A.parent).to.equal(void 0);
795return expect(B.parent).to.equal(parent);
796});
797});
798suite("Style", function () {
799test("Styles can be set via the .style/.css method with args pair of [property, value]", function () {
800var computedStyle, div;
801div = Dom.div({
802style: {
803width: '15px'
804}
805}).appendTo(sandbox);
806computedStyle = getComputedStyle(div.el);
807expect(computedStyle.width).to.equal('15px');
808div.style('width', '25px');
809expect(div.el.style.width).to.equal('25px');
810expect(computedStyle.width).to.equal('25px');
811div.style('width', '5vh');
812expect(div.el.style.width).to.equal('5vh');
813return expect(computedStyle.width).to.contain('px');
814});
815test("Multiple Styles can be set via the .style/.css method by passing a style object", function () {
816var computedStyle, div;
817div = Dom.div({
818style: {
819width: '15px'
820}
821}).appendTo(sandbox);
822computedStyle = getComputedStyle(div.el);
823expect(computedStyle.width).to.equal('15px');
824expect(computedStyle.height).to.equal('0px');
825div.style({
826width: 25,
827height: '33'
828});
829expect(computedStyle.width).to.equal('25px');
830return expect(computedStyle.height).to.equal('33px');
831});
832test("Styles defined in the options object will be applied via classNames and not inline style", function () {
833var divA, divB;
834divA = Dom.div({
835style: {
836width: 15,
837height: 30
838}
839}).appendTo(sandbox);
840divB = Dom.div().appendTo(sandbox).style({
841width: 15,
842height: 30
843});
844expect(divA.raw).to.have.style('width', '15px');
845expect(divB.raw).to.have.style('width', '15px');
846expect(divA.raw).to.have.style('height', '30px');
847expect(divB.raw).to.have.style('height', '30px');
848expect(divA.raw.style.width).to.equal('');
849expect(divB.raw.style.width).to.equal('15px');
850expect(divA.raw.style.height).to.equal('');
851return expect(divB.raw.style.height).to.equal('30px');
852});
853test("If passed a property name without a value, the computed value for that property will be returned", function () {
854var computedStyle, div;
855div = Dom.div({
856style: {
857width: '15px'
858}
859}).appendTo(sandbox);
860computedStyle = getComputedStyle(div.el);
861expect(div.style('width')).to.equal('15px');
862expect(div.style('height')).to.equal('0px');
863div.style({
864width: null,
865height: 55
866});
867expect(div.style('width')).to.equal(computedStyle.width);
868expect(div.style('height')).to.equal('55px');
869div.style('width', '19vw');
870return expect(div.style('width')).to.contain('px');
871});
872test("Functions can be passed as values for properties in style objects which will be invoked with the element's options.relatedInstance as the only argument", function () {
873var anotherObj, applyWidth, div;
874div = Dom.div({
875rate: 25
876}).appendTo(sandbox);
877applyWidth = function (expectedInstance) {
878return div.style({
879width: function (instance) {
880expect(typeof instance).to.equal('object');
881expect(instance).to.equal(expectedInstance);
882return div.options.rate;
883}
884});
885};
886applyWidth(div);
887expect(div.options.rate).to.equal(25);
888expect(div.style('width')).to.equal('25px');
889div.options.rate = 250;
890div.related = anotherObj = {};
891applyWidth(anotherObj);
892expect(div.style('width')).to.equal('250px');
893div = Dom.div({
894style: {
895width: 30,
896height: (function () {
897return 50;
898}),
899fontSize: (function () {
900return 20;
901})
902}
903}).appendTo(sandbox);
904expect(div.raw).to.have.style('width', '30px');
905expect(div.raw).to.have.style('height', '50px');
906return expect(div.raw).to.have.style('fontSize', '20px');
907});
908test("A null value can be passed for a property in order to delete that style", function () {
909var div;
910div = Dom.div({
911style: {
912width: '15px',
913fontSize: function () {
914return 30;
915}
916}
917}).appendTo(sandbox);
918div.style('height', 20);
919expect(div.el).to.have.style('width', '15px');
920expect(div.el).to.have.style('height', '20px');
921expect(div.el.style.width).to.equal('');
922expect(div.el.style.height).to.equal('20px');
923div.style({
924width: null,
925height: 12
926});
927expect(div.el).not.to.have.style('width', '15px');
928expect(div.el).to.have.style('height', '12px');
929expect(['unset', 'inherit', 'initial'].some(function (s) {
930return s === div.el.style.width;
931})).to.be.true;
932expect(div.el.style.height).to.equal('12px');
933div.css('height', null);
934expect(div.el.style.height).to.equal('');
935expect(div.el.style.width).not.to.equal('');
936div.el.style.width = null;
937expect(div.el.style.width).to.equal('');
938expect(div.el).to.have.style('width', '15px');
939div.css('width', null);
940expect(div.el.style.width).not.to.equal('');
941expect(div.el).not.to.have.style('width', '15px');
942div.style('height', function () {
943return 30;
944});
945expect(div.el.style.height).to.equal('30px');
946div.style('height', function () {
947return null;
948});
949expect(div.el.style.height).to.equal('');
950expect(div.el.style.fontSize).to.equal('30px');
951div.style('fontSize', null);
952return expect(div.el.style.fontSize).to.equal('');
953});
954test(".styleSafe() can be used to obtain the value for a given property even for non-inserted elements or elements with options.styleAfterInsert", function () {
955var divA, divB, heightA, heightB, prop, style, text;
956style = {
957width: '8px',
958height: '9px',
959zIndex: function (field) {
960return field.options.theIndex;
961},
962$happy: {
963width: '18px',
964zIndex: function (field) {
965return field.options.theIndex * 2;
966}
967},
968$relaxed: {
969height: '100%'
970}
971};
972divA = Dom.div({
973style,
974theIndex: '12'
975});
976divB = Dom.div({
977style,
978theIndex: '29',
979styleAfterInsert: true
980});
981divA.style({
982fontSize: 10,
983position: 'relative'
984});
985divB.style({
986fontSize: 10,
987position: 'relative'
988});
989prop = function (el, target) {
990return {
991computed: el.style(target),
992inline: el.raw.style[target],
993safe: '' + el.styleSafe(target)
994};
995};
996expect(prop(divA, 'fontSize')).to.eql({
997computed: '',
998inline: '10px',
999safe: '10px'
1000});
1001expect(prop(divB, 'fontSize')).to.eql({
1002computed: '',
1003inline: '10px',
1004safe: '10px'
1005});
1006expect(prop(divA, 'width')).to.eql({
1007computed: '',
1008inline: '',
1009safe: '8px'
1010});
1011expect(prop(divB, 'width')).to.eql({
1012computed: '',
1013inline: '',
1014safe: '8px'
1015});
1016expect(prop(divA, 'height')).to.eql({
1017computed: '',
1018inline: '',
1019safe: '9px'
1020});
1021expect(prop(divB, 'height')).to.eql({
1022computed: '',
1023inline: '',
1024safe: '9px'
1025});
1026expect(prop(divA, 'zIndex')).to.eql({
1027computed: '',
1028inline: '12',
1029safe: '12'
1030});
1031expect(prop(divB, 'zIndex')).to.eql({
1032computed: '',
1033inline: '',
1034safe: '29'
1035});
1036divA.state('happy', true);
1037divB.state('happy', true);
1038expect(prop(divA, 'width')).to.eql({
1039computed: '',
1040inline: '',
1041safe: '18px'
1042});
1043expect(prop(divB, 'width')).to.eql({
1044computed: '',
1045inline: '',
1046safe: '18px'
1047});
1048expect(prop(divA, 'zIndex')).to.eql({
1049computed: '',
1050inline: '24',
1051safe: '24'
1052});
1053expect(prop(divB, 'zIndex')).to.eql({
1054computed: '',
1055inline: '',
1056safe: '58'
1057});
1058divA.state('relaxed', true);
1059divB.state('relaxed', true);
1060expect(prop(divA, 'height')).to.eql({
1061computed: '',
1062inline: '',
1063safe: '100%'
1064});
1065expect(prop(divB, 'height')).to.eql({
1066computed: '',
1067inline: '',
1068safe: '100%'
1069});
1070divA.appendTo(sandbox);
1071divB.appendTo(sandbox);
1072heightA = getComputedStyle(divA.raw).height;
1073heightB = getComputedStyle(divB.raw).height;
1074expect(prop(divA, 'zIndex')).to.eql({
1075computed: '24',
1076inline: '24',
1077safe: '24'
1078});
1079expect(prop(divB, 'zIndex')).to.eql({
1080computed: '58',
1081inline: '58',
1082safe: '58'
1083});
1084expect(prop(divA, 'height')).to.eql({
1085computed: heightA,
1086inline: '',
1087safe: heightA
1088});
1089expect(prop(divB, 'height')).to.eql({
1090computed: heightB,
1091inline: '',
1092safe: heightB
1093});
1094expect(divA.styleSafe('height')).to.equal(heightA);
1095expect(divA.styleSafe('height', true)).to.equal('100%');
1096expect(divB.styleSafe('height')).to.equal(heightB);
1097expect(divB.styleSafe('height', true)).to.equal('100%');
1098divB.appendTo(sandbox);
1099expect(divB.style('height')).not.to.equal('');
1100expect(divB.style('height')).not.to.equal('100%');
1101expect(divB.style('height')).to.contain('px');
1102expect(divB.styleSafe('height')).to.equal(divB.style('height'));
1103expect(divB.styleSafe('height', true)).not.to.equal(divB.style('height'));
1104expect(divB.styleSafe('height', true)).to.equal('100%');
1105expect(divB.styleSafe('margin', true)).to.equal('');
1106expect(divB.style('width')).to.equal('18px');
1107expect(divA.styleSafe('fakeProp')).to.equal(divA);
1108expect(divA.styleSafe(123)).to.equal(divA);
1109text = Dom.text('abc123').appendTo(divA);
1110expect(text.styleSafe('fakeProp')).to.equal(void 0);
1111return expect(text.styleSafe(123)).to.equal(void 0);
1112});
1113test(".styleSafe() will work with instances with no given base styles", function () {
1114var divA, divB;
1115divA = Dom.div();
1116divB = Dom(document.createElement('div'));
1117expect(function () {
1118divA.styleSafe('height');
1119return divB.styleSafe('height');
1120}).not.to.throw();
1121expect(divA.styleSafe('height')).to.equal('');
1122return expect(divB.styleSafe('height')).to.equal('');
1123});
1124test(".styleParsed() is a shorthand for parseFloat(.styleSafe())", function () {
1125var divA, divB, style;
1126style = {
1127width: '8px',
1128height: '9px',
1129$happy: {
1130width: '18px'
1131},
1132$relaxed: {
1133height: '100%'
1134}
1135};
1136divA = Dom.div({
1137style
1138});
1139divB = Dom.div({
1140style,
1141styleAfterInsert: true
1142});
1143expect(divA.style('width')).to.equal('');
1144expect(divA.styleSafe('width')).to.equal('8px');
1145expect(divA.styleParsed('width')).to.equal(parseFloat(divA.styleSafe('width')));
1146expect(divA.style('height')).to.equal('');
1147expect(divA.styleSafe('height')).to.equal('9px');
1148expect(divA.styleParsed('height')).to.equal(parseFloat(divA.styleSafe('height')));
1149expect(divB.style('width')).to.equal('');
1150expect(divB.styleSafe('width')).to.equal('8px');
1151expect(divB.styleParsed('width')).to.equal(parseFloat(divB.styleSafe('width')));
1152divA.state('happy', true);
1153divB.state('happy', true);
1154expect(divA.style('width')).to.equal('');
1155expect(divA.styleSafe('width')).to.equal('18px');
1156expect(divA.styleParsed('width')).to.equal(parseFloat(divA.styleSafe('width')));
1157expect(divA.style('height')).to.equal('');
1158expect(divA.styleSafe('height')).to.equal('9px');
1159expect(divA.styleParsed('height')).to.equal(parseFloat(divA.styleSafe('height')));
1160expect(divB.style('width')).to.equal('');
1161expect(divB.styleSafe('width')).to.equal('18px');
1162expect(divB.styleParsed('width')).to.equal(parseFloat(divB.styleSafe('width')));
1163divA.state('relaxed', true);
1164divB.state('relaxed', true);
1165expect(divA.style('width')).to.equal('');
1166expect(divA.styleSafe('width')).to.equal('18px');
1167expect(divA.styleParsed('width')).to.equal(parseFloat(divA.styleSafe('width')));
1168expect(divA.style('height')).to.equal('');
1169expect(divA.styleSafe('height')).to.equal('100%');
1170expect(divA.styleParsed('height')).to.equal(parseFloat(divA.styleSafe('height')));
1171expect(divB.style('width')).to.equal('');
1172expect(divB.styleSafe('width')).to.equal('18px');
1173expect(divB.styleParsed('width')).to.equal(parseFloat(divB.styleSafe('width')));
1174divA.appendTo(sandbox);
1175divB.appendTo(sandbox);
1176divA.state('relaxed', false);
1177divB.state('relaxed', false);
1178expect(divA.style('width')).to.equal('18px');
1179expect(divA.styleSafe('width')).to.equal('18px');
1180expect(divA.styleParsed('width')).to.equal(parseFloat(divA.styleSafe('width')));
1181expect(divA.style('height')).to.equal('9px');
1182expect(divA.styleSafe('height')).to.equal('9px');
1183expect(divA.styleParsed('height')).to.equal(parseFloat(divA.styleSafe('height')));
1184expect(divB.style('width')).to.equal('18px');
1185expect(divB.styleSafe('width')).to.equal('18px');
1186return expect(divB.styleParsed('width')).to.equal(parseFloat(divB.styleSafe('width')));
1187});
1188test(".recalcStyle() re-applies all function-value styles", function () {
1189var count, div;
1190count = {
1191A: 0,
1192B: 0,
1193C: 0,
1194D: 0,
1195E: 0,
1196F: 0,
1197G: 0
1198};
1199div = Dom.div({
1200style: {
1201width: function () {
1202return ++count.A;
1203},
1204opacity: 1,
1205height: function () {
1206return ++count.B;
1207},
1208fontSize: function () {
1209return ++count.C;
1210},
1211$happy: {
1212opacity: 0.5,
1213fontSize: function () {
1214return ++count.D;
1215}
1216},
1217$relaxed: {
1218height: function () {
1219return ++count.E;
1220},
1221fontSize: function () {
1222return ++count.F;
1223},
1224$funny: {
1225width: function () {
1226return ++count.G;
1227}
1228}
1229}
1230}
1231});
1232expect(count).to.eql({
1233A: 1,
1234B: 1,
1235C: 1,
1236D: 0,
1237E: 0,
1238F: 0,
1239G: 0
1240});
1241div.recalcStyle();
1242expect(count).to.eql({
1243A: 2,
1244B: 2,
1245C: 2,
1246D: 0,
1247E: 0,
1248F: 0,
1249G: 0
1250});
1251div.state('happy', true);
1252expect(count).to.eql({
1253A: 2,
1254B: 2,
1255C: 2,
1256D: 1,
1257E: 0,
1258F: 0,
1259G: 0
1260});
1261div.recalcStyle();
1262expect(count).to.eql({
1263A: 3,
1264B: 3,
1265C: 2,
1266D: 2,
1267E: 0,
1268F: 0,
1269G: 0
1270});
1271div.state('relaxed', true);
1272expect(count).to.eql({
1273A: 3,
1274B: 3,
1275C: 2,
1276D: 2,
1277E: 1,
1278F: 1,
1279G: 0
1280});
1281div.recalcStyle();
1282expect(count).to.eql({
1283A: 4,
1284B: 3,
1285C: 2,
1286D: 2,
1287E: 2,
1288F: 2,
1289G: 0
1290});
1291div.state('funny', true);
1292expect(count).to.eql({
1293A: 4,
1294B: 3,
1295C: 2,
1296D: 2,
1297E: 2,
1298F: 2,
1299G: 1
1300});
1301div.recalcStyle();
1302expect(count).to.eql({
1303A: 4,
1304B: 3,
1305C: 2,
1306D: 2,
1307E: 3,
1308F: 3,
1309G: 2
1310});
1311div.state('funny', false);
1312expect(count).to.eql({
1313A: 5,
1314B: 3,
1315C: 2,
1316D: 2,
1317E: 3,
1318F: 3,
1319G: 2
1320});
1321div.recalcStyle();
1322return expect(count).to.eql({
1323A: 6,
1324B: 3,
1325C: 2,
1326D: 2,
1327E: 4,
1328F: 4,
1329G: 2
1330});
1331});
1332test(".recalcStyle() accepts a single argument to indicate if to recalc style on children", function () {
1333var count, div, wrapper, wrapperCount;
1334count = {
1335A: 0,
1336B: 0,
1337C: 0,
1338D: 0,
1339E: 0,
1340F: 0,
1341G: 0
1342};
1343wrapperCount = 0;
1344wrapper = Dom.div({
1345style: {
1346width: function () {
1347return ++wrapperCount;
1348}
1349}
1350});
1351div = Dom.div({
1352style: {
1353width: function () {
1354return ++count.A;
1355},
1356opacity: 1,
1357height: function () {
1358return ++count.B;
1359},
1360fontSize: function () {
1361return ++count.C;
1362},
1363$happy: {
1364opacity: 0.5,
1365fontSize: function () {
1366return ++count.D;
1367}
1368},
1369$relaxed: {
1370height: function () {
1371return ++count.E;
1372},
1373fontSize: function () {
1374return ++count.F;
1375},
1376$funny: {
1377width: function () {
1378return ++count.G;
1379}
1380}
1381}
1382}
1383});
1384div.appendTo(wrapper);
1385expect(wrapperCount).to.equal(1);
1386expect(count).to.eql({
1387A: 1,
1388B: 1,
1389C: 1,
1390D: 0,
1391E: 0,
1392F: 0,
1393G: 0
1394});
1395wrapper.recalcStyle();
1396expect(wrapperCount).to.equal(2);
1397expect(count).to.eql({
1398A: 1,
1399B: 1,
1400C: 1,
1401D: 0,
1402E: 0,
1403F: 0,
1404G: 0
1405});
1406wrapper.recalcStyle(true);
1407expect(wrapperCount).to.equal(3);
1408expect(count).to.eql({
1409A: 2,
1410B: 2,
1411C: 2,
1412D: 0,
1413E: 0,
1414F: 0,
1415G: 0
1416});
1417div.state('happy', true);
1418expect(count).to.eql({
1419A: 2,
1420B: 2,
1421C: 2,
1422D: 1,
1423E: 0,
1424F: 0,
1425G: 0
1426});
1427wrapper.recalcStyle();
1428expect(wrapperCount).to.equal(4);
1429expect(count).to.eql({
1430A: 2,
1431B: 2,
1432C: 2,
1433D: 1,
1434E: 0,
1435F: 0,
1436G: 0
1437});
1438wrapper.recalcStyle(1);
1439expect(wrapperCount).to.equal(5);
1440return expect(count).to.eql({
1441A: 3,
1442B: 3,
1443C: 2,
1444D: 2,
1445E: 0,
1446F: 0,
1447G: 0
1448});
1449});
1450test("If options.recalcOnResize is set, .recalcStyle() will be invoked on each resize event", function () {
1451var count;
1452count = {
1453A: 0,
1454B: 0,
1455C: 0,
1456D: 0
1457};
1458Dom.div({
1459style: {
1460width: function () {
1461return ++count.A;
1462},
1463opacity: 1,
1464height: function () {
1465return ++count.B;
1466}
1467}
1468});
1469Dom.div({
1470recalcOnResize: true,
1471style: {
1472width: function () {
1473return ++count.C;
1474},
1475opacity: 1,
1476height: function () {
1477return ++count.D;
1478}
1479}
1480});
1481expect(count).to.eql({
1482A: 1,
1483B: 1,
1484C: 1,
1485D: 1
1486});
1487Dom(window).emit('resize');
1488expect(count).to.eql({
1489A: 1,
1490B: 1,
1491C: 2,
1492D: 2
1493});
1494Dom(window).emit('resize');
1495return expect(count).to.eql({
1496A: 1,
1497B: 1,
1498C: 3,
1499D: 3
1500});
1501});
1502test("If options.forceStyle is set, all registered styles will have the '!important' flag set", function () {
1503var divA, divB, style;
1504style = DOM.style({
1505props: {
1506innerHTML: ".theDiv {width:50px}"
1507}
1508});
1509divA = DOM.div({
1510className: 'theDiv',
1511style: {
1512width: 100,
1513height: 100
1514}
1515}).appendTo(sandbox);
1516divB = DOM.div({
1517className: 'theDiv',
1518style: {
1519width: 100,
1520height: 100
1521},
1522forceStyle: true
1523}).appendTo(sandbox);
1524expect(divA.style('width')).to.equal('100px');
1525expect(divB.style('width')).to.equal('100px');
1526style.appendTo(document.head);
1527expect(divA.style('width')).to.equal('50px');
1528expect(divB.style('width')).to.equal('100px');
1529expect(divA.attr('style') === '' || divA.attr('style') === null).to.be.true;
1530expect(divB.attr('style') === '' || divB.attr('style') === null).to.be.true;
1531divA.style('width', function () {
1532return 75;
1533});
1534divB.style('width', function () {
1535return 75;
1536});
1537divA.style('height', 85);
1538divB.style('height', 85);
1539expect(divA.attr('style')).not.to.equal('');
1540expect(divB.attr('style')).not.to.equal('');
1541expect(divA.attr('style')).not.to.include('75px !important');
1542expect(divB.attr('style')).to.include('75px !important');
1543expect(divA.attr('style')).not.to.include('85px !important');
1544expect(divB.attr('style')).to.include('85px !important');
1545expect(divA.style('width')).to.equal('75px');
1546expect(divB.style('width')).to.equal('75px');
1547return style.remove();
1548});
1549test(".show()/.hide() will toggle the element's visibility", function () {
1550var div;
1551div = Dom.div().appendTo(sandbox);
1552expect(div.style('display')).to.equal('block');
1553div.hide();
1554expect(div.style('display')).to.equal('none');
1555div.show();
1556expect(div.style('display')).to.equal('block');
1557div.show();
1558return expect(div.style('display')).to.equal('block');
1559});
1560test(".show() will set the element's display style to the provided argument, or to the value provided in the style object", function () {
1561var div;
1562div = Dom.div({
1563style: {
1564display: 'inline'
1565}
1566}).appendTo(sandbox);
1567expect(div.style('display')).to.equal('inline');
1568div.hide();
1569expect(div.style('display')).to.equal('none');
1570div.show();
1571expect(div.style('display')).to.equal('inline');
1572div.hide();
1573div.show('inline-block');
1574return expect(div.style('display')).to.equal('inline-block');
1575});
1576return test("SVG elements", function () {
1577var svg;
1578svg = Dom(['*svg', {
1579style: {
1580display: 'block',
1581width: 10,
1582height: 10,
1583$happy: {
1584width: 20,
1585height: 20
1586}
1587}
1588}]).appendTo(sandbox);
1589expect(svg.style('width')).to.equal('10px');
1590expect(svg.style('height')).to.equal('10px');
1591svg.state('happy', true);
1592expect(svg.style('width')).to.equal('20px');
1593return expect(svg.style('height')).to.equal('20px');
1594});
1595});
1596suite("State", function () {
1597test("States can be polled for a value by passing only the target state's name to .state & can be toggled on/off by passing a second argument", function () {
1598var div;
1599div = Dom.div();
1600expect(div.state('funny')).to.be.false;
1601div.state('funny', true);
1602expect(div.state('funny')).to.be.true;
1603div.state('happy', true);
1604div.state('relaxed', true);
1605expect(div.state('funny')).to.be.true;
1606expect(div.state('happy')).to.be.true;
1607expect(div.state('relaxed')).to.be.true;
1608div.state('funny', false);
1609expect(div.state('funny')).to.be.false;
1610expect(div.state('happy')).to.be.true;
1611expect(div.state('relaxed')).to.be.true;
1612div.state('$funny', true);
1613div.state('$base', true);
1614expect(div.state('funny')).to.be.true;
1615return expect(div.state('base')).to.be.false;
1616});
1617test("A key:value pair object can be passed to toggle state for multiple states at once", function () {
1618var div;
1619div = Dom.div();
1620expect(div.state('a')).to.equal(false);
1621expect(div.state('b')).to.equal(false);
1622expect(div.state('c')).to.equal(false);
1623div.state({
1624a: true,
1625b: 1
1626});
1627expect(div.state('a')).to.equal(true);
1628expect(div.state('b')).to.equal(true);
1629expect(div.state('c')).to.equal(false);
1630div.state({
1631b: false,
1632c: 'y'
1633});
1634expect(div.state('a')).to.equal(true);
1635expect(div.state('b')).to.equal(false);
1636return expect(div.state('c')).to.equal(true);
1637});
1638test(".state() without arguments should return an array of active states", function () {
1639var el;
1640el = DOM.div();
1641expect(el.state()).to.eql([]);
1642el.state('happy', true);
1643el.state('relaxed', true);
1644expect(el.state()).to.eql(['happy', 'relaxed']);
1645el.state('happy', false);
1646expect(el.state()).to.eql(['relaxed']);
1647el.state('happy', true);
1648return expect(el.state()).to.eql(['relaxed', 'happy']);
1649});
1650test("All states can be cleared/toggled off via .resetState", function () {
1651var div;
1652div = Dom.div();
1653div.state('funny', true);
1654div.state('happy', true);
1655div.state('relaxed', true);
1656expect(div.state('funny')).to.be.true;
1657expect(div.state('happy')).to.be.true;
1658expect(div.state('relaxed')).to.be.true;
1659div.resetState();
1660expect(div.state('funny')).to.be.false;
1661expect(div.state('happy')).to.be.false;
1662return expect(div.state('relaxed')).to.be.false;
1663});
1664test("A state can be toggled on/off via .toggleState", function () {
1665var div;
1666div = DOM.div();
1667expect(div.state('happy')).to.equal(false);
1668div.toggleState('happy');
1669expect(div.state('happy')).to.equal(true);
1670div.toggleState('happy');
1671expect(div.state('happy')).to.equal(false);
1672div.toggleState('happy');
1673return expect(div.state('happy')).to.equal(true);
1674});
1675test("Styles can be passed under specific states using a '$' prefix before the state name", function () {
1676var computedStyle, div;
1677div = Dom.div({
1678style: {
1679$base: {
1680width: '15px',
1681height: '15px'
1682},
1683$happy: {
1684width: '25px',
1685marginTop: '20px'
1686},
1687$relaxed: {
1688width: '35px',
1689marginLeft: '12px'
1690}
1691}
1692});
1693div.appendTo(sandbox);
1694computedStyle = getComputedStyle(div.el);
1695expect(computedStyle.width).to.equal('15px');
1696expect(computedStyle.height).to.equal('15px');
1697expect(computedStyle.marginTop).to.equal('0px');
1698expect(computedStyle.marginLeft).to.equal('0px');
1699div.state('happy', true);
1700expect(computedStyle.width).to.equal('25px');
1701expect(computedStyle.height).to.equal('15px');
1702expect(computedStyle.marginTop).to.equal('20px');
1703expect(computedStyle.marginLeft).to.equal('0px');
1704div.state('happy', false);
1705expect(computedStyle.width).to.equal('15px');
1706expect(computedStyle.height).to.equal('15px');
1707expect(computedStyle.marginTop).to.equal('0px');
1708expect(computedStyle.marginLeft).to.equal('0px');
1709div.state('happy', true);
1710div.state('relaxed', true);
1711expect(computedStyle.width).to.equal('35px');
1712expect(computedStyle.height).to.equal('15px');
1713expect(computedStyle.marginTop).to.equal('20px');
1714expect(computedStyle.marginLeft).to.equal('12px');
1715div.state('happy', false);
1716expect(computedStyle.width).to.equal('35px');
1717expect(computedStyle.height).to.equal('15px');
1718expect(computedStyle.marginTop).to.equal('0px');
1719return expect(computedStyle.marginLeft).to.equal('12px');
1720});
1721test("A state:eventName (or state:eventOpts) map can be passed set for options.stateTriggers", function () {
1722var computedStyle, div;
1723div = Dom.div({
1724stateTriggers: {
1725happy: {
1726on: 'becameHappy',
1727off: 'becameSad'
1728},
1729relaxed: 'isRelaxed'
1730},
1731style: {
1732$base: {
1733width: '15px'
1734},
1735$happy: {
1736width: '25px'
1737},
1738$relaxed: {
1739width: '35px'
1740}
1741}
1742}).appendTo(sandbox);
1743computedStyle = getComputedStyle(div.el);
1744expect(div.state('happy')).to.be.false;
1745expect(div.state('relaxed')).to.be.false;
1746expect(computedStyle.width).to.equal('15px');
1747div.emit('becameHappy');
1748expect(div.state('happy')).to.be.true;
1749expect(div.state('relaxed')).to.be.false;
1750expect(computedStyle.width).to.equal('25px');
1751div.emit('isRelaxed');
1752expect(div.state('happy')).to.be.true;
1753expect(div.state('relaxed')).to.be.true;
1754expect(computedStyle.width).to.equal('35px');
1755div.emit('becameSad');
1756expect(div.state('happy')).to.be.false;
1757expect(div.state('relaxed')).to.be.true;
1758expect(computedStyle.width).to.equal('35px');
1759div.state('relaxed', false);
1760return expect(computedStyle.width).to.equal('15px');
1761});
1762test("options.stateTriggers won't be attached if they aren't being used in style object", function () {
1763var divA, divB;
1764divA = Dom.div({
1765style: {
1766$hover: {
1767display: 'block'
1768}
1769}
1770});
1771divB = Dom.div({
1772style: {
1773$focus: {
1774display: 'block'
1775}
1776}
1777});
1778expect(divA.state('hover')).to.equal(false);
1779expect(divB.state('hover')).to.equal(false);
1780divA.el.emitEvent('mouseenter');
1781divB.el.emitEvent('mouseenter');
1782expect(divA.state('hover')).to.equal(true);
1783expect(divB.state('hover')).to.equal(false);
1784divA.el.emitEvent('mouseleave');
1785divB.el.emitEvent('mouseleave');
1786expect(divA.state('hover')).to.equal(false);
1787expect(divB.state('hover')).to.equal(false);
1788divA.el.emitEvent('focus');
1789divB.el.emitEvent('focus');
1790expect(divA.state('focus')).to.equal(false);
1791expect(divB.state('focus')).to.equal(true);
1792divA.el.emitEvent('blur');
1793divB.el.emitEvent('blur');
1794expect(divA.state('focus')).to.equal(false);
1795return expect(divB.state('focus')).to.equal(false);
1796});
1797test("options.stateTriggers can be forced to be attached even if they aren't being used in style object via ._attachStateEvents(true)", function () {
1798var attachStateEvents, divA, divB;
1799attachStateEvents = Dom.div()._attachStateEvents ? '_attachStateEvents' : '_ae';
1800divA = Dom.div({
1801style: {
1802$hover: {
1803display: 'block'
1804}
1805}
1806});
1807divB = Dom.div({
1808style: {
1809$focus: {
1810display: 'block'
1811}
1812}
1813});
1814divA[attachStateEvents](true);
1815divB[attachStateEvents](true);
1816expect(divA.state('hover')).to.equal(false);
1817expect(divB.state('hover')).to.equal(false);
1818divA.el.emitEvent('mouseenter');
1819divB.el.emitEvent('mouseenter');
1820expect(divA.state('hover')).to.equal(true);
1821expect(divB.state('hover')).to.equal(true);
1822divA.el.emitEvent('mouseleave');
1823divB.el.emitEvent('mouseleave');
1824expect(divA.state('hover')).to.equal(false);
1825expect(divB.state('hover')).to.equal(false);
1826divA.el.emitEvent('focus');
1827divB.el.emitEvent('focus');
1828expect(divA.state('focus')).to.equal(true);
1829expect(divB.state('focus')).to.equal(true);
1830divA.el.emitEvent('blur');
1831divB.el.emitEvent('blur');
1832expect(divA.state('focus')).to.equal(false);
1833return expect(divB.state('focus')).to.equal(false);
1834});
1835test("The hover and focus states will be listened for and toggled by default by their appropriate events", function () {
1836var div;
1837div = Dom.div({
1838style: {
1839$base: {
1840width: '15px',
1841height: '15px',
1842backgroundColor: 'rgb(45, 45, 45)'
1843},
1844$hover: {
1845width: '25px',
1846marginTop: '20px',
1847backgroundColor: 'rgb(155, 155, 155)'
1848},
1849$focus: {
1850width: '35px',
1851backgroundColor: 'rgb(200, 200, 200)'
1852}
1853}
1854});
1855div.appendTo(sandbox);
1856expect(div.el).to.have.style('width', '15px');
1857expect(div.el).to.have.style('height', '15px');
1858expect(div.el).to.have.style('marginTop', '0px');
1859expect(div.el).to.have.style('backgroundColor', 'rgb(45, 45, 45)');
1860expect(div.el.style.marginTop).to.equal('');
1861div.emit('mouseenter');
1862expect(div.el).to.have.style('width', '25px');
1863expect(div.el).to.have.style('height', '15px');
1864expect(div.el).to.have.style('marginTop', '20px');
1865expect(div.el).to.have.style('backgroundColor', 'rgb(155, 155, 155)');
1866expect(div.el.style.marginTop).to.equal('');
1867div.emit('mouseleave');
1868expect(div.el).to.have.style('width', '15px');
1869expect(div.el).to.have.style('height', '15px');
1870expect(div.el).to.have.style('marginTop', '0px');
1871expect(div.el).to.have.style('backgroundColor', 'rgb(45, 45, 45)');
1872expect(div.el.style.marginTop).to.equal('');
1873div.emit('mouseenter');
1874div.emit('focus');
1875expect(div.el).to.have.style('width', '35px');
1876expect(div.el).to.have.style('height', '15px');
1877expect(div.el).to.have.style('marginTop', '20px');
1878expect(div.el).to.have.style('backgroundColor', 'rgb(200, 200, 200)');
1879expect(div.el.style.marginTop).to.equal('');
1880div.emit('mouseleave');
1881expect(div.el).to.have.style('width', '35px');
1882expect(div.el).to.have.style('height', '15px');
1883expect(div.el).to.have.style('marginTop', '0px');
1884expect(div.el).to.have.style('backgroundColor', 'rgb(200, 200, 200)');
1885return expect(div.el.style.marginTop).to.equal('');
1886});
1887test("If not passed a style map under the 'base' state, all non-state properties on the style object will be considered as 'base' state properties", function () {
1888var computedStyle, div;
1889div = Dom.div({
1890style: {
1891width: '15px',
1892height: '20px',
1893$hover: {
1894width: '25px',
1895height: '30px'
1896}
1897}
1898});
1899div.appendTo(sandbox);
1900computedStyle = getComputedStyle(div.el);
1901expect(computedStyle.width).to.equal('15px');
1902expect(computedStyle.height).to.equal('20px');
1903div.emit('mouseenter');
1904expect(computedStyle.width).to.equal('25px');
1905expect(computedStyle.height).to.equal('30px');
1906div.emit('mouseleave');
1907expect(computedStyle.width).to.equal('15px');
1908return expect(computedStyle.height).to.equal('20px');
1909});
1910test("State-specific styles will be removed upon state turn off or restored to the base value", function () {
1911var computedStyle, div;
1912div = Dom.div({
1913style: {
1914width: '15px',
1915$hover: {
1916width: '25px',
1917height: '30px'
1918}
1919}
1920});
1921div.appendTo(sandbox);
1922computedStyle = getComputedStyle(div.el);
1923expect(div.el).to.have.style('width', '15px');
1924expect(div.el).to.have.style('height', '0px');
1925expect(div.el.style.height).to.equal('');
1926div.emit('mouseenter');
1927expect(div.el).to.have.style('width', '25px');
1928expect(div.el).to.have.style('height', '30px');
1929expect(div.el.style.height).to.equal('');
1930div.emit('mouseleave');
1931expect(div.el).to.have.style('width', '15px');
1932expect(div.el).to.have.style('height', '0px');
1933return expect(div.el.style.height).to.equal('');
1934});
1935test("Higher order state styles will have a higher precedence than the 'base' style to be used as replacments for pending-removal state-styles", function () {
1936var computedStyle, div;
1937div = Dom.div({
1938style: {
1939width: '15px',
1940$hover: {
1941width: '25px',
1942height: '30px'
1943},
1944$focus: {
1945height: '45px'
1946}
1947}
1948});
1949div.appendTo(sandbox);
1950computedStyle = getComputedStyle(div.el);
1951expect(computedStyle.width).to.equal('15px');
1952expect(computedStyle.height).to.equal('0px');
1953div.emit('mouseenter');
1954expect(computedStyle.width).to.equal('25px');
1955expect(computedStyle.height).to.equal('30px');
1956div.emit('focus');
1957expect(computedStyle.width).to.equal('25px');
1958expect(computedStyle.height).to.equal('45px');
1959div.emit('mouseleave');
1960expect(computedStyle.width).to.equal('15px');
1961expect(computedStyle.height).to.equal('45px');
1962div.emit('blur');
1963div.emit('focus');
1964div.emit('mouseenter');
1965expect(computedStyle.width).to.equal('25px');
1966expect(computedStyle.height).to.equal('45px');
1967div.emit('blur');
1968expect(computedStyle.width).to.equal('25px');
1969return expect(computedStyle.height).to.equal('30px');
1970});
1971test("State toggles will be passed to children elements unless options.passStateToChildren is off", function () {
1972var A, B, C, Main;
1973Main = Dom.div();
1974A = Dom.div().appendTo(Main);
1975B = Dom.div().appendTo(A);
1976C = Dom.div({
1977passStateToChildren: false
1978}).appendTo(A);
1979expect(Main.state('happy')).to.be.false;
1980expect(A.state('happy')).to.be.false;
1981expect(B.state('happy')).to.be.false;
1982expect(C.state('happy')).to.be.false;
1983Main.state('happy', true);
1984expect(Main.state('happy')).to.be.true;
1985expect(A.state('happy')).to.be.true;
1986expect(B.state('happy')).to.be.true;
1987expect(C.state('happy')).to.be.true;
1988Main.options.passStateToChildren = false;
1989Main.state('happy', false);
1990expect(Main.state('happy')).to.be.false;
1991expect(A.state('happy')).to.be.true;
1992expect(B.state('happy')).to.be.true;
1993expect(C.state('happy')).to.be.true;
1994Main.state('happy', true);
1995Main.options.passStateToChildren = true;
1996A.options.passStateToChildren = false;
1997Main.state('happy', false);
1998expect(Main.state('happy')).to.be.false;
1999expect(A.state('happy')).to.be.false;
2000expect(B.state('happy')).to.be.true;
2001return expect(C.state('happy')).to.be.true;
2002});
2003test("State styles can be nested to trigger when all states are toggled on", function () {
2004var div;
2005div = Dom.div({
2006style: {
2007$base: {
2008width: '12px',
2009height: '12px',
2010fontSize: '10px'
2011},
2012$funny: {
2013fontSize: '15px',
2014height: '15px'
2015},
2016$happy: {
2017width: '14px',
2018fontSize: '14px',
2019$relaxed: {
2020height: '11px',
2021fontSize: '17px',
2022$funny: {
2023width: '10px',
2024height: '14px'
2025}
2026}
2027},
2028$relaxed: {
2029width: '17px'
2030}
2031}
2032});
2033div.appendTo(sandbox);
2034expect(div.style('width')).to.equal('12px');
2035expect(div.style('height')).to.equal('12px');
2036expect(div.style('fontSize')).to.equal('10px');
2037div.state('funny', true);
2038expect(div.style('width')).to.equal('12px');
2039expect(div.style('height')).to.equal('15px');
2040expect(div.style('fontSize')).to.equal('15px');
2041div.state('funny', false);
2042expect(div.style('width')).to.equal('12px');
2043expect(div.style('height')).to.equal('12px');
2044expect(div.style('fontSize')).to.equal('10px');
2045div.state('happy', true);
2046expect(div.style('width')).to.equal('14px');
2047expect(div.style('height')).to.equal('12px');
2048expect(div.style('fontSize')).to.equal('14px');
2049div.state('relaxed', true);
2050expect(div.style('width')).to.equal('17px');
2051expect(div.style('height')).to.equal('11px');
2052expect(div.style('fontSize')).to.equal('17px');
2053div.state('happy', false);
2054expect(div.style('width')).to.equal('17px');
2055expect(div.style('height')).to.equal('12px');
2056expect(div.style('fontSize')).to.equal('10px');
2057div.state('happy', true);
2058expect(div.style('width')).to.equal('17px');
2059expect(div.style('height')).to.equal('11px');
2060expect(div.style('fontSize')).to.equal('17px');
2061div.state('funny', true);
2062expect(div.style('width')).to.equal('10px');
2063expect(div.style('height')).to.equal('14px');
2064expect(div.style('fontSize')).to.equal('17px');
2065div.state('happy', false);
2066expect(div.style('width')).to.equal('17px');
2067expect(div.style('height')).to.equal('15px');
2068return expect(div.style('fontSize')).to.equal('15px');
2069});
2070test("QuickElement.rect should contain an updated version of the element's ClientRect", function () {
2071var div, rectA, rectB, rectC;
2072div = Dom.div().appendTo(sandbox);
2073rectA = div.rect;
2074rectB = div.rect;
2075expect(rectA).to.be.instanceOf(ClientRect);
2076expect(rectB).to.be.instanceOf(ClientRect);
2077expect(rectA).to.eql(rectB);
2078div.style('width', '7px');
2079rectC = div.rect;
2080expect(rectC).to.be.instanceOf(ClientRect);
2081expect(rectA).to.eql(rectB);
2082expect(rectA).not.to.eql(rectC);
2083expect(rectA.width).not.to.equal(7);
2084expect(rectB.width).not.to.equal(7);
2085return expect(rectC.width).to.equal(7);
2086});
2087test("QuickElement.width should return the updated version of an element's computed width", function () {
2088var div, parent;
2089parent = Dom.div().appendTo(sandbox);
2090div = Dom.div().appendTo(parent);
2091parent.style({
2092width: '1000px'
2093});
2094div.style({
2095width: '50%'
2096});
2097expect(div.width).to.equal(500);
2098div.style({
2099width: '10%'
2100});
2101expect(div.width).to.equal(100);
2102div.style({
2103width: '97px'
2104});
2105return expect(div.width).to.equal(97);
2106});
2107test("QuickElement.height should return the updated version of an element's computed height", function () {
2108var div, parent;
2109parent = Dom.div().appendTo(sandbox);
2110div = Dom.div().appendTo(parent);
2111parent.style({
2112height: '1000px'
2113});
2114div.style({
2115height: '50%'
2116});
2117expect(div.height).to.equal(500);
2118div.style({
2119height: '10%'
2120});
2121expect(div.height).to.equal(100);
2122div.style({
2123height: '97px'
2124});
2125return expect(div.height).to.equal(97);
2126});
2127test("QuickElement.width/.height setters are shortcuts for .style() setters", function () {
2128var div, parent;
2129parent = Dom.div().appendTo(sandbox);
2130div = Dom.div().appendTo(parent);
2131parent.style({
2132width: '1000px',
2133height: '1000px'
2134});
2135div.style({
2136width: '50%',
2137height: '50%'
2138});
2139div.width = div.height = '50%';
2140expect(div.width).to.equal(500);
2141expect(div.height).to.equal(500);
2142div.width = div.height = '10%';
2143expect(div.width).to.equal(100);
2144expect(div.height).to.equal(100);
2145div.width = div.height = '97px';
2146expect(div.width).to.equal(97);
2147return expect(div.height).to.equal(97);
2148});
2149test("QuickElement.orientation should return the updated version of an element's computed orientation", function () {
2150var div, parent;
2151parent = Dom.div().appendTo(sandbox);
2152div = Dom.div().appendTo(parent);
2153div.style({
2154width: 500,
2155height: 400
2156});
2157expect(div.orientation).to.equal('landscape');
2158div.style({
2159width: 550,
2160height: 600
2161});
2162expect(div.orientation).to.equal('portrait');
2163div.style({
2164width: 600,
2165height: 600
2166});
2167expect(div.orientation).to.equal('portrait');
2168div.style({
2169width: 601,
2170height: 600
2171});
2172return expect(div.orientation).to.equal('landscape');
2173});
2174test("QuickElement.aspectRatio should return the updated version of an element's computed aspect-ratio", function () {
2175var div, parent;
2176parent = Dom.div().appendTo(sandbox);
2177div = Dom.div().appendTo(parent);
2178div.style({
2179width: 500,
2180height: 400
2181});
2182expect(div.aspectRatio).to.equal(1.25);
2183div.style({
2184width: 540,
2185height: 600
2186});
2187expect(div.aspectRatio).to.equal(0.9);
2188div.style({
2189width: 600,
2190height: 600
2191});
2192expect(div.aspectRatio).to.equal(1);
2193div.style({
2194width: 300,
2195height: 900
2196});
2197return expect(div.aspectRatio).to.equal(0.33333333333333333333333333);
2198});
2199test("If options.styleAfterInsert is passed, function styles will be applied only after the element is inserted into the DOM", function () {
2200var className, divA, divB, divC, divReg, parentOpacityGetter;
2201parentOpacityGetter = function () {
2202if (this.parent) {
2203return this.parent.style('opacity');
2204} else {
2205return '0.5';
2206}
2207};
2208divReg = Dom.div({
2209style: {
2210height: '19px',
2211opacity: parentOpacityGetter
2212}
2213});
2214divA = Dom.div({
2215style: {
2216height: '19px',
2217opacity: parentOpacityGetter
2218},
2219styleAfterInsert: true
2220});
2221divB = Dom.div({
2222style: {
2223height: '19px',
2224opacity: parentOpacityGetter
2225},
2226styleAfterInsert: true
2227});
2228divC = Dom.div({
2229style: {
2230height: '19px',
2231opacity: parentOpacityGetter
2232},
2233styleAfterInsert: true
2234});
2235className = divReg.raw.className || 'no className';
2236expect(divReg.raw.className).to.equal(className);
2237expect(divA.raw.className).to.equal(className);
2238expect(divB.raw.className).to.equal(className);
2239expect(divC.raw.className).to.equal(className);
2240expect(divReg.el.style.opacity).to.equal('0.5');
2241expect(divA.el.style.opacity).to.equal('');
2242expect(divB.el.style.opacity).to.equal('');
2243expect(divC.el.style.opacity).to.equal('');
2244divA.appendTo(sandbox);
2245expect(divA.el.style.opacity).to.equal('1');
2246expect(divB.el.style.opacity).to.equal('');
2247expect(divC.el.style.opacity).to.equal('');
2248divB.insertBefore(sandbox);
2249expect(divA.el.style.opacity).to.equal('1');
2250expect(divB.el.style.opacity).to.equal('1');
2251expect(divC.el.style.opacity).to.equal('');
2252sandbox.appendChild(divC.el);
2253expect(divA.el.style.opacity).to.equal('1');
2254expect(divB.el.style.opacity).to.equal('1');
2255expect(divC.el.style.opacity).to.equal('');
2256divC.parent;
2257expect(divA.el.style.opacity).to.equal('1');
2258expect(divB.el.style.opacity).to.equal('1');
2259expect(divC.el.style.opacity).to.equal('1');
2260return divC.appendTo(sandbox);
2261});
2262test("Any styles applied by states before the element has been inserted into the DOM and when options.styleAfterInsert is on will be re-applied after insert", function () {
2263var divA, divReg;
2264divReg = Dom.div({
2265style: {
2266$base: {
2267height: function () {
2268return '19px';
2269}
2270},
2271$funny: {
2272height: function () {
2273return '29px';
2274}
2275},
2276$happy: {
2277height: function () {
2278return '39px';
2279}
2280}
2281}
2282});
2283divA = Dom.div({
2284style: {
2285$base: {
2286height: function () {
2287return '19px';
2288}
2289},
2290$funny: {
2291height: function () {
2292return '29px';
2293}
2294},
2295$happy: {
2296height: function () {
2297return '39px';
2298}
2299}
2300},
2301styleAfterInsert: true
2302});
2303expect(divReg.el.style.height).to.equal('19px');
2304expect(divA.el.style.height).to.equal('');
2305divReg.state('funny', true);
2306divA.state('funny', true);
2307expect(divReg.el.style.height).to.equal('29px');
2308expect(divA.el.style.height).to.equal('');
2309divReg.state('happy', true);
2310divA.state('happy', true);
2311expect(divReg.el.style.height).to.equal('39px');
2312expect(divA.el.style.height).to.equal('');
2313divReg.appendTo(sandbox);
2314divA.appendTo(sandbox);
2315expect(divReg.el.style.height).to.equal('39px');
2316return expect(divA.el.style.height).to.equal('39px');
2317});
2318test("If an element with options.styleAfterInsert is appended into a detached element, styles will be applied only after the parent is appended to the DOM", function () {
2319var detachedParent, divA, divReg;
2320detachedParent = Dom.div();
2321divReg = Dom.div({
2322style: {
2323height: (function () {
2324return '19px';
2325}),
2326$happy: {
2327$relaxed: {
2328width: function () {
2329return '31px';
2330}
2331}
2332}
2333}
2334});
2335divA = Dom.div({
2336style: {
2337height: (function () {
2338return '19px';
2339}),
2340$happy: {
2341$relaxed: {
2342width: function () {
2343return '31px';
2344}
2345}
2346}
2347},
2348styleAfterInsert: true
2349});
2350divReg.state('happy', true);
2351divReg.state('relaxed', true);
2352divA.state('happy', true);
2353divA.state('relaxed', true);
2354divA.state('relaxed', true);
2355divA.style('visibility', 'hidden');
2356expect(divReg.el.style.height).to.equal('19px');
2357expect(divReg.el.style.width).to.equal('31px');
2358expect(divA.el.style.height).to.equal('');
2359expect(divA.el.style.width).to.equal('');
2360expect(divA.el.style.visibility).to.equal('hidden');
2361divA.appendTo(detachedParent);
2362expect(divA.el.style.height).to.equal('');
2363expect(divA.el.style.width).to.equal('');
2364expect(divA.el.style.visibility).to.equal('hidden');
2365detachedParent.appendTo(sandbox);
2366expect(divA.el.style.height).to.equal('19px');
2367expect(divA.el.style.width).to.equal('31px');
2368return expect(divA.el.style.visibility).to.equal('hidden');
2369});
2370test("QuickElement.pipeState can be used to redirect all state toggles to the provided target element", function () {
2371var childA, childB, divA, divB, parentA, parentB;
2372parentA = Dom.div();
2373parentB = Dom.div({
2374passStateToChildren: false
2375});
2376divA = Dom.div(null).appendTo(parentA);
2377divB = Dom.div(null).appendTo(parentB);
2378childA = Dom.span().appendTo(divA);
2379childB = Dom.span().appendTo(divB);
2380divA.pipeState();
2381divA.state('1', true);
2382expect(parentA.state('1')).to.equal(false);
2383expect(divA.state('1')).to.equal(true);
2384expect(childA.state('1')).to.equal(true);
2385divA.pipeState(parentA);
2386divA.state('2', true);
2387expect(parentA.state('2')).to.equal(true);
2388expect(divA.state('2')).to.equal(true);
2389expect(childA.state('2')).to.equal(true);
2390divA.pipeState(false);
2391divA.state('2.5', true);
2392expect(parentA.state('2.5')).to.equal(false);
2393expect(divA.state('2.5')).to.equal(true);
2394expect(childA.state('2.5')).to.equal(true);
2395divB.pipeState(true);
2396divB.state('3', true);
2397expect(parentB.state('3')).to.equal(false);
2398expect(divB.state('3')).to.equal(true);
2399expect(childB.state('3')).to.equal(true);
2400divB.pipeState(parentB);
2401divB.state('4', true);
2402expect(parentB.state('4')).to.equal(true);
2403expect(divB.state('4')).to.equal(false);
2404expect(childB.state('4')).to.equal(false);
2405divA.pipeState(parentB);
2406divA.state('5', true);
2407expect(parentA.state('5')).to.equal(false);
2408expect(parentB.state('5')).to.equal(true);
2409expect(divA.state('5')).to.equal(false);
2410expect(divB.state('5')).to.equal(false);
2411expect(childA.state('5')).to.equal(false);
2412expect(childB.state('5')).to.equal(false);
2413divA.pipeState(false);
2414divB.pipeState(parentA);
2415divB.state('6', true);
2416expect(parentA.state('6')).to.equal(true);
2417expect(parentB.state('6')).to.equal(false);
2418expect(divA.state('6')).to.equal(true);
2419expect(divB.state('6')).to.equal(false);
2420expect(childA.state('6')).to.equal(true);
2421return expect(childB.state('6')).to.equal(false);
2422});
2423test("States can be marked as unpassable to avoid passing to children by including them in options.unpassableStates", function () {
2424var div, spanA, spanB, subSpan;
2425div = Dom.div({
2426unpassableStates: ['B', 'D']
2427});
2428spanA = Dom.span().appendTo(div);
2429spanB = Dom.span().appendTo(div);
2430subSpan = Dom.span().appendTo(spanB);
2431expect(div.state('A')).to.equal(false);
2432expect(spanA.state('A')).to.equal(false);
2433expect(spanB.state('A')).to.equal(false);
2434expect(subSpan.state('A')).to.equal(false);
2435div.state('A', true);
2436expect(div.state('A')).to.equal(true);
2437expect(spanA.state('A')).to.equal(true);
2438expect(spanB.state('A')).to.equal(true);
2439expect(subSpan.state('A')).to.equal(true);
2440div.state('B', true);
2441expect(div.state('B')).to.equal(true);
2442expect(spanA.state('B')).to.equal(false);
2443expect(spanB.state('B')).to.equal(false);
2444expect(subSpan.state('B')).to.equal(false);
2445div.state('C', true);
2446expect(div.state('C')).to.equal(true);
2447expect(spanA.state('C')).to.equal(true);
2448expect(spanB.state('C')).to.equal(true);
2449expect(subSpan.state('C')).to.equal(true);
2450div.state('D', true);
2451expect(div.state('D')).to.equal(true);
2452expect(spanA.state('D')).to.equal(false);
2453expect(spanB.state('D')).to.equal(false);
2454expect(subSpan.state('D')).to.equal(false);
2455spanB.state('D', true);
2456expect(spanB.state('D')).to.equal(true);
2457expect(subSpan.state('D')).to.equal(true);
2458div.state('D', false);
2459expect(div.state('D')).to.equal(false);
2460expect(spanB.state('D')).to.equal(true);
2461return expect(subSpan.state('D')).to.equal(true);
2462});
2463test("When .state() receives a truthy value as the third argument the event will bubble up to parents instead of cascade to children", function () {
2464var childA, childB, parentA, parentB, subChildA, subChildB, subParentA, subParentB;
2465parentA = Dom.section(null, subParentA = Dom.div(null, childA = Dom.div(null, subChildA = Dom.div())));
2466parentB = Dom.section(null, subParentB = Dom.div(null, childB = Dom.div(null, subChildB = Dom.div())));
2467expect(parentA.state('happy')).to.equal(false);
2468expect(parentB.state('happy')).to.equal(false);
2469expect(subParentA.state('happy')).to.equal(false);
2470expect(subParentB.state('happy')).to.equal(false);
2471expect(childA.state('happy')).to.equal(false);
2472expect(childB.state('happy')).to.equal(false);
2473expect(subChildA.state('happy')).to.equal(false);
2474expect(subChildB.state('happy')).to.equal(false);
2475childA.state('happy', true, true);
2476childB.state('happy', true);
2477expect(parentA.state('happy')).to.equal(true);
2478expect(parentB.state('happy')).to.equal(false);
2479expect(subParentA.state('happy')).to.equal(true);
2480expect(subParentB.state('happy')).to.equal(false);
2481expect(childA.state('happy')).to.equal(true);
2482expect(childB.state('happy')).to.equal(true);
2483expect(subChildA.state('happy')).to.equal(false);
2484expect(subChildB.state('happy')).to.equal(true);
2485childA.state('relaxed', true, null);
2486childB.state('relaxed', true, 'on');
2487expect(parentA.state('relaxed')).to.equal(false);
2488expect(parentB.state('relaxed')).to.equal(true);
2489expect(subParentA.state('relaxed')).to.equal(false);
2490expect(subParentB.state('relaxed')).to.equal(true);
2491expect(childA.state('relaxed')).to.equal(true);
2492expect(childB.state('relaxed')).to.equal(true);
2493expect(subChildA.state('relaxed')).to.equal(true);
2494return expect(subChildB.state('relaxed')).to.equal(false);
2495});
2496test("options.stateTriggers config objects can specify a 'force' property which will make them get attached even if they aren't used", function () {
2497var divA, divB;
2498divA = Dom.div({
2499stateTriggers: {
2500'happy': {
2501on: 'happyON',
2502off: 'happyOFF',
2503force: true
2504}
2505}
2506});
2507divB = Dom.div({
2508stateTriggers: {
2509'happy': {
2510on: 'happyON',
2511off: 'happyOFF'
2512}
2513}
2514});
2515expect(divA.state('happy')).to.equal(false);
2516expect(divB.state('happy')).to.equal(false);
2517divA.raw.emitEvent('happyON');
2518divB.raw.emitEvent('happyON');
2519expect(divA.state('happy')).to.equal(true);
2520expect(divB.state('happy')).to.equal(false);
2521divB.state('happy', true);
2522divA.raw.emitEvent('happyOFF');
2523divB.raw.emitEvent('happyOFF');
2524expect(divA.state('happy')).to.equal(false);
2525return expect(divB.state('happy')).to.equal(true);
2526});
2527test("options.stateTriggers config objects can specify a 'bubbles' property which will cause the state to bubble to parents instead of cascade to children", function () {
2528var childA, childB, parentA, parentB, subChildA, subChildB, subParentA, subParentB;
2529parentA = Dom.section(null, subParentA = Dom.div(null, childA = Dom.div({
2530stateTriggers: {
2531'happy': {
2532on: 'happyON',
2533off: 'happyOFF',
2534bubbles: true,
2535force: true
2536}
2537}
2538}, subChildA = Dom.div())));
2539parentB = Dom.section(null, subParentB = Dom.div(null, childB = Dom.div({
2540stateTriggers: {
2541'happy': {
2542on: 'happyON',
2543off: 'happyOFF',
2544force: true
2545}
2546}
2547}, subChildB = Dom.div())));
2548expect(parentA.state('happy')).to.equal(false);
2549expect(parentB.state('happy')).to.equal(false);
2550expect(subParentA.state('happy')).to.equal(false);
2551expect(subParentB.state('happy')).to.equal(false);
2552expect(childA.state('happy')).to.equal(false);
2553expect(childB.state('happy')).to.equal(false);
2554expect(subChildA.state('happy')).to.equal(false);
2555expect(subChildB.state('happy')).to.equal(false);
2556childA.raw.emitEvent('happyON');
2557childB.raw.emitEvent('happyON');
2558expect(parentA.state('happy')).to.equal(true);
2559expect(parentB.state('happy')).to.equal(false);
2560expect(subParentA.state('happy')).to.equal(true);
2561expect(subParentB.state('happy')).to.equal(false);
2562expect(childA.state('happy')).to.equal(true);
2563expect(childB.state('happy')).to.equal(true);
2564expect(subChildA.state('happy')).to.equal(false);
2565expect(subChildB.state('happy')).to.equal(true);
2566childA.raw.emitEvent('happyOFF');
2567childB.raw.emitEvent('happyOFF');
2568expect(parentA.state('happy')).to.equal(false);
2569expect(parentB.state('happy')).to.equal(false);
2570expect(subParentA.state('happy')).to.equal(false);
2571expect(subParentB.state('happy')).to.equal(false);
2572expect(childA.state('happy')).to.equal(false);
2573expect(childB.state('happy')).to.equal(false);
2574expect(subChildA.state('happy')).to.equal(false);
2575return expect(subChildB.state('happy')).to.equal(false);
2576});
2577test("wrappers created for existing elements should attempt to resolve if its inserted into the DOM on init", function () {
2578var divA, divA_, divB, divB_;
2579divA_ = document.createElement('div');
2580divB_ = document.createElement('div');
2581sandbox.appendChild(divB_);
2582divA = Dom(divA_);
2583divB = Dom(divB_);
2584divA_.style.height = '100px';
2585divB_.style.height = '100px';
2586expect(typeof divA.height).to.equal('number');
2587expect(typeof divB.height).to.equal('number');
2588expect(isNaN(divA.height)).to.be.true;
2589expect(isNaN(divB.height)).to.be.false;
2590return expect(divA.styleSafe('height')).to.equal('100px');
2591});
2592test("state-based text", function () {
2593var divA, divB, divC;
2594divA = Dom(['div', null, ['text', {
2595text: {
2596$base: 'abc123',
2597$happy: 'Happy',
2598$relaxed: 'Relaxed'
2599}
2600}]]);
2601divB = Dom(['div', null, ['text', {
2602text: {
2603$happy: 'Happy',
2604$relaxed: 'Relaxed',
2605'$relaxed+funny': 'Funny & Relaxed'
2606}
2607}]]);
2608divC = Dom.div({
2609text: {
2610$base: 'def456',
2611$happy: 'ghi789'
2612}
2613});
2614expect(divA.text).to.equal('abc123');
2615expect(divB.text).to.equal('');
2616expect(divC.text).to.equal('def456');
2617divA.state('happy', true);
2618divB.state('happy', true);
2619divC.state('happy', true);
2620expect(divA.text).to.equal('Happy');
2621expect(divB.text).to.equal('Happy');
2622expect(divC.text).to.equal('ghi789');
2623divA.state('happy', false);
2624divB.state('happy', false);
2625divC.state('happy', false);
2626expect(divA.text).to.equal('abc123');
2627expect(divB.text).to.equal('');
2628expect(divC.text).to.equal('def456');
2629divA.state('relaxed', true);
2630divB.state('relaxed', true);
2631expect(divA.text).to.equal('Relaxed');
2632expect(divB.text).to.equal('Relaxed');
2633divA.state('happy', true);
2634divB.state('happy', true);
2635expect(divA.text).to.equal('Relaxed');
2636expect(divB.text).to.equal('Relaxed');
2637divA.state('relaxed', false);
2638divB.state('relaxed', false);
2639expect(divA.text).to.equal('Happy');
2640expect(divB.text).to.equal('Happy');
2641divB.state('relaxed', true);
2642divB.state('funny', true);
2643expect(divB.text).to.equal('Relaxed');
2644divB.state('relaxed+funny', true);
2645return expect(divB.text).to.equal('Funny & Relaxed');
2646});
2647test("state changes will emit a private stateChange:<state> event", function () {
2648var div, results;
2649results = [];
2650div = Dom.div({
2651style: {
2652color: 'white',
2653opacity: 1,
2654$happy: {
2655color: 'black'
2656}
2657}
2658});
2659div.state('any', true);
2660div.on('stateChange:happy', function (state) {
2661return results.push(['happy', state]);
2662});
2663div.on('stateChange:relaxed', function (state) {
2664return results.push(['relaxed', state]);
2665});
2666div.on('stateChange:arbitrary', function (state) {
2667return results.push(['arbitrary', state]);
2668});
2669expect(results).to.deep.equal([]);
2670div.state('happy', true);
2671expect(results).to.deep.equal([['happy', true]]);
2672div.state('happy', false);
2673expect(results).to.deep.equal([['happy', true], ['happy', false]]);
2674div.state('happy', true);
2675expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true]]);
2676div.state('happy', true);
2677expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true]]);
2678div.state('another', true);
2679expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true]]);
2680div.state('relaxed', true);
2681expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true], ['relaxed', true]]);
2682div.state('arbitrary', true);
2683expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true], ['relaxed', true], ['arbitrary', true]]);
2684div.state('relaxed', true);
2685return expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true], ['relaxed', true], ['arbitrary', true]]);
2686});
2687test("state-based styles can be updated via QuickElement.updateStateStyles", function () {
2688var div, getStyles;
2689div = Dom.div({
2690style: {
2691width: 5,
2692height: 5,
2693marginTop: 5,
2694$happy: {
2695marginTop: 10
2696},
2697$relaxed: {
2698marginTop: 20,
2699width: 20,
2700$happy: {
2701height: 40,
2702marginTop: 40
2703}
2704},
2705$somethingElse: {
2706width: 60,
2707marginTop: 60
2708}
2709}
2710}).appendTo(sandbox);
2711getStyles = function () {
2712return {
2713width: div.style('width'),
2714height: div.style('height'),
2715marginTop: div.style('marginTop')
2716};
2717};
2718expect(getStyles()).to.eql({
2719width: '5px',
2720height: '5px',
2721marginTop: '5px'
2722});
2723div.state('happy', true);
2724expect(getStyles()).to.eql({
2725width: '5px',
2726height: '5px',
2727marginTop: '10px'
2728});
2729div.updateStateStyles({
2730width: 7,
2731height: 8,
2732$happy: {
2733marginTop: 12,
2734height: 12
2735}
2736});
2737expect(getStyles()).to.eql({
2738width: '7px',
2739height: '12px',
2740marginTop: '12px'
2741});
2742div.state('happy', false);
2743expect(getStyles()).to.eql({
2744width: '7px',
2745height: '8px',
2746marginTop: '5px'
2747});
2748div.state('happy', true);
2749expect(getStyles()).to.eql({
2750width: '7px',
2751height: '12px',
2752marginTop: '12px'
2753});
2754div.state('happy', false);
2755div.updateStateStyles({
2756$base: {
2757width: 2,
2758height: 9
2759},
2760$relaxed: {
2761height: 20,
2762$happy: {
2763width: 40,
2764marginTop: function () {
2765return 45;
2766}
2767}
2768}
2769});
2770expect(getStyles()).to.eql({
2771width: '2px',
2772height: '9px',
2773marginTop: '5px'
2774});
2775div.state('relaxed', true);
2776expect(getStyles()).to.eql({
2777width: '20px',
2778height: '20px',
2779marginTop: '20px'
2780});
2781div.state('happy', true);
2782expect(getStyles()).to.eql({
2783width: '40px',
2784height: '40px',
2785marginTop: '45px'
2786});
2787div.state({
2788happy: false,
2789relaxed: false
2790});
2791div.el.style.marginTop = null;
2792expect(getStyles()).to.eql({
2793width: '2px',
2794height: '9px',
2795marginTop: '5px'
2796});
2797div.state('somethingElse', true);
2798return expect(getStyles()).to.eql({
2799width: '60px',
2800height: '9px',
2801marginTop: '60px'
2802});
2803});
2804return test("default states to apply to an element upon creation can be specified via options.state mapping", function () {
2805var el1, el2, el3;
2806el1 = DOM.div();
2807el2 = DOM.div({
2808state: {
2809happy: true,
2810relaxed: false
2811}
2812});
2813el3 = DOM.div({
2814state: {
2815relaxed: true
2816}
2817});
2818expect(el1.state('happy')).to.equal(false);
2819expect(el1.state('relaxed')).to.equal(false);
2820expect(el2.state('happy')).to.equal(true);
2821expect(el2.state('relaxed')).to.equal(false);
2822expect(el3.state('happy')).to.equal(false);
2823return expect(el3.state('relaxed')).to.equal(true);
2824});
2825});
2826suite("Media Queries", function () {
2827suiteTeardown(function () {
2828var ref;
2829if ((ref = Object.getOwnPropertyDescriptor(window, 'innerWidth')) != null ? ref.configurable : void 0) {
2830return dimensions.restore();
2831}
2832});
2833suiteSetup(function () {
2834var ref;
2835if (!((ref = Object.getOwnPropertyDescriptor(window, 'innerWidth')) != null ? ref.configurable : void 0)) {
2836return this.skip();
2837}
2838});
2839teardown(function () {
2840var i, level, results1;
2841results1 = [];
2842for (level = i = 0; i <= 3; level = ++i) {
2843results1.push(Dom.CSS.clearRegistered(level));
2844}
2845return results1;
2846});
2847test("Window dimensions", function () {
2848var div;
2849dimensions.simulate(1000, 1000);
2850div = Dom.div({
2851style: {
2852position: 'relative',
2853zIndex: 2,
2854width: '300px',
2855height: '300px',
2856fontSize: '30px',
2857lineHeight: '30px',
2858'@window(orientation:landscape)': {
2859marginTop: 6
2860},
2861'@window(orientation:portrait)': {
2862marginTop: 7
2863},
2864'@window(max-width:800)': {
2865zIndex: 3,
2866width: '280px'
2867},
2868'@window(max-width:700, max-height:1000)': {
2869zIndex: 4,
2870width: '250px',
2871height: '250px'
2872},
2873'@window(max-height:1000)': {
2874fontSize: '25px'
2875},
2876'@window(min-width:900px)': {
2877fontSize: '23px'
2878},
2879'@window(aspect-ratio:0.5)': {
2880fontSize: '21px',
2881lineHeight: '12px'
2882},
2883'@window(min-height:1200)': {
2884fontSize: '20px'
2885}
2886}
2887});
2888div.appendTo(sandbox);
2889expect(div.style('zIndex')).to.equal('2');
2890expect(div.style('width')).to.equal('300px');
2891expect(div.style('height')).to.equal('300px');
2892expect(div.style('fontSize')).to.equal('23px');
2893expect(div.style('marginTop')).to.equal('7px');
2894dimensions.simulate(900);
2895expect(div.style('fontSize')).to.equal('23px');
2896dimensions.simulate(899);
2897expect(div.style('fontSize')).to.equal('25px');
2898dimensions.simulate(899, 1100);
2899expect(div.style('fontSize')).to.equal('30px');
2900dimensions.simulate(950);
2901expect(div.style('fontSize')).to.equal('23px');
2902dimensions.simulate(950, 1900);
2903expect(div.style('fontSize')).to.equal('20px');
2904expect(div.style('lineHeight')).to.equal('12px');
2905dimensions.simulate(950, 1899);
2906expect(div.style('fontSize')).to.equal('20px');
2907expect(div.style('lineHeight')).to.equal('30px');
2908dimensions.simulate(790);
2909expect(div.style('zIndex')).to.equal('3');
2910expect(div.style('width')).to.equal('280px');
2911dimensions.simulate(810);
2912expect(div.style('zIndex')).to.equal('2');
2913expect(div.style('width')).to.equal('300px');
2914dimensions.simulate(791);
2915expect(div.style('zIndex')).to.equal('3');
2916expect(div.style('width')).to.equal('280px');
2917dimensions.simulate(701, 900);
2918expect(div.style('zIndex')).to.equal('3');
2919expect(div.style('width')).to.equal('280px');
2920expect(div.style('height')).to.equal('300px');
2921dimensions.simulate(700, 900);
2922expect(div.style('zIndex')).to.equal('4');
2923expect(div.style('width')).to.equal('250px');
2924expect(div.style('height')).to.equal('250px');
2925dimensions.simulate(700, 1001);
2926expect(div.style('zIndex')).to.equal('3');
2927expect(div.style('width')).to.equal('280px');
2928expect(div.style('height')).to.equal('300px');
2929dimensions.simulate(700, 1000);
2930expect(div.style('zIndex')).to.equal('4');
2931expect(div.style('width')).to.equal('250px');
2932expect(div.style('height')).to.equal('250px');
2933expect(div.style('marginTop')).to.equal('7px');
2934dimensions.simulate(1100, 1000);
2935expect(div.style('marginTop')).to.equal('6px');
2936dimensions.simulate(1100, 1101);
2937return expect(div.style('marginTop')).to.equal('7px');
2938});
2939test("Self dimensions/styles", function () {
2940var div, parent, simulateParent;
2941parent = Dom.div().appendTo(sandbox);
2942simulateParent = function (width, height) {
2943if (width) {
2944parent.style('width', width);
2945}
2946if (height) {
2947parent.style('height', height);
2948}
2949return dimensions.simulate();
2950};
2951div = Dom.div({
2952style: {
2953position: 'relative',
2954zIndex: 2,
2955top: '30px',
2956width: '100%',
2957height: '100%',
2958fontSize: '30px',
2959lineHeight: '30px',
2960'@self(orientation:landscape)': {
2961marginTop: 6
2962},
2963'@self(orientation:portrait)': {
2964marginTop: 7
2965},
2966'@self(position:relative)': {
2967top: '20px'
2968},
2969'@self(max-width:350)': {
2970zIndex: 3,
2971fontSize: '33px'
2972},
2973'@self(max-width:500, min-height:400)': {
2974zIndex: 4,
2975fontSize: '27px',
2976lineHeight: '37px'
2977},
2978'@self(zIndex:4)': {
2979lineHeight: '15px'
2980},
2981'@self(min-zIndex:6)': {
2982opacity: '0'
2983},
2984'@self(max-fontSize:20)': {
2985lineHeight: '19px'
2986},
2987'@self(min-width:600px)': {
2988fontSize: '19px'
2989},
2990'@self(aspect-ratio:2.25)': {
2991fontSize: '22px',
2992lineHeight: '12px'
2993},
2994'@self(min-height:700)': {
2995fontSize: '40px'
2996}
2997}
2998});
2999simulateParent(400, 300);
3000div.appendTo(parent);
3001expect(div.style('zIndex')).to.equal('2');
3002expect(div.style('width')).to.equal('400px');
3003expect(div.style('height')).to.equal('300px');
3004expect(div.style('fontSize')).to.equal('30px');
3005expect(div.style('lineHeight')).to.equal('30px');
3006expect(div.style('marginTop')).to.equal('6px');
3007expect(div.style('top')).to.equal('20px');
3008simulateParent(349, 420);
3009expect(div.style('zIndex')).to.equal('4');
3010expect(div.style('fontSize')).to.equal('27px');
3011expect(div.style('lineHeight')).to.equal('15px');
3012simulateParent(349, 399);
3013expect(div.style('zIndex')).to.equal('3');
3014expect(div.style('fontSize')).to.equal('33px');
3015simulateParent(349, 401);
3016expect(div.style('zIndex')).to.equal('4');
3017expect(div.style('fontSize')).to.equal('27px');
3018expect(div.style('lineHeight')).to.equal('15px');
3019expect(div.style('opacity')).to.equal('1');
3020div.style('zIndex', 5);
3021dimensions.simulate();
3022expect(div.style('opacity')).to.equal('1');
3023expect(div.style('lineHeight')).to.equal('37px');
3024div.style('zIndex', 17);
3025expect(div.style('opacity')).to.equal('1');
3026dimensions.simulate();
3027expect(div.style('opacity')).to.equal('0');
3028simulateParent(900);
3029expect(div.style('fontSize')).to.equal('19px');
3030expect(div.style('lineHeight')).to.equal('30px');
3031simulateParent(900);
3032expect(div.style('lineHeight')).to.equal('19px');
3033simulateParent(900, 400);
3034expect(div.style('fontSize')).to.equal('22px');
3035expect(div.style('lineHeight')).to.equal('12px');
3036simulateParent(2025, 900);
3037expect(div.style('fontSize')).to.equal('40px');
3038expect(div.style('lineHeight')).to.equal('12px');
3039expect(div.style('marginTop')).to.equal('6px');
3040simulateParent(2025, 2026);
3041return expect(div.style('marginTop')).to.equal('7px');
3042});
3043test("Parent dimensions/styles", function () {
3044var div, parent, simulateParent;
3045parent = Dom.div({
3046style: {
3047position: 'absolute'
3048}
3049}).appendTo(sandbox);
3050simulateParent = function (width, height) {
3051if (width) {
3052parent.style('width', width);
3053}
3054if (height) {
3055parent.style('height', height);
3056}
3057return dimensions.simulate();
3058};
3059div = Dom.div({
3060style: {
3061position: 'relative',
3062zIndex: 2,
3063top: '30px',
3064width: '400px',
3065height: '300px',
3066fontSize: '30px',
3067lineHeight: '30px',
3068'@parent(orientation:landscape)': {
3069marginBottom: 6
3070},
3071'@parent(orientation:portrait)': {
3072marginBottom: 7
3073},
3074'@parent(position:relative)': {
3075top: '21px'
3076},
3077'@parent(max-width:350)': {
3078zIndex: 3,
3079fontSize: '34px'
3080},
3081'@parent(max-width:500, min-height:400)': {
3082zIndex: 4,
3083fontSize: '27px',
3084lineHeight: '37px'
3085},
3086'@parent(zIndex:7)': {
3087lineHeight: '16px'
3088}
3089}
3090});
3091simulateParent(400, 300);
3092div.appendTo(parent);
3093expect(div.style('zIndex')).to.equal('2');
3094expect(div.style('width')).to.equal('400px');
3095expect(div.style('height')).to.equal('300px');
3096expect(div.style('fontSize')).to.equal('30px');
3097expect(div.style('lineHeight')).to.equal('30px');
3098expect(div.style('marginBottom')).to.equal('6px');
3099expect(div.style('top')).to.equal('30px');
3100parent.style('position', 'relative');
3101expect(div.style('top')).to.equal('30px');
3102simulateParent();
3103expect(div.style('top')).to.equal('21px');
3104simulateParent(349, 420);
3105expect(div.style('zIndex')).to.equal('4');
3106expect(div.style('fontSize')).to.equal('27px');
3107expect(div.style('lineHeight')).to.equal('37px');
3108simulateParent(349, 399);
3109expect(div.style('zIndex')).to.equal('3');
3110expect(div.style('fontSize')).to.equal('34px');
3111parent.style('zIndex', '7');
3112simulateParent(349, 401);
3113expect(div.style('zIndex')).to.equal('4');
3114expect(div.style('fontSize')).to.equal('27px');
3115expect(div.style('lineHeight')).to.equal('16px');
3116return expect(div.style('opacity')).to.equal('1');
3117});
3118test("Parent Ref dimensions/styles", function () {
3119var div, parent;
3120parent = Dom.div({
3121ref: 'abc'
3122}, Dom.div({
3123id: 'def'
3124}, Dom.div({
3125ref: 'ghi'
3126}))).appendTo(sandbox);
3127div = Dom.div({
3128style: {
3129position: 'relative',
3130zIndex: 2,
3131top: '30px',
3132width: '400px',
3133height: '300px',
3134fontSize: '30px',
3135lineHeight: '30px',
3136'@#abc(orientation:landscape)': {
3137fontWeight: 600
3138},
3139'@#abc(orientation:portrait)': {
3140fontWeight: 500
3141},
3142'@#def(position:relative)': {
3143top: '20px'
3144},
3145'@#def(max-width:350)': {
3146zIndex: 3,
3147fontSize: '33px'
3148},
3149'@#ghi(max-width:500, min-height:400)': {
3150zIndex: 4,
3151fontSize: '27px',
3152lineHeight: '37px'
3153},
3154'@#abc(zIndex:7)': {
3155lineHeight: '15px'
3156}
3157}
3158});
3159parent.style({
3160width: 400,
3161height: 300
3162});
3163parent.child.def.style({
3164width: 400,
3165height: 300
3166});
3167parent.child.ghi.style({
3168width: 400,
3169height: 300
3170});
3171div.appendTo(parent.child.ghi);
3172expect(div.style('zIndex')).to.equal('2');
3173expect(div.style('width')).to.equal('400px');
3174expect(div.style('height')).to.equal('300px');
3175expect(div.style('fontSize')).to.equal('30px');
3176expect(div.style('lineHeight')).to.equal('30px');
3177expect(div.style('fontWeight')).to.equal('600');
3178expect(div.style('top')).to.equal('30px');
3179parent.style({
3180width: 400,
3181height: 900,
3182position: 'relative'
3183});
3184dimensions.simulate();
3185expect(div.style('fontWeight')).to.equal('500');
3186expect(div.style('top')).to.equal('30px');
3187parent.child.def.style({
3188position: 'relative'
3189});
3190expect(div.style('top')).to.equal('30px');
3191dimensions.simulate();
3192expect(div.style('top')).to.equal('20px');
3193parent.child.def.style({
3194width: 349,
3195height: 420
3196});
3197dimensions.simulate();
3198expect(div.style('zIndex')).to.equal('3');
3199expect(div.style('fontSize')).to.equal('33px');
3200parent.child.ghi.style({
3201width: 450,
3202height: 420
3203});
3204dimensions.simulate();
3205expect(div.style('zIndex')).to.equal('4');
3206expect(div.style('fontSize')).to.equal('27px');
3207expect(div.style('lineHeight')).to.equal('37px');
3208parent.style({
3209zIndex: 7
3210});
3211dimensions.simulate();
3212expect(div.style('zIndex')).to.equal('4');
3213expect(div.style('fontSize')).to.equal('27px');
3214expect(div.style('lineHeight')).to.equal('15px');
3215return expect(div.style('opacity')).to.equal('1');
3216});
3217return test("Nested media queries", function () {
3218var div;
3219dimensions.simulate(1000, 900);
3220div = Dom.div({
3221style: {
3222zIndex: 2,
3223$happy: {
3224marginRight: 5,
3225'@window(orientation:landscape)': {
3226marginRight: 6
3227}
3228},
3229'@window(orientation:portrait)': {
3230$relaxed: {
3231marginRight: 7
3232}
3233}
3234}
3235});
3236div.appendTo(sandbox);
3237expect(div.style('marginRight')).to.equal('0px');
3238div.state('happy', true);
3239expect(div.style('marginRight')).to.equal('6px');
3240dimensions.simulate(900, 1000);
3241expect(div.style('marginRight')).to.equal('5px');
3242dimensions.simulate(1000, 900);
3243expect(div.style('marginRight')).to.equal('6px');
3244div.state('relaxed', true);
3245expect(div.style('marginRight')).to.equal('6px');
3246dimensions.simulate(900, 1000);
3247expect(div.style('marginRight')).to.equal('7px');
3248dimensions.simulate(1000, 900);
3249return expect(div.style('marginRight')).to.equal('6px');
3250});
3251});
3252suite("Traversal", function () {
3253test("Children", function () {
3254var comment, div, div$, spanA, spanB, text;
3255div = Dom.div(null, Dom.div(), 'Some Text');
3256expect(div.children.length).to.equal(2);
3257expect(div.elementChildren.length).to.equal(1);
3258expect(div.el.childNodes.length).to.equal(2);
3259div.append(Dom.span());
3260expect(div.children.length).to.equal(3);
3261expect(div.elementChildren.length).to.equal(2);
3262expect(div.el.childNodes.length).to.equal(3);
3263div.el.appendChild(document.createElement('div'));
3264expect(div.children.length).to.equal(4);
3265expect(div.elementChildren.length).to.equal(3);
3266expect(div.el.childNodes.length).to.equal(4);
3267div = document.createElement('div');
3268spanA = document.createElement('span');
3269spanB = document.createElement('span');
3270text = document.createTextNode('someTextNode');
3271comment = document.createComment('someCommentNode');
3272div.appendChild(spanA);
3273div.appendChild(comment);
3274div.appendChild(spanB);
3275div.appendChild(text);
3276expect(div.childNodes.length).to.equal(4);
3277expect(div.children.length).to.equal(2);
3278div$ = Dom(div);
3279expect(div$.children.length).to.equal(3);
3280expect(div$.elementChildren.length).to.equal(2);
3281expect(div$.children[0].raw).to.equal(spanA);
3282expect(div$.children[1].raw).to.equal(spanB);
3283return expect(div$.children[2].raw).to.equal(text);
3284});
3285test("Parent", function () {
3286var A, B, C;
3287A = Dom.div(null, Dom.div(), 'Some Text');
3288B = Dom.div();
3289C = Dom.div();
3290expect(A.parent).to.equal(void 0);
3291expect(A.children[0].parent).to.equal(A);
3292expect(A.children[0].el.parentNode).to.equal(A.el);
3293B.append(A);
3294expect(A.parent).to.equal(B);
3295expect(A.children[0].parent).to.equal(A);
3296expect(A.children[0].el.parentNode).to.equal(A.el);
3297expect(B.children.length).to.equal(1);
3298expect(B.children[0]).to.equal(A);
3299C.append(A);
3300expect(A.parent).to.equal(C);
3301expect(A.children[0].parent).to.equal(A);
3302expect(A.children[0].el.parentNode).to.equal(A.el);
3303expect(B.children.length).to.equal(0);
3304return expect(C.children[0]).to.equal(A);
3305});
3306test("Parents", function () {
3307var A, B, C;
3308A = Dom.div().appendTo(sandbox);
3309B = Dom.div().appendTo(A);
3310C = Dom.div().appendTo(B);
3311expect(A.parent.el).to.equal(sandbox);
3312expect(B.parent).to.equal(A);
3313expect(C.parent).to.equal(B);
3314expect(A.parents.length).to.equal(B.parents.length - 1);
3315expect(B.parents.length).to.equal(C.parents.length - 1);
3316expect(B.parents[0]).to.equal(A);
3317expect(C.parents[0]).to.equal(B);
3318expect(C.parents.length).to.equal(5);
3319return expect(C.parents.slice(-1)[0].el).to.equal(document.documentElement);
3320});
3321suite("Parent Matching", function () {
3322teardown(function () {
3323return this.els.A.detach();
3324});
3325suiteSetup(function () {
3326var A, B, C, D;
3327A = Dom.section({
3328ref: 'A'
3329});
3330B = Dom.div({
3331ref: 'B'
3332}).appendTo(A);
3333C = Dom.div({
3334ref: 'C'
3335}).appendTo(B);
3336D = Dom.span({
3337ref: 'D'
3338}).appendTo(C);
3339return this.els = {
3340A,
3341B,
3342C,
3343D
3344};
3345});
3346test("function filter", function () {
3347var A, B, C, D;
3348({A, B, C, D} = this.els);
3349expect(D.parents).to.eql([C, B, A]);
3350expect(D.parentMatching(null)).to.equal(void 0);
3351expect(D.parentMatching(B)).to.equal(void 0);
3352expect(D.parentMatching(function () {
3353return false;
3354})).to.equal(void 0);
3355expect(D.parentMatching(function (el) {
3356return el === B;
3357})).to.equal(B);
3358expect(D.parentMatching(function (el) {
3359return el === A;
3360})).to.equal(A);
3361expect(D.parentMatching(function (el) {
3362return el === C;
3363})).to.equal(C);
3364A.appendTo(sandbox);
3365return expect(D.parentMatching(function (el) {
3366return el.raw === document.documentElement;
3367})).to.equal(Dom(document.documentElement));
3368});
3369return test("ref filter", function () {
3370var A, B, C, D;
3371({A, B, C, D} = this.els);
3372expect(D.parents).to.eql([C, B, A]);
3373expect(D.parentMatching('badRef')).to.equal(void 0);
3374expect(D.parentMatching('B')).to.equal(B);
3375expect(D.parentMatching('A')).to.equal(A);
3376return expect(D.parentMatching('C')).to.equal(C);
3377});
3378});
3379suite("Parents Until", function () {
3380suiteSetup(function () {
3381var A, B, C, D;
3382A = Dom.section({
3383ref: 'A'
3384});
3385B = Dom.div({
3386ref: 'B'
3387}).appendTo(A);
3388C = Dom.div({
3389ref: 'C'
3390}).appendTo(B);
3391D = Dom.span({
3392ref: 'D'
3393}).appendTo(C);
3394return this.els = {
3395A,
3396B,
3397C,
3398D
3399};
3400});
3401test("function filter", function () {
3402var A, B, C, D;
3403({A, B, C, D} = this.els);
3404expect(D.parents).to.eql([C, B, A]);
3405expect(D.parentsUntil(null)).to.eql([C, B, A]);
3406expect(D.parentsUntil()).to.eql([C, B, A]);
3407expect(D.parentsUntil(function (el) {
3408return el === A;
3409})).to.eql([C, B]);
3410expect(D.parentsUntil(function (el) {
3411return el === B;
3412})).to.eql([C]);
3413return expect(D.parentsUntil(function (el) {
3414return false;
3415})).to.eql([C, B, A]);
3416});
3417return test("ref filter", function () {
3418var A, B, C, D;
3419({A, B, C, D} = this.els);
3420expect(D.parentsUntil('A')).to.eql([C, B]);
3421expect(D.parentsUntil('B')).to.eql([C]);
3422return expect(D.parentsUntil('badRef')).to.eql([C, B, A]);
3423});
3424});
3425test("Next", function () {
3426var A, B, C, D, E, div;
3427div = Dom.div(null, A = Dom.div(), B = Dom.div(), C = Dom.div(), D = Dom.div(), E = Dom.div());
3428expect(A.next).to.equal(B);
3429expect(C.next).to.equal(D);
3430expect(E.next).to.equal(void 0);
3431return expect(B.nextAll).to.eql([C, D, E]);
3432});
3433test("Next Element", function () {
3434var A, B, C, D, E, div;
3435div = Dom.div(null, A = Dom.div(), B = Dom.text(), C = Dom.div(), D = Dom.text(), E = Dom.div());
3436expect(A.next).to.equal(B);
3437expect(A.nextEl).to.equal(C);
3438expect(B.nextEl).to.equal(C);
3439expect(C.nextEl).to.equal(E);
3440expect(E.nextEl).to.equal(void 0);
3441return expect(A.nextElAll).to.eql([C, E]);
3442});
3443test("Prev", function () {
3444var A, B, C, D, E, div;
3445div = Dom.div(null, A = Dom.div(), B = Dom.div(), C = Dom.div(), D = Dom.div(), E = Dom.div());
3446expect(E.prev).to.equal(D);
3447expect(C.prev).to.equal(B);
3448expect(A.prev).to.equal(void 0);
3449return expect(D.prevAll).to.eql([C, B, A]);
3450});
3451test("Prev Element", function () {
3452var A, B, C, D, E, div;
3453div = Dom.div(null, A = Dom.div(), B = Dom.text(), C = Dom.div(), D = Dom.text(), E = Dom.div());
3454expect(E.prev).to.equal(D);
3455expect(E.prevEl).to.equal(C);
3456expect(D.prevEl).to.equal(C);
3457expect(C.prevEl).to.equal(A);
3458expect(A.prevEl).to.equal(void 0);
3459return expect(E.prevElAll).to.eql([C, A]);
3460});
3461test("Siblings", function () {
3462var A, B, C, D, E, div;
3463div = Dom.div(null, A = Dom.div(), B = Dom.text(), C = Dom.div(), D = Dom.text(), E = Dom.div());
3464expect(C.siblings).to.eql(C.prevAll.reverse().concat(C.nextAll));
3465expect(C.siblings).to.eql([A, B, D, E]);
3466expect(C.elementSiblings).to.eql([A, E]);
3467return expect(B.elementSiblings).to.eql([A, C, E]);
3468});
3469test("First/Last Child", function () {
3470var divA, divB, divBA, divBB, divC, main;
3471main = DOM.div({
3472id: 'main'
3473});
3474divA = DOM.div({
3475id: 'divA'
3476}).appendTo(main);
3477divB = DOM.div({
3478id: 'divB'
3479}).appendTo(main);
3480divC = DOM.div({
3481id: 'divC'
3482}).appendTo(main);
3483divBA = DOM.div({
3484id: 'divBA'
3485}).appendTo(divB);
3486divBB = DOM.div({
3487id: 'divBB'
3488}).appendTo(divB);
3489expect(main.firstChild).to.equal(divA);
3490expect(main.lastChild).to.equal(divC);
3491expect(divA.firstChild).to.equal(void 0);
3492expect(divA.lastChild).to.equal(void 0);
3493expect(divB.firstChild).to.equal(divBA);
3494return expect(divB.lastChild).to.equal(divBB);
3495});
3496test("Child (by ref)", function () {
3497var divA, divB, divC, newChild, newChildChild, newParent, sandBox;
3498divA = Dom.div({
3499id: 'divA'
3500}, Dom.div({
3501id: 'childA'
3502}, Dom.span({
3503ref: 'childA_1'
3504}), Dom.div({
3505ref: 'childA_2',
3506id: 'childA_2'
3507})), Dom.div({}, Dom.span({
3508ref: 'childB_1'
3509}), Dom.text({
3510id: 'childB_2'
3511}, 'The Text')));
3512divB = Dom.template(['div', {
3513id: 'divB'
3514}, ['div', {
3515id: 'childA',
3516style: {
3517color: 'pink'
3518}
3519}, ['span', {
3520ref: 'childA_1'
3521}], ['div', {
3522ref: 'childA_3',
3523id: 'childA_2'
3524}]], ['div', null, ['span', {
3525ref: 'childB_1'
3526}]]]).spawn();
3527divC = Dom.template(['div', {
3528ref: 'divC'
3529}, ['div', {
3530ref: 'childA'
3531}, ['div', {
3532ref: 'divB'
3533}], ['div', {
3534ref: 'divC'
3535}]], ['div', {
3536ref: 'childB'
3537}, ['div', {
3538ref: 'divB'
3539}], ['div', {
3540ref: 'divC'
3541}], ['div', {
3542ref: 'divD'
3543}, ['div', {
3544ref: 'childB'
3545}]]]]).spawn();
3546expect(divA.child.childA).to.equal(divA.children[0]);
3547expect(divA.child.childA_1).to.equal(divA.children[0].children[0]);
3548expect(divA.child.childA_2).to.equal(divA.children[0].children[1]);
3549expect(divA.child.childA_3).to.equal(void 0);
3550expect(divA.child.childB).to.equal(void 0);
3551expect(divA.child.childB_1).to.equal(divA.children[1].children[0]);
3552expect(divA.child.childB_2).to.equal(divA.children[1].children[1]);
3553expect(divA.child.childB_2.type).to.equal('text');
3554expect(divB.child.childA).to.equal(divB.children[0]);
3555expect(divB.child.childA_1).to.equal(divB.children[0].children[0]);
3556expect(divB.child.childA_2).to.equal(divB.children[0].children[1]);
3557expect(divB.child.childA_3).to.equal(void 0);
3558expect(divB.child.childB).to.equal(void 0);
3559expect(divB.child.childB_1).to.equal(divB.children[1].children[0]);
3560expect(divB.child.childB_2).to.equal(divB.children[1].children[1]);
3561expect(divB.child.childA.style('color')).to.equal('');
3562expect(divB.child.childA.styleSafe('color')).not.to.equal('');
3563expect(divB.child.childA.styleSafe('color').length >= 4).to.be.true;
3564expect(divA.child.childA.raw.getAttribute('id')).to.equal('childA');
3565expect(divA.child.childA.raw.getAttribute('data-ref')).to.equal('childA');
3566expect(divA.child.childA_1.raw.getAttribute('id')).to.equal(null);
3567expect(divA.child.childA_1.raw.getAttribute('data-ref')).to.equal('childA_1');
3568expect(divA.child.childA_2.raw.getAttribute('id')).to.equal('childA_2');
3569expect(divA.child.childA_2.raw.getAttribute('data-ref')).to.equal('childA_2');
3570expect(divC.child.childA).to.equal(divC.children[0]);
3571expect(divC.child.childB).to.equal(divC.children[1]);
3572expect(divC.child.divB).to.equal(divC.children[0].children[0]);
3573expect(divC.child.divC).to.equal(divC);
3574expect(divC.child.divD).to.equal(divC.children[1].children[2]);
3575expect(divC.children[0].child.divB).to.equal(divC.children[0].children[0]);
3576expect(divC.children[0].child.divC).to.equal(divC.children[0].children[1]);
3577expect(divC.children[1].child.divB).to.equal(divC.children[1].children[0]);
3578expect(divC.children[1].child.divC).to.equal(divC.children[1].children[1]);
3579expect(divC.children[1].child.divD).to.equal(divC.children[1].children[2]);
3580expect(divC.children[1].child.childB).to.equal(divC.children[1]);
3581sandBox = Dom(sandbox);
3582expect(sandBox.child.childA).to.equal(void 0);
3583expect(sandBox.child.childB_2).to.equal(void 0);
3584expect(sandBox.child.divA).to.equal(void 0);
3585sandBox.append(divA);
3586expect(sandBox.child.childA).to.equal(void 0);
3587expect(sandBox.child.childB_2).to.equal(void 0);
3588expect(sandBox.child.divA).to.equal(void 0);
3589expect(sandBox.childf.divA).to.equal(divA);
3590expect(sandBox.child.childA).to.equal(divA.children[0]);
3591expect(sandBox.child.childB_2).to.equal(divA.children[1].children[1]);
3592expect(sandBox.child.divA).to.equal(divA);
3593newChild = Dom.div({
3594ref: 'newChild'
3595});
3596newChildChild = Dom.div({
3597ref: 'newChildChild'
3598});
3599expect(newChild.child.newChildChild).to.equal(void 0);
3600expect(newChildChild.child.newChildChild).to.equal(newChildChild);
3601expect(Object.keys(newChildChild.child).length).to.equal(1);
3602newChildChild.appendTo(newChild);
3603expect(newChild.child.newChildChild).to.equal(void 0);
3604expect(newChild.childf.newChildChild).to.equal(newChildChild);
3605expect(newChild.child.newChildChild).to.equal(newChildChild);
3606expect(Object.keys(newChildChild.child).length).to.equal(1);
3607newParent = Dom.div({
3608ref: 'newParent'
3609});
3610newChild.appendTo(newParent);
3611return expect(newParent.child.newChildChild).to.equal(newChildChild);
3612});
3613test("Index", function () {
3614var childA, childB, childC, childD, childE, childF, section;
3615section = Dom.section(null, childA = Dom.div(), childB = Dom.div(), childC = Dom.span(), childD = Dom.text(), childE = Dom.span(), childF = Dom.div());
3616expect(childB.index).to.equal(1);
3617expect(childD.index).to.equal(3);
3618expect(childF.index).to.equal(5);
3619childC.detach();
3620expect(childB.index).to.equal(1);
3621expect(childD.index).to.equal(2);
3622expect(childF.index).to.equal(4);
3623return expect(childC.index).to.equal(null);
3624});
3625test("Index (by type)", function () {
3626var childA, childB, childC, childD, childE, childF, childG, section;
3627section = Dom.section(null, childA = Dom.div(), childB = Dom.div(), childC = Dom.span(), childD = Dom.text(), childE = Dom.span(), childF = Dom.text(), childG = Dom.div());
3628expect(childB.indexType).to.equal(1);
3629expect(childD.indexType).to.equal(0);
3630expect(childF.indexType).to.equal(1);
3631expect(childG.indexType).to.equal(2);
3632childC.detach();
3633expect(childB.indexType).to.equal(1);
3634expect(childD.indexType).to.equal(0);
3635expect(childF.indexType).to.equal(1);
3636expect(childG.indexType).to.equal(2);
3637childA.detach();
3638expect(childB.indexType).to.equal(0);
3639expect(childD.indexType).to.equal(0);
3640expect(childF.indexType).to.equal(1);
3641expect(childG.indexType).to.equal(1);
3642expect(childA.indexType).to.equal(null);
3643return expect(childC.indexType).to.equal(null);
3644});
3645test("Index (by ref)", function () {
3646var childA, childB, childC, childD, childE, childF, childG, section;
3647section = Dom.section(null, childA = Dom.div({
3648ref: 'abc'
3649}), childB = Dom.div({
3650ref: 'abc'
3651}), childC = Dom.span({
3652ref: 'def'
3653}), childD = Dom.text({
3654ref: 'abc'
3655}), childE = Dom.span({
3656ref: 'abc'
3657}), childF = Dom.text({
3658ref: 'def'
3659}), childG = Dom.div({
3660ref: 'abc'
3661}));
3662expect(childB.indexRef).to.equal(1);
3663expect(childD.indexRef).to.equal(2);
3664expect(childF.indexRef).to.equal(1);
3665expect(childG.indexRef).to.equal(4);
3666childC.detach();
3667expect(childB.indexRef).to.equal(1);
3668expect(childD.indexRef).to.equal(2);
3669expect(childF.indexRef).to.equal(0);
3670expect(childG.indexRef).to.equal(4);
3671childA.detach();
3672expect(childB.indexRef).to.equal(0);
3673expect(childD.indexRef).to.equal(1);
3674expect(childF.indexRef).to.equal(0);
3675expect(childG.indexRef).to.equal(3);
3676expect(childA.indexRef).to.equal(null);
3677return expect(childC.indexRef).to.equal(null);
3678});
3679test("Query", function () {
3680var div, sandBox;
3681div = Dom.template(['div', {
3682class: 'div-one',
3683attrs: {
3684name: 'abc123'
3685}
3686}, ['div', {
3687class: 'childA',
3688style: {
3689color: 'pink'
3690}
3691}, ['span', {
3692class: 'childA_1'
3693}], ['div', {
3694class: 'childA_1'
3695}], ['span', {
3696class: 'childA_1'
3697}], ['div', {
3698class: 'childA_2'
3699}]], ['div', {
3700className: 'childB'
3701}, ['span', {
3702class: 'childB_1'
3703}]], ['section', {
3704className: 'childB'
3705}, ['span', {
3706class: 'childB_1'
3707}]]]).spawn().appendTo(sandBox = Dom(sandbox));
3708expect(div.query('.childA')).to.equal(div.children[0]);
3709expect(div.query('.childB')).to.equal(div.children[1]);
3710expect(div.query('.childB_1')).to.equal(div.children[1].children[0]);
3711expect(div.query('.childA_1')).to.equal(div.children[0].children[0]);
3712expect(div.query('.childA_2')).to.equal(div.children[0].children[3]);
3713expect(sandBox.query('.div-one')).to.equal(div);
3714expect(sandBox.query('.childB_1')).to.equal(div.children[1].children[0]);
3715expect(sandBox.query('div[name="abc123"]')).to.equal(div);
3716return expect(sandBox.query('span[name="abc123"]')).to.equal(void 0);
3717});
3718test("QueryAll", function () {
3719var div, sandBox;
3720div = Dom.template(['div', {
3721class: 'div-one',
3722attrs: {
3723name: 'abc123'
3724}
3725}, ['div', {
3726class: 'childA',
3727style: {
3728color: 'pink'
3729}
3730}, ['span', {
3731class: 'childA_1'
3732}], ['div', {
3733class: 'childA_1'
3734}], ['span', {
3735class: 'childA_1'
3736}], ['div', {
3737class: 'childA_2'
3738}]], ['div', {
3739className: 'childB'
3740}, ['span', {
3741class: 'childB_1'
3742}]], ['section', {
3743className: 'childB'
3744}, ['span', {
3745class: 'childB_1'
3746}]]]).spawn().appendTo(sandBox = Dom(sandbox));
3747expect(div.queryAll('.childA').elements).to.eql([div.children[0]]);
3748expect(div.queryAll('.childB').elements).to.eql([div.children[1], div.children[2]]);
3749expect(div.queryAll('.childB_1').elements).to.eql([div.children[1].children[0], div.children[2].children[0]]);
3750expect(div.queryAll('.childA_1').elements).to.eql([div.children[0].children[0], div.children[0].children[1], div.children[0].children[2]]);
3751expect(div.queryAll('.childA_2').elements).to.eql([div.children[0].children[3]]);
3752expect(sandBox.queryAll('.div-one').elements).to.eql([div]);
3753expect(sandBox.queryAll('.childB_1').elements).to.eql([div.children[1].children[0], div.children[2].children[0]]);
3754expect(sandBox.queryAll('div[name="abc123"]').elements).to.eql([div]);
3755expect(sandBox.queryAll('span[name="abc123"]').elements).to.eql([]);
3756expect(div.text).to.equal('');
3757expect(sandBox.queryAll('.childB_1').text('abc123').elements).to.eql([div.children[1].children[0], div.children[2].children[0]]);
3758return expect(div.text).to.equal('abc123abc123');
3759});
3760return test("Query/QueryAll shortcuts", function () {
3761var allA, allB, el, i, index, len;
3762expect(Dom.query('head')).to.equal(Dom(document).query('head'));
3763expect(Dom.query('body')).to.equal(Dom(document).query('body'));
3764allA = Dom.queryAll('section').elements;
3765allB = Dom(document).queryAll('section').elements;
3766expect(allA.length).to.equal(allB.length);
3767for ((index = i = 0, len = allA.length); i < len; index = ++i) {
3768el = allA[index];
3769expect(allA[index]).to.equal(allB[index]);
3770}
3771});
3772});
3773suite("Manipulation", function () {
3774test(".append()", function () {
3775var A, B, C, D, MainA, MainB;
3776A = Dom.div();
3777B = Dom.div();
3778C = Dom.text();
3779D = Dom.div();
3780MainA = Dom.div(null, A, B, C, D);
3781MainB = Dom.div();
3782checkChildStructure(MainA)(A, B, C, D);
3783checkChildStructure(MainB)();
3784MainB.append(A);
3785checkChildStructure(MainA)(B, C, D);
3786checkChildStructure(MainB)(A);
3787C.appendTo(MainB);
3788checkChildStructure(MainA)(B, D);
3789return checkChildStructure(MainB)(A, C);
3790});
3791test(".prepend()", function () {
3792var A, B, C, D, MainA, MainB;
3793A = Dom.div();
3794B = Dom.div();
3795C = Dom.text();
3796D = Dom.div();
3797MainA = Dom.div(null, A, B, C, D);
3798MainB = Dom.div();
3799checkChildStructure(MainA)(A, B, C, D);
3800checkChildStructure(MainB)();
3801MainB.prepend(A);
3802checkChildStructure(MainA)(B, C, D);
3803checkChildStructure(MainB)(A);
3804C.prependTo(MainB);
3805checkChildStructure(MainA)(B, D);
3806return checkChildStructure(MainB)(C, A);
3807});
3808test(".after()", function () {
3809var A, B, C, D, MainA, MainB;
3810A = Dom.div();
3811B = Dom.div();
3812C = Dom.text();
3813D = Dom.div();
3814MainA = Dom.div(null, A, B, C, D);
3815MainB = Dom.div();
3816checkChildStructure(MainA)(A, B, C, D);
3817checkChildStructure(MainB)();
3818MainB.append(B);
3819B.after(A);
3820checkChildStructure(MainA)(C, D);
3821checkChildStructure(MainB)(B, A);
3822C.insertAfter(B);
3823checkChildStructure(MainA)(D);
3824return checkChildStructure(MainB)(B, C, A);
3825});
3826test(".before()", function () {
3827var A, B, C, D, MainA, MainB;
3828A = Dom.div();
3829B = Dom.div();
3830C = Dom.text();
3831D = Dom.div();
3832MainA = Dom.div(null, A, B, C, D);
3833MainB = Dom.div();
3834checkChildStructure(MainA)(A, B, C, D);
3835checkChildStructure(MainB)();
3836MainB.append(B);
3837B.before(A);
3838checkChildStructure(MainA)(C, D);
3839checkChildStructure(MainB)(A, B);
3840C.insertBefore(B);
3841checkChildStructure(MainA)(D);
3842return checkChildStructure(MainB)(A, C, B);
3843});
3844test(".detach()", function () {
3845var div, emitCount;
3846emitCount = 0;
3847div = Dom.div(null, 'Inner Text Here');
3848div.on('beep', function () {
3849return emitCount++;
3850});
3851div.state('happy', true);
3852div.state('relaxed', true);
3853expect(div.parent).not.to.exist;
3854expect(emitCount).to.equal(0);
3855expect(div.state('happy')).to.be.true;
3856expect(div.state('relaxed')).to.be.true;
3857div.appendTo(sandbox);
3858div.emit('beep');
3859expect(sandbox.children.length).to.equal(1);
3860expect(div.parent.el).to.equal(sandbox);
3861expect(emitCount).to.equal(1);
3862expect(div.state('happy')).to.be.true;
3863expect(div.state('relaxed')).to.be.true;
3864div.detach();
3865div.emit('beep');
3866expect(sandbox.children.length).to.equal(0);
3867expect(div.parent).not.to.exist;
3868expect(emitCount).to.equal(2);
3869expect(div.state('happy')).to.be.true;
3870return expect(div.state('relaxed')).to.be.true;
3871});
3872test(".remove()", function () {
3873var div, emitCount;
3874emitCount = 0;
3875div = Dom.div(null, 'Inner Text Here');
3876div.on('beep', function () {
3877return emitCount++;
3878});
3879div.state('happy', true);
3880div.state('relaxed', true);
3881expect(div.parent).not.to.exist;
3882expect(emitCount).to.equal(0);
3883expect(div.state('happy')).to.be.true;
3884expect(div.state('relaxed')).to.be.true;
3885div.appendTo(sandbox);
3886div.emit('beep');
3887expect(sandbox.children.length).to.equal(1);
3888expect(div.parent.el).to.equal(sandbox);
3889expect(emitCount).to.equal(1);
3890expect(div.state('happy')).to.be.true;
3891expect(div.state('relaxed')).to.be.true;
3892div.remove();
3893div.emit('beep');
3894expect(sandbox.children.length).to.equal(0);
3895expect(div.parent).not.to.exist;
3896expect(emitCount).to.equal(1);
3897expect(div.state('happy')).to.be.false;
3898return expect(div.state('relaxed')).to.be.false;
3899});
3900test(".empty()", function () {
3901var A, B, Main;
3902Main = Dom.div();
3903A = Dom.div().appendTo(Main);
3904B = Dom.div().appendTo(Main);
3905A.state('happy', true);
3906B.state('happy', true);
3907checkChildStructure(Main)(A, B);
3908expect(A.state('happy')).to.be.true;
3909expect(B.state('happy')).to.be.true;
3910Main.empty();
3911checkChildStructure(Main)();
3912expect(A.parent).to.equal(void 0);
3913expect(B.parent).to.equal(void 0);
3914expect(A.state('happy')).to.be.true;
3915return expect(B.state('happy')).to.be.true;
3916});
3917test(".wrap()", function () {
3918var A, B, C, Main, wrapA, wrapB, wrapC;
3919Main = Dom.div();
3920A = Dom.div().appendTo(Main);
3921B = Dom.div().appendTo(Main);
3922C = Dom.div();
3923wrapA = Dom.section();
3924wrapB = Dom.section();
3925wrapC = Dom.section();
3926A.state('happy', true);
3927B.state('happy', true);
3928C.state('happy', true);
3929wrapA.state('relaxed', true);
3930wrapB.state('relaxed', true);
3931wrapC.state('relaxed', true);
3932checkChildStructure(Main)(A, B);
3933A.wrap(wrapA);
3934checkChildStructure(Main)(wrapA, B);
3935checkChildStructure(wrapA)(A);
3936B.wrap(wrapB);
3937checkChildStructure(Main)(wrapA, wrapB);
3938checkChildStructure(wrapA)(A);
3939checkChildStructure(wrapB)(B);
3940B.wrap(wrapA);
3941checkChildStructure(Main)(wrapA, wrapB);
3942checkChildStructure(wrapA)(A, B);
3943checkChildStructure(wrapB)();
3944wrapC.appendTo(wrapB);
3945C.wrap(wrapC);
3946C.wrap();
3947checkChildStructure(Main)(wrapA, wrapB);
3948checkChildStructure(wrapA)(A, B);
3949checkChildStructure(wrapB)(wrapC);
3950checkChildStructure(wrapC)(C);
3951C.wrap(C);
3952checkChildStructure(Main)(wrapA, wrapB);
3953checkChildStructure(wrapA)(A, B);
3954checkChildStructure(wrapB)(wrapC);
3955checkChildStructure(wrapC)(C);
3956expect(A.state('happy')).to.be.true;
3957expect(B.state('happy')).to.be.true;
3958expect(C.state('happy')).to.be.true;
3959expect(wrapA.state('relaxed')).to.be.true;
3960expect(wrapB.state('relaxed')).to.be.true;
3961return expect(wrapC.state('relaxed')).to.be.true;
3962});
3963test(".unwrap()", function () {
3964var A, B, C, D, E, Main;
3965Main = Dom.div();
3966A = Dom.div().prependTo(Main);
3967B = Dom.div().appendTo(A);
3968C = Dom.div().appendTo(A);
3969D = Dom.div().appendTo(C);
3970E = Dom.div().appendTo(D);
3971A.state('happy', true);
3972B.state('happy', true);
3973C.state('happy', true);
3974D.state('happy', true);
3975E.state('happy', true);
3976checkChildStructure(Main)(A);
3977checkChildStructure(A)(B, C);
3978checkChildStructure(B)();
3979checkChildStructure(C)(D);
3980checkChildStructure(D)(E);
3981E.unwrap();
3982checkChildStructure(Main)(A);
3983checkChildStructure(A)(B, C);
3984checkChildStructure(B)();
3985checkChildStructure(C)(E);
3986checkChildStructure(D)();
3987B.unwrap();
3988checkChildStructure(Main)(B, C);
3989checkChildStructure(A)();
3990checkChildStructure(B)();
3991checkChildStructure(C)(E);
3992checkChildStructure(D)();
3993E.unwrap();
3994checkChildStructure(Main)(B, E);
3995checkChildStructure(A)();
3996checkChildStructure(B)();
3997checkChildStructure(C)();
3998checkChildStructure(D)();
3999A.insertAfter(B);
4000C.appendTo(A);
4001D.appendTo(A);
4002checkChildStructure(Main)(B, A, E);
4003checkChildStructure(A)(C, D);
4004checkChildStructure(B)();
4005checkChildStructure(C)();
4006checkChildStructure(D)();
4007D.unwrap();
4008checkChildStructure(Main)(B, C, D, E);
4009checkChildStructure(A)();
4010checkChildStructure(B)();
4011checkChildStructure(C)();
4012return checkChildStructure(D)();
4013});
4014test(".replace()", function () {
4015var A, B, C, D, E, Main;
4016Main = Dom.div();
4017A = Dom.div().appendTo(Main);
4018B = Dom.div().appendTo(Main);
4019C = Dom.div().appendTo(A);
4020D = Dom.div().appendTo(A);
4021E = Dom.div().appendTo(D);
4022A.replace();
4023E.replace();
4024checkChildStructure(Main)(A, B);
4025checkChildStructure(A)(C, D);
4026checkChildStructure(B)();
4027checkChildStructure(C)();
4028checkChildStructure(D)(E);
4029C.replace(E).appendTo(B);
4030checkChildStructure(Main)(A, B);
4031checkChildStructure(A)(E, D);
4032checkChildStructure(B)(C);
4033checkChildStructure(C)();
4034checkChildStructure(D)();
4035D.replace(E);
4036checkChildStructure(Main)(A, B);
4037checkChildStructure(A)(E);
4038checkChildStructure(B)(C);
4039checkChildStructure(C)();
4040checkChildStructure(D)();
4041B.replace(C);
4042checkChildStructure(Main)(A, C);
4043checkChildStructure(A)(E);
4044checkChildStructure(B)();
4045checkChildStructure(C)();
4046checkChildStructure(D)();
4047A.replace(D);
4048checkChildStructure(Main)(D, C);
4049checkChildStructure(A)(E);
4050checkChildStructure(B)();
4051checkChildStructure(C)();
4052checkChildStructure(D)();
4053B.replace(D);
4054checkChildStructure(Main)(C);
4055checkChildStructure(A)(E);
4056checkChildStructure(B)();
4057checkChildStructure(C)();
4058return checkChildStructure(D)();
4059});
4060test(".clone()", function () {
4061var A, B, childA, childB, emitCount, opts, sandBox;
4062emitCount = 0;
4063sandBox = Dom(sandbox);
4064opts = {
4065style: {
4066$base: {
4067width: '34px'
4068},
4069$happy: {
4070height: '99px'
4071},
4072$relaxed: {
4073opacity: '0.5'
4074}
4075}
4076};
4077A = Dom.div(opts, 'Some Inner Text').appendTo(sandbox);
4078A.state('happy', true);
4079A.on('privateEvent', function () {
4080return emitCount++;
4081});
4082childA = Dom.div().appendTo(A);
4083childB = Dom.span().appendTo(A);
4084B = A.clone();
4085A.state('relaxed', true);
4086A.emit('privateEvent');
4087expect(emitCount).to.equal(1);
4088expect(A.parent).to.equal(sandBox);
4089expect(A.css('width')).to.equal('34px');
4090expect(A.css('height')).to.equal('99px');
4091expect(A.css('opacity')).to.equal('0.5');
4092expect(A.siblings.length).to.equal(0);
4093expect(A.children.length).to.equal(3);
4094expect(A.children[0].el.textContent).to.equal('Some Inner Text');
4095expect(A.children[1]).to.equal(childA);
4096expect(A.children[2]).to.equal(childB);
4097expect(B).not.to.equal(A);
4098expect(B.parent).to.equal(void 0);
4099sandBox.append(B);
4100expect(B.parent).to.equal(sandBox);
4101expect(B.css('width')).to.equal('34px');
4102expect(B.css('height')).to.equal('99px');
4103expect(B.css('opacity')).to.equal('1');
4104expect(B.siblings.length).to.equal(1);
4105expect(B.children.length).to.equal(3);
4106expect(B.children[0].el.textContent).to.equal('Some Inner Text');
4107expect(B.children[0]).not.to.equal(A.children[0]);
4108expect(B.children[1]).not.to.equal(childA);
4109expect(B.children[2]).not.to.equal(childB);
4110expect(B.state('happy')).to.be.true;
4111expect(B.state('relaxed')).to.be.false;
4112expect(emitCount).to.equal(1);
4113B.emit('privateEvent');
4114expect(emitCount).to.equal(2);
4115A.off();
4116A.emit('privateEvent');
4117expect(emitCount).to.equal(2);
4118B.emit('privateEvent');
4119return expect(emitCount).to.equal(3);
4120});
4121test(".prop() - element property getter/setter", function () {
4122var div;
4123div = Dom.div();
4124expect(div.prop('myProp')).to.equal(void 0);
4125expect(div.prop('myProp', 192)).to.equal(div);
4126expect(div.prop('myProp')).to.equal(192);
4127expect(div.prop('myProp', '192')).to.equal(div);
4128expect(div.prop('myProp')).to.equal('192');
4129expect(div.prop('anotherProp', [1, 2, 3])).to.equal(div);
4130expect(div.prop('anotherProp')).to.eql([1, 2, 3]);
4131expect(div.el.myProp).to.equal('192');
4132expect(div.el.anotherProp).to.eql([1, 2, 3]);
4133div.el.lastProp = 9999;
4134expect(div.el.lastProp).to.equal(9999);
4135expect(div.prop('lastProp')).to.equal(9999);
4136expect(Object.keys(div.el)).not.to.contain('promiseIsLast');
4137div.prop('promiseIsLast', 'over9k');
4138expect(Object.keys(div.el)).to.contain('promiseIsLast');
4139div.prop('promiseIsLast', void 0);
4140expect(Object.keys(div.el)).to.contain('promiseIsLast');
4141div.prop('promiseIsLast', null);
4142expect(Object.keys(div.el)).to.contain('promiseIsLast');
4143div.prop({
4144abc: 123,
4145def: 456
4146});
4147expect(div.el.abc).to.equal(123);
4148return expect(div.el.def).to.equal(456);
4149});
4150test(".attr() - element attribute getter/setter", function () {
4151var div;
4152div = Dom.div();
4153expect(div.attr('myAttr')).to.equal(null);
4154expect(div.attr('myAttr', 192)).to.equal(div);
4155expect(div.attr('myAttr')).to.equal('192');
4156expect(div.attr('myAttr', '192')).to.equal(div);
4157expect(div.attr('myAttr')).to.equal('192');
4158expect(div.attr('anotherAttr', [1, 2, 3])).to.equal(div);
4159expect(div.attr('anotherAttr')).to.equal('1,2,3');
4160expect(div.el.getAttribute('myAttr')).to.equal('192');
4161expect(div.el.getAttribute('anotherAttr')).to.eql('1,2,3');
4162div.el.setAttribute('lastAttr', 9999);
4163expect(div.el.getAttribute('lastAttr')).to.equal('9999');
4164expect(div.attr('lastAttr')).to.equal('9999');
4165expect(div.el.getAttribute('promiseIsLast')).to.equal(null);
4166div.attr('promiseIsLast', 'over9k');
4167expect(div.el.getAttribute('promiseIsLast')).to.equal('over9k');
4168div.attr('promiseIsLast');
4169expect(div.el.getAttribute('promiseIsLast')).to.equal('over9k');
4170div.attr('promiseIsLast', null);
4171expect(div.el.getAttribute('promiseIsLast')).to.equal(null);
4172div.attr({
4173abc: 123,
4174def: 456
4175});
4176expect(div.el.getAttribute('abc')).to.equal('123');
4177expect(div.el.getAttribute('def')).to.equal('456');
4178div.attr({
4179abc: 123,
4180def: null
4181});
4182expect(div.el.getAttribute('abc')).to.equal('123');
4183return expect(div.el.getAttribute('def')).to.equal(null);
4184});
4185test(".html - innerHTML getter/setter", function () {
4186var div;
4187div = Dom.div(null, Dom.div(), 'Some text', Dom.span(), Dom.div());
4188expect(div.children.length).to.equal(4);
4189expect(div.html).to.equal(div.el.innerHTML);
4190expect(div.children.length).to.equal(4);
4191div.html = '<section ID="test"></section>';
4192expect(div.html).to.equal('<section id="test"></section>');
4193expect(div.children.length).to.equal(1);
4194expect(div.children[0].el.id).to.equal('test');
4195return expect(div.children[0].el.nodeName.toLowerCase()).to.equal('section');
4196});
4197test(".text - textContent getter/setter", function () {
4198var div;
4199div = Dom.div(null, 'Some text', Dom.span(null, 'Inner Text'));
4200expect(div.children.length).to.equal(2);
4201expect(div.text).to.equal(div.el.textContent);
4202expect(div.text).to.equal('Some textInner Text');
4203expect(div.children.length).to.equal(2);
4204div.text = 'newText';
4205expect(div.text).to.equal('newText');
4206expect(div.el.textContent).to.equal('newText');
4207expect(div.children.length).to.equal(1);
4208return expect(div.children[0].el.nodeType).to.equal(3);
4209});
4210test(".addClass", function () {
4211var div;
4212div = Dom.div({
4213class: 'some-selector anotherSelector .period annoying-_-selector '
4214});
4215expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector ');
4216div.addClass('new-selector');
4217expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
4218div.addClass('new-selector');
4219expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
4220div.raw.className = div.raw.className.replace('new-selector', ' ');
4221expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector ');
4222div.addClass('new-selector');
4223expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
4224div.addClass('.period');
4225expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
4226div.addClass('period');
4227return expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector period');
4228});
4229test(".removeClass", function () {
4230var div;
4231div = Dom.div({
4232class: 'some-selector anotherSelector .period annoying-_-selector '
4233});
4234expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector ');
4235div.addClass('new-selector');
4236expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
4237div.removeClass('new-selector');
4238expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector');
4239div.removeClass('new-selector');
4240expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector');
4241div.removeClass('some-selector');
4242expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector');
4243div.removeClass('period');
4244expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector');
4245div.removeClass('.period');
4246return expect(div.raw.className).to.equal('anotherSelector annoying-_-selector');
4247});
4248test(".toggleClass", function () {
4249var div;
4250div = Dom.div({
4251class: 'some-selector anotherSelector .period annoying-_-selector '
4252});
4253expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector ');
4254div.toggleClass('new-selector');
4255expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
4256div.toggleClass('new-selector');
4257expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector');
4258div.toggleClass('new-selector');
4259expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
4260div.toggleClass('new-selector');
4261div.toggleClass('some-selector');
4262expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector');
4263div.toggleClass('some-selector');
4264expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector some-selector');
4265div.toggleClass('period');
4266expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector some-selector period');
4267div.toggleClass('.period');
4268expect(div.raw.className).to.equal('anotherSelector annoying-_-selector some-selector period');
4269div.toggleClass('annoying-_-selector');
4270return expect(div.raw.className).to.equal('anotherSelector some-selector period');
4271});
4272test(".setRef", function () {
4273var el;
4274el = DOM.div({
4275ref: 'name1'
4276});
4277expect(el.ref).to.equal('name1');
4278expect(el.options.ref).to.equal('name1');
4279expect(el.attr('data-ref')).to.equal('name1');
4280el.setRef('name2');
4281expect(el.ref).to.equal('name2');
4282expect(el.options.ref).to.equal('name2');
4283return expect(el.attr('data-ref')).to.equal('name2');
4284});
4285return test("Appending/prepending elements to a text node should do nothing", function () {
4286var div, text;
4287text = Dom.text('abc123');
4288expect(text.text).to.equal('abc123');
4289expect(text.raw.childNodes.length).to.equal(0);
4290text.append(Dom.text('def'));
4291expect(text.text).to.equal('abc123');
4292expect(text.raw.childNodes.length).to.equal(0);
4293text.prepend(Dom.div(null, 'def'));
4294expect(text.text).to.equal('abc123');
4295expect(text.raw.childNodes.length).to.equal(0);
4296div = Dom.div(null, '456');
4297div.appendTo(text);
4298expect(text.text).to.equal('abc123');
4299expect(text.raw.childNodes.length).to.equal(0);
4300return expect(div.parent).to.equal(void 0);
4301});
4302});
4303suite("Batch", function () {
4304test("Dom.batch() takes an iterable containing an array of elements or QuickDom elements and reveals the QuickElement API which will be applied for each element", function () {
4305var A, B, C, div, sandBox;
4306sandBox = Dom(sandbox);
4307div = Dom.div();
4308A = Dom.div().appendTo(div);
4309B = Dom.section().appendTo(div);
4310C = Dom.div().appendTo(div);
4311checkChildStructure(sandBox)();
4312checkChildStructure(div)(A, B, C);
4313Dom.batch([A, B, C]).appendTo(sandBox).style('opacity', 0.5).css({
4314height: 30,
4315backgroundColor: 'pink'
4316}).append('Some Inner Text');
4317checkChildStructure(sandBox)(A, B, C);
4318checkChildStructure(div)();
4319expect(getComputedStyle(A.el).opacity).to.equal('0.5');
4320expect(getComputedStyle(C.el).opacity).to.equal('0.5');
4321expect(getComputedStyle(B.el).height).to.equal('30px');
4322expect(A.children.length).to.equal(1);
4323expect(B.children.length).to.equal(1);
4324expect(C.children.length).to.equal(1);
4325return expect(B.children[0].el.textContent).to.equal('Some Inner Text');
4326});
4327test("If a truthy value is passed as the 2nd arg of Dom.batch(), an array will be returned for the first method invoked containing the result for each element provided", function () {
4328var A, B, C, batch1, batch2, sandBox;
4329sandBox = Dom(sandbox);
4330A = Dom.div().appendTo(sandBox);
4331B = Dom.section().appendTo(sandBox);
4332C = Dom.div().appendTo(sandBox);
4333batch1 = Dom.batch([A, B, C]);
4334batch2 = Dom.batch([A, B, C], true);
4335expect(batch1.style('width')).to.equal(batch1);
4336expect(batch1.style('width', 47)).to.equal(batch1);
4337expect(batch2.style('width')).to.eql(['47px', '47px', '47px']);
4338expect(batch2.style('width', 33)).to.eql([A, B, C]);
4339return expect(batch2.style('width')).to.eql(['33px', '33px', '33px']);
4340});
4341test("If the .return() method is invoked on the batch instance, it will return the result set from the last method invocation", function () {
4342var A, B, C, div, result, sandBox;
4343sandBox = Dom(sandbox);
4344div = Dom.div();
4345A = Dom.div().appendTo(div);
4346B = Dom.section().appendTo(div);
4347C = Dom.div().appendTo(div);
4348result = Dom.batch([A, B, C]).appendTo(sandBox).style('opacity', 0.5).css({
4349height: 30,
4350backgroundColor: 'pink'
4351}).append('Some Inner Text').style('opacity').return();
4352expect(result).to.eql(['0.5', '0.5', '0.5']);
4353return expect(Dom.batch([A, B, C]).css('width', '38px').css('width').return()).to.eql(['38px', '38px', '38px']);
4354});
4355test("If the .return() method is invoked with a truthy argument, it will cause the next method invocation to return the results of the invocation for each element provided", function () {
4356var A, B, C, div, result, sandBox;
4357sandBox = Dom(sandbox);
4358div = Dom.div();
4359A = Dom.div().appendTo(div);
4360B = Dom.section().appendTo(div);
4361C = Dom.div().appendTo(div);
4362result = Dom.batch([A, B, C]).appendTo(sandBox).style('opacity', 0.5).css({
4363height: 30,
4364backgroundColor: 'pink'
4365}).append('Some Inner Text').return(true).style('opacity');
4366expect(result).to.eql(['0.5', '0.5', '0.5']);
4367return expect(Dom.batch([A, B, C]).css('width', '38px').css('height', '28px').return(true).css('width')).to.eql(['38px', '38px', '38px']);
4368});
4369test("Invoking the .reverse() method on the batch instance will reverse the elements array in the batch and thus the execution order", function () {
4370var A, B, C, arr;
4371A = Dom.div(null, 'AAA').appendTo(sandbox);
4372B = Dom.div(null, 'BBB').appendTo(sandbox);
4373C = Dom.div(null, 'CCC').appendTo(sandbox);
4374arr = [A, B, C];
4375expect(Dom.batch(arr).elements).not.to.equal(arr);
4376expect(Dom.batch(arr).elements).to.eql([A, B, C]);
4377expect(Dom.batch(arr).reverse().elements).to.eql([C, B, A]);
4378expect(Dom.batch(arr, 1).text()).to.eql(['AAA', 'BBB', 'CCC']);
4379expect(Dom.batch(arr, 1).reverse().text()).to.eql(['CCC', 'BBB', 'AAA']);
4380expect(Dom.batch(arr, 1).reverse().text()).to.eql(['CCC', 'BBB', 'AAA']);
4381return expect(Dom.batch(arr, 1).reverse().reverse().text()).to.eql(['AAA', 'BBB', 'CCC']);
4382});
4383return test("Batch.text/.html are methods instead of getters/setters", function () {
4384var batch, divA, divB;
4385divA = Dom.div(null, 'The divA');
4386divB = Dom.div(null, 'The divB');
4387batch = Dom.batch([divA, divB], true);
4388expect(batch.html()).to.eql(['The divA', 'The divB']);
4389expect(batch.text()).to.eql(['The divA', 'The divB']);
4390batch.html('<span>The div</span>');
4391expect(batch.html()).to.eql(['<span>The div</span>', '<span>The div</span>']);
4392expect(batch.text()).to.eql(['The div', 'The div']);
4393batch.text('THE DIV');
4394expect(batch.html()).to.eql(['THE DIV', 'THE DIV']);
4395return expect(batch.text()).to.eql(['THE DIV', 'THE DIV']);
4396});
4397});
4398suite("Templates", function () {
4399test("A reusable template can be generated via QuickDom.template()", function () {
4400var template;
4401template = Dom.template(['span', {
4402id: 'theSpan'
4403}]);
4404expect(typeof template).to.equal('object');
4405expect(template.type).to.equal('span');
4406expect(template.options).to.eql({
4407id: 'theSpan'
4408});
4409return expect(template.children).to.eql([]);
4410});
4411test("Templates can be turned into QuickDom instances via template.spawn() or by passing as arg to QuickDom", function () {
4412var spawnA, spawnB, template;
4413template = Dom.template(['div', {
4414className: 'some-div'
4415}, 'Some Inner Text']);
4416spawnA = template.spawn();
4417spawnA.state('happy', true);
4418spawnB = Dom(template);
4419expect(spawnA.el).to.be.instanceOf(HTMLDivElement);
4420expect(spawnB.el).to.be.instanceOf(HTMLDivElement);
4421expect(spawnA).not.to.equal(spawnB);
4422expect(spawnA.el).not.to.equal(spawnB.el);
4423expect(spawnA.state('happy')).to.be.true;
4424expect(spawnB.state('happy')).to.be.false;
4425expect(spawnA.el.textContent).to.equal('Some Inner Text');
4426expect(spawnB.el.textContent).to.equal('Some Inner Text');
4427return expect(spawnA.el.className).to.equal('some-div');
4428});
4429test("Templates can be created from QuickElement instances", function () {
4430var section, sectionTemplate, templateSpawn;
4431section = Dom.section({
4432className: 'singleSection'
4433}, 'Some Inner Text');
4434section.state('happy', true);
4435sectionTemplate = section.toTemplate();
4436templateSpawn = sectionTemplate.spawn();
4437expect(sectionTemplate).not.to.equal(section);
4438expect(templateSpawn.el).not.to.equal(section.el);
4439expect(templateSpawn.el.className).to.equal('singleSection');
4440expect(templateSpawn.text).to.equal('Some Inner Text');
4441expect(section.state('happy')).to.be.true;
4442return expect(templateSpawn.state('happy')).to.be.false;
4443});
4444test("Templates can be created from DOM Elements", function () {
4445var sectionEl, sectionTemplate, templateSpawn;
4446sectionEl = document.createElement('section');
4447sectionEl.className = 'singleSection';
4448sectionEl.appendChild(document.createTextNode('Some Inner Text'));
4449sectionTemplate = Dom.template(sectionEl);
4450templateSpawn = sectionTemplate.spawn();
4451expect(templateSpawn.el).not.to.equal(sectionEl);
4452expect(templateSpawn.el.className).to.equal('singleSection');
4453return expect(templateSpawn.text).to.equal('Some Inner Text');
4454});
4455test("Templates can be extended via template.extend", function () {
4456var spawn, spawnA, spawnB, spawnC, template, templateCopyA, templateCopyB, templateCopyC;
4457template = Dom.template(['div', {
4458className: 'some-div'
4459}, 'Some Inner Text']);
4460templateCopyA = template.extend({
4461type: 'span',
4462options: {
4463className: 'some-span'
4464},
4465children: []
4466});
4467templateCopyB = template.extend({
4468options: {
4469id: 'theMainDiv'
4470},
4471children: ['The Other Inner Text']
4472});
4473templateCopyC = template.extend(['section', {
4474className: 'some-section'
4475}, ['div', null, 'Very '], ['div', null, ['span', {
4476style: {
4477fontWeight: 500
4478}
4479}, 'Nested '], 'Inner Text']]);
4480expect(templateCopyA).not.to.equal(template);
4481expect(templateCopyB).not.to.equal(template);
4482spawn = template.spawn();
4483spawnA = templateCopyA.spawn();
4484spawnB = templateCopyB.spawn();
4485spawnC = templateCopyC.spawn();
4486expect(spawn.el.nodeName.toLowerCase()).to.equal('div');
4487expect(spawn.el.className).to.equal('some-div');
4488expect(spawn.el.id).to.equal('');
4489expect(spawn.text).to.equal('Some Inner Text');
4490expect(spawnA.el.nodeName.toLowerCase()).to.equal('span');
4491expect(spawnA.el.className).to.equal('some-span');
4492expect(spawnA.el.id).to.equal('');
4493expect(spawnA.text).to.equal('Some Inner Text');
4494expect(spawnB.el.nodeName.toLowerCase()).to.equal('div');
4495expect(spawnB.el.className).to.equal('some-div');
4496expect(spawnB.el.id).to.equal('theMainDiv');
4497expect(spawnB.text).to.equal('The Other Inner Text');
4498expect(spawnC.el.nodeName.toLowerCase()).to.equal('section');
4499expect(spawnC.el.className).to.equal('some-section');
4500expect(spawnC.el.id).to.equal('');
4501return expect(spawnC.text).to.equal('Very Nested Inner Text');
4502});
4503test("Templates can be spawned via extended config by passing a new config object to template.spawn()", function () {
4504var spawnA, spawnB, spawnRaw, template;
4505template = Dom.template(['div', {
4506className: 'some-div'
4507}, 'Some Inner Text', ['strong', {
4508className: 'highlighted',
4509style: {
4510opacity: 0.9
4511}
4512}, ' - Bolded Text']]);
4513spawnRaw = template.spawn().appendTo(sandbox);
4514spawnA = template.spawn({
4515type: 'section',
4516options: {
4517className: 'some-section',
4518style: {
4519opacity: 0.7
4520}
4521}
4522}).appendTo(sandbox);
4523spawnB = template.spawn({
4524options: {
4525className: 'main-div',
4526id: 'theMainDiv',
4527style: {
4528opacity: 0.5
4529}
4530},
4531children: [{
4532type: 'span',
4533children: [{
4534type: 'text',
4535options: {
4536text: 'Main Inner Text'
4537}
4538}]
4539}, {
4540type: 'b',
4541options: {
4542className: 'super-highlighted',
4543style: {
4544opacity: '0.2'
4545}
4546},
4547children: [{
4548options: {
4549text: ' - Very Bolded Text'
4550}
4551}]
4552}, {
4553type: 'text',
4554options: {
4555text: ' + Other Text'
4556}
4557}]
4558}).appendTo(sandbox);
4559expect(spawnRaw.el.nodeName.toLowerCase()).to.equal('div');
4560expect(spawnRaw.el.className).to.equal('some-div');
4561expect(spawnRaw.el.id).to.equal('');
4562expect(spawnRaw.text).to.equal('Some Inner Text - Bolded Text');
4563expect(spawnRaw.el).to.have.style('opacity', '1');
4564expect(spawnRaw.el.childNodes.length).to.equal(2);
4565expect(spawnRaw.el.childNodes[0].nodeName).to.equal('#text');
4566expect(spawnRaw.el.childNodes[1].nodeName.toLowerCase()).to.equal('strong');
4567expect(spawnRaw.el.childNodes[1].className).to.include('highlighted');
4568expect(spawnRaw.el.childNodes[1]).to.have.style('opacity', '0.9');
4569expect(spawnA.el.nodeName.toLowerCase()).to.equal('section');
4570expect(spawnA.el.className).to.include('some-section');
4571expect(spawnA.el.id).to.equal('');
4572expect(spawnA.text).to.equal('Some Inner Text - Bolded Text');
4573expect(spawnA.el).to.have.style('opacity', '0.7');
4574expect(spawnA.el.childNodes.length).to.equal(2);
4575expect(spawnA.el.childNodes[0].nodeName).to.equal('#text');
4576expect(spawnA.el.childNodes[1].nodeName.toLowerCase()).to.equal('strong');
4577expect(spawnA.el.childNodes[1].className).to.include('highlighted');
4578expect(spawnA.el.childNodes[1]).to.have.style('opacity', '0.9');
4579expect(spawnB.el.nodeName.toLowerCase()).to.equal('div');
4580expect(spawnB.el.className).to.include('main-div');
4581expect(spawnB.el.id).to.equal('theMainDiv');
4582expect(spawnB.text).to.equal('Main Inner Text - Very Bolded Text + Other Text');
4583expect(spawnB.el).to.have.style('opacity', '0.5');
4584expect(spawnB.el.childNodes.length).to.equal(3);
4585expect(spawnB.el.childNodes[0].nodeName.toLowerCase()).to.equal('span');
4586expect(spawnB.el.childNodes[0].childNodes.length).to.equal(1);
4587expect(spawnB.el.childNodes[1].nodeName.toLowerCase()).to.equal('b');
4588expect(spawnB.el.childNodes[1].className).to.include('super-highlighted');
4589return expect(spawnB.el.childNodes[1]).to.have.style('opacity', '0.2');
4590});
4591test("Template.extend/spawn() can accept a template tree array", function () {
4592var cloneA, cloneB, cloneC, spawn, template;
4593template = Dom.template(['div', {
4594style: {
4595'opacity': 0.5
4596}
4597}, ['span', null, 'text of span'], ['div', null, 'text of div']]);
4598cloneA = template.extend(['section', {
4599style: {
4600'opacity': 0.8
4601}
4602}]);
4603cloneB = template.extend(['span', null, ['div']]);
4604cloneC = template.extend(['section', {
4605className: 'the-section',
4606style: {
4607color: 'blue'
4608}
4609}, ['section', null, 'text of subsection'], 'just a text node']);
4610spawn = template.spawn(['span', {
4611style: {
4612'width': 190,
4613'opacity': 0.4
4614}
4615}, 'so nice']).appendTo(sandbox);
4616expect(template.type).to.equal('div');
4617expect(template.options).to.eql({
4618style: {
4619'opacity': 0.5
4620}
4621});
4622expect(template.children.length).to.equal(2);
4623expect(template.children[0].type).to.equal('span');
4624expect(template.children[0].children.length).to.equal(1);
4625expect(template.children[0].children[0].options.text).to.equal('text of span');
4626expect(template.children[1].type).to.equal('div');
4627expect(template.children[1].children.length).to.equal(1);
4628expect(template.children[1].children[0].options.text).to.equal('text of div');
4629expect(cloneA.type).to.equal('section');
4630expect(cloneA.options).to.eql({
4631style: {
4632'opacity': 0.8
4633}
4634});
4635expect(cloneA.children.length).to.equal(2);
4636expect(cloneA.children[0].type).to.equal('span');
4637expect(cloneA.children[0].children.length).to.equal(1);
4638expect(cloneA.children[0].children[0].options.text).to.equal('text of span');
4639expect(cloneA.children[1].type).to.equal('div');
4640expect(cloneA.children[1].children.length).to.equal(1);
4641expect(cloneA.children[1].children[0].options.text).to.equal('text of div');
4642expect(cloneB.type).to.equal('span');
4643expect(cloneB.options).to.eql({
4644style: {
4645'opacity': 0.5
4646}
4647});
4648expect(cloneB.children.length).to.equal(2);
4649expect(cloneB.children[0].type).to.equal('div');
4650expect(cloneB.children[0].children.length).to.equal(1);
4651expect(cloneB.children[0].children[0].options.text).to.equal('text of span');
4652expect(cloneB.children[1].type).to.equal('div');
4653expect(cloneB.children[1].children.length).to.equal(1);
4654expect(cloneB.children[1].children[0].options.text).to.equal('text of div');
4655expect(cloneC.type).to.equal('section');
4656expect(cloneC.options).to.eql({
4657className: 'the-section',
4658style: {
4659'opacity': 0.5,
4660'color': 'blue'
4661}
4662});
4663expect(cloneC.children.length).to.equal(2);
4664expect(cloneC.children[0].type).to.equal('section');
4665expect(cloneC.children[0].children.length).to.equal(1);
4666expect(cloneC.children[0].children[0].options.text).to.equal('text of subsection');
4667expect(cloneC.children[1].type).to.equal('text');
4668expect(cloneC.children[1].options.text).to.equal('just a text node');
4669spawn.style('display', 'block');
4670expect(spawn.el.nodeName.toLowerCase()).to.equal('span');
4671expect(spawn.el).to.have.style('opacity', '0.4');
4672expect(spawn.el).to.have.style('width', '190px');
4673expect(spawn.el.childNodes.length).to.equal(2);
4674expect(spawn.el.childNodes[0].nodeType).to.equal(3);
4675expect(spawn.el.childNodes[0].textContent).to.equal('so nice');
4676expect(spawn.el.childNodes[1].nodeName.toLowerCase()).to.equal('div');
4677return expect(spawn.el.childNodes[1].textContent).to.equal('text of div');
4678});
4679test("Template.extend/spawn() can accept other template instances as children which will replace existing children", function () {
4680var childA, childB, childC, spawnedA, spawnedB, spawnedC, template, templateCopy;
4681template = Dom.template(['div', null, ['span', {
4682style: {
4683opacity: 0.5
4684}
4685}], 'original text']);
4686childA = Dom.template(['div', {
4687style: {
4688fontFamily: 'pink'
4689}
4690}]);
4691childB = Dom.template('replaced text');
4692childC = Dom.template(['section']);
4693templateCopy = template.extend(['span', {
4694style: {
4695fontSize: '77px'
4696}
4697}, childA, childB, childC]);
4698spawnedA = template.spawn().appendTo(sandbox);
4699spawnedB = templateCopy.spawn().appendTo(sandbox);
4700spawnedC = template.spawn(['span', {
4701style: {
4702fontSize: '77px'
4703}
4704}, childA, childB, childC]).appendTo(sandbox);
4705expect(spawnedA.type).to.equal('div');
4706expect(spawnedA.children.length).to.equal(2);
4707expect(spawnedA.children[0].type).to.equal('span');
4708expect(spawnedA.children[0].raw).to.have.style('opacity', '0.5');
4709expect(spawnedA.children[0].raw).to.have.style('fontFamily', '');
4710expect(spawnedA.children[1].type).to.equal('text');
4711expect(spawnedA.text).to.equal('original text');
4712expect(spawnedB.type).to.equal('span');
4713expect(spawnedB.children.length).to.equal(3);
4714expect(spawnedB.children[0].type).to.equal('div');
4715expect(spawnedB.children[0].raw).to.have.style('opacity', '');
4716expect(spawnedB.children[0].raw).to.have.style('fontFamily', 'pink');
4717expect(spawnedB.children[1].type).to.equal('text');
4718expect(spawnedB.text).to.equal('replaced text');
4719expect(spawnedB.children[2].type).to.equal('section');
4720expect(spawnedB.raw).to.have.style('fontSize', '77px');
4721expect(spawnedC.type).to.equal('span');
4722expect(spawnedC.children.length).to.equal(3);
4723expect(spawnedC.children[0].type).to.equal('div');
4724expect(spawnedC.children[0].raw).to.have.style('opacity', '');
4725expect(spawnedC.children[0].raw).to.have.style('fontFamily', 'pink');
4726expect(spawnedC.children[1].type).to.equal('text');
4727expect(spawnedC.text).to.equal('replaced text');
4728expect(spawnedC.children[2].type).to.equal('section');
4729return expect(spawnedC.raw).to.have.style('fontSize', '77px');
4730});
4731test("Template.extend/spawn() will consider the passed object as the options object if it doesn't contain template-related props", function () {
4732var template;
4733template = DOM.template(['div', {
4734defaults: {
4735text: 'default'
4736},
4737computers: {
4738text: function (text) {
4739return this.text = text;
4740}
4741}
4742}, ['span', {
4743ref: 'theSpan'
4744}]]);
4745expect(template.options.style).to.equal(void 0);
4746expect(template.options.label).to.equal(void 0);
4747expect(template.extend({
4748options: {
4749label: 'abc123'
4750}
4751}).options.label).to.equal('abc123');
4752expect(template.extend({
4753label: 'def456'
4754}).options.label).to.equal('def456');
4755expect(template.extend({
4756style: 'def456'
4757}).options.style).to.equal('def456');
4758expect(template.extend({
4759style: 'def456',
4760type: 'section'
4761}).options.style).to.equal(void 0);
4762expect(template.extend({
4763children: {
4764theSpan: {
4765style: 'ghi789'
4766}
4767}
4768}).child.theSpan.options.style).to.equal('ghi789');
4769expect(template.extend({
4770children: [{
4771defaults: 'ghi789'
4772}]
4773}).child.theSpan.options.defaults).to.equal('ghi789');
4774expect(template.spawn({
4775children: {
4776theSpan: {
4777className: 'GHI789'
4778}
4779}
4780}).child.theSpan.raw.className).to.equal('GHI789');
4781expect(template.spawn().text).to.equal('default');
4782return expect(template.spawn({
4783defaults: {
4784text: 'diff'
4785}
4786}).text).to.equal('diff');
4787});
4788test("Templates can have other templates as their children", function () {
4789var headerTemplate, headerTemplateClone, section, sectionTemplate;
4790headerTemplate = Dom.template(['header', {
4791style: {
4792'height': '200px'
4793}
4794}, ['span', {
4795style: {
4796'textAlign': 'center'
4797}
4798}, 'This is bolded text'], ' while this is not']);
4799headerTemplateClone = Dom.template(headerTemplate);
4800sectionTemplate = Dom.template(['section', null, headerTemplate]);
4801section = sectionTemplate.spawn().appendTo(sandbox);
4802expect(headerTemplateClone).to.equal(headerTemplate);
4803expect(sectionTemplate.children.length).to.equal(1);
4804expect(sectionTemplate.children[0]).to.equal(headerTemplate);
4805expect(sectionTemplate.children[0].children.length).to.equal(2);
4806expect(section.children.length).to.equal(1);
4807expect(section.children[0].type).to.equal('header');
4808expect(section.children[0].children.length).to.equal(2);
4809expect(section.text).to.equal('This is bolded text while this is not');
4810return expect(section.children[0].children[0].style('textAlign')).to.equal('center');
4811});
4812test("A global options object can be passed as the 2nd arg to template.extend/spawn() which will be applied to all templates, spawns, & their children", function () {
4813var dynamicHeightStyle, headerTemplate, obj, section, sectionTemplate;
4814obj = {
4815myHeight: '150px'
4816};
4817obj.obj = obj;
4818dynamicHeightStyle = {
4819'height': function (related) {
4820expect(related).to.equal(obj);
4821return related.myHeight;
4822}
4823};
4824headerTemplate = Dom.template(['header', {
4825style: {
4826'width': '23px'
4827}
4828}, ['div', {
4829style: {
4830'width': '23px'
4831}
4832}, 'This is bolded text'], ' while this is not']);
4833sectionTemplate = Dom.template(['section', {
4834style: {
4835'width': '23px'
4836}
4837}, headerTemplate]);
4838section = sectionTemplate.spawn({
4839options: {
4840related: window
4841}
4842}, {
4843related: obj,
4844style: dynamicHeightStyle
4845}).appendTo(sandbox);
4846expect(section.raw.style.height).to.equal('150px');
4847expect(section.children[0].raw.style.height).to.equal('150px');
4848expect(section.children[0].children[0].raw.style.height).to.equal('150px');
4849expect(section.raw.style.width).to.equal('');
4850expect(section.children[0].raw.style.width).to.equal('');
4851expect(section.children[0].children[0].raw.style.width).to.equal('');
4852expect(section.children.length).to.equal(1);
4853expect(section.children[0].type).to.equal('header');
4854expect(section.children[0].children.length).to.equal(2);
4855return expect(section.text).to.equal('This is bolded text while this is not');
4856});
4857test("Template children can be navigated by ref using the .child property", function () {
4858var rendered, template;
4859template = Dom.template(['div', {
4860id: 'divA'
4861}, ['div', {
4862id: 'childA'
4863}, ['span', {
4864ref: 'childA_1'
4865}], ['div', {
4866ref: 'childA_2',
4867id: 'childA_2'
4868}]], ['div', null, ['span', {
4869ref: 'childB_1'
4870}], ['text', {
4871id: 'childB_2',
4872text: 'The Text'
4873}]]]);
4874expect(typeof template.child).to.equal('object');
4875expect(Object.keys(template.child).length).to.equal(6);
4876expect(template.child.divA).to.equal(template);
4877expect(template.child.childA.type).to.equal('div');
4878expect(template.child.childA).to.equal(template.children[0]);
4879expect(template.child.childA_1).to.equal(template.children[0].children[0]);
4880expect(template.child.childA_2).to.equal(template.children[0].children[1]);
4881expect(template.child.childB_1).to.equal(template.children[1].children[0]);
4882expect(template.child.childB_2).to.equal(template.children[1].children[1]);
4883rendered = template.spawn();
4884expect(rendered.child.childB_2).to.equal(rendered.children[1].children[1]);
4885return expect(rendered.text).to.equal('The Text');
4886});
4887test("Template's children can be extend/spawned with a {ref:newChild} map instead of a positional array", function () {
4888var rendered, templateCopy, templateCopy2, templateMain;
4889templateMain = Dom.template(['div', {
4890id: 'divA'
4891}, ['div', {
4892id: 'childA'
4893}, ['span', {
4894ref: 'childA_1'
4895}], ['div', {
4896ref: 'childA_2',
4897id: 'childA_2'
4898}]], ['div', null, ['span', {
4899ref: 'childB_1'
4900}], ['text', {
4901id: 'childB_2',
4902text: 'The Text'
4903}]]]);
4904templateCopy = templateMain.extend(['section', null, {
4905childA: {
4906type: 'form',
4907options: {
4908style: {
4909display: 'inline-block'
4910}
4911}
4912},
4913childA_2: ['a', {
4914id: 'CHILDa_2',
4915href: 'http://google.com'
4916}, ['text', {
4917ref: 'childA_2_1',
4918text: 'New Text'
4919}]],
4920childC: ['div', {
4921ref: 'childD'
4922}]
4923}], {
4924value: 'theValue'
4925});
4926templateCopy2 = templateMain.extend({
4927children: {
4928childA: {
4929children: {
4930newChild: ['div']
4931}
4932},
4933childA_2: ['a', {
4934id: 'CHILDa_2',
4935href: 'http://google.com'
4936}, ['text', {
4937ref: 'childA_2_1',
4938text: 'New Text'
4939}]],
4940childC: ['div', {
4941ref: 'childD'
4942}]
4943}
4944});
4945expect(typeof templateCopy.child.childA_2_1).not.to.equal('undefined');
4946expect(Object.keys(templateMain.child).length).to.equal(6);
4947expect(Object.keys(templateCopy.child).length).to.equal(8);
4948expect(templateCopy.children.length).to.equal(3);
4949expect(templateCopy.child.divA).to.equal(templateCopy);
4950expect(templateCopy.child.childA).to.equal(templateCopy.children[0]);
4951expect(templateCopy.child.childA.type).to.equal('form');
4952expect(templateCopy.child.childA_1).to.equal(templateCopy.children[0].children[0]);
4953expect(templateCopy.child.childA_2).to.equal(void 0);
4954expect(templateCopy.child.CHILDa_2).to.equal(templateCopy.children[0].children[1]);
4955expect(templateCopy.child.childA_2_1).to.equal(templateCopy.children[0].children[1].children[0]);
4956expect(templateCopy.child.childA_2_1.options.text).to.equal('New Text');
4957expect(templateCopy.child.childB_1).to.equal(templateCopy.children[1].children[0]);
4958expect(templateCopy.child.childB_2).to.equal(templateCopy.children[1].children[1]);
4959expect(templateCopy.child.childC).to.equal(void 0);
4960expect(templateCopy.child.childD).to.equal(templateCopy.children[2]);
4961rendered = templateCopy.spawn().appendTo(sandbox);
4962expect(Object.keys(rendered.child).length).to.equal(8);
4963expect(rendered.child.childB_2).to.equal(rendered.children[1].children[1]);
4964expect(rendered.child.childA.raw).to.have.style('display', 'inline-block');
4965expect(rendered.child.CHILDa_2.prop('href')).to.contain('http://google.com');
4966expect(rendered.child.childB_1.prop('value')).to.equal('theValue');
4967return expect(rendered.child.childD.attr('data-ref')).to.equal('childD');
4968});
4969test("Templates can be passed as replacement/new children in {ref:newChild} extension maps", function () {
4970var childA, childB, childC, templateCopy, templateMain;
4971childA = Dom.template(['div', {
4972id: 'childA'
4973}, ['span', {
4974ref: 'childA_1'
4975}], ['div', {
4976ref: 'childA_2',
4977id: 'childA_2'
4978}]]);
4979childB = Dom.template(['div', {
4980ref: 'childB'
4981}, ['span', {
4982ref: 'childB_1'
4983}], ['text', {
4984id: 'childB_2',
4985text: 'The Text'
4986}]]);
4987childC = Dom.template(['div', {
4988id: 'childC'
4989}, ['span', {
4990ref: 'childC_1'
4991}], ['text', {
4992id: 'childC_2',
4993text: 'The Text'
4994}]]);
4995templateMain = Dom.template(['div', {
4996id: 'divA'
4997}, childA, childB]);
4998templateCopy = templateMain.extend(['section', null, {
4999childA: {
5000type: 'form'
5001},
5002childB: childB.extend({
5003ref: 'ChildB'
5004}),
5005childC: childC.extend({
5006ref: 'ChildC'
5007})
5008}], {
5009value: 'theValue'
5010});
5011expect(Object.keys(templateMain.child).length).to.equal(7);
5012expect(Object.keys(templateCopy.child).length).to.equal(10);
5013expect(templateMain.children.length).to.equal(2);
5014expect(templateCopy.children.length).to.equal(3);
5015expect(templateCopy.child.divA).to.equal(templateCopy);
5016expect(templateCopy.child.childA).to.equal(templateCopy.children[0]);
5017expect(templateCopy.child.childA.type).to.equal('form');
5018expect(templateCopy.child.childA.children.length).to.equal(2);
5019expect(templateCopy.child.ChildB).to.equal(templateCopy.children[1]);
5020expect(templateCopy.child.childB_1).to.equal(templateCopy.children[1].children[0]);
5021expect(templateCopy.child.childB_2).to.equal(templateCopy.children[1].children[1]);
5022expect(templateMain.child.childC).to.equal(void 0);
5023expect(templateCopy.child.childC).to.equal(void 0);
5024expect(templateCopy.child.ChildC).to.equal(templateCopy.children[2]);
5025expect(Object.keys(templateMain.spawn().child).length).to.equal(7);
5026return expect(Object.keys(templateCopy.spawn().child).length).to.equal(10);
5027});
5028test("ref-children maps shouldn't be modified by the template extender", function () {
5029var config, spawnA, spawnB, spawnC, spawnD, templateA, templateB, templateC, templateD;
5030config = {
5031children: {
5032childA_1: {
5033type: 'div',
5034options: {
5035style: {
5036display: 'none'
5037}
5038}
5039}
5040}
5041};
5042templateA = Dom.template(['div', {
5043ref: 'divA'
5044}, ['div', {
5045ref: 'childA'
5046}, ['span', {
5047ref: 'childA_1'
5048}]]]);
5049templateA.child.childA_1;
5050templateB = templateA.extend();
5051templateC = templateA.extend(config);
5052templateD = templateA.extend(config);
5053spawnA = templateA.spawn().appendTo(sandbox);
5054spawnB = templateB.spawn().appendTo(sandbox);
5055spawnC = templateC.spawn().appendTo(sandbox);
5056spawnD = templateD.spawn().appendTo(sandbox);
5057expect(spawnA.child.childA_1.type).to.equal('span');
5058expect(spawnA.child.childA_1.style('display')).to.equal('inline');
5059expect(spawnB.child.childA_1.type).to.equal('span');
5060expect(spawnB.child.childA_1.style('display')).to.equal('inline');
5061expect(spawnC.child.childA_1.type).to.equal('div');
5062expect(spawnC.child.childA_1.style('display')).to.equal('none');
5063expect(spawnD.child.childA_1.type).to.equal('div');
5064return expect(spawnD.child.childA_1.style('display')).to.equal('none');
5065});
5066test("Null values in ref-children map will remove the child from the template", function () {
5067var templateCopy, templateMain;
5068templateMain = Dom.template(['div', {
5069id: 'divA'
5070}, ['div', {
5071id: 'childA'
5072}, ['span', {
5073ref: 'childA_1'
5074}], ['div', {
5075ref: 'childA_2',
5076id: 'childA_2'
5077}]], ['div', {
5078ref: 'childB'
5079}, ['span', {
5080ref: 'childB_1'
5081}], ['text', {
5082id: 'childB_2',
5083text: 'The Text'
5084}]], ['div', {
5085id: 'childC'
5086}, ['span', {
5087ref: 'childC_1'
5088}], ['text', {
5089id: 'childC_2',
5090text: 'The Text'
5091}]]]);
5092templateCopy = templateMain.extend(['section', null, {
5093childA: {
5094type: 'form',
5095options: {
5096style: {
5097display: 'inline-block'
5098}
5099}
5100},
5101childA_1: null,
5102childA_2: ['a', {
5103id: 'CHILDa_2',
5104href: 'http://google.com'
5105}, ['text', {
5106ref: 'childA_2_1',
5107text: 'New Text'
5108}]],
5109childB_1: null,
5110childC: null
5111}]);
5112expect(typeof templateCopy.child.childA_2_1).not.to.equal('undefined');
5113expect(Object.keys(templateMain.child).length).to.equal(10);
5114expect(Object.keys(templateCopy.child).length).to.equal(6);
5115expect(templateCopy.children.length).to.equal(2);
5116expect(templateCopy.child.divA).to.equal(templateCopy);
5117expect(templateCopy.child.childA).to.equal(templateCopy.children[0]);
5118expect(templateCopy.child.childA.type).to.equal('form');
5119expect(templateCopy.child.childA.children.length).to.equal(1);
5120expect(templateMain.child.childA_1).to.equal(templateMain.child.childA_1);
5121expect(templateCopy.child.childA_1).to.equal(void 0);
5122expect(templateCopy.child.childA_2).to.equal(void 0);
5123expect(templateCopy.child.CHILDa_2).to.equal(templateCopy.children[0].children[0]);
5124expect(templateCopy.child.childA_2_1).to.equal(templateCopy.children[0].children[0].children[0]);
5125expect(templateCopy.child.childA_2_1.options.text).to.equal('New Text');
5126expect(templateCopy.child.childB_1).to.equal(void 0);
5127expect(templateCopy.child.childB_2).to.equal(templateCopy.children[1].children[0]);
5128expect(templateMain.child.childB_1).to.equal(templateMain.children[1].children[0]);
5129expect(templateMain.child.childB_2).to.equal(templateMain.children[1].children[1]);
5130expect(templateMain.child.childC).to.equal(templateMain.children[2]);
5131return expect(templateCopy.child.childC).to.equal(void 0);
5132});
5133test("Null values in options object will delete keys during template extension", function () {
5134var spawnA, spawnB, templateA, templateB;
5135templateA = Dom.template(['div', {
5136ref: 'theDiv',
5137computers: {
5138valueA: function () {
5139return 1;
5140},
5141valueB: function () {
5142return 2;
5143}
5144},
5145style: {
5146position: 'relative',
5147width: 100,
5148height: 100,
5149$active: {
5150width: 200,
5151height: 200
5152}
5153}
5154}]);
5155templateB = templateA.extend({
5156options: {
5157ref: null,
5158computers: {
5159valueA: null,
5160valueB: function () {
5161return 3;
5162}
5163},
5164style: {
5165height: null,
5166opacity: 1,
5167$active: {
5168width: null
5169}
5170}
5171}
5172});
5173spawnA = templateA.spawn();
5174spawnB = templateB.spawn();
5175expect(spawnA.ref).to.equal('theDiv');
5176expect(spawnB.ref).to.equal(void 0);
5177expect(typeof spawnA.options.computers.valueA).to.equal('function');
5178expect(typeof spawnB.options.computers.valueA).to.equal('undefined');
5179expect(typeof spawnA.options.computers.valueB).to.equal('function');
5180expect(typeof spawnB.options.computers.valueB).to.equal('function');
5181expect(spawnA.options.computers.valueB()).to.equal(2);
5182expect(spawnB.options.computers.valueB()).to.equal(3);
5183expect(spawnA.options.style.position).to.equal('relative');
5184expect(spawnB.options.style.position).to.equal('relative');
5185expect(spawnA.options.style.width).to.equal(100);
5186expect(spawnB.options.style.width).to.equal(100);
5187expect(spawnA.options.style.height).to.equal(100);
5188expect(spawnB.options.style.height).to.equal(void 0);
5189expect(spawnA.options.style.opacity).to.equal(void 0);
5190expect(spawnB.options.style.opacity).to.equal(1);
5191expect(spawnA.options.style.$active.width).to.equal(200);
5192expect(spawnB.options.style.$active.width).to.equal(void 0);
5193expect(spawnA.options.style.$active.height).to.equal(200);
5194return expect(spawnB.options.style.$active.height).to.equal(200);
5195});
5196test("When spawning elements the options object passed to the spawns should be a clone of the template's options", function () {
5197var spawnA, spawnB, templateA, templateB;
5198templateA = Dom.template(['div', {
5199style: {
5200display: 'block'
5201}
5202}]);
5203templateB = Dom.template(['div', {
5204style: {
5205display: 'block'
5206}
5207}]);
5208spawnA = templateA.spawn({
5209ref: 'a'
5210});
5211spawnB = templateA.spawn();
5212expect(spawnA.options).not.to.equal(templateA.options);
5213expect(spawnA.options.style).not.to.equal(templateA.options.style);
5214expect(templateA.options.style.$base).to.equal(void 0);
5215expect(spawnB.options).not.to.equal(templateB.options);
5216expect(spawnB.options.style).not.to.equal(templateB.options.style);
5217return expect(templateB.options.style.$base).to.equal(void 0);
5218});
5219test("Templates will be spawned when appended to DOM elements", function () {
5220var div, template;
5221template = Dom.template(['span', {
5222ref: 'theSpan'
5223}, 'someText']);
5224div = Dom.div(null, 'label: ');
5225expect(div.children.length).to.equal(1);
5226expect(div.text).to.equal('label: ');
5227div.append(template);
5228expect(div.children.length).to.equal(2);
5229expect(div.text).to.equal('label: someText');
5230div.prepend(template);
5231expect(div.children.length).to.equal(3);
5232return expect(div.text).to.equal('someTextlabel: someText');
5233});
5234return suite("Data computers", function () {
5235test("Templates accept options.computers fn map which will be invoked with provided options.data upon spawning", function () {
5236var receivedData, template;
5237receivedData = null;
5238template = Dom.template(['div', {
5239computers: {
5240'someLabel': function (data) {
5241return receivedData = data || 'nothing';
5242}
5243}
5244}]);
5245expect(receivedData).to.equal(null);
5246template.spawn();
5247expect(receivedData).to.equal(null);
5248template.spawn({
5249data: {
5250'someLabel': 'works'
5251}
5252});
5253return expect(receivedData).to.equal('works');
5254});
5255test("Computers will be have the spawned QuickElement instance as their context", function () {
5256var context, instance, template;
5257context = null;
5258template = Dom.template(['div', {
5259computers: {
5260'someLabel': function (data) {
5261return context = this;
5262}
5263}
5264}]);
5265expect(context).to.equal(null);
5266template.spawn();
5267expect(context).to.equal(null);
5268instance = template.spawn({
5269data: {
5270'someLabel': void 0
5271}
5272});
5273return expect(context).to.equal(instance);
5274});
5275test("Values specified in options.defaults will be used if not specified in options.data upon spawning", function () {
5276var instance, results, template;
5277results = {};
5278template = Dom.template(['div', {
5279computers: {
5280'first': function (data) {
5281return results.first = data.toLowerCase();
5282},
5283'second': function (data) {
5284return results.second = data.toLowerCase();
5285},
5286'third': function (data) {
5287return results.third = data.toLowerCase();
5288}
5289},
5290defaults: {
5291'first': 'firstValue here',
5292'third': 'thirdValue here'
5293}
5294}]);
5295expect(results).to.deep.equal({});
5296template.spawn();
5297expect(results).to.deep.equal({
5298first: 'firstvalue here',
5299third: 'thirdvalue here'
5300});
5301instance = template.spawn({
5302data: {
5303'third': 'customvalue here'
5304}
5305});
5306return expect(results).to.deep.equal({
5307first: 'firstvalue here',
5308third: 'customvalue here'
5309});
5310});
5311test("Values can be of any type", function () {
5312var instance, results, template;
5313results = {};
5314template = Dom.template(['div', {
5315computers: {
5316'first': function (data) {
5317return results.first = data;
5318},
5319'second': function (data) {
5320return results.second = data;
5321},
5322'third': function (data) {
5323return results.third = data;
5324},
5325'fourth': function (data) {
5326return results.fourth = data;
5327},
5328'fifth': function (data) {
5329return results.fifth = data;
5330},
5331'sixth': function (data) {
5332return results.sixth = data;
5333}
5334},
5335defaults: {
5336'first': ['abc', '123'],
5337'third': {
5338a: 1,
5339b: 12
5340},
5341'sixth': 999
5342}
5343}]);
5344instance = template.spawn({
5345data: {
5346'second': null,
5347'fourth': 19,
5348'fifth': false,
5349'sixth': void 0
5350}
5351});
5352expect(results).to.deep.equal({
5353first: ['abc', '123'],
5354second: null,
5355third: {
5356a: 1,
5357b: 12
5358},
5359fourth: 19,
5360fifth: false,
5361sixth: void 0
5362});
5363return expect(Object.keys(results).length).to.equal(6);
5364});
5365test("Values in options.data that do not have a matching computer will be skipped", function () {
5366var instance, results, template;
5367results = {};
5368template = Dom.template(['div', {
5369computers: {
5370'first': function (data) {
5371return results.first = data;
5372},
5373'second': function (data) {
5374return results.second = data;
5375},
5376'third': function (data) {
5377return results.third = data;
5378}
5379}
5380}]);
5381instance = template.spawn({
5382data: {
5383'first': 'first value',
5384'second': 'second value',
5385'third': 'third value',
5386'fourth': 'fourth value'
5387}
5388});
5389expect(results).to.deep.equal({
5390'first': 'first value',
5391'second': 'second value',
5392'third': 'third value'
5393});
5394return expect(Object.keys(results).length).to.equal(3);
5395});
5396test("Computers in template children will receive the parent's options.data", function () {
5397var instance, results, template;
5398results = {
5399parent: {},
5400childA: {},
5401childB: {},
5402childC: {}
5403};
5404template = Dom.template(['div', {
5405computers: {
5406'first': function (data) {
5407return results.parent.first = data;
5408},
5409'second': function (data) {
5410return results.parent.second = data;
5411},
5412'third': function (data) {
5413return results.parent.third = data;
5414}
5415}
5416}, ['div', {
5417computers: {
5418'first': function (data) {
5419return results.childA.first = data;
5420},
5421'second': function (data) {
5422return results.childA.second = data;
5423},
5424'third': function (data) {
5425return results.childA.third = data;
5426}
5427}
5428}], ['div', null, ['div', {
5429computers: {
5430'first': function (data) {
5431return results.childB.first = data;
5432},
5433'fourth': function (data) {
5434return results.childB.fourth = data;
5435}
5436}
5437}], ['div', {
5438computers: {
5439'first': function (data) {
5440return results.childC.first = data;
5441},
5442'sixth': function (data) {
5443return results.childC.sixth = data;
5444}
5445}
5446}]]]);
5447instance = template.spawn({
5448data: {
5449'first': 'first value',
5450'second': 'second value',
5451'third': 'third value',
5452'fourth': 'fourth value'
5453}
5454});
5455expect(results.parent).to.deep.equal({
5456'first': 'first value',
5457'second': 'second value',
5458'third': 'third value'
5459});
5460expect(results.childA).to.deep.equal({
5461'first': 'first value',
5462'second': 'second value',
5463'third': 'third value'
5464});
5465expect(results.childB).to.deep.equal({
5466'first': 'first value',
5467'fourth': 'fourth value'
5468});
5469return expect(results.childC).to.deep.equal({
5470'first': 'first value'
5471});
5472});
5473test("Parent defaults will not be passed to children", function () {
5474var instance, results, template;
5475results = {
5476parent: {},
5477child: {}
5478};
5479template = Dom.template(['div', {
5480computers: {
5481'first': function (data) {
5482return results.parent.first = data;
5483},
5484'second': function (data) {
5485return results.parent.second = data;
5486},
5487'third': function (data) {
5488return results.parent.third = data;
5489}
5490},
5491defaults: {
5492'second': 'second value',
5493'fourth': 'fourth value'
5494}
5495}, ['div', {
5496computers: {
5497'first': function (data) {
5498return results.child.first = data;
5499},
5500'second': function (data) {
5501return results.child.second = data;
5502},
5503'third': function (data) {
5504return results.child.third = data;
5505},
5506'fourth': function (data) {
5507return results.child.fourth = data;
5508}
5509},
5510defaults: {
5511'first': 'first value'
5512}
5513}]]);
5514instance = template.spawn({
5515data: {
5516'third': 'third value'
5517}
5518});
5519expect(results.parent).to.deep.equal({
5520'second': 'second value',
5521'third': 'third value'
5522});
5523return expect(results.child).to.deep.equal({
5524'first': 'first value',
5525'third': 'third value'
5526});
5527});
5528test("Defaults should only be applied once", function () {
5529var count, template;
5530count = {
5531parent: 0,
5532child: 0,
5533childChild: 0
5534};
5535template = Dom.template(['div', {
5536ref: 'parent',
5537computers: {
5538'first': function (data) {
5539return count.parent++;
5540}
5541},
5542defaults: {
5543'first': 'first value'
5544}
5545}, ['div', {
5546ref: 'child',
5547computers: {
5548'first': function (data) {
5549return count.parent++;
5550},
5551'second': function (data) {
5552return count.child++;
5553}
5554},
5555defaults: {
5556'second': 'second value'
5557}
5558}, ['div', {
5559ref: 'child',
5560computers: {
5561'fourth': function (data) {
5562return count.childChild++;
5563}
5564},
5565defaults: {
5566'fourth': 'fourth value'
5567}
5568}]]]);
5569template.spawn({
5570data: {
5571'third': 'third value'
5572}
5573});
5574expect(count).to.eql({
5575parent: 1,
5576child: 1,
5577childChild: 1
5578});
5579template.spawn();
5580return expect(count).to.eql({
5581parent: 2,
5582child: 2,
5583childChild: 2
5584});
5585});
5586test("Data/defaults should be applied even when parent doesn't have computers", function () {
5587var count, template;
5588count = 0;
5589template = Dom.template(['div', null, ['section', null, ['div', {
5590computers: {
5591'first': function (data) {
5592return count++;
5593}
5594},
5595defaults: {
5596'first': 'first value'
5597}
5598}]]]);
5599template.spawn({
5600data: {
5601'first': 'second value'
5602}
5603});
5604expect(count).to.equal(1);
5605template.spawn();
5606return expect(count).to.equal(2);
5607});
5608test("Data can be re-applied via .applyData(data)", function () {
5609var count, instance, results, template;
5610results = {};
5611count = {
5612a: 0,
5613b: 0,
5614c: 0,
5615d: 0,
5616e: 0,
5617f: 0
5618};
5619template = Dom.template(['div', {
5620computers: {
5621'a': function (data) {
5622results.a = data;
5623return count.a++;
5624},
5625'b': function (data) {
5626results.b = data;
5627return count.b++;
5628},
5629'c': function (data) {
5630results.c = data;
5631return count.c++;
5632},
5633'd': function (data) {
5634results.d = data;
5635return count.d++;
5636},
5637'e': function (data) {
5638results.e = data;
5639return count.e++;
5640},
5641'f': function (data) {
5642results.f = data;
5643return count.f++;
5644}
5645},
5646defaults: {
5647'a': 1,
5648'c': 3,
5649'f': 6
5650}
5651}]);
5652instance = template.spawn({
5653data: {
5654b: 2,
5655d: 4,
5656e: 5,
5657f: 6
5658}
5659});
5660expect(results).to.deep.equal({
5661a: 1,
5662b: 2,
5663c: 3,
5664d: 4,
5665e: 5,
5666f: 6
5667});
5668expect(count).to.deep.equal({
5669a: 1,
5670b: 1,
5671c: 1,
5672d: 1,
5673e: 1,
5674f: 1
5675});
5676instance.applyData({
5677a: 11,
5678b: 22,
5679d: 44,
5680e: 55
5681});
5682expect(results).to.deep.equal({
5683a: 11,
5684b: 22,
5685c: 3,
5686d: 44,
5687e: 55,
5688f: 6
5689});
5690return expect(count).to.deep.equal({
5691a: 2,
5692b: 2,
5693c: 2,
5694d: 2,
5695e: 2,
5696f: 2
5697});
5698});
5699test("The '_init' computer will be run by default on template spawn regardless of data", function () {
5700var count, template;
5701count = {};
5702template = Dom.template(['div', {
5703ref: 'divA',
5704computers: {
5705_init: function () {
5706var name1;
5707if (count[name1 = this.ref] == null) {
5708count[name1] = 0;
5709}
5710return count[this.ref]++;
5711}
5712}
5713}, ['div', {
5714ref: 'divB',
5715data: {
5716first: '1'
5717},
5718computers: {
5719_init: function () {
5720var name1;
5721if (count[name1 = this.ref] == null) {
5722count[name1] = 0;
5723}
5724return count[this.ref]++;
5725}
5726}
5727}], ['div', {
5728ref: 'divC'
5729}, ['div', {
5730ref: 'divD'
5731}, ['div', {
5732ref: 'divE',
5733computers: {
5734_init: function () {
5735var name1;
5736if (count[name1 = this.ref] == null) {
5737count[name1] = 0;
5738}
5739return count[this.ref]++;
5740}
5741}
5742}]]]]);
5743expect(count).to.eql({});
5744template.spawn();
5745expect(count).to.eql({
5746divA: 1,
5747divB: 1,
5748divE: 1
5749});
5750template.spawn();
5751expect(count).to.eql({
5752divA: 2,
5753divB: 2,
5754divE: 2
5755});
5756template.child.divB.spawn({
5757data: {
5758second: '2'
5759}
5760});
5761expect(count).to.eql({
5762divA: 2,
5763divB: 3,
5764divE: 2
5765});
5766template.child.divC.spawn();
5767expect(count).to.eql({
5768divA: 2,
5769divB: 3,
5770divE: 3
5771});
5772template.child.divC.spawn();
5773return expect(count).to.eql({
5774divA: 2,
5775divB: 3,
5776divE: 4
5777});
5778});
5779test("The '_init' computer will be passed all of the data the template spawn receives", function () {
5780var expected, result, template;
5781result = {
5782divA: {},
5783divB: {}
5784};
5785template = Dom.template(['div', {
5786ref: 'divA',
5787computers: {
5788href: function (href) {
5789return result[this.ref].href = href;
5790},
5791name: function (name) {
5792return result[this.ref].name = name;
5793},
5794_init: function () {
5795return result[this.ref]._init = arguments[0];
5796}
5797}
5798}, ['div', {
5799ref: 'divProxy'
5800}, ['div', {
5801ref: 'divB',
5802defaults: {
5803first: '1'
5804},
5805computers: {
5806href: function (href) {
5807return result[this.ref].href = href;
5808},
5809name: function (name) {
5810return result[this.ref].name = name;
5811},
5812_init: function () {
5813return result[this.ref]._init = arguments[0];
5814}
5815}
5816}]]]);
5817expected = {
5818href: 'abc',
5819name: '123',
5820_init: {
5821href: 'abc',
5822name: '123',
5823value: 'def',
5824size: '456'
5825}
5826};
5827expect(result).to.eql({
5828divA: {},
5829divB: {}
5830});
5831template.spawn({
5832data: {
5833href: 'abc',
5834name: '123',
5835value: 'def',
5836size: '456'
5837}
5838});
5839expect(result).to.eql({
5840divA: expected,
5841divB: expected
5842});
5843delete result.divA;
5844({
5845divB: null
5846});
5847template.child.divB.spawn({
5848data: {
5849href: 'abc',
5850name: '123',
5851value: 'def',
5852size: '456'
5853}
5854});
5855return expect(result).to.eql({
5856divB: expected
5857});
5858});
5859test("Data can be specified via options object", function () {
5860var receivedData, template, templateCopy;
5861receivedData = null;
5862template = Dom.template(['div', {
5863computers: {
5864'someLabel': function (data) {
5865return receivedData = data || 'nothing';
5866}
5867}
5868}]);
5869templateCopy = template.extend({
5870options: {
5871data: {
5872'someLabel': 'works'
5873}
5874}
5875});
5876template.spawn();
5877expect(receivedData).to.equal(null);
5878templateCopy.spawn();
5879expect(receivedData).to.equal('works');
5880template.spawn({
5881options: {
5882data: {
5883'someLabel': 'also works'
5884}
5885}
5886});
5887return expect(receivedData).to.equal('also works');
5888});
5889test("Data specified in children's options object will be merged with the parent's data", function () {
5890var receivedData, template, templateCopy;
5891receivedData = {
5892abc: null,
5893def: null
5894};
5895template = Dom.template(['div', null, ['span', {
5896data: {
5897abc: 123
5898},
5899computers: {
5900'abc': function (data) {
5901return receivedData.abc = data || 'nothing';
5902},
5903'def': function (data) {
5904return receivedData.def = data || 'nothing';
5905}
5906}
5907}]]);
5908templateCopy = template.extend({
5909options: {
5910data: {
5911def: 456
5912}
5913}
5914});
5915template.spawn();
5916expect(receivedData).to.eql({
5917abc: 123,
5918def: null
5919});
5920receivedData = {
5921abc: null,
5922def: null
5923};
5924templateCopy.spawn();
5925expect(receivedData).to.eql({
5926abc: 123,
5927def: 456
5928});
5929receivedData = {
5930abc: null,
5931def: null
5932};
5933template.spawn({
5934options: {
5935data: {
5936def: 789
5937}
5938}
5939});
5940expect(receivedData).to.eql({
5941abc: 123,
5942def: 789
5943});
5944receivedData = {
5945abc: null,
5946def: null
5947};
5948template.spawn({
5949options: {
5950data: {
5951abc: 789
5952}
5953}
5954});
5955return expect(receivedData).to.eql({
5956abc: 789,
5957def: null
5958});
5959});
5960test("Data won't be passed to children if options.passDataToChildren is false", function () {
5961var el1, el2, receivedData, template1, template2;
5962receivedData = {
5963parent: null,
5964child: null
5965};
5966template1 = DOM.template(['div', {
5967computers: {
5968abc: function (data) {
5969return receivedData.parent = data;
5970}
5971}
5972}, ['span', {
5973computers: {
5974abc: function (data) {
5975return receivedData.child = data;
5976}
5977}
5978}]]);
5979template2 = template1.extend({
5980passDataToChildren: false
5981});
5982expect(receivedData).to.eql({
5983parent: null,
5984child: null
5985});
5986el1 = template1.spawn({
5987data: {
5988abc: 123
5989}
5990});
5991expect(receivedData).to.eql({
5992parent: 123,
5993child: 123
5994});
5995receivedData = {
5996parent: null,
5997child: null
5998};
5999el2 = template2.spawn({
6000data: {
6001abc: 123
6002}
6003});
6004expect(receivedData).to.eql({
6005parent: 123,
6006child: null
6007});
6008receivedData = {
6009parent: null,
6010child: null
6011};
6012el1.applyData({
6013abc: 456
6014});
6015expect(receivedData).to.eql({
6016parent: 456,
6017child: 456
6018});
6019receivedData = {
6020parent: null,
6021child: null
6022};
6023el2.applyData({
6024abc: 456
6025});
6026expect(receivedData).to.eql({
6027parent: 456,
6028child: null
6029});
6030el2.lastChild.applyData({
6031abc: 789
6032});
6033return expect(receivedData).to.eql({
6034parent: 456,
6035child: 789
6036});
6037});
6038test("Data should be invoked for parents after invoked children", function () {
6039var computers, el, history, template;
6040history = [];
6041computers = {
6042_init: function () {
6043return history.push(this.ref);
6044},
6045abc: function () {
6046return history.push(this.ref);
6047}
6048};
6049template = DOM.template(['div', {
6050computers,
6051id: 'parent'
6052}, ['div', {
6053computers,
6054id: 'child1'
6055}, ['div', {
6056computers,
6057id: 'child2'
6058}]], ['div', {
6059computers,
6060id: 'child3'
6061}]]);
6062expect(history).to.eql([]);
6063el = template.spawn();
6064expect(history).to.eql(['child2', 'child1', 'child3', 'parent']);
6065history.length = 0;
6066el.applyData({
6067abc: 123
6068});
6069return expect(history).to.eql(['child2', 'child1', 'child3', 'parent']);
6070});
6071return test("Computers will be invoked only one time per element if options.invokeComputersOnce is on", function () {
6072var computers, el, history, template;
6073history = [];
6074computers = {
6075abc: function () {
6076return history.push(this.ref);
6077}
6078};
6079template = DOM.template(['div', {
6080computers,
6081id: 'parent',
6082invokeComputersOnce: true
6083}, ['div', {
6084computers,
6085id: 'child1'
6086}, ['div', {
6087computers,
6088id: 'child2',
6089invokeComputersOnce: true
6090}]], ['div', {
6091computers,
6092id: 'child3'
6093}]]);
6094expect(history).to.eql([]);
6095el = template.spawn({
6096data: {
6097abc: 123
6098}
6099});
6100expect(history).to.eql(['child2', 'child1', 'child3', 'parent']);
6101history.length = 0;
6102el.applyData({
6103abc: 123
6104});
6105expect(history).to.eql(['child1', 'child3']);
6106history.length = 0;
6107el.applyData({
6108abc: 456
6109});
6110return expect(history).to.eql(['child1', 'child3']);
6111});
6112});
6113});
6114return suite("Misc", function () {
6115test("QuickDom.isTemplate", function () {
6116expect(Dom.isTemplate(Dom.template(['div']))).to.be.true;
6117expect(Dom.isTemplate(Dom.div())).to.be.false;
6118expect(Dom.isTemplate(Dom.div()[0])).to.be.false;
6119expect(Dom.isTemplate({})).to.be.false;
6120expect(Dom.isTemplate('string')).to.be.false;
6121expect(Dom.isTemplate(5)).to.be.false;
6122expect(Dom.isTemplate(false)).to.be.false;
6123return expect(Dom.isTemplate(true)).to.be.false;
6124});
6125test("QuickDom.isQuickEl", function () {
6126expect(Dom.isQuickEl(Dom.template(['div']))).to.be.false;
6127expect(Dom.isQuickEl(Dom.div())).to.be.true;
6128expect(Dom.isQuickEl(Dom.text())).to.be.true;
6129expect(Dom.isQuickEl(Dom.div()[0])).to.be.false;
6130expect(Dom.isQuickEl({})).to.be.false;
6131expect(Dom.isQuickEl('string')).to.be.false;
6132expect(Dom.isQuickEl(5)).to.be.false;
6133expect(Dom.isQuickEl(false)).to.be.false;
6134return expect(Dom.isQuickEl(true)).to.be.false;
6135});
6136test("QuickDom.isEl", function () {
6137expect(Dom.isEl(Dom.template(['div']))).to.be.false;
6138expect(Dom.isEl(Dom.div())).to.be.false;
6139expect(Dom.isEl(Dom.text())).to.be.false;
6140expect(Dom.isEl(Dom.div()[0])).to.be.true;
6141expect(Dom.isEl(Dom.text()[0])).to.be.false;
6142expect(Dom.isEl({})).to.be.false;
6143expect(Dom.isEl('string')).to.be.false;
6144expect(Dom.isEl(5)).to.be.false;
6145expect(Dom.isEl(false)).to.be.false;
6146return expect(Dom.isEl(true)).to.be.false;
6147});
6148test("Stringification", function () {
6149var section, sectionCopy;
6150section = Dom(['section', {
6151id: 'theSection',
6152className: 'theSectionClass',
6153style: {
6154'position': 'relative',
6155'opacity': 0.5,
6156'fontSize': function () {
6157return '29px';
6158},
6159$happy: {
6160fontSize: '11px',
6161$relaxed: {
6162fontSize: '8px'
6163}
6164}
6165}
6166}, ['div', {
6167id: 'childA',
6168style: {
6169position: 'relative'
6170}
6171}, 'childA-innertext'], 'section-innertext', ['span', {
6172id: 'childB',
6173ref: 'childB-ref!',
6174style: {
6175position: 'absolute'
6176}
6177}, 'childB-innertext', ['text', {
6178text: 'childB-innertext 2'
6179}], ['a', {
6180url: 'https://google.com'
6181}]]]).appendTo(sandbox);
6182window.stringified = JSON.stringify(section, null, 2);
6183sectionCopy = Dom(JSON.parse(stringified)).appendTo(sandbox);
6184expect(sectionCopy.type).to.equal(section.type);
6185expect(sectionCopy.ref).to.equal(section.ref);
6186expect(sectionCopy.el.id).to.equal(section.el.id);
6187expect(sectionCopy.el.className).to.equal(section.el.className);
6188expect(sectionCopy.style('position')).to.equal(section.style('position'));
6189expect(sectionCopy.style('opacity')).to.equal(section.style('opacity'));
6190expect(sectionCopy.style('fontSize')).not.to.equal(section.style('fontSize'));
6191section.style('fontSize', null);
6192section.state('happy', true);
6193sectionCopy.state('happy', true);
6194expect(sectionCopy.style('fontSize')).to.equal(section.style('fontSize'));
6195section.state('relaxed', true);
6196sectionCopy.state('relaxed', true);
6197expect(sectionCopy.style('fontSize')).to.equal(section.style('fontSize'));
6198expect(sectionCopy.children.length).to.equal(section.children.length);
6199expect(Object.keys(sectionCopy.child).length).to.equal(Object.keys(section.child).length);
6200expect(sectionCopy.text).to.equal(section.text);
6201expect(sectionCopy.html).to.equal(section.html);
6202expect(sectionCopy.children[0].style('position')).to.equal(section.children[0].style('position'));
6203expect(sectionCopy.children[2].style('position')).to.equal(section.children[2].style('position'));
6204return expect(sectionCopy.children[2].ref).to.equal(section.children[2].ref);
6205});
6206test("Chaining", function () {
6207var chainResult, div, head;
6208div = Dom.div();
6209chainResult = div.state('abc', true).resetState().style().css('width', 12).attr('test', 123).prop('anotherTest', 123).updateStateStyles({
6210height: 50
6211}).updateStateTexts({
6212$base: 'abc'
6213}).append().appendTo().prepend().prependTo().before().after().insertBefore().insertAfter().detach().wrap(Dom.section()).unwrap().wrap(Dom.header()).replace().appendTo(sandbox).wrap(head = Dom.header()).on('abc', function () {}).emit('abc').off('abc').off();
6214expect(chainResult).to.equal(div);
6215expect(sandbox.children[0]).to.equal(head.el);
6216expect(div.parent).to.equal(head);
6217return expect(div.css('width')).to.equal('12px');
6218});
6219return test("Invalid Arguments", function () {
6220var cb, div, emitCount, text;
6221text = Dom.text('someText', {
6222lostOpts: true
6223});
6224div = Dom.div({
6225lostOpts: true
6226});
6227expect(Dom()).to.equal(void 0);
6228expect(Dom(null)).to.equal(void 0);
6229expect(Dom({})).to.equal(void 0);
6230expect(div.updateOptions()).to.equal(div);
6231expect(text.options.lostOpts).to.equal(void 0);
6232expect(div.options.lostOpts).to.equal(true);
6233expect(div.on()).to.equal(div);
6234expect(div.on('abc')).to.equal(div);
6235expect(div.on('abc', {})).to.equal(div);
6236expect(div.once('abc')).to.equal(div);
6237expect(div.off('somethingFake')).to.equal(div);
6238emitCount = 0;
6239div.on('something', cb = function () {
6240return emitCount++;
6241});
6242expect(div.emit('')).to.equal(div);
6243expect(div.emit()).to.equal(div);
6244expect(div.emitPrivate('none')).to.equal(div);
6245expect(div.emitPrivate('')).to.equal(div);
6246expect(div.emitPrivate()).to.equal(div);
6247expect(emitCount).to.equal(0);
6248expect(div.emit('something')).to.equal(div);
6249expect(emitCount).to.equal(1);
6250expect(div.off('something', function () {})).to.equal(div);
6251expect(div.emit('something')).to.equal(div);
6252expect(emitCount).to.equal(2);
6253div.css(null, '129');
6254expect(div.el.style.null).to.equal(void 0);
6255expect(div.state()).to.eql([]);
6256expect(div.state(null, true)).to.equal(void 0);
6257expect(div.state(123, true)).to.equal(void 0);
6258expect(div.state('base', true)).to.equal(div);
6259expect(div.state('base')).to.be.false;
6260expect(div.state('$whatevs', true)).to.equal(div);
6261expect(div.state('whatevs')).to.be.true;
6262expect(div.state('another')).to.be.false;
6263expect(div.state('another', true)).to.equal(div);
6264expect(div.state('another')).to.be.true;
6265expect(div.state('another', void 0)).to.equal(div);
6266expect(div.state('another')).to.be.false;
6267expect(div.updateStateStyles({
6268$base: {
6269width: 1
6270}
6271})).to.equal(div);
6272expect(div.updateStateStyles(null)).to.equal(div);
6273expect(div.updateStateTexts({
6274$base: 'abc'
6275})).to.equal(div);
6276expect(div.updateStateTexts(null)).to.equal(div);
6277div.appendTo(Dom(sandbox));
6278expect(div.parent).to.equal(Dom(sandbox));
6279div.append(true);
6280expect(div.children.length).to.equal(0);
6281div.appendTo(document);
6282expect(div.parent).to.equal(Dom(sandbox));
6283div.prepend(true);
6284expect(div.children.length).to.equal(0);
6285div.prependTo(true);
6286expect(div.parent).to.equal(Dom(sandbox));
6287div.after(true);
6288expect(div.children.length).to.equal(0);
6289div.insertAfter(123);
6290expect(div.parent).to.equal(Dom(sandbox));
6291div.before(true);
6292expect(div.children.length).to.equal(0);
6293div.insertBefore(123);
6294expect(div.parent).to.equal(Dom(sandbox));
6295div.wrap(123);
6296expect(div.parent).to.equal(Dom(sandbox));
6297div.replace(123);
6298expect(div.parent).to.equal(Dom(sandbox));
6299div.detach();
6300expect(div.parent).to.equal(void 0);
6301div.unwrap();
6302expect(div.parent).to.equal(void 0);
6303expect(Dom(sandbox).children.length).to.equal(0);
6304div.appendTo(Dom(sandbox));
6305expect(Dom(sandbox).children.length).to.equal(1);
6306if (Dom(sandbox)._removeChild) {
6307Dom(sandbox)._removeChild(text);
6308Dom(sandbox)._removeChild(Dom.div());
6309expect(Dom(sandbox).children.length).to.equal(1);
6310}
6311expect(function () {
6312return Dom.batch();
6313}).to.throw();
6314expect(function () {
6315return Dom.batch({});
6316}).to.throw();
6317expect(function () {
6318return Dom.batch(5432);
6319}).to.throw();
6320expect(function () {
6321return Dom.batch([]);
6322}).to.throw();
6323expect(function () {
6324return Dom.batch([12]).append(Dom.div());
6325}).to.throw();
6326expect(function () {
6327return Dom.batch([12]);
6328}).not.to.throw();
6329expect(function () {
6330return Dom.template();
6331}).to.throw();
6332expect(function () {
6333return Dom.template(null);
6334}).to.throw();
6335expect(function () {
6336return Dom.template({});
6337}).to.throw();
6338expect(function () {
6339return Dom.template([8482, {
6340className: 't'
6341}]);
6342}).to.throw();
6343expect(function () {
6344return Dom.template(['div', 'someString']);
6345}).to.throw();
6346expect(function () {
6347return Dom.template(['div', null, 'Some Inner Text']);
6348}).not.to.throw();
6349expect(function () {
6350return Dom.div({
6351style: {
6352opacity: 0.5,
6353'@abc(max-width:390)': {
6354opacity: 1
6355}
6356}
6357}).appendTo(sandbox);
6358}).not.to.throw();
6359return expect(function () {
6360div = Dom.div();
6361div.pipeState(div);
6362div.state('happy', true);
6363return expect(div.state('happy')).to.equal(true);
6364}).not.to.throw();
6365});
6366});
6367});
6368HTMLElement.prototype.onEvent = function (eventName, callback) {
6369if (this.addEventListener) {
6370return this.addEventListener(eventName, callback);
6371} else {
6372return this.attachEvent(`on${eventName}`, callback);
6373}
6374};
6375HTMLElement.prototype.removeEvent = function (eventName, callback) {
6376if (this.removeEventListener) {
6377return this.removeEventListener(eventName, callback);
6378} else {
6379return this.detachEvent(`on${eventName}`, callback);
6380}
6381};
6382HTMLElement.prototype.emitEvent = function (eventName) {
6383var event;
6384event = document.createEvent('Event');
6385event.initEvent(eventName, true, false);
6386return this.dispatchEvent(event);
6387};
6388if (HTMLElement.name !== 'HTMLElement') {
6389HTMLElement.name = 'HTMLElement';
6390Text.name = 'Text';
6391nonElementSuffix = ['OptionsCollection', 'FormControlsCollection', 'Document', 'Collection', 'AllCollection'];
6392elementSuffix = ["Video", "Unknown", "UList", "Track", "Title", "TextArea", "Template", "TableSection", "TableRow", "Table", "TableCol", "TableCell", "TableCaption", "Style", "Span", "Source", "Slot", "Shadow", "Select", "Script", "Quote", "Progress", "Pre", "Picture", "Param", "Paragraph", "Output", "Option", "OptGroup", "Object", "OList", "Mod", "Meter", "Meta", "Menu", "Media", "Marquee", "Map", "Link", "Legend", "Label", "LI", "Input", "Image", "IFrame", "Html", "Heading", "Head", "HR", "FrameSet", "Frame", "Form", "Font", "FieldSet", "Embed", "Div", "Directory", "Dialog", "Details", "DataList", "DList", "Content", "Canvas", "Button", "Body", "Base", "BR", "Audio", "Area", "Anchor"];
6393for ((i = 0, len = nonElementSuffix.length); i < len; i++) {
6394creator = nonElementSuffix[i];
6395if ((ref = window[`HTML${creator}`]) != null) {
6396ref.name = `HTML${creator}`;
6397}
6398}
6399for ((j = 0, len1 = elementSuffix.length); j < len1; j++) {
6400creator = elementSuffix[j];
6401if ((ref1 = window[`HTML${creator}Element`]) != null) {
6402ref1.name = `HTML${creator}Element`;
6403}
6404}
6405if ((ref2 = window.SVGElement) != null) {
6406ref2.name = 'SVGElement';
6407}
6408if ((ref3 = window.SVGSVGElement) != null) {
6409ref3.name = 'SVGSVGElement';
6410}
6411if ((ref4 = window.SVGPolylineElement) != null) {
6412ref4.name = 'SVGPolylineElement';
6413}
6414}
6415if (window.ClientRect == null) {
6416window.ClientRect = DOMRect;
6417}
6418return module.exports;
6419},
6420"simulate.coffee": function (require, module, exports) {
6421var origDescriptors;
6422origDescriptors = {
6423'innerWidth': Object.getOwnPropertyDescriptor(window, 'innerWidth'),
6424'innerHeight': Object.getOwnPropertyDescriptor(window, 'innerHeight')
6425};
6426module.exports = new (function () {
6427var current, getReal, overwrite, overwritten;
6428overwritten = false;
6429current = {
6430width: window.innerWidth,
6431height: window.innerHeight
6432};
6433getReal = function (dimension) {
6434dimension = 'inner' + dimension.replace(/\b./, function (letter) {
6435return letter.toUpperCase();
6436});
6437return origDescriptors[dimension].get.call(window);
6438};
6439overwrite = function () {
6440if (!overwritten) {
6441overwritten = true;
6442Object.defineProperty(window, 'innerWidth', {
6443configurable: true,
6444get: function () {
6445return current.width;
6446},
6447set: function (newValue) {
6448return current.width = newValue;
6449}
6450});
6451return Object.defineProperty(window, 'innerHeight', {
6452configurable: true,
6453get: function () {
6454return current.height;
6455},
6456set: function (newValue) {
6457return current.height = newValue;
6458}
6459});
6460}
6461};
6462this.simulate = function (width, height) {
6463var event;
6464if (width) {
6465current.width = width;
6466}
6467if (height) {
6468current.height = height;
6469}
6470overwrite();
6471event = document.createEvent('Event');
6472event.initEvent('resize', true, false);
6473return window.dispatchEvent(event);
6474};
6475this.restore = function () {
6476Object.defineProperty(window, 'innerWidth', origDescriptors.innerWidth);
6477return Object.defineProperty(window, 'innerHeight', origDescriptors.innerHeight);
6478};
6479return this;
6480})();
6481return module.exports;
6482},
6483"node_modules/chai/index.js": function (require, module, exports) {
6484module.exports = require("node_modules/chai/lib/chai.js");
6485return module.exports;
6486},
6487"node_modules/chai-style/sources/index.js": function (require, module, exports) {
6488module.exports = chaiStyle;
6489function chaiStyle(chai, utils) {
6490const {Assertion} = chai;
6491const {flag} = utils;
6492let sampleDiv, sampleStyle, sampleIframe;
6493Assertion.addMethod('style', function (property, value = '') {
6494const element = flag(this, 'object');
6495const style = window.getComputedStyle(element);
6496value = value.trim();
6497const isNonColors = style[property] === 'rgba(0, 0, 0, 0)' || style[property] === 'transparent';
6498const propertyValue = isNonColors ? '' : style[property];
6499const assertion = value ? compareCSSValue(propertyValue, value) : Boolean(propertyValue);
6500const elementTag = element.tagName.toLowerCase();
6501const throwMessage = `expect ${elementTag} to have {${property}: ${value}}, is receiving {${property}: ${propertyValue}}`;
6502const throwMessageNegative = `expect ${elementTag} to not have {${property}: ${value}}, is receiving {${property}: ${propertyValue}}`;
6503this.assert(assertion, throwMessage, throwMessageNegative, value);
6504function compareCSSValue(computed, expected) {
6505const propertyHifenCase = property.replace(/[A-Z]/g, match => '-' + match.toLowerCase());
6506if (!sampleDiv) {
6507sampleIframe = document.createElement('iframe');
6508sampleDiv = document.createElement('div');
6509sampleStyle = window.getComputedStyle(sampleDiv);
6510sampleIframe.appendChild(sampleDiv);
6511document.body.appendChild(sampleIframe);
6512}
6513sampleDiv.style.fontSize = style.fontSize;
6514sampleDiv.style.setProperty(propertyHifenCase, expected, 'important');
6515const value = sampleStyle[property];
6516const hasAutoValue = value.includes('auto');
6517const reg = new RegExp(escapeRegExp(value).replace(/auto/g, '(\\d+(.\\d+)?px|auto)'));
6518sampleDiv.style.fontSize = null;
6519sampleDiv.style[propertyHifenCase] = null;
6520return hasAutoValue ? reg.test(computed) : computed === value;
6521}
6522});
6523}
6524function escapeRegExp(value) {
6525return String(value).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
6526}
6527return module.exports;
6528},
6529"node_modules/chai/lib/chai.js": function (require, module, exports) {
6530var used = [];
6531exports.version = '4.1.2';
6532exports.AssertionError = require("node_modules/assertion-error/index.js");
6533var util = require("node_modules/chai/lib/chai/utils/index.js");
6534exports.use = function (fn) {
6535if (!~used.indexOf(fn)) {
6536fn(exports, util);
6537used.push(fn);
6538}
6539return exports;
6540};
6541exports.util = util;
6542var config = require("node_modules/chai/lib/chai/config.js");
6543exports.config = config;
6544var assertion = require("node_modules/chai/lib/chai/assertion.js");
6545exports.use(assertion);
6546var core = require("node_modules/chai/lib/chai/core/assertions.js");
6547exports.use(core);
6548var expect = require("node_modules/chai/lib/chai/interface/expect.js");
6549exports.use(expect);
6550var should = require("node_modules/chai/lib/chai/interface/should.js");
6551exports.use(should);
6552var assert = require("node_modules/chai/lib/chai/interface/assert.js");
6553exports.use(assert);
6554return module.exports;
6555},
6556"node_modules/assertion-error/index.js": function (require, module, exports) {
6557function exclude() {
6558var excludes = [].slice.call(arguments);
6559function excludeProps(res, obj) {
6560Object.keys(obj).forEach(function (key) {
6561if (!~excludes.indexOf(key)) res[key] = obj[key];
6562});
6563}
6564return function extendExclude() {
6565var args = [].slice.call(arguments), i = 0, res = {};
6566for (; i < args.length; i++) {
6567excludeProps(res, args[i]);
6568}
6569return res;
6570};
6571}
6572;
6573module.exports = AssertionError;
6574function AssertionError(message, _props, ssf) {
6575var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON'), props = extend(_props || ({}));
6576this.message = message || 'Unspecified AssertionError';
6577this.showDiff = false;
6578for (var key in props) {
6579this[key] = props[key];
6580}
6581ssf = ssf || arguments.callee;
6582if (ssf && Error.captureStackTrace) {
6583Error.captureStackTrace(this, ssf);
6584} else {
6585try {
6586throw new Error();
6587} catch (e) {
6588this.stack = e.stack;
6589}
6590}
6591}
6592AssertionError.prototype = Object.create(Error.prototype);
6593AssertionError.prototype.name = 'AssertionError';
6594AssertionError.prototype.constructor = AssertionError;
6595AssertionError.prototype.toJSON = function (stack) {
6596var extend = exclude('constructor', 'toJSON', 'stack'), props = extend({
6597name: this.name
6598}, this);
6599if (false !== stack && this.stack) {
6600props.stack = this.stack;
6601}
6602return props;
6603};
6604return module.exports;
6605},
6606"node_modules/chai/lib/chai/utils/index.js": function (require, module, exports) {
6607var pathval = require("node_modules/pathval/index.js");
6608exports.test = require("node_modules/chai/lib/chai/utils/test.js");
6609exports.type = require("node_modules/type-detect/index.js");
6610exports.expectTypes = require("node_modules/chai/lib/chai/utils/expectTypes.js");
6611exports.getMessage = require("node_modules/chai/lib/chai/utils/getMessage.js");
6612exports.getActual = require("node_modules/chai/lib/chai/utils/getActual.js");
6613exports.inspect = require("node_modules/chai/lib/chai/utils/inspect.js");
6614exports.objDisplay = require("node_modules/chai/lib/chai/utils/objDisplay.js");
6615exports.flag = require("node_modules/chai/lib/chai/utils/flag.js");
6616exports.transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
6617exports.eql = require("node_modules/deep-eql/index.js");
6618exports.getPathInfo = pathval.getPathInfo;
6619exports.hasProperty = pathval.hasProperty;
6620exports.getName = require("node_modules/get-func-name/index.js");
6621exports.addProperty = require("node_modules/chai/lib/chai/utils/addProperty.js");
6622exports.addMethod = require("node_modules/chai/lib/chai/utils/addMethod.js");
6623exports.overwriteProperty = require("node_modules/chai/lib/chai/utils/overwriteProperty.js");
6624exports.overwriteMethod = require("node_modules/chai/lib/chai/utils/overwriteMethod.js");
6625exports.addChainableMethod = require("node_modules/chai/lib/chai/utils/addChainableMethod.js");
6626exports.overwriteChainableMethod = require("node_modules/chai/lib/chai/utils/overwriteChainableMethod.js");
6627exports.compareByInspect = require("node_modules/chai/lib/chai/utils/compareByInspect.js");
6628exports.getOwnEnumerablePropertySymbols = require("node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js");
6629exports.getOwnEnumerableProperties = require("node_modules/chai/lib/chai/utils/getOwnEnumerableProperties.js");
6630exports.checkError = require("node_modules/check-error/index.js");
6631exports.proxify = require("node_modules/chai/lib/chai/utils/proxify.js");
6632exports.addLengthGuard = require("node_modules/chai/lib/chai/utils/addLengthGuard.js");
6633exports.isProxyEnabled = require("node_modules/chai/lib/chai/utils/isProxyEnabled.js");
6634exports.isNaN = require("node_modules/chai/lib/chai/utils/isNaN.js");
6635return module.exports;
6636},
6637"node_modules/chai/lib/chai/config.js": function (require, module, exports) {
6638module.exports = {
6639includeStack: false,
6640showDiff: true,
6641truncateThreshold: 40,
6642useProxy: true,
6643proxyExcludedKeys: ['then', 'inspect', 'toJSON']
6644};
6645return module.exports;
6646},
6647"node_modules/chai/lib/chai/assertion.js": function (require, module, exports) {
6648var config = require("node_modules/chai/lib/chai/config.js");
6649module.exports = function (_chai, util) {
6650var AssertionError = _chai.AssertionError, flag = util.flag;
6651_chai.Assertion = Assertion;
6652function Assertion(obj, msg, ssfi, lockSsfi) {
6653flag(this, 'ssfi', ssfi || Assertion);
6654flag(this, 'lockSsfi', lockSsfi);
6655flag(this, 'object', obj);
6656flag(this, 'message', msg);
6657return util.proxify(this);
6658}
6659Object.defineProperty(Assertion, 'includeStack', {
6660get: function () {
6661console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
6662return config.includeStack;
6663},
6664set: function (value) {
6665console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
6666config.includeStack = value;
6667}
6668});
6669Object.defineProperty(Assertion, 'showDiff', {
6670get: function () {
6671console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
6672return config.showDiff;
6673},
6674set: function (value) {
6675console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
6676config.showDiff = value;
6677}
6678});
6679Assertion.addProperty = function (name, fn) {
6680util.addProperty(this.prototype, name, fn);
6681};
6682Assertion.addMethod = function (name, fn) {
6683util.addMethod(this.prototype, name, fn);
6684};
6685Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
6686util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
6687};
6688Assertion.overwriteProperty = function (name, fn) {
6689util.overwriteProperty(this.prototype, name, fn);
6690};
6691Assertion.overwriteMethod = function (name, fn) {
6692util.overwriteMethod(this.prototype, name, fn);
6693};
6694Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {
6695util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
6696};
6697Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
6698var ok = util.test(this, arguments);
6699if (false !== showDiff) showDiff = true;
6700if (undefined === expected && undefined === _actual) showDiff = false;
6701if (true !== config.showDiff) showDiff = false;
6702if (!ok) {
6703msg = util.getMessage(this, arguments);
6704var actual = util.getActual(this, arguments);
6705throw new AssertionError(msg, {
6706actual: actual,
6707expected: expected,
6708showDiff: showDiff
6709}, ((config.includeStack)) ? this.assert : flag(this, 'ssfi'));
6710}
6711};
6712Object.defineProperty(Assertion.prototype, '_obj', {
6713get: function () {
6714return flag(this, 'object');
6715},
6716set: function (val) {
6717flag(this, 'object', val);
6718}
6719});
6720};
6721return module.exports;
6722},
6723"node_modules/chai/lib/chai/core/assertions.js": function (require, module, exports) {
6724module.exports = function (chai, _) {
6725var Assertion = chai.Assertion, AssertionError = chai.AssertionError, flag = _.flag;
6726['to', 'be', 'been', 'is', 'and', 'has', 'have', 'with', 'that', 'which', 'at', 'of', 'same', 'but', 'does'].forEach(function (chain) {
6727Assertion.addProperty(chain);
6728});
6729Assertion.addProperty('not', function () {
6730flag(this, 'negate', true);
6731});
6732Assertion.addProperty('deep', function () {
6733flag(this, 'deep', true);
6734});
6735Assertion.addProperty('nested', function () {
6736flag(this, 'nested', true);
6737});
6738Assertion.addProperty('own', function () {
6739flag(this, 'own', true);
6740});
6741Assertion.addProperty('ordered', function () {
6742flag(this, 'ordered', true);
6743});
6744Assertion.addProperty('any', function () {
6745flag(this, 'any', true);
6746flag(this, 'all', false);
6747});
6748Assertion.addProperty('all', function () {
6749flag(this, 'all', true);
6750flag(this, 'any', false);
6751});
6752function an(type, msg) {
6753if (msg) flag(this, 'message', msg);
6754type = type.toLowerCase();
6755var obj = flag(this, 'object'), article = ~['a', 'e', 'i', 'o', 'u'].indexOf(type.charAt(0)) ? 'an ' : 'a ';
6756this.assert(type === _.type(obj).toLowerCase(), 'expected #{this} to be ' + article + type, 'expected #{this} not to be ' + article + type);
6757}
6758Assertion.addChainableMethod('an', an);
6759Assertion.addChainableMethod('a', an);
6760function SameValueZero(a, b) {
6761return (_.isNaN(a) && _.isNaN(b)) || a === b;
6762}
6763function includeChainingBehavior() {
6764flag(this, 'contains', true);
6765}
6766function include(val, msg) {
6767if (msg) flag(this, 'message', msg);
6768var obj = flag(this, 'object'), objType = _.type(obj).toLowerCase(), flagMsg = flag(this, 'message'), negate = flag(this, 'negate'), ssfi = flag(this, 'ssfi'), isDeep = flag(this, 'deep'), descriptor = isDeep ? 'deep ' : '';
6769flagMsg = flagMsg ? flagMsg + ': ' : '';
6770var included = false;
6771switch (objType) {
6772case 'string':
6773included = obj.indexOf(val) !== -1;
6774break;
6775case 'weakset':
6776if (isDeep) {
6777throw new AssertionError(flagMsg + 'unable to use .deep.include with WeakSet', undefined, ssfi);
6778}
6779included = obj.has(val);
6780break;
6781case 'map':
6782var isEql = isDeep ? _.eql : SameValueZero;
6783obj.forEach(function (item) {
6784included = included || isEql(item, val);
6785});
6786break;
6787case 'set':
6788if (isDeep) {
6789obj.forEach(function (item) {
6790included = included || _.eql(item, val);
6791});
6792} else {
6793included = obj.has(val);
6794}
6795break;
6796case 'array':
6797if (isDeep) {
6798included = obj.some(function (item) {
6799return _.eql(item, val);
6800});
6801} else {
6802included = obj.indexOf(val) !== -1;
6803}
6804break;
6805default:
6806if (val !== Object(val)) {
6807throw new AssertionError(flagMsg + 'object tested must be an array, a map, an object,' + ' a set, a string, or a weakset, but ' + objType + ' given', undefined, ssfi);
6808}
6809var props = Object.keys(val), firstErr = null, numErrs = 0;
6810props.forEach(function (prop) {
6811var propAssertion = new Assertion(obj);
6812_.transferFlags(this, propAssertion, true);
6813flag(propAssertion, 'lockSsfi', true);
6814if (!negate || props.length === 1) {
6815propAssertion.property(prop, val[prop]);
6816return;
6817}
6818try {
6819propAssertion.property(prop, val[prop]);
6820} catch (err) {
6821if (!_.checkError.compatibleConstructor(err, AssertionError)) {
6822throw err;
6823}
6824if (firstErr === null) firstErr = err;
6825numErrs++;
6826}
6827}, this);
6828if (negate && props.length > 1 && numErrs === props.length) {
6829throw firstErr;
6830}
6831return;
6832}
6833this.assert(included, 'expected #{this} to ' + descriptor + 'include ' + _.inspect(val), 'expected #{this} to not ' + descriptor + 'include ' + _.inspect(val));
6834}
6835Assertion.addChainableMethod('include', include, includeChainingBehavior);
6836Assertion.addChainableMethod('contain', include, includeChainingBehavior);
6837Assertion.addChainableMethod('contains', include, includeChainingBehavior);
6838Assertion.addChainableMethod('includes', include, includeChainingBehavior);
6839Assertion.addProperty('ok', function () {
6840this.assert(flag(this, 'object'), 'expected #{this} to be truthy', 'expected #{this} to be falsy');
6841});
6842Assertion.addProperty('true', function () {
6843this.assert(true === flag(this, 'object'), 'expected #{this} to be true', 'expected #{this} to be false', flag(this, 'negate') ? false : true);
6844});
6845Assertion.addProperty('false', function () {
6846this.assert(false === flag(this, 'object'), 'expected #{this} to be false', 'expected #{this} to be true', flag(this, 'negate') ? true : false);
6847});
6848Assertion.addProperty('null', function () {
6849this.assert(null === flag(this, 'object'), 'expected #{this} to be null', 'expected #{this} not to be null');
6850});
6851Assertion.addProperty('undefined', function () {
6852this.assert(undefined === flag(this, 'object'), 'expected #{this} to be undefined', 'expected #{this} not to be undefined');
6853});
6854Assertion.addProperty('NaN', function () {
6855this.assert(_.isNaN(flag(this, 'object')), 'expected #{this} to be NaN', 'expected #{this} not to be NaN');
6856});
6857Assertion.addProperty('exist', function () {
6858var val = flag(this, 'object');
6859this.assert(val !== null && val !== undefined, 'expected #{this} to exist', 'expected #{this} to not exist');
6860});
6861Assertion.addProperty('empty', function () {
6862var val = flag(this, 'object'), ssfi = flag(this, 'ssfi'), flagMsg = flag(this, 'message'), itemsCount;
6863flagMsg = flagMsg ? flagMsg + ': ' : '';
6864switch (_.type(val).toLowerCase()) {
6865case 'array':
6866case 'string':
6867itemsCount = val.length;
6868break;
6869case 'map':
6870case 'set':
6871itemsCount = val.size;
6872break;
6873case 'weakmap':
6874case 'weakset':
6875throw new AssertionError(flagMsg + '.empty was passed a weak collection', undefined, ssfi);
6876case 'function':
6877var msg = flagMsg + '.empty was passed a function ' + _.getName(val);
6878throw new AssertionError(msg.trim(), undefined, ssfi);
6879default:
6880if (val !== Object(val)) {
6881throw new AssertionError(flagMsg + '.empty was passed non-string primitive ' + _.inspect(val), undefined, ssfi);
6882}
6883itemsCount = Object.keys(val).length;
6884}
6885this.assert(0 === itemsCount, 'expected #{this} to be empty', 'expected #{this} not to be empty');
6886});
6887function checkArguments() {
6888var obj = flag(this, 'object'), type = _.type(obj);
6889this.assert('Arguments' === type, 'expected #{this} to be arguments but got ' + type, 'expected #{this} to not be arguments');
6890}
6891Assertion.addProperty('arguments', checkArguments);
6892Assertion.addProperty('Arguments', checkArguments);
6893function assertEqual(val, msg) {
6894if (msg) flag(this, 'message', msg);
6895var obj = flag(this, 'object');
6896if (flag(this, 'deep')) {
6897return this.eql(val);
6898} else {
6899this.assert(val === obj, 'expected #{this} to equal #{exp}', 'expected #{this} to not equal #{exp}', val, this._obj, true);
6900}
6901}
6902Assertion.addMethod('equal', assertEqual);
6903Assertion.addMethod('equals', assertEqual);
6904Assertion.addMethod('eq', assertEqual);
6905function assertEql(obj, msg) {
6906if (msg) flag(this, 'message', msg);
6907this.assert(_.eql(obj, flag(this, 'object')), 'expected #{this} to deeply equal #{exp}', 'expected #{this} to not deeply equal #{exp}', obj, this._obj, true);
6908}
6909Assertion.addMethod('eql', assertEql);
6910Assertion.addMethod('eqls', assertEql);
6911function assertAbove(n, msg) {
6912if (msg) flag(this, 'message', msg);
6913var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), nType = _.type(n).toLowerCase(), shouldThrow = true;
6914if (doLength) {
6915new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
6916}
6917if (!doLength && (objType === 'date' && nType !== 'date')) {
6918errorMessage = msgPrefix + 'the argument to above must be a date';
6919} else if (nType !== 'number' && (doLength || objType === 'number')) {
6920errorMessage = msgPrefix + 'the argument to above must be a number';
6921} else if (!doLength && (objType !== 'date' && objType !== 'number')) {
6922var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
6923errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
6924} else {
6925shouldThrow = false;
6926}
6927if (shouldThrow) {
6928throw new AssertionError(errorMessage, undefined, ssfi);
6929}
6930if (doLength) {
6931var len = obj.length;
6932this.assert(len > n, 'expected #{this} to have a length above #{exp} but got #{act}', 'expected #{this} to not have a length above #{exp}', n, len);
6933} else {
6934this.assert(obj > n, 'expected #{this} to be above #{exp}', 'expected #{this} to be at most #{exp}', n);
6935}
6936}
6937Assertion.addMethod('above', assertAbove);
6938Assertion.addMethod('gt', assertAbove);
6939Assertion.addMethod('greaterThan', assertAbove);
6940function assertLeast(n, msg) {
6941if (msg) flag(this, 'message', msg);
6942var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), nType = _.type(n).toLowerCase(), shouldThrow = true;
6943if (doLength) {
6944new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
6945}
6946if (!doLength && (objType === 'date' && nType !== 'date')) {
6947errorMessage = msgPrefix + 'the argument to least must be a date';
6948} else if (nType !== 'number' && (doLength || objType === 'number')) {
6949errorMessage = msgPrefix + 'the argument to least must be a number';
6950} else if (!doLength && (objType !== 'date' && objType !== 'number')) {
6951var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
6952errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
6953} else {
6954shouldThrow = false;
6955}
6956if (shouldThrow) {
6957throw new AssertionError(errorMessage, undefined, ssfi);
6958}
6959if (doLength) {
6960var len = obj.length;
6961this.assert(len >= n, 'expected #{this} to have a length at least #{exp} but got #{act}', 'expected #{this} to have a length below #{exp}', n, len);
6962} else {
6963this.assert(obj >= n, 'expected #{this} to be at least #{exp}', 'expected #{this} to be below #{exp}', n);
6964}
6965}
6966Assertion.addMethod('least', assertLeast);
6967Assertion.addMethod('gte', assertLeast);
6968function assertBelow(n, msg) {
6969if (msg) flag(this, 'message', msg);
6970var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), nType = _.type(n).toLowerCase(), shouldThrow = true;
6971if (doLength) {
6972new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
6973}
6974if (!doLength && (objType === 'date' && nType !== 'date')) {
6975errorMessage = msgPrefix + 'the argument to below must be a date';
6976} else if (nType !== 'number' && (doLength || objType === 'number')) {
6977errorMessage = msgPrefix + 'the argument to below must be a number';
6978} else if (!doLength && (objType !== 'date' && objType !== 'number')) {
6979var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
6980errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
6981} else {
6982shouldThrow = false;
6983}
6984if (shouldThrow) {
6985throw new AssertionError(errorMessage, undefined, ssfi);
6986}
6987if (doLength) {
6988var len = obj.length;
6989this.assert(len < n, 'expected #{this} to have a length below #{exp} but got #{act}', 'expected #{this} to not have a length below #{exp}', n, len);
6990} else {
6991this.assert(obj < n, 'expected #{this} to be below #{exp}', 'expected #{this} to be at least #{exp}', n);
6992}
6993}
6994Assertion.addMethod('below', assertBelow);
6995Assertion.addMethod('lt', assertBelow);
6996Assertion.addMethod('lessThan', assertBelow);
6997function assertMost(n, msg) {
6998if (msg) flag(this, 'message', msg);
6999var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), nType = _.type(n).toLowerCase(), shouldThrow = true;
7000if (doLength) {
7001new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
7002}
7003if (!doLength && (objType === 'date' && nType !== 'date')) {
7004errorMessage = msgPrefix + 'the argument to most must be a date';
7005} else if (nType !== 'number' && (doLength || objType === 'number')) {
7006errorMessage = msgPrefix + 'the argument to most must be a number';
7007} else if (!doLength && (objType !== 'date' && objType !== 'number')) {
7008var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
7009errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
7010} else {
7011shouldThrow = false;
7012}
7013if (shouldThrow) {
7014throw new AssertionError(errorMessage, undefined, ssfi);
7015}
7016if (doLength) {
7017var len = obj.length;
7018this.assert(len <= n, 'expected #{this} to have a length at most #{exp} but got #{act}', 'expected #{this} to have a length above #{exp}', n, len);
7019} else {
7020this.assert(obj <= n, 'expected #{this} to be at most #{exp}', 'expected #{this} to be above #{exp}', n);
7021}
7022}
7023Assertion.addMethod('most', assertMost);
7024Assertion.addMethod('lte', assertMost);
7025Assertion.addMethod('within', function (start, finish, msg) {
7026if (msg) flag(this, 'message', msg);
7027var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), startType = _.type(start).toLowerCase(), finishType = _.type(finish).toLowerCase(), shouldThrow = true, range = ((startType === 'date' && finishType === 'date')) ? start.toUTCString() + '..' + finish.toUTCString() : start + '..' + finish;
7028if (doLength) {
7029new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
7030}
7031if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) {
7032errorMessage = msgPrefix + 'the arguments to within must be dates';
7033} else if ((startType !== 'number' || finishType !== 'number') && (doLength || objType === 'number')) {
7034errorMessage = msgPrefix + 'the arguments to within must be numbers';
7035} else if (!doLength && (objType !== 'date' && objType !== 'number')) {
7036var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
7037errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
7038} else {
7039shouldThrow = false;
7040}
7041if (shouldThrow) {
7042throw new AssertionError(errorMessage, undefined, ssfi);
7043}
7044if (doLength) {
7045var len = obj.length;
7046this.assert(len >= start && len <= finish, 'expected #{this} to have a length within ' + range, 'expected #{this} to not have a length within ' + range);
7047} else {
7048this.assert(obj >= start && obj <= finish, 'expected #{this} to be within ' + range, 'expected #{this} to not be within ' + range);
7049}
7050});
7051function assertInstanceOf(constructor, msg) {
7052if (msg) flag(this, 'message', msg);
7053var target = flag(this, 'object');
7054var ssfi = flag(this, 'ssfi');
7055var flagMsg = flag(this, 'message');
7056try {
7057var isInstanceOf = target instanceof constructor;
7058} catch (err) {
7059if (err instanceof TypeError) {
7060flagMsg = flagMsg ? flagMsg + ': ' : '';
7061throw new AssertionError(flagMsg + 'The instanceof assertion needs a constructor but ' + _.type(constructor) + ' was given.', undefined, ssfi);
7062}
7063throw err;
7064}
7065var name = _.getName(constructor);
7066if (name === null) {
7067name = 'an unnamed constructor';
7068}
7069this.assert(isInstanceOf, 'expected #{this} to be an instance of ' + name, 'expected #{this} to not be an instance of ' + name);
7070}
7071;
7072Assertion.addMethod('instanceof', assertInstanceOf);
7073Assertion.addMethod('instanceOf', assertInstanceOf);
7074function assertProperty(name, val, msg) {
7075if (msg) flag(this, 'message', msg);
7076var isNested = flag(this, 'nested'), isOwn = flag(this, 'own'), flagMsg = flag(this, 'message'), obj = flag(this, 'object'), ssfi = flag(this, 'ssfi');
7077if (isNested && isOwn) {
7078flagMsg = flagMsg ? flagMsg + ': ' : '';
7079throw new AssertionError(flagMsg + 'The "nested" and "own" flags cannot be combined.', undefined, ssfi);
7080}
7081if (obj === null || obj === undefined) {
7082flagMsg = flagMsg ? flagMsg + ': ' : '';
7083throw new AssertionError(flagMsg + 'Target cannot be null or undefined.', undefined, ssfi);
7084}
7085var isDeep = flag(this, 'deep'), negate = flag(this, 'negate'), pathInfo = isNested ? _.getPathInfo(obj, name) : null, value = isNested ? pathInfo.value : obj[name];
7086var descriptor = '';
7087if (isDeep) descriptor += 'deep ';
7088if (isOwn) descriptor += 'own ';
7089if (isNested) descriptor += 'nested ';
7090descriptor += 'property ';
7091var hasProperty;
7092if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name); else if (isNested) hasProperty = pathInfo.exists; else hasProperty = _.hasProperty(obj, name);
7093if (!negate || arguments.length === 1) {
7094this.assert(hasProperty, 'expected #{this} to have ' + descriptor + _.inspect(name), 'expected #{this} to not have ' + descriptor + _.inspect(name));
7095}
7096if (arguments.length > 1) {
7097this.assert(hasProperty && (isDeep ? _.eql(val, value) : val === value), 'expected #{this} to have ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}', 'expected #{this} to not have ' + descriptor + _.inspect(name) + ' of #{act}', val, value);
7098}
7099flag(this, 'object', value);
7100}
7101Assertion.addMethod('property', assertProperty);
7102function assertOwnProperty(name, value, msg) {
7103flag(this, 'own', true);
7104assertProperty.apply(this, arguments);
7105}
7106Assertion.addMethod('ownProperty', assertOwnProperty);
7107Assertion.addMethod('haveOwnProperty', assertOwnProperty);
7108function assertOwnPropertyDescriptor(name, descriptor, msg) {
7109if (typeof descriptor === 'string') {
7110msg = descriptor;
7111descriptor = null;
7112}
7113if (msg) flag(this, 'message', msg);
7114var obj = flag(this, 'object');
7115var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);
7116if (actualDescriptor && descriptor) {
7117this.assert(_.eql(descriptor, actualDescriptor), 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor), 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor), descriptor, actualDescriptor, true);
7118} else {
7119this.assert(actualDescriptor, 'expected #{this} to have an own property descriptor for ' + _.inspect(name), 'expected #{this} to not have an own property descriptor for ' + _.inspect(name));
7120}
7121flag(this, 'object', actualDescriptor);
7122}
7123Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);
7124Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);
7125function assertLengthChain() {
7126flag(this, 'doLength', true);
7127}
7128function assertLength(n, msg) {
7129if (msg) flag(this, 'message', msg);
7130var obj = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
7131new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
7132var len = obj.length;
7133this.assert(len == n, 'expected #{this} to have a length of #{exp} but got #{act}', 'expected #{this} to not have a length of #{act}', n, len);
7134}
7135Assertion.addChainableMethod('length', assertLength, assertLengthChain);
7136Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain);
7137function assertMatch(re, msg) {
7138if (msg) flag(this, 'message', msg);
7139var obj = flag(this, 'object');
7140this.assert(re.exec(obj), 'expected #{this} to match ' + re, 'expected #{this} not to match ' + re);
7141}
7142Assertion.addMethod('match', assertMatch);
7143Assertion.addMethod('matches', assertMatch);
7144Assertion.addMethod('string', function (str, msg) {
7145if (msg) flag(this, 'message', msg);
7146var obj = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
7147new Assertion(obj, flagMsg, ssfi, true).is.a('string');
7148this.assert(~obj.indexOf(str), 'expected #{this} to contain ' + _.inspect(str), 'expected #{this} to not contain ' + _.inspect(str));
7149});
7150function assertKeys(keys) {
7151var obj = flag(this, 'object'), objType = _.type(obj), keysType = _.type(keys), ssfi = flag(this, 'ssfi'), isDeep = flag(this, 'deep'), str, deepStr = '', ok = true, flagMsg = flag(this, 'message');
7152flagMsg = flagMsg ? flagMsg + ': ' : '';
7153var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments';
7154if (objType === 'Map' || objType === 'Set') {
7155deepStr = isDeep ? 'deeply ' : '';
7156actual = [];
7157obj.forEach(function (val, key) {
7158actual.push(key);
7159});
7160if (keysType !== 'Array') {
7161keys = Array.prototype.slice.call(arguments);
7162}
7163} else {
7164actual = _.getOwnEnumerableProperties(obj);
7165switch (keysType) {
7166case 'Array':
7167if (arguments.length > 1) {
7168throw new AssertionError(mixedArgsMsg, undefined, ssfi);
7169}
7170break;
7171case 'Object':
7172if (arguments.length > 1) {
7173throw new AssertionError(mixedArgsMsg, undefined, ssfi);
7174}
7175keys = Object.keys(keys);
7176break;
7177default:
7178keys = Array.prototype.slice.call(arguments);
7179}
7180keys = keys.map(function (val) {
7181return typeof val === 'symbol' ? val : String(val);
7182});
7183}
7184if (!keys.length) {
7185throw new AssertionError(flagMsg + 'keys required', undefined, ssfi);
7186}
7187var len = keys.length, any = flag(this, 'any'), all = flag(this, 'all'), expected = keys, actual;
7188if (!any && !all) {
7189all = true;
7190}
7191if (any) {
7192ok = expected.some(function (expectedKey) {
7193return actual.some(function (actualKey) {
7194if (isDeep) {
7195return _.eql(expectedKey, actualKey);
7196} else {
7197return expectedKey === actualKey;
7198}
7199});
7200});
7201}
7202if (all) {
7203ok = expected.every(function (expectedKey) {
7204return actual.some(function (actualKey) {
7205if (isDeep) {
7206return _.eql(expectedKey, actualKey);
7207} else {
7208return expectedKey === actualKey;
7209}
7210});
7211});
7212if (!flag(this, 'contains')) {
7213ok = ok && keys.length == actual.length;
7214}
7215}
7216if (len > 1) {
7217keys = keys.map(function (key) {
7218return _.inspect(key);
7219});
7220var last = keys.pop();
7221if (all) {
7222str = keys.join(', ') + ', and ' + last;
7223}
7224if (any) {
7225str = keys.join(', ') + ', or ' + last;
7226}
7227} else {
7228str = _.inspect(keys[0]);
7229}
7230str = (len > 1 ? 'keys ' : 'key ') + str;
7231str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;
7232this.assert(ok, 'expected #{this} to ' + deepStr + str, 'expected #{this} to not ' + deepStr + str, expected.slice(0).sort(_.compareByInspect), actual.sort(_.compareByInspect), true);
7233}
7234Assertion.addMethod('keys', assertKeys);
7235Assertion.addMethod('key', assertKeys);
7236function assertThrows(errorLike, errMsgMatcher, msg) {
7237if (msg) flag(this, 'message', msg);
7238var obj = flag(this, 'object'), ssfi = flag(this, 'ssfi'), flagMsg = flag(this, 'message'), negate = flag(this, 'negate') || false;
7239new Assertion(obj, flagMsg, ssfi, true).is.a('function');
7240if (errorLike instanceof RegExp || typeof errorLike === 'string') {
7241errMsgMatcher = errorLike;
7242errorLike = null;
7243}
7244var caughtErr;
7245try {
7246obj();
7247} catch (err) {
7248caughtErr = err;
7249}
7250var everyArgIsUndefined = errorLike === undefined && errMsgMatcher === undefined;
7251var everyArgIsDefined = Boolean(errorLike && errMsgMatcher);
7252var errorLikeFail = false;
7253var errMsgMatcherFail = false;
7254if (everyArgIsUndefined || !everyArgIsUndefined && !negate) {
7255var errorLikeString = 'an error';
7256if (errorLike instanceof Error) {
7257errorLikeString = '#{exp}';
7258} else if (errorLike) {
7259errorLikeString = _.checkError.getConstructorName(errorLike);
7260}
7261this.assert(caughtErr, 'expected #{this} to throw ' + errorLikeString, 'expected #{this} to not throw an error but #{act} was thrown', errorLike && errorLike.toString(), (caughtErr instanceof Error ? caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr && _.checkError.getConstructorName(caughtErr))));
7262}
7263if (errorLike && caughtErr) {
7264if (errorLike instanceof Error) {
7265var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike);
7266if (isCompatibleInstance === negate) {
7267if (everyArgIsDefined && negate) {
7268errorLikeFail = true;
7269} else {
7270this.assert(negate, 'expected #{this} to throw #{exp} but #{act} was thrown', 'expected #{this} to not throw #{exp}' + (caughtErr && !negate ? ' but #{act} was thrown' : ''), errorLike.toString(), caughtErr.toString());
7271}
7272}
7273}
7274var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike);
7275if (isCompatibleConstructor === negate) {
7276if (everyArgIsDefined && negate) {
7277errorLikeFail = true;
7278} else {
7279this.assert(negate, 'expected #{this} to throw #{exp} but #{act} was thrown', 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : ''), (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)), (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)));
7280}
7281}
7282}
7283if (caughtErr && errMsgMatcher !== undefined && errMsgMatcher !== null) {
7284var placeholder = 'including';
7285if (errMsgMatcher instanceof RegExp) {
7286placeholder = 'matching';
7287}
7288var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher);
7289if (isCompatibleMessage === negate) {
7290if (everyArgIsDefined && negate) {
7291errMsgMatcherFail = true;
7292} else {
7293this.assert(negate, 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}', 'expected #{this} to throw error not ' + placeholder + ' #{exp}', errMsgMatcher, _.checkError.getMessage(caughtErr));
7294}
7295}
7296}
7297if (errorLikeFail && errMsgMatcherFail) {
7298this.assert(negate, 'expected #{this} to throw #{exp} but #{act} was thrown', 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : ''), (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)), (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)));
7299}
7300flag(this, 'object', caughtErr);
7301}
7302;
7303Assertion.addMethod('throw', assertThrows);
7304Assertion.addMethod('throws', assertThrows);
7305Assertion.addMethod('Throw', assertThrows);
7306function respondTo(method, msg) {
7307if (msg) flag(this, 'message', msg);
7308var obj = flag(this, 'object'), itself = flag(this, 'itself'), context = (('function' === typeof obj && !itself)) ? obj.prototype[method] : obj[method];
7309this.assert('function' === typeof context, 'expected #{this} to respond to ' + _.inspect(method), 'expected #{this} to not respond to ' + _.inspect(method));
7310}
7311Assertion.addMethod('respondTo', respondTo);
7312Assertion.addMethod('respondsTo', respondTo);
7313Assertion.addProperty('itself', function () {
7314flag(this, 'itself', true);
7315});
7316function satisfy(matcher, msg) {
7317if (msg) flag(this, 'message', msg);
7318var obj = flag(this, 'object');
7319var result = matcher(obj);
7320this.assert(result, 'expected #{this} to satisfy ' + _.objDisplay(matcher), 'expected #{this} to not satisfy' + _.objDisplay(matcher), flag(this, 'negate') ? false : true, result);
7321}
7322Assertion.addMethod('satisfy', satisfy);
7323Assertion.addMethod('satisfies', satisfy);
7324function closeTo(expected, delta, msg) {
7325if (msg) flag(this, 'message', msg);
7326var obj = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
7327new Assertion(obj, flagMsg, ssfi, true).is.a('number');
7328if (typeof expected !== 'number' || typeof delta !== 'number') {
7329flagMsg = flagMsg ? flagMsg + ': ' : '';
7330throw new AssertionError(flagMsg + 'the arguments to closeTo or approximately must be numbers', undefined, ssfi);
7331}
7332this.assert(Math.abs(obj - expected) <= delta, 'expected #{this} to be close to ' + expected + ' +/- ' + delta, 'expected #{this} not to be close to ' + expected + ' +/- ' + delta);
7333}
7334Assertion.addMethod('closeTo', closeTo);
7335Assertion.addMethod('approximately', closeTo);
7336function isSubsetOf(subset, superset, cmp, contains, ordered) {
7337if (!contains) {
7338if (subset.length !== superset.length) return false;
7339superset = superset.slice();
7340}
7341return subset.every(function (elem, idx) {
7342if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx];
7343if (!cmp) {
7344var matchIdx = superset.indexOf(elem);
7345if (matchIdx === -1) return false;
7346if (!contains) superset.splice(matchIdx, 1);
7347return true;
7348}
7349return superset.some(function (elem2, matchIdx) {
7350if (!cmp(elem, elem2)) return false;
7351if (!contains) superset.splice(matchIdx, 1);
7352return true;
7353});
7354});
7355}
7356Assertion.addMethod('members', function (subset, msg) {
7357if (msg) flag(this, 'message', msg);
7358var obj = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
7359new Assertion(obj, flagMsg, ssfi, true).to.be.an('array');
7360new Assertion(subset, flagMsg, ssfi, true).to.be.an('array');
7361var contains = flag(this, 'contains');
7362var ordered = flag(this, 'ordered');
7363var subject, failMsg, failNegateMsg, lengthCheck;
7364if (contains) {
7365subject = ordered ? 'an ordered superset' : 'a superset';
7366failMsg = 'expected #{this} to be ' + subject + ' of #{exp}';
7367failNegateMsg = 'expected #{this} to not be ' + subject + ' of #{exp}';
7368} else {
7369subject = ordered ? 'ordered members' : 'members';
7370failMsg = 'expected #{this} to have the same ' + subject + ' as #{exp}';
7371failNegateMsg = 'expected #{this} to not have the same ' + subject + ' as #{exp}';
7372}
7373var cmp = flag(this, 'deep') ? _.eql : undefined;
7374this.assert(isSubsetOf(subset, obj, cmp, contains, ordered), failMsg, failNegateMsg, subset, obj, true);
7375});
7376function oneOf(list, msg) {
7377if (msg) flag(this, 'message', msg);
7378var expected = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
7379new Assertion(list, flagMsg, ssfi, true).to.be.an('array');
7380this.assert(list.indexOf(expected) > -1, 'expected #{this} to be one of #{exp}', 'expected #{this} to not be one of #{exp}', list, expected);
7381}
7382Assertion.addMethod('oneOf', oneOf);
7383function assertChanges(subject, prop, msg) {
7384if (msg) flag(this, 'message', msg);
7385var fn = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
7386new Assertion(fn, flagMsg, ssfi, true).is.a('function');
7387var initial;
7388if (!prop) {
7389new Assertion(subject, flagMsg, ssfi, true).is.a('function');
7390initial = subject();
7391} else {
7392new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
7393initial = subject[prop];
7394}
7395fn();
7396var final = prop === undefined || prop === null ? subject() : subject[prop];
7397var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
7398flag(this, 'deltaMsgObj', msgObj);
7399flag(this, 'initialDeltaValue', initial);
7400flag(this, 'finalDeltaValue', final);
7401flag(this, 'deltaBehavior', 'change');
7402flag(this, 'realDelta', final !== initial);
7403this.assert(initial !== final, 'expected ' + msgObj + ' to change', 'expected ' + msgObj + ' to not change');
7404}
7405Assertion.addMethod('change', assertChanges);
7406Assertion.addMethod('changes', assertChanges);
7407function assertIncreases(subject, prop, msg) {
7408if (msg) flag(this, 'message', msg);
7409var fn = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
7410new Assertion(fn, flagMsg, ssfi, true).is.a('function');
7411var initial;
7412if (!prop) {
7413new Assertion(subject, flagMsg, ssfi, true).is.a('function');
7414initial = subject();
7415} else {
7416new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
7417initial = subject[prop];
7418}
7419new Assertion(initial, flagMsg, ssfi, true).is.a('number');
7420fn();
7421var final = prop === undefined || prop === null ? subject() : subject[prop];
7422var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
7423flag(this, 'deltaMsgObj', msgObj);
7424flag(this, 'initialDeltaValue', initial);
7425flag(this, 'finalDeltaValue', final);
7426flag(this, 'deltaBehavior', 'increase');
7427flag(this, 'realDelta', final - initial);
7428this.assert(final - initial > 0, 'expected ' + msgObj + ' to increase', 'expected ' + msgObj + ' to not increase');
7429}
7430Assertion.addMethod('increase', assertIncreases);
7431Assertion.addMethod('increases', assertIncreases);
7432function assertDecreases(subject, prop, msg) {
7433if (msg) flag(this, 'message', msg);
7434var fn = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
7435new Assertion(fn, flagMsg, ssfi, true).is.a('function');
7436var initial;
7437if (!prop) {
7438new Assertion(subject, flagMsg, ssfi, true).is.a('function');
7439initial = subject();
7440} else {
7441new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
7442initial = subject[prop];
7443}
7444new Assertion(initial, flagMsg, ssfi, true).is.a('number');
7445fn();
7446var final = prop === undefined || prop === null ? subject() : subject[prop];
7447var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
7448flag(this, 'deltaMsgObj', msgObj);
7449flag(this, 'initialDeltaValue', initial);
7450flag(this, 'finalDeltaValue', final);
7451flag(this, 'deltaBehavior', 'decrease');
7452flag(this, 'realDelta', initial - final);
7453this.assert(final - initial < 0, 'expected ' + msgObj + ' to decrease', 'expected ' + msgObj + ' to not decrease');
7454}
7455Assertion.addMethod('decrease', assertDecreases);
7456Assertion.addMethod('decreases', assertDecreases);
7457function assertDelta(delta, msg) {
7458if (msg) flag(this, 'message', msg);
7459var msgObj = flag(this, 'deltaMsgObj');
7460var initial = flag(this, 'initialDeltaValue');
7461var final = flag(this, 'finalDeltaValue');
7462var behavior = flag(this, 'deltaBehavior');
7463var realDelta = flag(this, 'realDelta');
7464var expression;
7465if (behavior === 'change') {
7466expression = Math.abs(final - initial) === Math.abs(delta);
7467} else {
7468expression = realDelta === Math.abs(delta);
7469}
7470this.assert(expression, 'expected ' + msgObj + ' to ' + behavior + ' by ' + delta, 'expected ' + msgObj + ' to not ' + behavior + ' by ' + delta);
7471}
7472Assertion.addMethod('by', assertDelta);
7473Assertion.addProperty('extensible', function () {
7474var obj = flag(this, 'object');
7475var isExtensible = obj === Object(obj) && Object.isExtensible(obj);
7476this.assert(isExtensible, 'expected #{this} to be extensible', 'expected #{this} to not be extensible');
7477});
7478Assertion.addProperty('sealed', function () {
7479var obj = flag(this, 'object');
7480var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true;
7481this.assert(isSealed, 'expected #{this} to be sealed', 'expected #{this} to not be sealed');
7482});
7483Assertion.addProperty('frozen', function () {
7484var obj = flag(this, 'object');
7485var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true;
7486this.assert(isFrozen, 'expected #{this} to be frozen', 'expected #{this} to not be frozen');
7487});
7488Assertion.addProperty('finite', function (msg) {
7489var obj = flag(this, 'object');
7490this.assert(typeof obj === "number" && isFinite(obj), 'expected #{this} to be a finite number', 'expected #{this} to not be a finite number');
7491});
7492};
7493return module.exports;
7494},
7495"node_modules/chai/lib/chai/interface/expect.js": function (require, module, exports) {
7496module.exports = function (chai, util) {
7497chai.expect = function (val, message) {
7498return new chai.Assertion(val, message);
7499};
7500chai.expect.fail = function (actual, expected, message, operator) {
7501message = message || 'expect.fail()';
7502throw new chai.AssertionError(message, {
7503actual: actual,
7504expected: expected,
7505operator: operator
7506}, chai.expect.fail);
7507};
7508};
7509return module.exports;
7510},
7511"node_modules/chai/lib/chai/interface/should.js": function (require, module, exports) {
7512module.exports = function (chai, util) {
7513var Assertion = chai.Assertion;
7514function loadShould() {
7515function shouldGetter() {
7516if (this instanceof String || this instanceof Number || this instanceof Boolean || typeof Symbol === 'function' && this instanceof Symbol) {
7517return new Assertion(this.valueOf(), null, shouldGetter);
7518}
7519return new Assertion(this, null, shouldGetter);
7520}
7521function shouldSetter(value) {
7522Object.defineProperty(this, 'should', {
7523value: value,
7524enumerable: true,
7525configurable: true,
7526writable: true
7527});
7528}
7529Object.defineProperty(Object.prototype, 'should', {
7530set: shouldSetter,
7531get: shouldGetter,
7532configurable: true
7533});
7534var should = {};
7535should.fail = function (actual, expected, message, operator) {
7536message = message || 'should.fail()';
7537throw new chai.AssertionError(message, {
7538actual: actual,
7539expected: expected,
7540operator: operator
7541}, should.fail);
7542};
7543should.equal = function (val1, val2, msg) {
7544new Assertion(val1, msg).to.equal(val2);
7545};
7546should.Throw = function (fn, errt, errs, msg) {
7547new Assertion(fn, msg).to.Throw(errt, errs);
7548};
7549should.exist = function (val, msg) {
7550new Assertion(val, msg).to.exist;
7551};
7552should.not = {};
7553should.not.equal = function (val1, val2, msg) {
7554new Assertion(val1, msg).to.not.equal(val2);
7555};
7556should.not.Throw = function (fn, errt, errs, msg) {
7557new Assertion(fn, msg).to.not.Throw(errt, errs);
7558};
7559should.not.exist = function (val, msg) {
7560new Assertion(val, msg).to.not.exist;
7561};
7562should['throw'] = should['Throw'];
7563should.not['throw'] = should.not['Throw'];
7564return should;
7565}
7566;
7567chai.should = loadShould;
7568chai.Should = loadShould;
7569};
7570return module.exports;
7571},
7572"node_modules/chai/lib/chai/interface/assert.js": function (require, module, exports) {
7573module.exports = function (chai, util) {
7574var Assertion = chai.Assertion, flag = util.flag;
7575var assert = chai.assert = function (express, errmsg) {
7576var test = new Assertion(null, null, chai.assert, true);
7577test.assert(express, errmsg, '[ negation message unavailable ]');
7578};
7579assert.fail = function (actual, expected, message, operator) {
7580message = message || 'assert.fail()';
7581throw new chai.AssertionError(message, {
7582actual: actual,
7583expected: expected,
7584operator: operator
7585}, assert.fail);
7586};
7587assert.isOk = function (val, msg) {
7588new Assertion(val, msg, assert.isOk, true).is.ok;
7589};
7590assert.isNotOk = function (val, msg) {
7591new Assertion(val, msg, assert.isNotOk, true).is.not.ok;
7592};
7593assert.equal = function (act, exp, msg) {
7594var test = new Assertion(act, msg, assert.equal, true);
7595test.assert(exp == flag(test, 'object'), 'expected #{this} to equal #{exp}', 'expected #{this} to not equal #{act}', exp, act, true);
7596};
7597assert.notEqual = function (act, exp, msg) {
7598var test = new Assertion(act, msg, assert.notEqual, true);
7599test.assert(exp != flag(test, 'object'), 'expected #{this} to not equal #{exp}', 'expected #{this} to equal #{act}', exp, act, true);
7600};
7601assert.strictEqual = function (act, exp, msg) {
7602new Assertion(act, msg, assert.strictEqual, true).to.equal(exp);
7603};
7604assert.notStrictEqual = function (act, exp, msg) {
7605new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp);
7606};
7607assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) {
7608new Assertion(act, msg, assert.deepEqual, true).to.eql(exp);
7609};
7610assert.notDeepEqual = function (act, exp, msg) {
7611new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp);
7612};
7613assert.isAbove = function (val, abv, msg) {
7614new Assertion(val, msg, assert.isAbove, true).to.be.above(abv);
7615};
7616assert.isAtLeast = function (val, atlst, msg) {
7617new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst);
7618};
7619assert.isBelow = function (val, blw, msg) {
7620new Assertion(val, msg, assert.isBelow, true).to.be.below(blw);
7621};
7622assert.isAtMost = function (val, atmst, msg) {
7623new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst);
7624};
7625assert.isTrue = function (val, msg) {
7626new Assertion(val, msg, assert.isTrue, true).is['true'];
7627};
7628assert.isNotTrue = function (val, msg) {
7629new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true);
7630};
7631assert.isFalse = function (val, msg) {
7632new Assertion(val, msg, assert.isFalse, true).is['false'];
7633};
7634assert.isNotFalse = function (val, msg) {
7635new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false);
7636};
7637assert.isNull = function (val, msg) {
7638new Assertion(val, msg, assert.isNull, true).to.equal(null);
7639};
7640assert.isNotNull = function (val, msg) {
7641new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null);
7642};
7643assert.isNaN = function (val, msg) {
7644new Assertion(val, msg, assert.isNaN, true).to.be.NaN;
7645};
7646assert.isNotNaN = function (val, msg) {
7647new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN;
7648};
7649assert.exists = function (val, msg) {
7650new Assertion(val, msg, assert.exists, true).to.exist;
7651};
7652assert.notExists = function (val, msg) {
7653new Assertion(val, msg, assert.notExists, true).to.not.exist;
7654};
7655assert.isUndefined = function (val, msg) {
7656new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined);
7657};
7658assert.isDefined = function (val, msg) {
7659new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined);
7660};
7661assert.isFunction = function (val, msg) {
7662new Assertion(val, msg, assert.isFunction, true).to.be.a('function');
7663};
7664assert.isNotFunction = function (val, msg) {
7665new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function');
7666};
7667assert.isObject = function (val, msg) {
7668new Assertion(val, msg, assert.isObject, true).to.be.a('object');
7669};
7670assert.isNotObject = function (val, msg) {
7671new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object');
7672};
7673assert.isArray = function (val, msg) {
7674new Assertion(val, msg, assert.isArray, true).to.be.an('array');
7675};
7676assert.isNotArray = function (val, msg) {
7677new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array');
7678};
7679assert.isString = function (val, msg) {
7680new Assertion(val, msg, assert.isString, true).to.be.a('string');
7681};
7682assert.isNotString = function (val, msg) {
7683new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string');
7684};
7685assert.isNumber = function (val, msg) {
7686new Assertion(val, msg, assert.isNumber, true).to.be.a('number');
7687};
7688assert.isNotNumber = function (val, msg) {
7689new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number');
7690};
7691assert.isFinite = function (val, msg) {
7692new Assertion(val, msg, assert.isFinite, true).to.be.finite;
7693};
7694assert.isBoolean = function (val, msg) {
7695new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean');
7696};
7697assert.isNotBoolean = function (val, msg) {
7698new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean');
7699};
7700assert.typeOf = function (val, type, msg) {
7701new Assertion(val, msg, assert.typeOf, true).to.be.a(type);
7702};
7703assert.notTypeOf = function (val, type, msg) {
7704new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type);
7705};
7706assert.instanceOf = function (val, type, msg) {
7707new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type);
7708};
7709assert.notInstanceOf = function (val, type, msg) {
7710new Assertion(val, msg, assert.notInstanceOf, true).to.not.be.instanceOf(type);
7711};
7712assert.include = function (exp, inc, msg) {
7713new Assertion(exp, msg, assert.include, true).include(inc);
7714};
7715assert.notInclude = function (exp, inc, msg) {
7716new Assertion(exp, msg, assert.notInclude, true).not.include(inc);
7717};
7718assert.deepInclude = function (exp, inc, msg) {
7719new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc);
7720};
7721assert.notDeepInclude = function (exp, inc, msg) {
7722new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc);
7723};
7724assert.nestedInclude = function (exp, inc, msg) {
7725new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc);
7726};
7727assert.notNestedInclude = function (exp, inc, msg) {
7728new Assertion(exp, msg, assert.notNestedInclude, true).not.nested.include(inc);
7729};
7730assert.deepNestedInclude = function (exp, inc, msg) {
7731new Assertion(exp, msg, assert.deepNestedInclude, true).deep.nested.include(inc);
7732};
7733assert.notDeepNestedInclude = function (exp, inc, msg) {
7734new Assertion(exp, msg, assert.notDeepNestedInclude, true).not.deep.nested.include(inc);
7735};
7736assert.ownInclude = function (exp, inc, msg) {
7737new Assertion(exp, msg, assert.ownInclude, true).own.include(inc);
7738};
7739assert.notOwnInclude = function (exp, inc, msg) {
7740new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc);
7741};
7742assert.deepOwnInclude = function (exp, inc, msg) {
7743new Assertion(exp, msg, assert.deepOwnInclude, true).deep.own.include(inc);
7744};
7745assert.notDeepOwnInclude = function (exp, inc, msg) {
7746new Assertion(exp, msg, assert.notDeepOwnInclude, true).not.deep.own.include(inc);
7747};
7748assert.match = function (exp, re, msg) {
7749new Assertion(exp, msg, assert.match, true).to.match(re);
7750};
7751assert.notMatch = function (exp, re, msg) {
7752new Assertion(exp, msg, assert.notMatch, true).to.not.match(re);
7753};
7754assert.property = function (obj, prop, msg) {
7755new Assertion(obj, msg, assert.property, true).to.have.property(prop);
7756};
7757assert.notProperty = function (obj, prop, msg) {
7758new Assertion(obj, msg, assert.notProperty, true).to.not.have.property(prop);
7759};
7760assert.propertyVal = function (obj, prop, val, msg) {
7761new Assertion(obj, msg, assert.propertyVal, true).to.have.property(prop, val);
7762};
7763assert.notPropertyVal = function (obj, prop, val, msg) {
7764new Assertion(obj, msg, assert.notPropertyVal, true).to.not.have.property(prop, val);
7765};
7766assert.deepPropertyVal = function (obj, prop, val, msg) {
7767new Assertion(obj, msg, assert.deepPropertyVal, true).to.have.deep.property(prop, val);
7768};
7769assert.notDeepPropertyVal = function (obj, prop, val, msg) {
7770new Assertion(obj, msg, assert.notDeepPropertyVal, true).to.not.have.deep.property(prop, val);
7771};
7772assert.ownProperty = function (obj, prop, msg) {
7773new Assertion(obj, msg, assert.ownProperty, true).to.have.own.property(prop);
7774};
7775assert.notOwnProperty = function (obj, prop, msg) {
7776new Assertion(obj, msg, assert.notOwnProperty, true).to.not.have.own.property(prop);
7777};
7778assert.ownPropertyVal = function (obj, prop, value, msg) {
7779new Assertion(obj, msg, assert.ownPropertyVal, true).to.have.own.property(prop, value);
7780};
7781assert.notOwnPropertyVal = function (obj, prop, value, msg) {
7782new Assertion(obj, msg, assert.notOwnPropertyVal, true).to.not.have.own.property(prop, value);
7783};
7784assert.deepOwnPropertyVal = function (obj, prop, value, msg) {
7785new Assertion(obj, msg, assert.deepOwnPropertyVal, true).to.have.deep.own.property(prop, value);
7786};
7787assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) {
7788new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true).to.not.have.deep.own.property(prop, value);
7789};
7790assert.nestedProperty = function (obj, prop, msg) {
7791new Assertion(obj, msg, assert.nestedProperty, true).to.have.nested.property(prop);
7792};
7793assert.notNestedProperty = function (obj, prop, msg) {
7794new Assertion(obj, msg, assert.notNestedProperty, true).to.not.have.nested.property(prop);
7795};
7796assert.nestedPropertyVal = function (obj, prop, val, msg) {
7797new Assertion(obj, msg, assert.nestedPropertyVal, true).to.have.nested.property(prop, val);
7798};
7799assert.notNestedPropertyVal = function (obj, prop, val, msg) {
7800new Assertion(obj, msg, assert.notNestedPropertyVal, true).to.not.have.nested.property(prop, val);
7801};
7802assert.deepNestedPropertyVal = function (obj, prop, val, msg) {
7803new Assertion(obj, msg, assert.deepNestedPropertyVal, true).to.have.deep.nested.property(prop, val);
7804};
7805assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) {
7806new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true).to.not.have.deep.nested.property(prop, val);
7807};
7808assert.lengthOf = function (exp, len, msg) {
7809new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len);
7810};
7811assert.hasAnyKeys = function (obj, keys, msg) {
7812new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys);
7813};
7814assert.hasAllKeys = function (obj, keys, msg) {
7815new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys);
7816};
7817assert.containsAllKeys = function (obj, keys, msg) {
7818new Assertion(obj, msg, assert.containsAllKeys, true).to.contain.all.keys(keys);
7819};
7820assert.doesNotHaveAnyKeys = function (obj, keys, msg) {
7821new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true).to.not.have.any.keys(keys);
7822};
7823assert.doesNotHaveAllKeys = function (obj, keys, msg) {
7824new Assertion(obj, msg, assert.doesNotHaveAllKeys, true).to.not.have.all.keys(keys);
7825};
7826assert.hasAnyDeepKeys = function (obj, keys, msg) {
7827new Assertion(obj, msg, assert.hasAnyDeepKeys, true).to.have.any.deep.keys(keys);
7828};
7829assert.hasAllDeepKeys = function (obj, keys, msg) {
7830new Assertion(obj, msg, assert.hasAllDeepKeys, true).to.have.all.deep.keys(keys);
7831};
7832assert.containsAllDeepKeys = function (obj, keys, msg) {
7833new Assertion(obj, msg, assert.containsAllDeepKeys, true).to.contain.all.deep.keys(keys);
7834};
7835assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) {
7836new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true).to.not.have.any.deep.keys(keys);
7837};
7838assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) {
7839new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true).to.not.have.all.deep.keys(keys);
7840};
7841assert.throws = function (fn, errorLike, errMsgMatcher, msg) {
7842if ('string' === typeof errorLike || errorLike instanceof RegExp) {
7843errMsgMatcher = errorLike;
7844errorLike = null;
7845}
7846var assertErr = new Assertion(fn, msg, assert.throws, true).to.throw(errorLike, errMsgMatcher);
7847return flag(assertErr, 'object');
7848};
7849assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) {
7850if ('string' === typeof errorLike || errorLike instanceof RegExp) {
7851errMsgMatcher = errorLike;
7852errorLike = null;
7853}
7854new Assertion(fn, msg, assert.doesNotThrow, true).to.not.throw(errorLike, errMsgMatcher);
7855};
7856assert.operator = function (val, operator, val2, msg) {
7857var ok;
7858switch (operator) {
7859case '==':
7860ok = val == val2;
7861break;
7862case '===':
7863ok = val === val2;
7864break;
7865case '>':
7866ok = val > val2;
7867break;
7868case '>=':
7869ok = val >= val2;
7870break;
7871case '<':
7872ok = val < val2;
7873break;
7874case '<=':
7875ok = val <= val2;
7876break;
7877case '!=':
7878ok = val != val2;
7879break;
7880case '!==':
7881ok = val !== val2;
7882break;
7883default:
7884msg = msg ? msg + ': ' : msg;
7885throw new chai.AssertionError(msg + 'Invalid operator "' + operator + '"', undefined, assert.operator);
7886}
7887var test = new Assertion(ok, msg, assert.operator, true);
7888test.assert(true === flag(test, 'object'), 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2), 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2));
7889};
7890assert.closeTo = function (act, exp, delta, msg) {
7891new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta);
7892};
7893assert.approximately = function (act, exp, delta, msg) {
7894new Assertion(act, msg, assert.approximately, true).to.be.approximately(exp, delta);
7895};
7896assert.sameMembers = function (set1, set2, msg) {
7897new Assertion(set1, msg, assert.sameMembers, true).to.have.same.members(set2);
7898};
7899assert.notSameMembers = function (set1, set2, msg) {
7900new Assertion(set1, msg, assert.notSameMembers, true).to.not.have.same.members(set2);
7901};
7902assert.sameDeepMembers = function (set1, set2, msg) {
7903new Assertion(set1, msg, assert.sameDeepMembers, true).to.have.same.deep.members(set2);
7904};
7905assert.notSameDeepMembers = function (set1, set2, msg) {
7906new Assertion(set1, msg, assert.notSameDeepMembers, true).to.not.have.same.deep.members(set2);
7907};
7908assert.sameOrderedMembers = function (set1, set2, msg) {
7909new Assertion(set1, msg, assert.sameOrderedMembers, true).to.have.same.ordered.members(set2);
7910};
7911assert.notSameOrderedMembers = function (set1, set2, msg) {
7912new Assertion(set1, msg, assert.notSameOrderedMembers, true).to.not.have.same.ordered.members(set2);
7913};
7914assert.sameDeepOrderedMembers = function (set1, set2, msg) {
7915new Assertion(set1, msg, assert.sameDeepOrderedMembers, true).to.have.same.deep.ordered.members(set2);
7916};
7917assert.notSameDeepOrderedMembers = function (set1, set2, msg) {
7918new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true).to.not.have.same.deep.ordered.members(set2);
7919};
7920assert.includeMembers = function (superset, subset, msg) {
7921new Assertion(superset, msg, assert.includeMembers, true).to.include.members(subset);
7922};
7923assert.notIncludeMembers = function (superset, subset, msg) {
7924new Assertion(superset, msg, assert.notIncludeMembers, true).to.not.include.members(subset);
7925};
7926assert.includeDeepMembers = function (superset, subset, msg) {
7927new Assertion(superset, msg, assert.includeDeepMembers, true).to.include.deep.members(subset);
7928};
7929assert.notIncludeDeepMembers = function (superset, subset, msg) {
7930new Assertion(superset, msg, assert.notIncludeDeepMembers, true).to.not.include.deep.members(subset);
7931};
7932assert.includeOrderedMembers = function (superset, subset, msg) {
7933new Assertion(superset, msg, assert.includeOrderedMembers, true).to.include.ordered.members(subset);
7934};
7935assert.notIncludeOrderedMembers = function (superset, subset, msg) {
7936new Assertion(superset, msg, assert.notIncludeOrderedMembers, true).to.not.include.ordered.members(subset);
7937};
7938assert.includeDeepOrderedMembers = function (superset, subset, msg) {
7939new Assertion(superset, msg, assert.includeDeepOrderedMembers, true).to.include.deep.ordered.members(subset);
7940};
7941assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) {
7942new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true).to.not.include.deep.ordered.members(subset);
7943};
7944assert.oneOf = function (inList, list, msg) {
7945new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list);
7946};
7947assert.changes = function (fn, obj, prop, msg) {
7948if (arguments.length === 3 && typeof obj === 'function') {
7949msg = prop;
7950prop = null;
7951}
7952new Assertion(fn, msg, assert.changes, true).to.change(obj, prop);
7953};
7954assert.changesBy = function (fn, obj, prop, delta, msg) {
7955if (arguments.length === 4 && typeof obj === 'function') {
7956var tmpMsg = delta;
7957delta = prop;
7958msg = tmpMsg;
7959} else if (arguments.length === 3) {
7960delta = prop;
7961prop = null;
7962}
7963new Assertion(fn, msg, assert.changesBy, true).to.change(obj, prop).by(delta);
7964};
7965assert.doesNotChange = function (fn, obj, prop, msg) {
7966if (arguments.length === 3 && typeof obj === 'function') {
7967msg = prop;
7968prop = null;
7969}
7970return new Assertion(fn, msg, assert.doesNotChange, true).to.not.change(obj, prop);
7971};
7972assert.changesButNotBy = function (fn, obj, prop, delta, msg) {
7973if (arguments.length === 4 && typeof obj === 'function') {
7974var tmpMsg = delta;
7975delta = prop;
7976msg = tmpMsg;
7977} else if (arguments.length === 3) {
7978delta = prop;
7979prop = null;
7980}
7981new Assertion(fn, msg, assert.changesButNotBy, true).to.change(obj, prop).but.not.by(delta);
7982};
7983assert.increases = function (fn, obj, prop, msg) {
7984if (arguments.length === 3 && typeof obj === 'function') {
7985msg = prop;
7986prop = null;
7987}
7988return new Assertion(fn, msg, assert.increases, true).to.increase(obj, prop);
7989};
7990assert.increasesBy = function (fn, obj, prop, delta, msg) {
7991if (arguments.length === 4 && typeof obj === 'function') {
7992var tmpMsg = delta;
7993delta = prop;
7994msg = tmpMsg;
7995} else if (arguments.length === 3) {
7996delta = prop;
7997prop = null;
7998}
7999new Assertion(fn, msg, assert.increasesBy, true).to.increase(obj, prop).by(delta);
8000};
8001assert.doesNotIncrease = function (fn, obj, prop, msg) {
8002if (arguments.length === 3 && typeof obj === 'function') {
8003msg = prop;
8004prop = null;
8005}
8006return new Assertion(fn, msg, assert.doesNotIncrease, true).to.not.increase(obj, prop);
8007};
8008assert.increasesButNotBy = function (fn, obj, prop, delta, msg) {
8009if (arguments.length === 4 && typeof obj === 'function') {
8010var tmpMsg = delta;
8011delta = prop;
8012msg = tmpMsg;
8013} else if (arguments.length === 3) {
8014delta = prop;
8015prop = null;
8016}
8017new Assertion(fn, msg, assert.increasesButNotBy, true).to.increase(obj, prop).but.not.by(delta);
8018};
8019assert.decreases = function (fn, obj, prop, msg) {
8020if (arguments.length === 3 && typeof obj === 'function') {
8021msg = prop;
8022prop = null;
8023}
8024return new Assertion(fn, msg, assert.decreases, true).to.decrease(obj, prop);
8025};
8026assert.decreasesBy = function (fn, obj, prop, delta, msg) {
8027if (arguments.length === 4 && typeof obj === 'function') {
8028var tmpMsg = delta;
8029delta = prop;
8030msg = tmpMsg;
8031} else if (arguments.length === 3) {
8032delta = prop;
8033prop = null;
8034}
8035new Assertion(fn, msg, assert.decreasesBy, true).to.decrease(obj, prop).by(delta);
8036};
8037assert.doesNotDecrease = function (fn, obj, prop, msg) {
8038if (arguments.length === 3 && typeof obj === 'function') {
8039msg = prop;
8040prop = null;
8041}
8042return new Assertion(fn, msg, assert.doesNotDecrease, true).to.not.decrease(obj, prop);
8043};
8044assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) {
8045if (arguments.length === 4 && typeof obj === 'function') {
8046var tmpMsg = delta;
8047delta = prop;
8048msg = tmpMsg;
8049} else if (arguments.length === 3) {
8050delta = prop;
8051prop = null;
8052}
8053return new Assertion(fn, msg, assert.doesNotDecreaseBy, true).to.not.decrease(obj, prop).by(delta);
8054};
8055assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) {
8056if (arguments.length === 4 && typeof obj === 'function') {
8057var tmpMsg = delta;
8058delta = prop;
8059msg = tmpMsg;
8060} else if (arguments.length === 3) {
8061delta = prop;
8062prop = null;
8063}
8064new Assertion(fn, msg, assert.decreasesButNotBy, true).to.decrease(obj, prop).but.not.by(delta);
8065};
8066assert.ifError = function (val) {
8067if (val) {
8068throw (val);
8069}
8070};
8071assert.isExtensible = function (obj, msg) {
8072new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible;
8073};
8074assert.isNotExtensible = function (obj, msg) {
8075new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible;
8076};
8077assert.isSealed = function (obj, msg) {
8078new Assertion(obj, msg, assert.isSealed, true).to.be.sealed;
8079};
8080assert.isNotSealed = function (obj, msg) {
8081new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed;
8082};
8083assert.isFrozen = function (obj, msg) {
8084new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen;
8085};
8086assert.isNotFrozen = function (obj, msg) {
8087new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen;
8088};
8089assert.isEmpty = function (val, msg) {
8090new Assertion(val, msg, assert.isEmpty, true).to.be.empty;
8091};
8092assert.isNotEmpty = function (val, msg) {
8093new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty;
8094};
8095(function alias(name, as) {
8096assert[as] = assert[name];
8097return alias;
8098})('isOk', 'ok')('isNotOk', 'notOk')('throws', 'throw')('throws', 'Throw')('isExtensible', 'extensible')('isNotExtensible', 'notExtensible')('isSealed', 'sealed')('isNotSealed', 'notSealed')('isFrozen', 'frozen')('isNotFrozen', 'notFrozen')('isEmpty', 'empty')('isNotEmpty', 'notEmpty');
8099};
8100return module.exports;
8101},
8102"node_modules/pathval/index.js": function (require, module, exports) {
8103'use strict';
8104function hasProperty(obj, name) {
8105if (typeof obj === 'undefined' || obj === null) {
8106return false;
8107}
8108return (name in Object(obj));
8109}
8110function parsePath(path) {
8111var str = path.replace(/([^\\])\[/g, '$1.[');
8112var parts = str.match(/(\\\.|[^.]+?)+/g);
8113return parts.map(function mapMatches(value) {
8114var regexp = /^\[(\d+)\]$/;
8115var mArr = regexp.exec(value);
8116var parsed = null;
8117if (mArr) {
8118parsed = {
8119i: parseFloat(mArr[1])
8120};
8121} else {
8122parsed = {
8123p: value.replace(/\\([.\[\]])/g, '$1')
8124};
8125}
8126return parsed;
8127});
8128}
8129function internalGetPathValue(obj, parsed, pathDepth) {
8130var temporaryValue = obj;
8131var res = null;
8132pathDepth = (typeof pathDepth === 'undefined' ? parsed.length : pathDepth);
8133for (var i = 0; i < pathDepth; i++) {
8134var part = parsed[i];
8135if (temporaryValue) {
8136if (typeof part.p === 'undefined') {
8137temporaryValue = temporaryValue[part.i];
8138} else {
8139temporaryValue = temporaryValue[part.p];
8140}
8141if (i === (pathDepth - 1)) {
8142res = temporaryValue;
8143}
8144}
8145}
8146return res;
8147}
8148function internalSetPathValue(obj, val, parsed) {
8149var tempObj = obj;
8150var pathDepth = parsed.length;
8151var part = null;
8152for (var i = 0; i < pathDepth; i++) {
8153var propName = null;
8154var propVal = null;
8155part = parsed[i];
8156if (i === (pathDepth - 1)) {
8157propName = typeof part.p === 'undefined' ? part.i : part.p;
8158tempObj[propName] = val;
8159} else if (typeof part.p !== 'undefined' && tempObj[part.p]) {
8160tempObj = tempObj[part.p];
8161} else if (typeof part.i !== 'undefined' && tempObj[part.i]) {
8162tempObj = tempObj[part.i];
8163} else {
8164var next = parsed[i + 1];
8165propName = typeof part.p === 'undefined' ? part.i : part.p;
8166propVal = typeof next.p === 'undefined' ? [] : {};
8167tempObj[propName] = propVal;
8168tempObj = tempObj[propName];
8169}
8170}
8171}
8172function getPathInfo(obj, path) {
8173var parsed = parsePath(path);
8174var last = parsed[parsed.length - 1];
8175var info = {
8176parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj,
8177name: last.p || last.i,
8178value: internalGetPathValue(obj, parsed)
8179};
8180info.exists = hasProperty(info.parent, info.name);
8181return info;
8182}
8183function getPathValue(obj, path) {
8184var info = getPathInfo(obj, path);
8185return info.value;
8186}
8187function setPathValue(obj, path, val) {
8188var parsed = parsePath(path);
8189internalSetPathValue(obj, val, parsed);
8190return obj;
8191}
8192module.exports = {
8193hasProperty: hasProperty,
8194getPathInfo: getPathInfo,
8195getPathValue: getPathValue,
8196setPathValue: setPathValue
8197};
8198return module.exports;
8199},
8200"node_modules/chai/lib/chai/utils/test.js": function (require, module, exports) {
8201var flag = require("node_modules/chai/lib/chai/utils/flag.js");
8202module.exports = function test(obj, args) {
8203var negate = flag(obj, 'negate'), expr = args[0];
8204return negate ? !expr : expr;
8205};
8206return module.exports;
8207},
8208"node_modules/type-detect/index.js": function (require, module, exports) {
8209'use strict';
8210var promiseExists = typeof Promise === 'function';
8211var globalObject = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : self;
8212var isDom = ('location' in globalObject) && ('document' in globalObject);
8213var symbolExists = typeof Symbol !== 'undefined';
8214var mapExists = typeof Map !== 'undefined';
8215var setExists = typeof Set !== 'undefined';
8216var weakMapExists = typeof WeakMap !== 'undefined';
8217var weakSetExists = typeof WeakSet !== 'undefined';
8218var dataViewExists = typeof DataView !== 'undefined';
8219var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined';
8220var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined';
8221var setEntriesExists = setExists && typeof Set.prototype.entries === 'function';
8222var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function';
8223var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries());
8224var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries());
8225var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function';
8226var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]());
8227var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function';
8228var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(('')[Symbol.iterator]());
8229var toStringLeftSliceLength = 8;
8230var toStringRightSliceLength = -1;
8231module.exports = function typeDetect(obj) {
8232var typeofObj = typeof obj;
8233if (typeofObj !== 'object') {
8234return typeofObj;
8235}
8236if (obj === null) {
8237return 'null';
8238}
8239if (obj === globalObject) {
8240return 'global';
8241}
8242if (Array.isArray(obj) && (symbolToStringTagExists === false || !((Symbol.toStringTag in obj)))) {
8243return 'Array';
8244}
8245if (isDom) {
8246if (obj === globalObject.location) {
8247return 'Location';
8248}
8249if (obj === globalObject.document) {
8250return 'Document';
8251}
8252if (obj === (globalObject.navigator || ({})).mimeTypes) {
8253return 'MimeTypeArray';
8254}
8255if (obj === (globalObject.navigator || ({})).plugins) {
8256return 'PluginArray';
8257}
8258if (obj instanceof HTMLElement && obj.tagName === 'BLOCKQUOTE') {
8259return 'HTMLQuoteElement';
8260}
8261if (obj instanceof HTMLElement && obj.tagName === 'TD') {
8262return 'HTMLTableDataCellElement';
8263}
8264if (obj instanceof HTMLElement && obj.tagName === 'TH') {
8265return 'HTMLTableHeaderCellElement';
8266}
8267}
8268var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]);
8269if (typeof stringTag === 'string') {
8270return stringTag;
8271}
8272var objPrototype = Object.getPrototypeOf(obj);
8273if (objPrototype === RegExp.prototype) {
8274return 'RegExp';
8275}
8276if (objPrototype === Date.prototype) {
8277return 'Date';
8278}
8279if (promiseExists && objPrototype === Promise.prototype) {
8280return 'Promise';
8281}
8282if (setExists && objPrototype === Set.prototype) {
8283return 'Set';
8284}
8285if (mapExists && objPrototype === Map.prototype) {
8286return 'Map';
8287}
8288if (weakSetExists && objPrototype === WeakSet.prototype) {
8289return 'WeakSet';
8290}
8291if (weakMapExists && objPrototype === WeakMap.prototype) {
8292return 'WeakMap';
8293}
8294if (dataViewExists && objPrototype === DataView.prototype) {
8295return 'DataView';
8296}
8297if (mapExists && objPrototype === mapIteratorPrototype) {
8298return 'Map Iterator';
8299}
8300if (setExists && objPrototype === setIteratorPrototype) {
8301return 'Set Iterator';
8302}
8303if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) {
8304return 'Array Iterator';
8305}
8306if (stringIteratorExists && objPrototype === stringIteratorPrototype) {
8307return 'String Iterator';
8308}
8309if (objPrototype === null) {
8310return 'Object';
8311}
8312return Object.prototype.toString.call(obj).slice(toStringLeftSliceLength, toStringRightSliceLength);
8313};
8314module.exports.typeDetect = module.exports;
8315return module.exports;
8316},
8317"node_modules/chai/lib/chai/utils/expectTypes.js": function (require, module, exports) {
8318var AssertionError = require("node_modules/assertion-error/index.js");
8319var flag = require("node_modules/chai/lib/chai/utils/flag.js");
8320var type = require("node_modules/type-detect/index.js");
8321module.exports = function expectTypes(obj, types) {
8322var flagMsg = flag(obj, 'message');
8323var ssfi = flag(obj, 'ssfi');
8324flagMsg = flagMsg ? flagMsg + ': ' : '';
8325obj = flag(obj, 'object');
8326types = types.map(function (t) {
8327return t.toLowerCase();
8328});
8329types.sort();
8330var str = types.map(function (t, index) {
8331var art = ~['a', 'e', 'i', 'o', 'u'].indexOf(t.charAt(0)) ? 'an' : 'a';
8332var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';
8333return or + art + ' ' + t;
8334}).join(', ');
8335var objType = type(obj).toLowerCase();
8336if (!types.some(function (expected) {
8337return objType === expected;
8338})) {
8339throw new AssertionError(flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given', undefined, ssfi);
8340}
8341};
8342return module.exports;
8343},
8344"node_modules/chai/lib/chai/utils/getMessage.js": function (require, module, exports) {
8345var flag = require("node_modules/chai/lib/chai/utils/flag.js"), getActual = require("node_modules/chai/lib/chai/utils/getActual.js"), inspect = require("node_modules/chai/lib/chai/utils/inspect.js"), objDisplay = require("node_modules/chai/lib/chai/utils/objDisplay.js");
8346module.exports = function getMessage(obj, args) {
8347var negate = flag(obj, 'negate'), val = flag(obj, 'object'), expected = args[3], actual = getActual(obj, args), msg = negate ? args[2] : args[1], flagMsg = flag(obj, 'message');
8348if (typeof msg === "function") msg = msg();
8349msg = msg || '';
8350msg = msg.replace(/#\{this\}/g, function () {
8351return objDisplay(val);
8352}).replace(/#\{act\}/g, function () {
8353return objDisplay(actual);
8354}).replace(/#\{exp\}/g, function () {
8355return objDisplay(expected);
8356});
8357return flagMsg ? flagMsg + ': ' + msg : msg;
8358};
8359return module.exports;
8360},
8361"node_modules/chai/lib/chai/utils/getActual.js": function (require, module, exports) {
8362module.exports = function getActual(obj, args) {
8363return args.length > 4 ? args[4] : obj._obj;
8364};
8365return module.exports;
8366},
8367"node_modules/chai/lib/chai/utils/inspect.js": function (require, module, exports) {
8368var getName = require("node_modules/get-func-name/index.js");
8369var getProperties = require("node_modules/chai/lib/chai/utils/getProperties.js");
8370var getEnumerableProperties = require("node_modules/chai/lib/chai/utils/getEnumerableProperties.js");
8371var config = require("node_modules/chai/lib/chai/config.js");
8372module.exports = inspect;
8373function inspect(obj, showHidden, depth, colors) {
8374var ctx = {
8375showHidden: showHidden,
8376seen: [],
8377stylize: function (str) {
8378return str;
8379}
8380};
8381return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth));
8382}
8383var isDOMElement = function (object) {
8384if (typeof HTMLElement === 'object') {
8385return object instanceof HTMLElement;
8386} else {
8387return object && typeof object === 'object' && ('nodeType' in object) && object.nodeType === 1 && typeof object.nodeName === 'string';
8388}
8389};
8390function formatValue(ctx, value, recurseTimes) {
8391if (value && typeof value.inspect === 'function' && value.inspect !== exports.inspect && !(value.constructor && value.constructor.prototype === value)) {
8392var ret = value.inspect(recurseTimes, ctx);
8393if (typeof ret !== 'string') {
8394ret = formatValue(ctx, ret, recurseTimes);
8395}
8396return ret;
8397}
8398var primitive = formatPrimitive(ctx, value);
8399if (primitive) {
8400return primitive;
8401}
8402if (isDOMElement(value)) {
8403if (('outerHTML' in value)) {
8404return value.outerHTML;
8405} else {
8406try {
8407if (document.xmlVersion) {
8408var xmlSerializer = new XMLSerializer();
8409return xmlSerializer.serializeToString(value);
8410} else {
8411var ns = "http://www.w3.org/1999/xhtml";
8412var container = document.createElementNS(ns, '_');
8413container.appendChild(value.cloneNode(false));
8414var html = container.innerHTML.replace('><', '>' + value.innerHTML + '<');
8415container.innerHTML = '';
8416return html;
8417}
8418} catch (err) {}
8419}
8420}
8421var visibleKeys = getEnumerableProperties(value);
8422var keys = ctx.showHidden ? getProperties(value) : visibleKeys;
8423var name, nameSuffix;
8424if (keys.length === 0 || (isError(value) && ((keys.length === 1 && keys[0] === 'stack') || (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')))) {
8425if (typeof value === 'function') {
8426name = getName(value);
8427nameSuffix = name ? ': ' + name : '';
8428return ctx.stylize('[Function' + nameSuffix + ']', 'special');
8429}
8430if (isRegExp(value)) {
8431return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
8432}
8433if (isDate(value)) {
8434return ctx.stylize(Date.prototype.toUTCString.call(value), 'date');
8435}
8436if (isError(value)) {
8437return formatError(value);
8438}
8439}
8440var base = '', array = false, typedArray = false, braces = ['{', '}'];
8441if (isTypedArray(value)) {
8442typedArray = true;
8443braces = ['[', ']'];
8444}
8445if (isArray(value)) {
8446array = true;
8447braces = ['[', ']'];
8448}
8449if (typeof value === 'function') {
8450name = getName(value);
8451nameSuffix = name ? ': ' + name : '';
8452base = ' [Function' + nameSuffix + ']';
8453}
8454if (isRegExp(value)) {
8455base = ' ' + RegExp.prototype.toString.call(value);
8456}
8457if (isDate(value)) {
8458base = ' ' + Date.prototype.toUTCString.call(value);
8459}
8460if (isError(value)) {
8461return formatError(value);
8462}
8463if (keys.length === 0 && (!array || value.length == 0)) {
8464return braces[0] + base + braces[1];
8465}
8466if (recurseTimes < 0) {
8467if (isRegExp(value)) {
8468return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
8469} else {
8470return ctx.stylize('[Object]', 'special');
8471}
8472}
8473ctx.seen.push(value);
8474var output;
8475if (array) {
8476output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
8477} else if (typedArray) {
8478return formatTypedArray(value);
8479} else {
8480output = keys.map(function (key) {
8481return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
8482});
8483}
8484ctx.seen.pop();
8485return reduceToSingleString(output, base, braces);
8486}
8487function formatPrimitive(ctx, value) {
8488switch (typeof value) {
8489case 'undefined':
8490return ctx.stylize('undefined', 'undefined');
8491case 'string':
8492var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '').replace(/'/g, "\\'").replace(/\\"/g, '"') + '\'';
8493return ctx.stylize(simple, 'string');
8494case 'number':
8495if (value === 0 && (1 / value) === -Infinity) {
8496return ctx.stylize('-0', 'number');
8497}
8498return ctx.stylize('' + value, 'number');
8499case 'boolean':
8500return ctx.stylize('' + value, 'boolean');
8501case 'symbol':
8502return ctx.stylize(value.toString(), 'symbol');
8503}
8504if (value === null) {
8505return ctx.stylize('null', 'null');
8506}
8507}
8508function formatError(value) {
8509return '[' + Error.prototype.toString.call(value) + ']';
8510}
8511function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
8512var output = [];
8513for (var i = 0, l = value.length; i < l; ++i) {
8514if (Object.prototype.hasOwnProperty.call(value, String(i))) {
8515output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true));
8516} else {
8517output.push('');
8518}
8519}
8520keys.forEach(function (key) {
8521if (!key.match(/^\d+$/)) {
8522output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true));
8523}
8524});
8525return output;
8526}
8527function formatTypedArray(value) {
8528var str = '[ ';
8529for (var i = 0; i < value.length; ++i) {
8530if (str.length >= config.truncateThreshold - 7) {
8531str += '...';
8532break;
8533}
8534str += value[i] + ', ';
8535}
8536str += ' ]';
8537if (str.indexOf(', ]') !== -1) {
8538str = str.replace(', ]', ' ]');
8539}
8540return str;
8541}
8542function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
8543var name;
8544var propDescriptor = Object.getOwnPropertyDescriptor(value, key);
8545var str;
8546if (propDescriptor) {
8547if (propDescriptor.get) {
8548if (propDescriptor.set) {
8549str = ctx.stylize('[Getter/Setter]', 'special');
8550} else {
8551str = ctx.stylize('[Getter]', 'special');
8552}
8553} else {
8554if (propDescriptor.set) {
8555str = ctx.stylize('[Setter]', 'special');
8556}
8557}
8558}
8559if (visibleKeys.indexOf(key) < 0) {
8560name = '[' + key + ']';
8561}
8562if (!str) {
8563if (ctx.seen.indexOf(value[key]) < 0) {
8564if (recurseTimes === null) {
8565str = formatValue(ctx, value[key], null);
8566} else {
8567str = formatValue(ctx, value[key], recurseTimes - 1);
8568}
8569if (str.indexOf('\n') > -1) {
8570if (array) {
8571str = str.split('\n').map(function (line) {
8572return ' ' + line;
8573}).join('\n').substr(2);
8574} else {
8575str = '\n' + str.split('\n').map(function (line) {
8576return ' ' + line;
8577}).join('\n');
8578}
8579}
8580} else {
8581str = ctx.stylize('[Circular]', 'special');
8582}
8583}
8584if (typeof name === 'undefined') {
8585if (array && key.match(/^\d+$/)) {
8586return str;
8587}
8588name = JSON.stringify('' + key);
8589if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
8590name = name.substr(1, name.length - 2);
8591name = ctx.stylize(name, 'name');
8592} else {
8593name = name.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'");
8594name = ctx.stylize(name, 'string');
8595}
8596}
8597return name + ': ' + str;
8598}
8599function reduceToSingleString(output, base, braces) {
8600var numLinesEst = 0;
8601var length = output.reduce(function (prev, cur) {
8602numLinesEst++;
8603if (cur.indexOf('\n') >= 0) numLinesEst++;
8604return prev + cur.length + 1;
8605}, 0);
8606if (length > 60) {
8607return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1];
8608}
8609return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
8610}
8611function isTypedArray(ar) {
8612return (typeof ar === 'object' && (/\w+Array]$/).test(objectToString(ar)));
8613}
8614function isArray(ar) {
8615return Array.isArray(ar) || (typeof ar === 'object' && objectToString(ar) === '[object Array]');
8616}
8617function isRegExp(re) {
8618return typeof re === 'object' && objectToString(re) === '[object RegExp]';
8619}
8620function isDate(d) {
8621return typeof d === 'object' && objectToString(d) === '[object Date]';
8622}
8623function isError(e) {
8624return typeof e === 'object' && objectToString(e) === '[object Error]';
8625}
8626function objectToString(o) {
8627return Object.prototype.toString.call(o);
8628}
8629return module.exports;
8630},
8631"node_modules/chai/lib/chai/utils/objDisplay.js": function (require, module, exports) {
8632var inspect = require("node_modules/chai/lib/chai/utils/inspect.js");
8633var config = require("node_modules/chai/lib/chai/config.js");
8634module.exports = function objDisplay(obj) {
8635var str = inspect(obj), type = Object.prototype.toString.call(obj);
8636if (config.truncateThreshold && str.length >= config.truncateThreshold) {
8637if (type === '[object Function]') {
8638return !obj.name || obj.name === '' ? '[Function]' : '[Function: ' + obj.name + ']';
8639} else if (type === '[object Array]') {
8640return '[ Array(' + obj.length + ') ]';
8641} else if (type === '[object Object]') {
8642var keys = Object.keys(obj), kstr = keys.length > 2 ? keys.splice(0, 2).join(', ') + ', ...' : keys.join(', ');
8643return '{ Object (' + kstr + ') }';
8644} else {
8645return str;
8646}
8647} else {
8648return str;
8649}
8650};
8651return module.exports;
8652},
8653"node_modules/chai/lib/chai/utils/flag.js": function (require, module, exports) {
8654module.exports = function flag(obj, key, value) {
8655var flags = obj.__flags || (obj.__flags = Object.create(null));
8656if (arguments.length === 3) {
8657flags[key] = value;
8658} else {
8659return flags[key];
8660}
8661};
8662return module.exports;
8663},
8664"node_modules/chai/lib/chai/utils/transferFlags.js": function (require, module, exports) {
8665module.exports = function transferFlags(assertion, object, includeAll) {
8666var flags = assertion.__flags || (assertion.__flags = Object.create(null));
8667if (!object.__flags) {
8668object.__flags = Object.create(null);
8669}
8670includeAll = arguments.length === 3 ? includeAll : true;
8671for (var flag in flags) {
8672if (includeAll || (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) {
8673object.__flags[flag] = flags[flag];
8674}
8675}
8676};
8677return module.exports;
8678},
8679"node_modules/deep-eql/index.js": function (require, module, exports) {
8680'use strict';
8681var type = require("node_modules/type-detect/index.js");
8682function FakeMap() {
8683this._key = 'chai/deep-eql__' + Math.random() + Date.now();
8684}
8685FakeMap.prototype = {
8686get: function getMap(key) {
8687return key[this._key];
8688},
8689set: function setMap(key, value) {
8690if (!Object.isFrozen(key)) {
8691Object.defineProperty(key, this._key, {
8692value: value,
8693configurable: true
8694});
8695}
8696}
8697};
8698var MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap;
8699function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) {
8700if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
8701return null;
8702}
8703var leftHandMap = memoizeMap.get(leftHandOperand);
8704if (leftHandMap) {
8705var result = leftHandMap.get(rightHandOperand);
8706if (typeof result === 'boolean') {
8707return result;
8708}
8709}
8710return null;
8711}
8712function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) {
8713if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
8714return;
8715}
8716var leftHandMap = memoizeMap.get(leftHandOperand);
8717if (leftHandMap) {
8718leftHandMap.set(rightHandOperand, result);
8719} else {
8720leftHandMap = new MemoizeMap();
8721leftHandMap.set(rightHandOperand, result);
8722memoizeMap.set(leftHandOperand, leftHandMap);
8723}
8724}
8725module.exports = deepEqual;
8726module.exports.MemoizeMap = MemoizeMap;
8727function deepEqual(leftHandOperand, rightHandOperand, options) {
8728if (options && options.comparator) {
8729return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
8730}
8731var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
8732if (simpleResult !== null) {
8733return simpleResult;
8734}
8735return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
8736}
8737function simpleEqual(leftHandOperand, rightHandOperand) {
8738if (leftHandOperand === rightHandOperand) {
8739return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand;
8740}
8741if (leftHandOperand !== leftHandOperand && rightHandOperand !== rightHandOperand) {
8742return true;
8743}
8744if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
8745return false;
8746}
8747return null;
8748}
8749function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) {
8750options = options || ({});
8751options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap();
8752var comparator = options && options.comparator;
8753var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize);
8754if (memoizeResultLeft !== null) {
8755return memoizeResultLeft;
8756}
8757var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize);
8758if (memoizeResultRight !== null) {
8759return memoizeResultRight;
8760}
8761if (comparator) {
8762var comparatorResult = comparator(leftHandOperand, rightHandOperand);
8763if (comparatorResult === false || comparatorResult === true) {
8764memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult);
8765return comparatorResult;
8766}
8767var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
8768if (simpleResult !== null) {
8769return simpleResult;
8770}
8771}
8772var leftHandType = type(leftHandOperand);
8773if (leftHandType !== type(rightHandOperand)) {
8774memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false);
8775return false;
8776}
8777memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true);
8778var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options);
8779memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result);
8780return result;
8781}
8782function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) {
8783switch (leftHandType) {
8784case 'String':
8785case 'Number':
8786case 'Boolean':
8787case 'Date':
8788return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf());
8789case 'Promise':
8790case 'Symbol':
8791case 'function':
8792case 'WeakMap':
8793case 'WeakSet':
8794case 'Error':
8795return leftHandOperand === rightHandOperand;
8796case 'Arguments':
8797case 'Int8Array':
8798case 'Uint8Array':
8799case 'Uint8ClampedArray':
8800case 'Int16Array':
8801case 'Uint16Array':
8802case 'Int32Array':
8803case 'Uint32Array':
8804case 'Float32Array':
8805case 'Float64Array':
8806case 'Array':
8807return iterableEqual(leftHandOperand, rightHandOperand, options);
8808case 'RegExp':
8809return regexpEqual(leftHandOperand, rightHandOperand);
8810case 'Generator':
8811return generatorEqual(leftHandOperand, rightHandOperand, options);
8812case 'DataView':
8813return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options);
8814case 'ArrayBuffer':
8815return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options);
8816case 'Set':
8817return entriesEqual(leftHandOperand, rightHandOperand, options);
8818case 'Map':
8819return entriesEqual(leftHandOperand, rightHandOperand, options);
8820default:
8821return objectEqual(leftHandOperand, rightHandOperand, options);
8822}
8823}
8824function regexpEqual(leftHandOperand, rightHandOperand) {
8825return leftHandOperand.toString() === rightHandOperand.toString();
8826}
8827function entriesEqual(leftHandOperand, rightHandOperand, options) {
8828if (leftHandOperand.size !== rightHandOperand.size) {
8829return false;
8830}
8831if (leftHandOperand.size === 0) {
8832return true;
8833}
8834var leftHandItems = [];
8835var rightHandItems = [];
8836leftHandOperand.forEach(function gatherEntries(key, value) {
8837leftHandItems.push([key, value]);
8838});
8839rightHandOperand.forEach(function gatherEntries(key, value) {
8840rightHandItems.push([key, value]);
8841});
8842return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options);
8843}
8844function iterableEqual(leftHandOperand, rightHandOperand, options) {
8845var length = leftHandOperand.length;
8846if (length !== rightHandOperand.length) {
8847return false;
8848}
8849if (length === 0) {
8850return true;
8851}
8852var index = -1;
8853while (++index < length) {
8854if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) {
8855return false;
8856}
8857}
8858return true;
8859}
8860function generatorEqual(leftHandOperand, rightHandOperand, options) {
8861return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options);
8862}
8863function hasIteratorFunction(target) {
8864return typeof Symbol !== 'undefined' && typeof target === 'object' && typeof Symbol.iterator !== 'undefined' && typeof target[Symbol.iterator] === 'function';
8865}
8866function getIteratorEntries(target) {
8867if (hasIteratorFunction(target)) {
8868try {
8869return getGeneratorEntries(target[Symbol.iterator]());
8870} catch (iteratorError) {
8871return [];
8872}
8873}
8874return [];
8875}
8876function getGeneratorEntries(generator) {
8877var generatorResult = generator.next();
8878var accumulator = [generatorResult.value];
8879while (generatorResult.done === false) {
8880generatorResult = generator.next();
8881accumulator.push(generatorResult.value);
8882}
8883return accumulator;
8884}
8885function getEnumerableKeys(target) {
8886var keys = [];
8887for (var key in target) {
8888keys.push(key);
8889}
8890return keys;
8891}
8892function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
8893var length = keys.length;
8894if (length === 0) {
8895return true;
8896}
8897for (var i = 0; i < length; i += 1) {
8898if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) {
8899return false;
8900}
8901}
8902return true;
8903}
8904function objectEqual(leftHandOperand, rightHandOperand, options) {
8905var leftHandKeys = getEnumerableKeys(leftHandOperand);
8906var rightHandKeys = getEnumerableKeys(rightHandOperand);
8907if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
8908leftHandKeys.sort();
8909rightHandKeys.sort();
8910if (iterableEqual(leftHandKeys, rightHandKeys) === false) {
8911return false;
8912}
8913return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);
8914}
8915var leftHandEntries = getIteratorEntries(leftHandOperand);
8916var rightHandEntries = getIteratorEntries(rightHandOperand);
8917if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) {
8918leftHandEntries.sort();
8919rightHandEntries.sort();
8920return iterableEqual(leftHandEntries, rightHandEntries, options);
8921}
8922if (leftHandKeys.length === 0 && leftHandEntries.length === 0 && rightHandKeys.length === 0 && rightHandEntries.length === 0) {
8923return true;
8924}
8925return false;
8926}
8927function isPrimitive(value) {
8928return value === null || typeof value !== 'object';
8929}
8930return module.exports;
8931},
8932"node_modules/get-func-name/index.js": function (require, module, exports) {
8933'use strict';
8934var toString = Function.prototype.toString;
8935var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/;
8936function getFuncName(aFunc) {
8937if (typeof aFunc !== 'function') {
8938return null;
8939}
8940var name = '';
8941if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') {
8942var match = toString.call(aFunc).match(functionNameMatch);
8943if (match) {
8944name = match[1];
8945}
8946} else {
8947name = aFunc.name;
8948}
8949return name;
8950}
8951module.exports = getFuncName;
8952return module.exports;
8953},
8954"node_modules/chai/lib/chai/utils/addProperty.js": function (require, module, exports) {
8955var chai = require("node_modules/chai/lib/chai.js");
8956var flag = require("node_modules/chai/lib/chai/utils/flag.js");
8957var isProxyEnabled = require("node_modules/chai/lib/chai/utils/isProxyEnabled.js");
8958var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
8959module.exports = function addProperty(ctx, name, getter) {
8960getter = getter === undefined ? function () {} : getter;
8961Object.defineProperty(ctx, name, {
8962get: function propertyGetter() {
8963if (!isProxyEnabled() && !flag(this, 'lockSsfi')) {
8964flag(this, 'ssfi', propertyGetter);
8965}
8966var result = getter.call(this);
8967if (result !== undefined) return result;
8968var newAssertion = new chai.Assertion();
8969transferFlags(this, newAssertion);
8970return newAssertion;
8971},
8972configurable: true
8973});
8974};
8975return module.exports;
8976},
8977"node_modules/chai/lib/chai/utils/addMethod.js": function (require, module, exports) {
8978var addLengthGuard = require("node_modules/chai/lib/chai/utils/addLengthGuard.js");
8979var chai = require("node_modules/chai/lib/chai.js");
8980var flag = require("node_modules/chai/lib/chai/utils/flag.js");
8981var proxify = require("node_modules/chai/lib/chai/utils/proxify.js");
8982var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
8983module.exports = function addMethod(ctx, name, method) {
8984var methodWrapper = function () {
8985if (!flag(this, 'lockSsfi')) {
8986flag(this, 'ssfi', methodWrapper);
8987}
8988var result = method.apply(this, arguments);
8989if (result !== undefined) return result;
8990var newAssertion = new chai.Assertion();
8991transferFlags(this, newAssertion);
8992return newAssertion;
8993};
8994addLengthGuard(methodWrapper, name, false);
8995ctx[name] = proxify(methodWrapper, name);
8996};
8997return module.exports;
8998},
8999"node_modules/chai/lib/chai/utils/overwriteProperty.js": function (require, module, exports) {
9000var chai = require("node_modules/chai/lib/chai.js");
9001var flag = require("node_modules/chai/lib/chai/utils/flag.js");
9002var isProxyEnabled = require("node_modules/chai/lib/chai/utils/isProxyEnabled.js");
9003var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
9004module.exports = function overwriteProperty(ctx, name, getter) {
9005var _get = Object.getOwnPropertyDescriptor(ctx, name), _super = function () {};
9006if (_get && 'function' === typeof _get.get) _super = _get.get;
9007Object.defineProperty(ctx, name, {
9008get: function overwritingPropertyGetter() {
9009if (!isProxyEnabled() && !flag(this, 'lockSsfi')) {
9010flag(this, 'ssfi', overwritingPropertyGetter);
9011}
9012var origLockSsfi = flag(this, 'lockSsfi');
9013flag(this, 'lockSsfi', true);
9014var result = getter(_super).call(this);
9015flag(this, 'lockSsfi', origLockSsfi);
9016if (result !== undefined) {
9017return result;
9018}
9019var newAssertion = new chai.Assertion();
9020transferFlags(this, newAssertion);
9021return newAssertion;
9022},
9023configurable: true
9024});
9025};
9026return module.exports;
9027},
9028"node_modules/chai/lib/chai/utils/overwriteMethod.js": function (require, module, exports) {
9029var addLengthGuard = require("node_modules/chai/lib/chai/utils/addLengthGuard.js");
9030var chai = require("node_modules/chai/lib/chai.js");
9031var flag = require("node_modules/chai/lib/chai/utils/flag.js");
9032var proxify = require("node_modules/chai/lib/chai/utils/proxify.js");
9033var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
9034module.exports = function overwriteMethod(ctx, name, method) {
9035var _method = ctx[name], _super = function () {
9036throw new Error(name + ' is not a function');
9037};
9038if (_method && 'function' === typeof _method) _super = _method;
9039var overwritingMethodWrapper = function () {
9040if (!flag(this, 'lockSsfi')) {
9041flag(this, 'ssfi', overwritingMethodWrapper);
9042}
9043var origLockSsfi = flag(this, 'lockSsfi');
9044flag(this, 'lockSsfi', true);
9045var result = method(_super).apply(this, arguments);
9046flag(this, 'lockSsfi', origLockSsfi);
9047if (result !== undefined) {
9048return result;
9049}
9050var newAssertion = new chai.Assertion();
9051transferFlags(this, newAssertion);
9052return newAssertion;
9053};
9054addLengthGuard(overwritingMethodWrapper, name, false);
9055ctx[name] = proxify(overwritingMethodWrapper, name);
9056};
9057return module.exports;
9058},
9059"node_modules/chai/lib/chai/utils/addChainableMethod.js": function (require, module, exports) {
9060var addLengthGuard = require("node_modules/chai/lib/chai/utils/addLengthGuard.js");
9061var chai = require("node_modules/chai/lib/chai.js");
9062var flag = require("node_modules/chai/lib/chai/utils/flag.js");
9063var proxify = require("node_modules/chai/lib/chai/utils/proxify.js");
9064var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
9065var canSetPrototype = typeof Object.setPrototypeOf === 'function';
9066var testFn = function () {};
9067var excludeNames = Object.getOwnPropertyNames(testFn).filter(function (name) {
9068var propDesc = Object.getOwnPropertyDescriptor(testFn, name);
9069if (typeof propDesc !== 'object') return true;
9070return !propDesc.configurable;
9071});
9072var call = Function.prototype.call, apply = Function.prototype.apply;
9073module.exports = function addChainableMethod(ctx, name, method, chainingBehavior) {
9074if (typeof chainingBehavior !== 'function') {
9075chainingBehavior = function () {};
9076}
9077var chainableBehavior = {
9078method: method,
9079chainingBehavior: chainingBehavior
9080};
9081if (!ctx.__methods) {
9082ctx.__methods = {};
9083}
9084ctx.__methods[name] = chainableBehavior;
9085Object.defineProperty(ctx, name, {
9086get: function chainableMethodGetter() {
9087chainableBehavior.chainingBehavior.call(this);
9088var chainableMethodWrapper = function () {
9089if (!flag(this, 'lockSsfi')) {
9090flag(this, 'ssfi', chainableMethodWrapper);
9091}
9092var result = chainableBehavior.method.apply(this, arguments);
9093if (result !== undefined) {
9094return result;
9095}
9096var newAssertion = new chai.Assertion();
9097transferFlags(this, newAssertion);
9098return newAssertion;
9099};
9100addLengthGuard(chainableMethodWrapper, name, true);
9101if (canSetPrototype) {
9102var prototype = Object.create(this);
9103prototype.call = call;
9104prototype.apply = apply;
9105Object.setPrototypeOf(chainableMethodWrapper, prototype);
9106} else {
9107var asserterNames = Object.getOwnPropertyNames(ctx);
9108asserterNames.forEach(function (asserterName) {
9109if (excludeNames.indexOf(asserterName) !== -1) {
9110return;
9111}
9112var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);
9113Object.defineProperty(chainableMethodWrapper, asserterName, pd);
9114});
9115}
9116transferFlags(this, chainableMethodWrapper);
9117return proxify(chainableMethodWrapper);
9118},
9119configurable: true
9120});
9121};
9122return module.exports;
9123},
9124"node_modules/chai/lib/chai/utils/overwriteChainableMethod.js": function (require, module, exports) {
9125var chai = require("node_modules/chai/lib/chai.js");
9126var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
9127module.exports = function overwriteChainableMethod(ctx, name, method, chainingBehavior) {
9128var chainableBehavior = ctx.__methods[name];
9129var _chainingBehavior = chainableBehavior.chainingBehavior;
9130chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() {
9131var result = chainingBehavior(_chainingBehavior).call(this);
9132if (result !== undefined) {
9133return result;
9134}
9135var newAssertion = new chai.Assertion();
9136transferFlags(this, newAssertion);
9137return newAssertion;
9138};
9139var _method = chainableBehavior.method;
9140chainableBehavior.method = function overwritingChainableMethodWrapper() {
9141var result = method(_method).apply(this, arguments);
9142if (result !== undefined) {
9143return result;
9144}
9145var newAssertion = new chai.Assertion();
9146transferFlags(this, newAssertion);
9147return newAssertion;
9148};
9149};
9150return module.exports;
9151},
9152"node_modules/chai/lib/chai/utils/compareByInspect.js": function (require, module, exports) {
9153var inspect = require("node_modules/chai/lib/chai/utils/inspect.js");
9154module.exports = function compareByInspect(a, b) {
9155return inspect(a) < inspect(b) ? -1 : 1;
9156};
9157return module.exports;
9158},
9159"node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js": function (require, module, exports) {
9160module.exports = function getOwnEnumerablePropertySymbols(obj) {
9161if (typeof Object.getOwnPropertySymbols !== 'function') return [];
9162return Object.getOwnPropertySymbols(obj).filter(function (sym) {
9163return Object.getOwnPropertyDescriptor(obj, sym).enumerable;
9164});
9165};
9166return module.exports;
9167},
9168"node_modules/chai/lib/chai/utils/getOwnEnumerableProperties.js": function (require, module, exports) {
9169var getOwnEnumerablePropertySymbols = require("node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js");
9170module.exports = function getOwnEnumerableProperties(obj) {
9171return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj));
9172};
9173return module.exports;
9174},
9175"node_modules/check-error/index.js": function (require, module, exports) {
9176'use strict';
9177function compatibleInstance(thrown, errorLike) {
9178return errorLike instanceof Error && thrown === errorLike;
9179}
9180function compatibleConstructor(thrown, errorLike) {
9181if (errorLike instanceof Error) {
9182return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor;
9183} else if (errorLike.prototype instanceof Error || errorLike === Error) {
9184return thrown.constructor === errorLike || thrown instanceof errorLike;
9185}
9186return false;
9187}
9188function compatibleMessage(thrown, errMatcher) {
9189var comparisonString = typeof thrown === 'string' ? thrown : thrown.message;
9190if (errMatcher instanceof RegExp) {
9191return errMatcher.test(comparisonString);
9192} else if (typeof errMatcher === 'string') {
9193return comparisonString.indexOf(errMatcher) !== -1;
9194}
9195return false;
9196}
9197var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\(\/]+)/;
9198function getFunctionName(constructorFn) {
9199var name = '';
9200if (typeof constructorFn.name === 'undefined') {
9201var match = String(constructorFn).match(functionNameMatch);
9202if (match) {
9203name = match[1];
9204}
9205} else {
9206name = constructorFn.name;
9207}
9208return name;
9209}
9210function getConstructorName(errorLike) {
9211var constructorName = errorLike;
9212if (errorLike instanceof Error) {
9213constructorName = getFunctionName(errorLike.constructor);
9214} else if (typeof errorLike === 'function') {
9215constructorName = getFunctionName(errorLike).trim() || getFunctionName(new errorLike());
9216}
9217return constructorName;
9218}
9219function getMessage(errorLike) {
9220var msg = '';
9221if (errorLike && errorLike.message) {
9222msg = errorLike.message;
9223} else if (typeof errorLike === 'string') {
9224msg = errorLike;
9225}
9226return msg;
9227}
9228module.exports = {
9229compatibleInstance: compatibleInstance,
9230compatibleConstructor: compatibleConstructor,
9231compatibleMessage: compatibleMessage,
9232getMessage: getMessage,
9233getConstructorName: getConstructorName
9234};
9235return module.exports;
9236},
9237"node_modules/chai/lib/chai/utils/proxify.js": function (require, module, exports) {
9238var config = require("node_modules/chai/lib/chai/config.js");
9239var flag = require("node_modules/chai/lib/chai/utils/flag.js");
9240var getProperties = require("node_modules/chai/lib/chai/utils/getProperties.js");
9241var isProxyEnabled = require("node_modules/chai/lib/chai/utils/isProxyEnabled.js");
9242var builtins = ['__flags', '__methods', '_obj', 'assert'];
9243module.exports = function proxify(obj, nonChainableMethodName) {
9244if (!isProxyEnabled()) return obj;
9245return new Proxy(obj, {
9246get: function proxyGetter(target, property) {
9247if (typeof property === 'string' && config.proxyExcludedKeys.indexOf(property) === -1 && !Reflect.has(target, property)) {
9248if (nonChainableMethodName) {
9249throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' + property + '. See docs for proper usage of "' + nonChainableMethodName + '".');
9250}
9251var orderedProperties = getProperties(target).filter(function (property) {
9252return !Object.prototype.hasOwnProperty(property) && builtins.indexOf(property) === -1;
9253}).sort(function (a, b) {
9254return stringDistance(property, a) - stringDistance(property, b);
9255});
9256if (orderedProperties.length && stringDistance(orderedProperties[0], property) < 4) {
9257throw Error('Invalid Chai property: ' + property + '. Did you mean "' + orderedProperties[0] + '"?');
9258} else {
9259throw Error('Invalid Chai property: ' + property);
9260}
9261}
9262if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) {
9263flag(target, 'ssfi', proxyGetter);
9264}
9265return Reflect.get(target, property);
9266}
9267});
9268};
9269function stringDistance(strA, strB, memo) {
9270if (!memo) {
9271memo = [];
9272for (var i = 0; i <= strA.length; i++) {
9273memo[i] = [];
9274}
9275}
9276if (!memo[strA.length] || !memo[strA.length][strB.length]) {
9277if (strA.length === 0 || strB.length === 0) {
9278memo[strA.length][strB.length] = Math.max(strA.length, strB.length);
9279} else {
9280memo[strA.length][strB.length] = Math.min(stringDistance(strA.slice(0, -1), strB, memo) + 1, stringDistance(strA, strB.slice(0, -1), memo) + 1, stringDistance(strA.slice(0, -1), strB.slice(0, -1), memo) + (strA.slice(-1) === strB.slice(-1) ? 0 : 1));
9281}
9282}
9283return memo[strA.length][strB.length];
9284}
9285return module.exports;
9286},
9287"node_modules/chai/lib/chai/utils/addLengthGuard.js": function (require, module, exports) {
9288var config = require("node_modules/chai/lib/chai/config.js");
9289var fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length');
9290module.exports = function addLengthGuard(fn, assertionName, isChainable) {
9291if (!fnLengthDesc.configurable) return fn;
9292Object.defineProperty(fn, 'length', {
9293get: function () {
9294if (isChainable) {
9295throw Error('Invalid Chai property: ' + assertionName + '.length. Due' + ' to a compatibility issue, "length" cannot directly follow "' + assertionName + '". Use "' + assertionName + '.lengthOf" instead.');
9296}
9297throw Error('Invalid Chai property: ' + assertionName + '.length. See' + ' docs for proper usage of "' + assertionName + '".');
9298}
9299});
9300return fn;
9301};
9302return module.exports;
9303},
9304"node_modules/chai/lib/chai/utils/isProxyEnabled.js": function (require, module, exports) {
9305var config = require("node_modules/chai/lib/chai/config.js");
9306module.exports = function isProxyEnabled() {
9307return config.useProxy && typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined';
9308};
9309return module.exports;
9310},
9311"node_modules/chai/lib/chai/utils/isNaN.js": function (require, module, exports) {
9312function isNaN(value) {
9313return value !== value;
9314}
9315module.exports = Number.isNaN || isNaN;
9316return module.exports;
9317},
9318"node_modules/chai/lib/chai/utils/getProperties.js": function (require, module, exports) {
9319module.exports = function getProperties(object) {
9320var result = Object.getOwnPropertyNames(object);
9321function addProperty(property) {
9322if (result.indexOf(property) === -1) {
9323result.push(property);
9324}
9325}
9326var proto = Object.getPrototypeOf(object);
9327while (proto !== null) {
9328Object.getOwnPropertyNames(proto).forEach(addProperty);
9329proto = Object.getPrototypeOf(proto);
9330}
9331return result;
9332};
9333return module.exports;
9334},
9335"node_modules/chai/lib/chai/utils/getEnumerableProperties.js": function (require, module, exports) {
9336module.exports = function getEnumerableProperties(object) {
9337var result = [];
9338for (var name in object) {
9339result.push(name);
9340}
9341return result;
9342};
9343return module.exports;
9344}
9345}, this);
9346return require("entry.js");
9347}).call(this, null, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : this);
9348
9349
9350//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QuY29mZmVlIiwiLi4vcGFja2FnZS5qc29uIiwic2ltdWxhdGUuY29mZmVlIiwibm9kZV9tb2R1bGVzL2NoYWkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhaS1zdHlsZS9zb3VyY2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkuanMiLCJub2RlX21vZHVsZXMvYXNzZXJ0aW9uLWVycm9yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9jb25maWcuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9hc3NlcnRpb24uanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9jb3JlL2Fzc2VydGlvbnMuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9pbnRlcmZhY2UvZXhwZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvaW50ZXJmYWNlL3Nob3VsZC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL2ludGVyZmFjZS9hc3NlcnQuanMiLCJub2RlX21vZHVsZXMvcGF0aHZhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL3Rlc3QuanMiLCJub2RlX21vZHVsZXMvdHlwZS1kZXRlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9leHBlY3RUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2dldE1lc3NhZ2UuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9nZXRBY3R1YWwuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9pbnNwZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvb2JqRGlzcGxheS5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2ZsYWcuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy90cmFuc2ZlckZsYWdzLmpzIiwibm9kZV9tb2R1bGVzL2RlZXAtZXFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dldC1mdW5jLW5hbWUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9hZGRQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2FkZE1ldGhvZC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlTWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvYWRkQ2hhaW5hYmxlTWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvY29tcGFyZUJ5SW5zcGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2dldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9nZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL3Byb3hpZnkuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9hZGRMZW5ndGhHdWFyZC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2lzUHJveHlFbmFibGVkLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvaXNOYU4uanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9nZXRQcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvZ2V0RW51bWVyYWJsZVByb3BlcnRpZXMuanMiXSwibmFtZXMiOlsiY2hhaSIsImRpbWVuc2lvbnMiLCJEb20iLCJET00iLCJ3aW5kb3ciLCJxdWlja2RvbSIsIm1vY2hhIiwic2V0dXAiLCJzbG93IiwidGltZW91dCIsImxvY2F0aW9uIiwiaG9zdG5hbWUiLCJiYWlsIiwidXNlIiwiY29uZmlnIiwidHJ1bmNhdGVUaHJlc2hvbGQiLCJzYW5kYm94IiwicmVzdGFydFNhbmRib3giLCJwYXJlbnRFbGVtZW50IiwicmVtb3ZlQ2hpbGQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpZCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNoZWNrQ2hpbGRTdHJ1Y3R1cmUiLCJtYWluIiwiY2hpbGRyZW4iLCJjaGlsZCIsImxlbmd0aCIsInRvIiwiZXF1YWwiLCJpbmRleCIsImV4cGVjdCIsImVsIiwicGFyZW50Tm9kZSIsInBhcmVudCIsInN1aXRlIiwidGVzdCIsInBhY2thZ2VWZXJzaW9uIiwidmVyc2lvbiIsImRpdiIsImJlIiwiaW5zdGFuY2VPZiIsIkhUTUxEaXZFbGVtZW50IiwidW5kZWZpbmVkIiwiaSIsImEiLCJjb25zdHJ1Y3RvciIsImxpbmsiLCJhbmNob3IiLCJ0ZXh0Iiwic3BhbiIsImg0IiwiaGVhZGVyIiwiZm9vdGVyIiwic2VjdGlvbiIsImJ1dHRvbiIsImlucHV0IiwidHlwZXMiLCJ0eXBlIiwibmFtZSIsIm5vdCIsImNvbnRhaW4iLCJBIiwiY2xhc3MiLCJwcm9wcyIsIkIiLCJjbGFzc05hbWUiLCJhdHRycyIsIkMiLCJ2YWx1ZSIsIkQiLCJjaGVja2VkIiwiRSIsIm9wdGlvbiIsInNlbGVjdGVkIiwiRiIsImhyZWYiLCJHIiwidXJsIiwiSCIsIkkiLCJpbWciLCJzcmMiLCJKIiwicmVsYXRlZEluc3RhbmNlIiwib2JqIiwiYWJjIiwiZGVmIiwiZ2V0QXR0cmlidXRlIiwiZGF0YXNldCIsIm5vZGVUeXBlIiwidGV4dENvbnRlbnQiLCJyZWxhdGVkIiwib3B0aW9ucyIsImNoaWxkTm9kZXMiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwic3R5bGUiLCJkaXNwbGF5IiwiYXBwZW5kVG8iLCJyYXciLCJoYXZlIiwiZGl2UmF3IiwiX3F1aWNrRWxlbWVudCIsInJhd0IiLCJyYXdDIiwicmF3QSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJkb2MiLCJwYXJlbnRzIiwid2luIiwidHJ1ZSIsImFwcGVuZCIsImh0bWwiLCJjb21wdXRlZFN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImxhbWVvIiwid2lkdGgiLCJoZWlnaHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kU2l6ZSIsInJlZ0RpdiIsInN2Z0dvb2QiLCJzdmdQb2x5QmFkIiwic3ZnUG9seUdvb2QiLCJzdmdEaXYiLCJzdmdCYWQiLCJIVE1MVW5rbm93bkVsZW1lbnQiLCJTVkdTVkdFbGVtZW50IiwiU1ZHUG9seWxpbmVFbGVtZW50IiwiaHRtbFN0cmluZyIsImJhdGNoIiwiZWxlbWVudHMiLCJpbmNsdWRlIiwiY3NzIiwicmVwbGFjZVdpdGgiLCJyZXBsYWNlIiwicmVtb3ZlTGlzdGVuZXIiLCJvZmYiLCJkaXZBIiwiZGl2QiIsIm1ldGhvZHMiLCJzY3JvbGxUb3AiLCJnZXQiLCJ3ZWlnaHQiLCJzZXQiLCJiaWdJbmRleCIsImVtaXRDb3VudEIiLCJvbiIsImV2ZW50IiwiZW1pdENvdW50QSIsImVtaXRFdmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJlbWl0IiwiYXJnIiwiYXJndW1lbnRzIiwiZW1pdFByaXZhdGUiLCJlbWl0Q291bnRDIiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJmYWxzZSIsImUiLCJjdXN0b20iLCJlbWl0Q291bnREIiwiZXZlbnRDQiIsImF0dGFjaExpc3RlbmVycyIsImVtaXRDb3VudCIsIm9uY2UiLCJlbWl0Q29udGV4dCIsImxpc3RlbmVycyIsImV2ZW50cyIsInBhcmVudEEiLCJwYXJlbnRCIiwibWFzdGVyUGFyZW50QiIsInBhcmVudEMiLCJpbnZva2VDb3VudCIsImRldGFjaCIsImFub3RoZXJPYmoiLCJyYXRlIiwiYXBwbHlXaWR0aCIsImV4cGVjdGVkSW5zdGFuY2UiLCJpbnN0YW5jZSIsImZvbnRTaXplIiwic29tZSIsInMiLCJ6SW5kZXgiLCJmaWVsZCIsInRoZUluZGV4IiwiJGhhcHB5IiwiJHJlbGF4ZWQiLCJzdHlsZUFmdGVySW5zZXJ0IiwicG9zaXRpb24iLCJwcm9wIiwidGFyZ2V0IiwiY29tcHV0ZWQiLCJpbmxpbmUiLCJzYWZlIiwic3R5bGVTYWZlIiwiZXFsIiwic3RhdGUiLCJoZWlnaHRBIiwiaGVpZ2h0QiIsInRocm93Iiwic3R5bGVQYXJzZWQiLCJwYXJzZUZsb2F0IiwiY291bnQiLCJvcGFjaXR5IiwiJGZ1bm55IiwicmVjYWxjU3R5bGUiLCJ3cmFwcGVyQ291bnQiLCJ3cmFwcGVyIiwicmVjYWxjT25SZXNpemUiLCJpbm5lckhUTUwiLCJmb3JjZVN0eWxlIiwiaGVhZCIsImF0dHIiLCJyZW1vdmUiLCJoaWRlIiwic2hvdyIsInN2ZyIsImIiLCJjIiwicmVzZXRTdGF0ZSIsInRvZ2dsZVN0YXRlIiwiJGJhc2UiLCJtYXJnaW5Ub3AiLCJtYXJnaW5MZWZ0Iiwic3RhdGVUcmlnZ2VycyIsImhhcHB5IiwicmVsYXhlZCIsIiRob3ZlciIsIiRmb2N1cyIsImF0dGFjaFN0YXRlRXZlbnRzIiwiX2F0dGFjaFN0YXRlRXZlbnRzIiwiTWFpbiIsInBhc3NTdGF0ZVRvQ2hpbGRyZW4iLCJyZWN0QSIsInJlY3QiLCJyZWN0QiIsIkNsaWVudFJlY3QiLCJyZWN0QyIsIm9yaWVudGF0aW9uIiwiYXNwZWN0UmF0aW8iLCJkaXZSZWciLCJwYXJlbnRPcGFjaXR5R2V0dGVyIiwiZGl2QyIsImluc2VydEJlZm9yZSIsImRldGFjaGVkUGFyZW50IiwidmlzaWJpbGl0eSIsImNoaWxkQSIsImNoaWxkQiIsInBpcGVTdGF0ZSIsInVucGFzc2FibGVTdGF0ZXMiLCJzcGFuQSIsInNwYW5CIiwic3ViU3BhbiIsInN1YlBhcmVudEEiLCJzdWJDaGlsZEEiLCJzdWJQYXJlbnRCIiwic3ViQ2hpbGRCIiwiZm9yY2UiLCJkaXZCXyIsImRpdkFfIiwiaXNOYU4iLCJjb2xvciIsInJlc3VsdHMiLCJwdXNoIiwiZGVlcCIsIiRzb21ldGhpbmdFbHNlIiwiZ2V0U3R5bGVzIiwidXBkYXRlU3RhdGVTdHlsZXMiLCJlbDEiLCJlbDIiLCJlbDMiLCJzdWl0ZVRlYXJkb3duIiwicmVmIiwiY29uZmlndXJhYmxlIiwicmVzdG9yZSIsInN1aXRlU2V0dXAiLCJza2lwIiwidGVhcmRvd24iLCJyZXN1bHRzMSIsImxldmVsIiwiQ1NTIiwiY2xlYXJSZWdpc3RlcmVkIiwic2ltdWxhdGUiLCJsaW5lSGVpZ2h0Iiwic2ltdWxhdGVQYXJlbnQiLCJ0b3AiLCJtYXJnaW5Cb3R0b20iLCJmb250V2VpZ2h0IiwiZ2hpIiwibWFyZ2luUmlnaHQiLCJjb21tZW50IiwiZWxlbWVudENoaWxkcmVuIiwiY3JlYXRlVGV4dE5vZGUiLCJjcmVhdGVDb21tZW50IiwiZGl2JCIsInNsaWNlIiwiZG9jdW1lbnRFbGVtZW50IiwiZWxzIiwicGFyZW50TWF0Y2hpbmciLCJwYXJlbnRzVW50aWwiLCJuZXh0IiwibmV4dEFsbCIsIm5leHRFbCIsIm5leHRFbEFsbCIsInByZXYiLCJwcmV2QWxsIiwicHJldkVsIiwicHJldkVsQWxsIiwic2libGluZ3MiLCJyZXZlcnNlIiwiY29uY2F0IiwiZWxlbWVudFNpYmxpbmdzIiwiZGl2QkEiLCJkaXZCQiIsImZpcnN0Q2hpbGQiLCJsYXN0Q2hpbGQiLCJ0ZW1wbGF0ZSIsInNwYXduIiwiY2hpbGRBXzEiLCJjaGlsZEFfMiIsImNoaWxkQV8zIiwiY2hpbGRCXzEiLCJjaGlsZEJfMiIsImRpdkQiLCJzYW5kQm94IiwiY2hpbGRmIiwibmV3Q2hpbGQiLCJuZXdDaGlsZENoaWxkIiwiT2JqZWN0Iiwia2V5cyIsIm5ld1BhcmVudCIsImNoaWxkQyIsImNoaWxkRCIsImNoaWxkRSIsImNoaWxkRiIsImNoaWxkRyIsImluZGV4VHlwZSIsImluZGV4UmVmIiwicXVlcnkiLCJxdWVyeUFsbCIsImFsbEEiLCJhbGxCIiwiTWFpbkEiLCJNYWluQiIsInByZXBlbmQiLCJwcmVwZW5kVG8iLCJhZnRlciIsImluc2VydEFmdGVyIiwiYmVmb3JlIiwiZXhpc3QiLCJlbXB0eSIsIndyYXBBIiwid3JhcEIiLCJ3cmFwQyIsIndyYXAiLCJ1bndyYXAiLCJvcHRzIiwiY2xvbmUiLCJteVByb3AiLCJhbm90aGVyUHJvcCIsImxhc3RQcm9wIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwic2V0UmVmIiwiYmF0Y2gxIiwiYmF0Y2gyIiwicmVzdWx0IiwicmV0dXJuIiwiYXJyIiwic3Bhd25BIiwic3Bhd25CIiwic2VjdGlvblRlbXBsYXRlIiwidG9UZW1wbGF0ZSIsInRlbXBsYXRlU3Bhd24iLCJzZWN0aW9uRWwiLCJ0ZW1wbGF0ZUNvcHlBIiwiZXh0ZW5kIiwidGVtcGxhdGVDb3B5QiIsInRlbXBsYXRlQ29weUMiLCJzcGF3bkMiLCJzcGF3blJhdyIsImNsb25lQSIsImNsb25lQiIsImNsb25lQyIsImZvbnRGYW1pbHkiLCJ0ZW1wbGF0ZUNvcHkiLCJzcGF3bmVkQSIsInNwYXduZWRCIiwic3Bhd25lZEMiLCJkZWZhdWx0cyIsImNvbXB1dGVycyIsImxhYmVsIiwidGhlU3BhbiIsImhlYWRlclRlbXBsYXRlIiwiaGVhZGVyVGVtcGxhdGVDbG9uZSIsImR5bmFtaWNIZWlnaHRTdHlsZSIsIm15SGVpZ2h0IiwicmVuZGVyZWQiLCJ0ZW1wbGF0ZU1haW4iLCJ0ZW1wbGF0ZUNvcHkyIiwiY2hpbGRBXzJfMSIsIkNISUxEYV8yIiwiQ2hpbGRCIiwiQ2hpbGRDIiwidGVtcGxhdGVBIiwidGVtcGxhdGVCIiwidGVtcGxhdGVDIiwidGVtcGxhdGVEIiwic3Bhd25EIiwidmFsdWVBIiwidmFsdWVCIiwiJGFjdGl2ZSIsInJlY2VpdmVkRGF0YSIsImRhdGEiLCJjb250ZXh0IiwiZmlyc3QiLCJzZWNvbmQiLCJ0aGlyZCIsImZvdXJ0aCIsImZpZnRoIiwic2l4dGgiLCJjaGlsZENoaWxkIiwiZCIsImYiLCJhcHBseURhdGEiLCJfaW5pdCIsIm5hbWUxIiwiZGl2RSIsImV4cGVjdGVkIiwic2l6ZSIsInRlbXBsYXRlMSIsInRlbXBsYXRlMiIsInBhc3NEYXRhVG9DaGlsZHJlbiIsImhpc3RvcnkiLCJpbnZva2VDb21wdXRlcnNPbmNlIiwiaXNUZW1wbGF0ZSIsImlzUXVpY2tFbCIsImlzRWwiLCJzdHJpbmdpZmllZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZWN0aW9uQ29weSIsInBhcnNlIiwiY2hhaW5SZXN1bHQiLCJ1cGRhdGVTdGF0ZVRleHRzIiwiY2IiLCJsb3N0T3B0cyIsInVwZGF0ZU9wdGlvbnMiLCJudWxsIiwiX3JlbW92ZUNoaWxkIiwiSFRNTEVsZW1lbnQiLCJwcm90b3R5cGUiLCJvbkV2ZW50IiwiZXZlbnROYW1lIiwiY2FsbGJhY2siLCJhdHRhY2hFdmVudCIsInJlbW92ZUV2ZW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRldGFjaEV2ZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiVGV4dCIsIm5vbkVsZW1lbnRTdWZmaXgiLCJlbGVtZW50U3VmZml4IiwiY3JlYXRvciIsImoiLCJET01SZWN0Iiwib3JpZ0Rlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwibW9kdWxlIiwiZXhwb3J0cyIsImN1cnJlbnQiLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJnZXRSZWFsIiwiZGltZW5zaW9uIiwibGV0dGVyIiwidG9VcHBlckNhc2UiLCJjYWxsIiwib3ZlcndyaXRlIiwib3ZlcndyaXR0ZW4iLCJkZWZpbmVQcm9wZXJ0eSIsIm5ld1ZhbHVlIiwiY2hhaVN0eWxlIiwidXRpbHMiLCJBc3NlcnRpb24iLCJmbGFnIiwic2FtcGxlRGl2Iiwic2FtcGxlU3R5bGUiLCJzYW1wbGVJZnJhbWUiLCJhZGRNZXRob2QiLCJwcm9wZXJ0eSIsImVsZW1lbnQiLCJ0cmltIiwiaXNOb25Db2xvcnMiLCJwcm9wZXJ0eVZhbHVlIiwiYXNzZXJ0aW9uIiwiY29tcGFyZUNTU1ZhbHVlIiwiQm9vbGVhbiIsImVsZW1lbnRUYWciLCJ0YWdOYW1lIiwidGhyb3dNZXNzYWdlIiwidGhyb3dNZXNzYWdlTmVnYXRpdmUiLCJhc3NlcnQiLCJwcm9wZXJ0eUhpZmVuQ2FzZSIsIm1hdGNoIiwic2V0UHJvcGVydHkiLCJoYXNBdXRvVmFsdWUiLCJpbmNsdWRlcyIsInJlZyIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIlN0cmluZyIsInVzZWQiLCJBc3NlcnRpb25FcnJvciIsInV0aWwiLCJmbiIsImluZGV4T2YiLCJjb3JlIiwic2hvdWxkIiwiZXhjbHVkZXMiLCJyZXMiLCJmb3JFYWNoIiwia2V5IiwiYXJncyIsImV4Y2x1ZGVQcm9wcyIsIm1lc3NhZ2UiLCJfcHJvcHMiLCJzc2YiLCJleGNsdWRlIiwic2hvd0RpZmYiLCJjYWxsZWUiLCJFcnJvciIsImNhcHR1cmVTdGFja1RyYWNlIiwic3RhY2siLCJjcmVhdGUiLCJ0b0pTT04iLCJwYXRodmFsIiwiZXhwZWN0VHlwZXMiLCJnZXRNZXNzYWdlIiwiZ2V0QWN0dWFsIiwiaW5zcGVjdCIsIm9iakRpc3BsYXkiLCJ0cmFuc2ZlckZsYWdzIiwiZ2V0UGF0aEluZm8iLCJoYXNQcm9wZXJ0eSIsImdldE5hbWUiLCJhZGRQcm9wZXJ0eSIsIm92ZXJ3cml0ZVByb3BlcnR5Iiwib3ZlcndyaXRlTWV0aG9kIiwiYWRkQ2hhaW5hYmxlTWV0aG9kIiwib3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kIiwiY29tcGFyZUJ5SW5zcGVjdCIsImdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMiLCJnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyIsImNoZWNrRXJyb3IiLCJwcm94aWZ5IiwiYWRkTGVuZ3RoR3VhcmQiLCJpc1Byb3h5RW5hYmxlZCIsImluY2x1ZGVTdGFjayIsInVzZVByb3h5IiwicHJveHlFeGNsdWRlZEtleXMiLCJfY2hhaSIsIm1zZyIsInNzZmkiLCJsb2NrU3NmaSIsImNvbnNvbGUiLCJ3YXJuIiwiY2hhaW5pbmdCZWhhdmlvciIsImV4cHIiLCJuZWdhdGVNc2ciLCJfYWN0dWFsIiwib2siLCJhY3R1YWwiLCJ2YWwiLCJfIiwiY2hhaW4iLCJhcnRpY2xlIiwiY2hhckF0IiwiYW4iLCJvYmpUeXBlIiwiZmxhZ01zZyIsIm5lZ2F0ZSIsImlzRGVlcCIsImRlc2NyaXB0b3IiLCJpbmNsdWRlZCIsImhhcyIsImlzRXFsIiwiU2FtZVZhbHVlWmVybyIsIml0ZW0iLCJmaXJzdEVyciIsIm51bUVycnMiLCJwcm9wQXNzZXJ0aW9uIiwiZXJyIiwiY29tcGF0aWJsZUNvbnN0cnVjdG9yIiwiaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IiLCJpdGVtc0NvdW50IiwiY2hlY2tBcmd1bWVudHMiLCJfb2JqIiwiYXNzZXJ0RXF1YWwiLCJhc3NlcnRFcWwiLCJuIiwiZG9MZW5ndGgiLCJtc2dQcmVmaXgiLCJuVHlwZSIsInNob3VsZFRocm93IiwiZXJyb3JNZXNzYWdlIiwicHJpbnRPYmoiLCJsZW4iLCJhc3NlcnRBYm92ZSIsImFzc2VydExlYXN0IiwiYXNzZXJ0QmVsb3ciLCJhc3NlcnRNb3N0Iiwic3RhcnQiLCJmaW5pc2giLCJzdGFydFR5cGUiLCJmaW5pc2hUeXBlIiwicmFuZ2UiLCJ0b1VUQ1N0cmluZyIsImlzSW5zdGFuY2VPZiIsIlR5cGVFcnJvciIsImFzc2VydEluc3RhbmNlT2YiLCJpc05lc3RlZCIsImlzT3duIiwicGF0aEluZm8iLCJoYXNPd25Qcm9wZXJ0eSIsImV4aXN0cyIsImFzc2VydFByb3BlcnR5IiwiYXBwbHkiLCJhc3NlcnRPd25Qcm9wZXJ0eSIsImFjdHVhbERlc2NyaXB0b3IiLCJhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJhc3NlcnRMZW5ndGgiLCJhc3NlcnRMZW5ndGhDaGFpbiIsInJlIiwiZXhlYyIsImFzc2VydE1hdGNoIiwic3RyIiwiaXMiLCJrZXlzVHlwZSIsImRlZXBTdHIiLCJtaXhlZEFyZ3NNc2ciLCJBcnJheSIsIm1hcCIsImFueSIsImFsbCIsImV4cGVjdGVkS2V5IiwiYWN0dWFsS2V5IiwiZXZlcnkiLCJsYXN0IiwicG9wIiwiam9pbiIsInNvcnQiLCJhc3NlcnRLZXlzIiwiZXJyb3JMaWtlIiwiZXJyTXNnTWF0Y2hlciIsImNhdWdodEVyciIsImV2ZXJ5QXJnSXNVbmRlZmluZWQiLCJldmVyeUFyZ0lzRGVmaW5lZCIsImVycm9yTGlrZUZhaWwiLCJlcnJNc2dNYXRjaGVyRmFpbCIsImVycm9yTGlrZVN0cmluZyIsImdldENvbnN0cnVjdG9yTmFtZSIsInRvU3RyaW5nIiwiaXNDb21wYXRpYmxlSW5zdGFuY2UiLCJjb21wYXRpYmxlSW5zdGFuY2UiLCJpc0NvbXBhdGlibGVDb25zdHJ1Y3RvciIsInBsYWNlaG9sZGVyIiwiaXNDb21wYXRpYmxlTWVzc2FnZSIsImNvbXBhdGlibGVNZXNzYWdlIiwiYXNzZXJ0VGhyb3dzIiwibWV0aG9kIiwiaXRzZWxmIiwicmVzcG9uZFRvIiwibWF0Y2hlciIsInNhdGlzZnkiLCJkZWx0YSIsIk1hdGgiLCJhYnMiLCJjbG9zZVRvIiwic3Vic2V0Iiwic3VwZXJzZXQiLCJjbXAiLCJjb250YWlucyIsIm9yZGVyZWQiLCJlbGVtIiwiaWR4IiwibWF0Y2hJZHgiLCJzcGxpY2UiLCJlbGVtMiIsInN1YmplY3QiLCJmYWlsTXNnIiwiZmFpbE5lZ2F0ZU1zZyIsImxlbmd0aENoZWNrIiwiaXNTdWJzZXRPZiIsImxpc3QiLCJvbmVPZiIsImluaXRpYWwiLCJmaW5hbCIsIm1zZ09iaiIsImFzc2VydENoYW5nZXMiLCJhc3NlcnRJbmNyZWFzZXMiLCJhc3NlcnREZWNyZWFzZXMiLCJiZWhhdmlvciIsInJlYWxEZWx0YSIsImV4cHJlc3Npb24iLCJhc3NlcnREZWx0YSIsImlzRXh0ZW5zaWJsZSIsImlzU2VhbGVkIiwiaXNGcm96ZW4iLCJpc0Zpbml0ZSIsImZhaWwiLCJvcGVyYXRvciIsIk51bWJlciIsIlN5bWJvbCIsInZhbHVlT2YiLCJzaG91bGRHZXR0ZXIiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJzaG91bGRTZXR0ZXIiLCJ2YWwxIiwidmFsMiIsIlRocm93IiwiZXJydCIsImVycnMiLCJsb2FkU2hvdWxkIiwiU2hvdWxkIiwiZXhwcmVzcyIsImVycm1zZyIsImlzT2siLCJpc05vdE9rIiwiYWN0IiwiZXhwIiwibm90RXF1YWwiLCJzdHJpY3RFcXVhbCIsIm5vdFN0cmljdEVxdWFsIiwiZGVlcEVxdWFsIiwiZGVlcFN0cmljdEVxdWFsIiwibm90RGVlcEVxdWFsIiwiaXNBYm92ZSIsImFidiIsImFib3ZlIiwiaXNBdExlYXN0IiwiYXRsc3QiLCJsZWFzdCIsImlzQmVsb3ciLCJibHciLCJiZWxvdyIsImlzQXRNb3N0IiwiYXRtc3QiLCJtb3N0IiwiaXNUcnVlIiwiaXNOb3RUcnVlIiwiaXNGYWxzZSIsImlzTm90RmFsc2UiLCJpc051bGwiLCJpc05vdE51bGwiLCJOYU4iLCJpc05vdE5hTiIsIm5vdEV4aXN0cyIsImlzVW5kZWZpbmVkIiwiaXNEZWZpbmVkIiwiaXNGdW5jdGlvbiIsImlzTm90RnVuY3Rpb24iLCJpc09iamVjdCIsImlzTm90T2JqZWN0IiwiaXNBcnJheSIsImlzTm90QXJyYXkiLCJpc1N0cmluZyIsImlzTm90U3RyaW5nIiwiaXNOdW1iZXIiLCJpc05vdE51bWJlciIsImZpbml0ZSIsImlzQm9vbGVhbiIsImlzTm90Qm9vbGVhbiIsInR5cGVPZiIsIm5vdFR5cGVPZiIsIm5vdEluc3RhbmNlT2YiLCJpbmMiLCJub3RJbmNsdWRlIiwiZGVlcEluY2x1ZGUiLCJub3REZWVwSW5jbHVkZSIsIm5lc3RlZEluY2x1ZGUiLCJuZXN0ZWQiLCJub3ROZXN0ZWRJbmNsdWRlIiwiZGVlcE5lc3RlZEluY2x1ZGUiLCJub3REZWVwTmVzdGVkSW5jbHVkZSIsIm93bkluY2x1ZGUiLCJvd24iLCJub3RPd25JbmNsdWRlIiwiZGVlcE93bkluY2x1ZGUiLCJub3REZWVwT3duSW5jbHVkZSIsIm5vdE1hdGNoIiwibm90UHJvcGVydHkiLCJwcm9wZXJ0eVZhbCIsIm5vdFByb3BlcnR5VmFsIiwiZGVlcFByb3BlcnR5VmFsIiwibm90RGVlcFByb3BlcnR5VmFsIiwib3duUHJvcGVydHkiLCJub3RPd25Qcm9wZXJ0eSIsIm93blByb3BlcnR5VmFsIiwibm90T3duUHJvcGVydHlWYWwiLCJkZWVwT3duUHJvcGVydHlWYWwiLCJub3REZWVwT3duUHJvcGVydHlWYWwiLCJuZXN0ZWRQcm9wZXJ0eSIsIm5vdE5lc3RlZFByb3BlcnR5IiwibmVzdGVkUHJvcGVydHlWYWwiLCJub3ROZXN0ZWRQcm9wZXJ0eVZhbCIsImRlZXBOZXN0ZWRQcm9wZXJ0eVZhbCIsIm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCIsImxlbmd0aE9mIiwiaGFzQW55S2V5cyIsImhhc0FsbEtleXMiLCJjb250YWluc0FsbEtleXMiLCJkb2VzTm90SGF2ZUFueUtleXMiLCJkb2VzTm90SGF2ZUFsbEtleXMiLCJoYXNBbnlEZWVwS2V5cyIsImhhc0FsbERlZXBLZXlzIiwiY29udGFpbnNBbGxEZWVwS2V5cyIsImRvZXNOb3RIYXZlQW55RGVlcEtleXMiLCJkb2VzTm90SGF2ZUFsbERlZXBLZXlzIiwidGhyb3dzIiwiYXNzZXJ0RXJyIiwiZG9lc05vdFRocm93IiwiYXBwcm94aW1hdGVseSIsInNhbWVNZW1iZXJzIiwic2V0MSIsInNldDIiLCJzYW1lIiwibWVtYmVycyIsIm5vdFNhbWVNZW1iZXJzIiwic2FtZURlZXBNZW1iZXJzIiwibm90U2FtZURlZXBNZW1iZXJzIiwic2FtZU9yZGVyZWRNZW1iZXJzIiwibm90U2FtZU9yZGVyZWRNZW1iZXJzIiwic2FtZURlZXBPcmRlcmVkTWVtYmVycyIsIm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMiLCJpbmNsdWRlTWVtYmVycyIsIm5vdEluY2x1ZGVNZW1iZXJzIiwiaW5jbHVkZURlZXBNZW1iZXJzIiwibm90SW5jbHVkZURlZXBNZW1iZXJzIiwiaW5jbHVkZU9yZGVyZWRNZW1iZXJzIiwibm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzIiwiaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyIsIm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMiLCJpbkxpc3QiLCJjaGFuZ2VzIiwiY2hhbmdlIiwiY2hhbmdlc0J5IiwidG1wTXNnIiwiYnkiLCJkb2VzTm90Q2hhbmdlIiwiY2hhbmdlc0J1dE5vdEJ5IiwiYnV0IiwiaW5jcmVhc2VzIiwiaW5jcmVhc2UiLCJpbmNyZWFzZXNCeSIsImRvZXNOb3RJbmNyZWFzZSIsImluY3JlYXNlc0J1dE5vdEJ5IiwiZGVjcmVhc2VzIiwiZGVjcmVhc2UiLCJkZWNyZWFzZXNCeSIsImRvZXNOb3REZWNyZWFzZSIsImRvZXNOb3REZWNyZWFzZUJ5IiwiZGVjcmVhc2VzQnV0Tm90QnkiLCJpZkVycm9yIiwiZXh0ZW5zaWJsZSIsImlzTm90RXh0ZW5zaWJsZSIsInNlYWxlZCIsImlzTm90U2VhbGVkIiwiZnJvemVuIiwiaXNOb3RGcm96ZW4iLCJpc0VtcHR5IiwiaXNOb3RFbXB0eSIsImFzIiwiYWxpYXMiLCJwYXRoIiwicGFydHMiLCJyZWdleHAiLCJtQXJyIiwicGFyc2VkIiwicCIsInBhdGhEZXB0aCIsInRlbXBvcmFyeVZhbHVlIiwicGFydCIsInRlbXBPYmoiLCJwcm9wTmFtZSIsInByb3BWYWwiLCJwYXJzZVBhdGgiLCJpbmZvIiwiaW50ZXJuYWxHZXRQYXRoVmFsdWUiLCJpbnRlcm5hbFNldFBhdGhWYWx1ZSIsImdldFBhdGhWYWx1ZSIsInNldFBhdGhWYWx1ZSIsInByb21pc2VFeGlzdHMiLCJQcm9taXNlIiwiZ2xvYmFsT2JqZWN0IiwiZ2xvYmFsIiwic2VsZiIsImlzRG9tIiwic3ltYm9sRXhpc3RzIiwibWFwRXhpc3RzIiwiTWFwIiwic2V0RXhpc3RzIiwiU2V0Iiwid2Vha01hcEV4aXN0cyIsIldlYWtNYXAiLCJ3ZWFrU2V0RXhpc3RzIiwiV2Vha1NldCIsImRhdGFWaWV3RXhpc3RzIiwiRGF0YVZpZXciLCJzeW1ib2xJdGVyYXRvckV4aXN0cyIsIml0ZXJhdG9yIiwic3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMiLCJ0b1N0cmluZ1RhZyIsInNldEVudHJpZXNFeGlzdHMiLCJlbnRyaWVzIiwibWFwRW50cmllc0V4aXN0cyIsInNldEl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJtYXBJdGVyYXRvclByb3RvdHlwZSIsImFycmF5SXRlcmF0b3JFeGlzdHMiLCJhcnJheUl0ZXJhdG9yUHJvdG90eXBlIiwic3RyaW5nSXRlcmF0b3JFeGlzdHMiLCJzdHJpbmdJdGVyYXRvclByb3RvdHlwZSIsInRvU3RyaW5nTGVmdFNsaWNlTGVuZ3RoIiwidG9TdHJpbmdSaWdodFNsaWNlTGVuZ3RoIiwidHlwZW9mT2JqIiwibmF2aWdhdG9yIiwibWltZVR5cGVzIiwicGx1Z2lucyIsInN0cmluZ1RhZyIsIm9ialByb3RvdHlwZSIsIkRhdGUiLCJ0eXBlRGV0ZWN0IiwidCIsImFydCIsIm9yIiwiZ2V0UHJvcGVydGllcyIsImdldEVudW1lcmFibGVQcm9wZXJ0aWVzIiwic2hvd0hpZGRlbiIsImRlcHRoIiwiY29sb3JzIiwiY3R4Iiwic2VlbiIsInN0eWxpemUiLCJmb3JtYXRWYWx1ZSIsImlzRE9NRWxlbWVudCIsIm9iamVjdCIsInJlY3Vyc2VUaW1lcyIsInJldCIsInByaW1pdGl2ZSIsImZvcm1hdFByaW1pdGl2ZSIsIm91dGVySFRNTCIsInhtbFZlcnNpb24iLCJ4bWxTZXJpYWxpemVyIiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwibnMiLCJjb250YWluZXIiLCJjcmVhdGVFbGVtZW50TlMiLCJjbG9uZU5vZGUiLCJ2aXNpYmxlS2V5cyIsIm5hbWVTdWZmaXgiLCJpc0Vycm9yIiwiaXNSZWdFeHAiLCJpc0RhdGUiLCJmb3JtYXRFcnJvciIsImJhc2UiLCJhcnJheSIsInR5cGVkQXJyYXkiLCJicmFjZXMiLCJpc1R5cGVkQXJyYXkiLCJvdXRwdXQiLCJmb3JtYXRBcnJheSIsImZvcm1hdFR5cGVkQXJyYXkiLCJmb3JtYXRQcm9wZXJ0eSIsInJlZHVjZVRvU2luZ2xlU3RyaW5nIiwic2ltcGxlIiwiSW5maW5pdHkiLCJsIiwicHJvcERlc2NyaXB0b3IiLCJzcGxpdCIsImxpbmUiLCJzdWJzdHIiLCJudW1MaW5lc0VzdCIsInJlZHVjZSIsImN1ciIsImFyIiwib2JqZWN0VG9TdHJpbmciLCJvIiwia3N0ciIsImZsYWdzIiwiX19mbGFncyIsImluY2x1ZGVBbGwiLCJfa2V5IiwicmFuZG9tIiwibm93IiwiRmFrZU1hcCIsIk1lbW9pemVNYXAiLCJsZWZ0SGFuZE9wZXJhbmQiLCJyaWdodEhhbmRPcGVyYW5kIiwibWVtb2l6ZU1hcCIsImlzUHJpbWl0aXZlIiwibGVmdEhhbmRNYXAiLCJjb21wYXJhdG9yIiwiZXh0ZW5zaXZlRGVlcEVxdWFsIiwic2ltcGxlUmVzdWx0Iiwic2ltcGxlRXF1YWwiLCJtZW1vaXplIiwibWVtb2l6ZVJlc3VsdExlZnQiLCJtZW1vaXplQ29tcGFyZSIsIm1lbW9pemVSZXN1bHRSaWdodCIsImNvbXBhcmF0b3JSZXN1bHQiLCJtZW1vaXplU2V0IiwibGVmdEhhbmRUeXBlIiwiZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlIiwiaXRlcmFibGVFcXVhbCIsInJlZ2V4cEVxdWFsIiwiZ2VuZXJhdG9yRXF1YWwiLCJVaW50OEFycmF5IiwiYnVmZmVyIiwiZW50cmllc0VxdWFsIiwib2JqZWN0RXF1YWwiLCJsZWZ0SGFuZEl0ZW1zIiwicmlnaHRIYW5kSXRlbXMiLCJnZXRHZW5lcmF0b3JFbnRyaWVzIiwiaGFzSXRlcmF0b3JGdW5jdGlvbiIsIml0ZXJhdG9yRXJyb3IiLCJnZW5lcmF0b3IiLCJnZW5lcmF0b3JSZXN1bHQiLCJhY2N1bXVsYXRvciIsImRvbmUiLCJsZWZ0SGFuZEtleXMiLCJnZXRFbnVtZXJhYmxlS2V5cyIsInJpZ2h0SGFuZEtleXMiLCJrZXlzRXF1YWwiLCJsZWZ0SGFuZEVudHJpZXMiLCJnZXRJdGVyYXRvckVudHJpZXMiLCJyaWdodEhhbmRFbnRyaWVzIiwiRnVuY3Rpb24iLCJmdW5jdGlvbk5hbWVNYXRjaCIsImFGdW5jIiwiZ2V0RnVuY05hbWUiLCJnZXR0ZXIiLCJwcm9wZXJ0eUdldHRlciIsIm5ld0Fzc2VydGlvbiIsIm1ldGhvZFdyYXBwZXIiLCJfZ2V0IiwiX3N1cGVyIiwib3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlciIsIm9yaWdMb2NrU3NmaSIsIl9tZXRob2QiLCJvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIiLCJjYW5TZXRQcm90b3R5cGUiLCJzZXRQcm90b3R5cGVPZiIsInRlc3RGbiIsImV4Y2x1ZGVOYW1lcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJmaWx0ZXIiLCJwcm9wRGVzYyIsImNoYWluYWJsZUJlaGF2aW9yIiwiX19tZXRob2RzIiwiY2hhaW5hYmxlTWV0aG9kV3JhcHBlciIsImFzc2VydGVyTmFtZXMiLCJhc3NlcnRlck5hbWUiLCJwZCIsIl9jaGFpbmluZ0JlaGF2aW9yIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltIiwidGhyb3duIiwiZXJyTWF0Y2hlciIsImNvbXBhcmlzb25TdHJpbmciLCJjb25zdHJ1Y3RvckZuIiwiY29uc3RydWN0b3JOYW1lIiwiZ2V0RnVuY3Rpb25OYW1lIiwiYnVpbHRpbnMiLCJub25DaGFpbmFibGVNZXRob2ROYW1lIiwiUHJveHkiLCJSZWZsZWN0Iiwib3JkZXJlZFByb3BlcnRpZXMiLCJzdHJpbmdEaXN0YW5jZSIsInByb3h5R2V0dGVyIiwic3RyQSIsInN0ckIiLCJtZW1vIiwibWF4IiwibWluIiwiZm5MZW5ndGhEZXNjIiwiYXNzZXJ0aW9uTmFtZSIsImlzQ2hhaW5hYmxlIiwicHJvdG8iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBQTtLQUFDQyxhQUVpQjtBQURsQixLQUFDQyxNQUFNLEtBQUNDLE1BQU1DLE9BQU9DO0FBQ3JCQyxNQUFNQyxNQUFNO0FBQ1pELE1BQU1FLEtBQUs7QUFDWEYsTUFBTUcsUUFBUTtBQUNkLEtBQW9CTCxPQUFPTSxTQUFTQyxVQUFwQ0w7TUFBTU07O0FBQ05aLE9B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QU87QUFHcEIsT0FBT0EsVUFBVUE7O0FBSW5CcVosT0FBT0MsVUFBVW1QLE9BQU92YyxTQUFTQTs7OztBQ05qQ21OLE9BQU9DLFVBQVUsdUJBQXVCOGQsUUFBUTtBQUM5QyxJQUFJdmtCLFNBQVN2QyxPQUFPNHRCLG9CQUFvQjlHO0FBRXhDLHFCQUFxQnpjLFVBQVU7QUFDN0IsSUFBSTlILE9BQU93SixRQUFRMUIsY0FBYyxDQUFDLEdBQUc7QUFDbkM5SCxPQUFPeEcsS0FBS3NPOzs7QUFJaEIsSUFBSXdsQixRQUFRN3ZCLE9BQU9pbEIsZUFBZTZCO0FBQ2xDLE9BQU8rSSxVQUFVLE1BQU07QUFDckI3dkIsT0FBTzR0QixvQkFBb0JpQyxPQUFPempCLFFBQVF5QjtBQUMxQ2dpQixRQUFRN3ZCLE9BQU9pbEIsZUFBZTRLOztBQUdoQyxPQUFPdHRCOzs7OztBQ2ZUd0csT0FBT0MsVUFBVSxpQ0FBaUM4ZCxRQUFRO0FBQ3hELElBQUl2a0IsU0FBUztBQUNiLFNBQVN2VCxRQUFRODNCLFFBQVE7QUFDdkJ2a0IsT0FBT3hHLEtBQUsvTTs7QUFFZCxPQUFPdVQiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiQGRpbWVuc2lvbnMgPSBpbXBvcnQgJy4vc2ltdWxhdGUuY29mZmVlJ1xuQERvbSA9IEBET00gPSB3aW5kb3cucXVpY2tkb21cbm1vY2hhLnNldHVwKCd0ZGQnKVxubW9jaGEuc2xvdyg0MDApXG5tb2NoYS50aW1lb3V0KDEyMDAwKVxubW9jaGEuYmFpbCgpIHVubGVzcyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWVcbmNoYWkgPSBpbXBvcnQgJ2NoYWknXG5jaGFpLnVzZSBpbXBvcnQgJ2NoYWktc3R5bGUnXG5jaGFpLmNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA9IDFlM1xue2V4cGVjdH0gPSBjaGFpXG5cbnNhbmRib3ggPSBudWxsXG5yZXN0YXJ0U2FuZGJveCA9ICgpLT5cblx0c2FuZGJveC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHNhbmRib3gpIGlmIHNhbmRib3hcblx0c2FuZGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdHNhbmRib3guaWQgPSAnc2FuZGJveCdcblx0c2FuZGJveC5zZXRBdHRyaWJ1dGUgJ3N0eWxlJywgJ2JvcmRlcjoxcHggc29saWQ7IHBhZGRpbmc6MjBweDsgYm94LXNpemluZzpib3JkZXItYm94J1xuXHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNhbmRib3gpXG5cbmNoZWNrQ2hpbGRTdHJ1Y3R1cmUgPSAobWFpbiktPiAoY2hpbGRyZW4uLi4pLT5cblx0ZXhwZWN0KG1haW4uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbChjaGlsZHJlbi5sZW5ndGgpXG5cdGZvciBjaGlsZCxpbmRleCBpbiBjaGlsZHJlblxuXHRcdGV4cGVjdChtYWluLmNoaWxkcmVuW2luZGV4XSkudG8uZXF1YWwoY2hpbGQpXG5cdFx0ZXhwZWN0KGNoaWxkLmVsLnBhcmVudE5vZGUpLnRvLmVxdWFsKG1haW4uZWwpXG5cdFx0ZXhwZWN0KGNoaWxkLnBhcmVudCkudG8uZXF1YWwobWFpbilcblx0cmV0dXJuXG5cblxuc3VpdGUgXCJRdWlja0RvbVwiLCAoKS0+XG5cdHNldHVwKHJlc3RhcnRTYW5kYm94KVxuXG5cdHRlc3QgXCJWZXJzaW9uIFByb3BlcnR5XCIsICgpLT5cblx0XHRwYWNrYWdlVmVyc2lvbiA9IChpbXBvcnQgJy4uL3BhY2thZ2UgJCB2ZXJzaW9uJylcblx0XHRleHBlY3QoRG9tLnZlcnNpb24pLnRvLmVxdWFsKHBhY2thZ2VWZXJzaW9uKVxuXG5cblx0c3VpdGUgXCJFbGVtZW50IENyZWF0aW9uXCIsICgpLT5cblx0XHR0ZXN0IFwiQmFzaWMgQ3JlYXRpb25cIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tKCdkaXYnKVxuXHRcdFx0ZXhwZWN0KHR5cGVvZiBkaXYpLnRvLmVxdWFsICdvYmplY3QnXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdi5lbCkudG8uZXF1YWwgJ29iamVjdCdcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmJlLmluc3RhbmNlT2Ygd2luZG93LkhUTUxEaXZFbGVtZW50XG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uYmUudW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMFxuXG5cblx0XHR0ZXN0IFwiU2hvcnRjdXRzXCIsICgpLT5cblx0XHRcdGV4cGVjdChEb20uYSgpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ2EnKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20ubGluaygpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ2EnKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20uYW5jaG9yKCkuZWwuY29uc3RydWN0b3IpLnRvLmVxdWFsKERvbSgnYScpLmVsLmNvbnN0cnVjdG9yKVxuXHRcdFx0ZXhwZWN0KERvbS5kaXYoKS5lbC5jb25zdHJ1Y3RvcikudG8uZXF1YWwoRG9tKCdkaXYnKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20udGV4dCgpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ3RleHQnKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20uc3BhbigpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ3NwYW4nKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20uaDQoKS5lbC5jb25zdHJ1Y3RvcikudG8uZXF1YWwoRG9tKCdoNCcpLmVsLmNvbnN0cnVjdG9yKVxuXHRcdFx0ZXhwZWN0KERvbS5oZWFkZXIoKS5lbC5jb25zdHJ1Y3RvcikudG8uZXF1YWwoRG9tKCdoZWFkZXInKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20uZm9vdGVyKCkuZWwuY29uc3RydWN0b3IpLnRvLmVxdWFsKERvbSgnZm9vdGVyJykuZWwuY29uc3RydWN0b3IpXG5cdFx0XHRleHBlY3QoRG9tLnNlY3Rpb24oKS5lbC5jb25zdHJ1Y3RvcikudG8uZXF1YWwoRG9tKCdzZWN0aW9uJykuZWwuY29uc3RydWN0b3IpXG5cdFx0XHRleHBlY3QoRG9tLmJ1dHRvbigpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ2J1dHRvbicpLmVsLmNvbnN0cnVjdG9yKVxuXHRcdFx0ZXhwZWN0KERvbS5pbnB1dCgpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ2lucHV0JykuZWwuY29uc3RydWN0b3IpXG5cdFx0XHQjIGV4cGVjdChEb20ubWFpbigpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ21haW4nKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdHR5cGVzID0gWydhJywnZGl2JywndGV4dCcsJ3NwYW4nLCdoNCcsJ2hlYWRlcicsJ2Zvb3RlcicsJ3NlY3Rpb24nLCdidXR0b24nLCdpbnB1dCddXG5cdFx0XHRmb3IgdHlwZSBpbiB0eXBlc1xuXHRcdFx0XHRleHBlY3QoRG9tW3R5cGVdKCkuZWwuY29uc3RydWN0b3IubmFtZSkubm90LnRvLmNvbnRhaW4oJ1Vua25vd24nKVxuXHRcdFx0cmV0dXJuXG5cblxuXHRcdHRlc3QgXCJCYXNpYyBvcHRpb25zXCIsICgpLT5cblx0XHRcdEEgPSBEb20uZGl2KGNsYXNzOidhYmMtMTIzJywgcHJvcHM6eydhYmMnOjEyMywgJ2RlZic6NDU2fSlcblx0XHRcdEIgPSBEb20uZGl2KGlkOidCJywgY2xhc3NOYW1lOidhYmMtMTIzJywgYXR0cnM6eydkYXRhLWFiYyc6MTIzLCAnZGF0YS1kZWYnOjQ1Nn0pXG5cdFx0XHRDID0gRG9tLmlucHV0KHR5cGU6J3RleHQnLCBuYW1lOidhYmMnLCB2YWx1ZTonaGVsbG8nKVxuXHRcdFx0RCA9IERvbS5pbnB1dCh0eXBlOidjaGVja2JveCcsIGNoZWNrZWQ6dHJ1ZSlcblx0XHRcdEUgPSBEb20ub3B0aW9uKG5hbWU6J2FiYycsIHZhbHVlOidoZWxsbycsIHNlbGVjdGVkOnRydWUpXG5cdFx0XHRGID0gRG9tLmxpbmsoaHJlZjonaHR0cHM6Ly9nb29nbGUuY29tLycpXG5cdFx0XHRHID0gRG9tLmFuY2hvcih1cmw6J2h0dHBzOi8vZ29vZ2xlLmNvbS8nKVxuXHRcdFx0SCA9IERvbS50ZXh0KCdTb21lIHRleHQnKVxuXHRcdFx0SSA9IERvbS5pbWcoc3JjOidodHRwczovL2dvb2dsZS5jb20vJylcblx0XHRcdEogPSBEb20uZGl2KHJlbGF0ZWRJbnN0YW5jZTogb2JqPXthOjF9KVxuXG5cdFx0XHRleHBlY3QoQS5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdhYmMtMTIzJylcblx0XHRcdGV4cGVjdChBLmVsLmFiYykudG8uZXF1YWwoMTIzKVxuXHRcdFx0ZXhwZWN0KEEuZWwuZGVmKS50by5lcXVhbCg0NTYpXG5cdFx0XHRleHBlY3QoQi5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdhYmMtMTIzJylcblx0XHRcdGV4cGVjdChCLmVsLmlkKS50by5lcXVhbCgnQicpXG5cdFx0XHRleHBlY3QoQi5lbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWJjJykpLnRvLmVxdWFsKCcxMjMnKVxuXHRcdFx0ZXhwZWN0KEIuZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWRlZicpKS50by5lcXVhbCgnNDU2Jylcblx0XHRcdGV4cGVjdChCLmVsLmRhdGFzZXQuYWJjKS50by5lcXVhbCgnMTIzJykgaWYgQi5lbC5kYXRhc2V0XG5cdFx0XHRleHBlY3QoQy5lbC50eXBlKS50by5lcXVhbCgndGV4dCcpXG5cdFx0XHRleHBlY3QoQy5lbC5uYW1lKS50by5lcXVhbCgnYWJjJylcblx0XHRcdGV4cGVjdChDLmVsLnZhbHVlKS50by5lcXVhbCgnaGVsbG8nKVxuXHRcdFx0ZXhwZWN0KEQuZWwuY2hlY2tlZCkudG8uZXF1YWwodHJ1ZSlcblx0XHRcdGV4cGVjdChFLmVsLm5hbWUpLnRvLmVxdWFsKCdhYmMnKVxuXHRcdFx0ZXhwZWN0KEUuZWwuc2VsZWN0ZWQpLnRvLmVxdWFsKHRydWUpXG5cdFx0XHRleHBlY3QoRi5lbC5ocmVmKS50by5lcXVhbCgnaHR0cHM6Ly9nb29nbGUuY29tLycpXG5cdFx0XHRleHBlY3QoRy5lbC5ocmVmKS50by5lcXVhbCgnaHR0cHM6Ly9nb29nbGUuY29tLycpXG5cdFx0XHRleHBlY3QoSC5lbC5ub2RlVHlwZSkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChILmVsLnRleHRDb250ZW50KS50by5lcXVhbCgnU29tZSB0ZXh0Jylcblx0XHRcdGV4cGVjdChJLmVsLnNyYykudG8uZXF1YWwoJ2h0dHBzOi8vZ29vZ2xlLmNvbS8nKVxuXHRcdFx0ZXhwZWN0KEoucmVsYXRlZCkudG8uZXF1YWwob2JqKVxuXHRcdFx0ZXhwZWN0KEoub3B0aW9ucy5yZWxhdGVkKS50by5lcXVhbChvYmopXG5cblxuXHRcdHRlc3QgXCJDcmVhdGlvbiB3LyBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRBID0gRG9tLmRpdihudWxsLCAnU29tZSB0ZXh0Jylcblx0XHRcdEIgPSBEb20uZGl2KG51bGwsIERvbS5zcGFuKCksICdTb21lIHRleHQnLCBEb20uc3BhbigpKVxuXG5cdFx0XHRleHBlY3QoQS5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChBLmVsLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChBLmVsLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QoQS5lbC5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50by5lcXVhbCgnU29tZSB0ZXh0Jylcblx0XHRcdGV4cGVjdChBLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChCLmVsLmNoaWxkTm9kZXMubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KEIuZWwuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KEIuZWwuY2hpbGROb2Rlc1swXS5ub2RlVHlwZSkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChCLmVsLmNoaWxkTm9kZXNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ3NwYW4nKVxuXHRcdFx0ZXhwZWN0KEIuZWwuY2hpbGROb2Rlc1sxXS5ub2RlVHlwZSkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChCLmVsLmNoaWxkTm9kZXNbMV0udGV4dENvbnRlbnQpLnRvLmVxdWFsKCdTb21lIHRleHQnKVxuXHRcdFx0ZXhwZWN0KEIuZWwuY2hpbGROb2Rlc1syXS5ub2RlVHlwZSkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChCLmVsLmNoaWxkTm9kZXNbMl0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ3NwYW4nKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgzKVxuXG5cblx0XHR0ZXN0IFwiQXJyYXkgc3ludGF4XCIsICgpLT5cblx0XHRcdHNlY3Rpb24gPSBEb20oXG5cdFx0XHRcdFsnc2VjdGlvbicsIHtzdHlsZTpkaXNwbGF5OidpbmxpbmUnfSwgXG5cdFx0XHRcdFx0WydkaXYnLCBudWxsLCAnY2hpbGRBJ11cblx0XHRcdFx0XHRbJ3NwYW4nLCBudWxsLCBcblx0XHRcdFx0XHRcdFsnc3Ryb25nJywgbnVsbCwgJ2NoaWxkQiddXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JywgbnVsbCwgJ2NoaWxkQycsIFxuXHRcdFx0XHRcdFx0WydzcGFuJywgbnVsbCwgJ2NoaWxkQ18xJ11cblx0XHRcdFx0XHRcdFsnc3BhbicsIG51bGwsICdjaGlsZENfMiddXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGV4cGVjdChzZWN0aW9uKS5ub3QudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24ucmF3KS50by5oYXZlLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblsxXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblsyXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblsyXS5jaGlsZHJlblsxXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblsyXS5jaGlsZHJlblsyXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS50ZXh0KS50by5lcXVhbCgnY2hpbGRBJylcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzFdLnRleHQpLnRvLmVxdWFsKCdjaGlsZEInKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMl0udGV4dCkudG8uZXF1YWwoJ2NoaWxkQ2NoaWxkQ18xY2hpbGRDXzInKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMl0uY2hpbGRyZW5bMV0udGV4dCkudG8uZXF1YWwoJ2NoaWxkQ18xJylcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzJdLmNoaWxkcmVuWzJdLnRleHQpLnRvLmVxdWFsKCdjaGlsZENfMicpXG5cblxuXHRcdHRlc3QgXCJFeGlzdGluZyBFbGVtZW50XCIsICgpLT5cblx0XHRcdGRpdlJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdFx0XHRBID0gRG9tKGRpdlJhdylcblx0XHRcdEIgPSBEb20oZGl2UmF3KVxuXHRcdFx0QyA9IERvbShBKVxuXG5cdFx0XHRleHBlY3QoQS5lbCkudG8uZXF1YWwoZGl2UmF3KVxuXHRcdFx0ZXhwZWN0KEIuZWwpLnRvLmVxdWFsKGRpdlJhdylcblx0XHRcdGV4cGVjdChDLmVsKS50by5lcXVhbChkaXZSYXcpXG5cdFx0XHRleHBlY3QoQSkudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChCKS50by5lcXVhbChDKVxuXHRcdFx0ZXhwZWN0KEMpLnRvLmVxdWFsKGRpdlJhdy5fcXVpY2tFbGVtZW50KVxuXG5cblx0XHR0ZXN0IFwiRXhpc3RpbmcgRWxlbWVudCB3LyBPcHRpb25zXCIsICgpLT5cblx0XHRcdGRpdlJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdFx0XHRkaXZSYXcuaWQgPSAnQSdcblxuXHRcdFx0ZGl2ID0gRG9tKGRpdlJhdywge2lkOidCJywgY2xhc3M6J2FiYy0xMjMnfSlcblx0XHRcdGV4cGVjdChkaXZSYXcuaWQpLnRvLmVxdWFsKCdCJylcblx0XHRcdGV4cGVjdChkaXZSYXcuY2xhc3NOYW1lKS50by5lcXVhbCgnYWJjLTEyMycpXG5cdFx0XHRcblx0XHRcdGRpdiA9IERvbShkaXYsIHtpZDonQycsIGNsYXNzOidkZWYtNDU2J30pXG5cdFx0XHRleHBlY3QoZGl2UmF3LmlkKS50by5lcXVhbCgnQycpXG5cdFx0XHRleHBlY3QoZGl2UmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoJ2RlZi00NTYnKVxuXG5cblx0XHR0ZXN0IFwiRXhpc3RpbmcgRWxlbWVudCBmcm9tIGFycmF5LWxpa2Ugb2JqZWN0c1wiLCAoKS0+XG5cdFx0XHRyYXdBID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jylcblx0XHRcdHJhd0IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuXHRcdFx0cmF3QyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdFx0XHRwYXJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJylcblx0XHRcdHBhcmVudC5hcHBlbmRDaGlsZChyYXdBKTsgcGFyZW50LmFwcGVuZENoaWxkKHJhd0IpOyBwYXJlbnQuYXBwZW5kQ2hpbGQocmF3Qyk7XG5cdFx0XHRBID0gRG9tKFtyYXdBLCByYXdCLCByYXdDXSlcblx0XHRcdEIgPSBEb20ocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdicpKVxuXHRcdFx0QyA9IERvbShCKVxuXG5cdFx0XHRleHBlY3QoQS5lbCkudG8uZXF1YWwocmF3QSlcblx0XHRcdGV4cGVjdChCLmVsKS50by5lcXVhbChyYXdBKVxuXHRcdFx0ZXhwZWN0KEMuZWwpLnRvLmVxdWFsKHJhd0EpXG5cdFx0XHRleHBlY3QoQSkudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChCKS50by5lcXVhbChDKVxuXHRcdFx0ZXhwZWN0KEMpLnRvLmVxdWFsKHJhd0EuX3F1aWNrRWxlbWVudClcblxuXG5cblx0XHR0ZXN0IFwiRG9jdW1lbnQgbm9kZVwiLCAoKS0+XG5cdFx0XHRkb2MgPSBEb20oZG9jdW1lbnQpXG5cdFx0XHRleHBlY3QoZG9jKS5ub3QudG8uYmUudW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoZG9jLnJhdykudG8uZXF1YWwoZG9jdW1lbnQpXG5cdFx0XHRleHBlY3QoZG9jLnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KGRvYy5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoRG9tKHNhbmRib3gpLnBhcmVudHMpLm5vdC50by5jb250YWluKGRvYylcblx0XHRcdGV4cGVjdChEb20oc2FuZGJveCkucGFyZW50cykudG8uY29udGFpbihkb2MuY2hpbGRyZW5bMF0pXG5cblxuXHRcdHRlc3QgXCJXaW5kb3cgb2JqZWN0XCIsICgpLT5cblx0XHRcdHdpbiA9IERvbSh3aW5kb3cpXG5cdFx0XHRleHBlY3Qod2luKS5ub3QudG8uYmUudW5kZWZpbmVkXG5cdFx0XHRleHBlY3Qod2luLnJhdyBpcyB3aW5kb3cpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdCh3aW4ucGFyZW50KS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3Qod2luLmNoaWxkcmVuKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3Qod2luLmFwcGVuZCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHdpbi5odG1sKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3Qod2luLnN0eWxlKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3QoRG9tKHNhbmRib3gpLnBhcmVudHMpLm5vdC50by5jb250YWluKHdpbilcblxuXG5cdFx0dGVzdCBcIkNyZWF0aW9uIHcvIHN0eWxpbmdcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdiBzdHlsZTpcblx0XHRcdFx0J3dpZHRoJzogJzEwcHgnXG5cdFx0XHRcdCdoZWlnaHQnOiAxNVxuXHRcdFx0XHQnbGFtZW8nOiAnMTlweCdcblx0XHRcdFx0J2JhY2tncm91bmQtY29sb3InOiAnYmx1ZSdcblx0XHRcdFx0J2JhY2tncm91bmRTaXplJzogJ2NvdmVyJ1xuXG5cdFx0XHRzYW5kYm94LmFwcGVuZENoaWxkKGRpdi5lbClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZS5sYW1lbykudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5sYW1lbykudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwgJzEwcHgnXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsICcxNXB4J1xuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuYmFja2dyb3VuZENvbG9yKS5ub3QudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmJhY2tncm91bmRTaXplKS50by5lcXVhbCAnY292ZXInXG5cblxuXHRcdHRlc3QgXCJTVkcgZWxlbWVudHMgY2FuIGJlIGNyZWF0ZWQgdmlhIGEgJyonIGluIHRoZSBlbGVtZW50J3MgdHlwZSBzdHJpbmdcIiwgKCktPlxuXHRcdFx0c3ZnQmFkID0gRG9tKCdzdmcnKS5lbFxuXHRcdFx0c3ZnR29vZCA9IERvbSgnKnN2ZycpLmVsXG5cdFx0XHRzdmdQb2x5QmFkID0gRG9tKCdwb2x5bGluZScpLmVsXG5cdFx0XHRzdmdQb2x5R29vZCA9IERvbSgnKnBvbHlsaW5lJykuZWxcblx0XHRcdHN2Z0RpdiA9IERvbSgnKmRpdicpLmVsXG5cdFx0XHRyZWdEaXYgPSBEb20oJ2RpdicpLmVsXG5cblx0XHRcdGV4cGVjdChzdmdCYWQpLnRvLmJlLmluc3RhbmNlT2YoSFRNTFVua25vd25FbGVtZW50KVxuXHRcdFx0ZXhwZWN0KHN2Z1BvbHlCYWQpLnRvLmJlLmluc3RhbmNlT2YoSFRNTFVua25vd25FbGVtZW50KVxuXHRcdFx0ZXhwZWN0KHN2Z0dvb2QpLnRvLmJlLmluc3RhbmNlT2YoU1ZHU1ZHRWxlbWVudClcblx0XHRcdGV4cGVjdChzdmdQb2x5R29vZCkudG8uYmUuaW5zdGFuY2VPZihTVkdQb2x5bGluZUVsZW1lbnQpXG5cdFx0XHQjIGV4cGVjdChzdmdEaXYpLnRvLmJlLmluc3RhbmNlT2YoJ1NWR0VsZW1lbnQnKVxuXHRcdFx0ZXhwZWN0KHN2Z0Rpdi5jb25zdHJ1Y3Rvcikubm90LnRvLmVxdWFsKHJlZ0Rpdi5jb25zdHJ1Y3RvcilcblxuXG5cdFx0dGVzdCBcIlF1aWNrRG9tLmh0bWwoKSBhY2NlcHRzIGFuIGh0bWwgc3RyaW5nIHdoaWNoIHdvdWxkIGJlIHBhcnNlZCBhbmQgY29udmVydGVkIGludG8gYSBRdWlja0JhdGNoIGluc3RhbmNlXCIsICgpLT5cblx0XHRcdGh0bWxTdHJpbmcgPSBcIlxuXHRcdFx0XHQ8ZGl2PmZpcnN0Q2hpbGRUZXh0PC9kaXY+PHNwYW4+c2Vjb25kQ2hpbGRUZXh0PC9zcGFuPlxuXHRcdFx0XHR0ZXh0Tm9kZVxuXHRcdFx0XHQ8c3Ryb25nPmFiYzEyMzwvc3Ryb25nPlxuXHRcdFx0XCJcblx0XHRcdHdpbmRvdy5iYXRjaCA9IERvbS5odG1sKGh0bWxTdHJpbmcpXG5cblx0XHRcdGV4cGVjdCh0eXBlb2YgYmF0Y2gpLnRvLmVxdWFsICdvYmplY3QnXG5cdFx0XHRleHBlY3QoYmF0Y2guY29uc3RydWN0b3IubmFtZSkudG8uZXF1YWwgJ1F1aWNrQmF0Y2gnXG5cdFx0XHRleHBlY3QoYmF0Y2guZWxlbWVudHMubGVuZ3RoKS50by5lcXVhbCA0XG5cdFx0XHRleHBlY3QoYmF0Y2guZWxlbWVudHNbMF0udHlwZSkudG8uZXF1YWwgJ2Rpdidcblx0XHRcdGV4cGVjdChiYXRjaC5lbGVtZW50c1sxXS50eXBlKS50by5lcXVhbCAnc3Bhbidcblx0XHRcdGV4cGVjdChiYXRjaC5lbGVtZW50c1syXS50eXBlKS50by5lcXVhbCAndGV4dCdcblx0XHRcdGV4cGVjdChiYXRjaC5lbGVtZW50c1szXS50eXBlKS50by5lcXVhbCAnc3Ryb25nJ1xuXHRcdFx0ZXhwZWN0KGJhdGNoLmVsZW1lbnRzWzBdLnRleHQpLnRvLmVxdWFsICdmaXJzdENoaWxkVGV4dCdcblx0XHRcdGV4cGVjdChiYXRjaC5lbGVtZW50c1sxXS50ZXh0KS50by5lcXVhbCAnc2Vjb25kQ2hpbGRUZXh0J1xuXHRcdFx0ZXhwZWN0KGJhdGNoLmVsZW1lbnRzWzJdLnRleHQpLnRvLmluY2x1ZGUgJ3RleHROb2RlJ1xuXHRcdFx0ZXhwZWN0KGJhdGNoLmVsZW1lbnRzWzNdLnRleHQpLnRvLmVxdWFsICdhYmMxMjMnXG5cblxuXHRcdHRlc3QgXCJNZXRob2QvUHJvcGVydHkgYWxpYXNlc1wiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20oJ2RpdicpXG5cdFx0XHRleHBlY3QoZGl2LnJhdykudG8uZXF1YWwoZGl2LmVsKVxuXHRcdFx0ZXhwZWN0KGRpdlswXSkudG8uZXF1YWwoZGl2LmVsKVxuXHRcdFx0ZXhwZWN0KGRpdi5jc3MpLnRvLmVxdWFsKGRpdi5zdHlsZSlcblx0XHRcdGV4cGVjdChkaXYucmVwbGFjZVdpdGgpLnRvLmVxdWFsKGRpdi5yZXBsYWNlKVxuXHRcdFx0ZXhwZWN0KGRpdi5yZW1vdmVMaXN0ZW5lcikudG8uZXF1YWwoZGl2Lm9mZilcblx0XHRcdGV4cGVjdChkaXYucmVtb3ZlTGlzdGVuZXIoJ2V2ZW50QScpKVxuXG5cblx0XHR0ZXN0IFwidXNlci1kZWZpbmVkIG1ldGhkb2RzL2dldHRlcnMvc2V0dGVyc1wiLCAoKS0+XG5cdFx0XHRkaXZBID0gRG9tLmRpdigpXG5cdFx0XHRkaXZCID0gRG9tLmRpdiBtZXRob2RzOlxuXHRcdFx0XHRzY3JvbGxUb3A6XG5cdFx0XHRcdFx0Z2V0OiAoKS0+IEByYXcuc2Nyb2xsVG9wXG5cdFx0XHRcdHdlaWdodDpcblx0XHRcdFx0XHRnZXQ6ICgpLT4gQHJhdy53ZWlnaHRcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0Z2V0OiAoKS0+IEByYXcudmFsdWVcblx0XHRcdFx0XHRzZXQ6ICh2YWx1ZSktPiBAcmF3LnZhbHVlID0gdmFsdWVcblx0XHRcdFx0bmFtZTogdHJ1ZVxuXHRcdFx0XHRiaWdJbmRleDogKCktPiBAaW5kZXggKiAxMFxuXG5cdFx0XHRzYW5kYm94LmFwcGVuZCBkaXZBXG5cdFx0XHRzYW5kYm94LmFwcGVuZCBkaXZCXG5cdFx0XHRkaXZBLnJhdy52YWx1ZSA9IGRpdkIucmF3LnZhbHVlID0gJ2FiYydcblxuXHRcdFx0ZXhwZWN0KHR5cGVvZiBkaXZBLnNjcm9sbFRvcCkudG8uZXF1YWwgJ3VuZGVmaW5lZCdcblx0XHRcdGV4cGVjdCh0eXBlb2YgZGl2Qi5zY3JvbGxUb3ApLnRvLmVxdWFsICdudW1iZXInXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdkEudmFsdWUpLnRvLmVxdWFsICd1bmRlZmluZWQnXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdkIudmFsdWUpLnRvLmVxdWFsICdzdHJpbmcnXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdkEubmFtZSkudG8uZXF1YWwgJ3VuZGVmaW5lZCdcblx0XHRcdGV4cGVjdCh0eXBlb2YgZGl2Qi5uYW1lKS50by5lcXVhbCAndW5kZWZpbmVkJ1xuXHRcdFx0ZXhwZWN0KHR5cGVvZiBkaXZBLmJpZ0luZGV4KS50by5lcXVhbCAndW5kZWZpbmVkJ1xuXHRcdFx0ZXhwZWN0KHR5cGVvZiBkaXZCLmJpZ0luZGV4KS50by5lcXVhbCAnZnVuY3Rpb24nXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZCLnNjcm9sbFRvcCkudG8uZXF1YWwgZGl2Qi5yYXcuc2Nyb2xsVG9wXG5cdFx0XHRcblx0XHRcdGRpdkIucmF3LndlaWdodCA9ICcxJ1xuXHRcdFx0ZXhwZWN0KGRpdkIud2VpZ2h0KS50by5lcXVhbCAnMSdcblx0XHRcdFxuXHRcdFx0ZGl2Qi53ZWlnaHQgPSAnMidcblx0XHRcdGV4cGVjdChkaXZCLndlaWdodCkudG8uZXF1YWwgJzEnXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZCLnZhbHVlKS50by5lcXVhbCAnYWJjJ1xuXHRcdFx0ZGl2Qi52YWx1ZSA9ICcxMjMnXG5cdFx0XHRleHBlY3QoZGl2Qi52YWx1ZSkudG8uZXF1YWwgJzEyMydcblxuXHRcdFx0ZXhwZWN0KGRpdkIuYmlnSW5kZXgoKSkudG8uZXF1YWwgZGl2Qi5pbmRleCoxMFxuXG5cblx0c3VpdGUgXCJFdmVudHNcIiwgKCktPlxuXHRcdHRlc3QgXCJFdmVudHMgY2FuIGJlIGxpc3RlbmVkIHRvIHZpYSB0aGUgLm9uIG1ldGhvZFwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IDBcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0ZGl2Lm9uICdteUNsaWNrJywgKGV2ZW50KS0+XG5cdFx0XHRcdGV4cGVjdCh0eXBlb2YgZXZlbnQpLnRvLmVxdWFsICdvYmplY3QnXG5cdFx0XHRcdGV4cGVjdChldmVudC50eXBlKS50by5lcXVhbCAnbXlDbGljaydcblx0XHRcdFx0ZW1pdENvdW50QSsrXG5cdFx0XHRcblxuXHRcdFx0ZGl2LmVsLmVtaXRFdmVudCgnbXlDbGljaycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMSlcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215Q2xpY2snKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDIpXG5cdFx0XHRcblx0XHRcdGRpdi5vbiAnbXlDbGljaycsIChldmVudCktPiBlbWl0Q291bnRCKytcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215Q2xpY2snKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMylcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215Q2xpY2snKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoNClcblxuXG5cdFx0dGVzdCBcIkV2ZW50cyBjYW4gYmUgZW1pdHRlZCB2aWEgdGhlIC5lbWl0IG1ldGhvZFwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IDBcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0ZGl2Lm9uICdteUV2ZW50JywgKCktPiBlbWl0Q291bnRBKytcblx0XHRcdGRpdi5lbC5hZGRFdmVudExpc3RlbmVyICdteUV2ZW50JywgKCktPiBlbWl0Q291bnRCKytcblxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMClcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdFxuXHRcdFx0ZGl2LmVsLmVtaXRFdmVudCgnbXlFdmVudCcpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgyKVxuXG5cblx0XHR0ZXN0IFwiRXZlbnQgaGFuZGxlcnMgY2FuIGJlIG1hbnVhbGx5IGludm9rZWQgd2l0aCBhIGN1c3RvbSBhcmcgdmlhIHRoZSAuZW1pdFByaXZhdGUgbWV0aG9kXCIsICgpLT5cblx0XHRcdGVtaXRDb3VudEEgPSBlbWl0Q291bnRCID0gMFxuXHRcdFx0YXJnID0gbnVsbFxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cdFx0XHRkaXYub24gJ215RXZlbnQnLCAoKS0+IGVtaXRDb3VudEErKzsgYXJnID0gYXJndW1lbnRzWzBdXG5cdFx0XHRkaXYuZWwuYWRkRXZlbnRMaXN0ZW5lciAnbXlFdmVudCcsICgpLT4gZW1pdENvdW50QisrXG5cblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoYXJnKS50by5lcXVhbChudWxsKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdFByaXZhdGUoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChhcmcpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXRQcml2YXRlKCdteUV2ZW50JywgJ2FiYzEyMycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGFyZykudG8uZXF1YWwoJ2FiYzEyMycpXG5cdFx0XHRcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChhcmcpLm5vdC50by5lcXVhbCgnYWJjMTIzJylcblx0XHRcdGV4cGVjdCh0eXBlb2YgYXJnKS50by5lcXVhbCgnb2JqZWN0JylcblxuXG5cdFx0dGVzdCBcIkJvb2xlYW5zIGNhbiBiZSBwYXNzZWQgZm9yIHRoZSAybmQgYW5kIDNyZCBhcmdzIG9mIC5lbWl0IHRvIGNvbnRyb2wgZXZlbnQuYnViYmxlcyBhbmQgZXZlbnQuY2FuY2VsYWJsZVwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IGVtaXRDb3VudEMgPSAwXG5cdFx0XHRkaXYgPSBEb20uZGl2KClcblx0XHRcdGRpdi5vbiAnZXZlbnRBJywgKGV2ZW50KS0+IGVtaXRDb3VudEErKzsgZXhwZWN0KGV2ZW50LmJ1YmJsZXMpLnRvLmJlLnRydWU7IGV4cGVjdChldmVudC5jYW5jZWxhYmxlKS50by5iZS50cnVlXG5cdFx0XHRkaXYub24gJ2V2ZW50QicsIChldmVudCktPiBlbWl0Q291bnRCKys7IGV4cGVjdChldmVudC5idWJibGVzKS50by5iZS5mYWxzZTsgZXhwZWN0KGV2ZW50LmNhbmNlbGFibGUpLnRvLmJlLnRydWVcblx0XHRcdGRpdi5vbiAnZXZlbnRDJywgKGV2ZW50KS0+IGVtaXRDb3VudEMrKzsgZXhwZWN0KGV2ZW50LmJ1YmJsZXMpLnRvLmJlLmZhbHNlOyBleHBlY3QoZXZlbnQuY2FuY2VsYWJsZSkudG8uYmUuZmFsc2VcblxuXHRcdFx0ZGl2LmVtaXQoJ2V2ZW50QScpOyBkaXYuZW1pdCgnZXZlbnRCJywgZmFsc2UpOyBkaXYuZW1pdCgnZXZlbnRDJywgZmFsc2UsIGZhbHNlKTtcblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QykudG8uZXF1YWwoMSlcblxuXG5cdFx0dGVzdCBcIkEgZGF0YSBvYmplY3QgY2FuIGJlIHBhc3NlZCBhcyB0aGUgNHRoIGFyZyBvZiAuZW1pdCB3aGljaCB3aWxsIGJlIGV4dGVuZGVkIG9udG8gdGhlIGV2ZW50IG9iamVjdFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBET00uZGl2KClcblx0XHRcdGV2ZW50ID0gbnVsbFxuXHRcdFx0ZGl2Lm9uICdtb3VzZWRvd24nLCAoZSktPiBldmVudCA9IGVcblxuXHRcdFx0ZXhwZWN0KGV2ZW50KS50by5lcXVhbCBudWxsXG5cdFx0XHRkaXYuZW1pdCAnbW91c2Vkb3duJ1xuXHRcdFx0ZXhwZWN0KGV2ZW50LnR5cGUpLnRvLmVxdWFsICdtb3VzZWRvd24nXG5cdFx0XHRleHBlY3QoZXZlbnQuY3VzdG9tKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZG93bicsIG51bGwsIG51bGwsIHtjdXN0b206J2N1c3RvbScsIGFiYzoxMjN9XG5cdFx0XHRleHBlY3QoZXZlbnQudHlwZSkudG8uZXF1YWwgJ21vdXNlZG93bidcblx0XHRcdGV4cGVjdChldmVudC5jdXN0b20pLnRvLmVxdWFsICdjdXN0b20nXG5cdFx0XHRleHBlY3QoZXZlbnQuYWJjKS50by5lcXVhbCAxMjNcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZG93bicsIG51bGwsIG51bGwsIHRydWVcblx0XHRcdGV4cGVjdChldmVudC50eXBlKS50by5lcXVhbCAnbW91c2Vkb3duJ1xuXHRcdFx0ZXhwZWN0KGV2ZW50LmN1c3RvbSkudG8uZXF1YWwgdW5kZWZpbmVkXG5cblxuXHRcdHRlc3QgXCJFdmVudCBsaXN0ZW5lcnMgY2FuIGJlIHJlbW92ZWQgdmlhIHRoZSAub2ZmIG1ldGhvZFwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IGVtaXRDb3VudEMgPSBlbWl0Q291bnREID0gMFxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cdFx0XHRkaXYub24gJ215RXZlbnQnLCAoKS0+IGVtaXRDb3VudEErK1xuXHRcdFx0ZGl2Lm9uICdteUV2ZW50JywgZXZlbnRDQj0oKS0+IGVtaXRDb3VudEIrK1xuXHRcdFx0ZGl2Lm9uICdhbm90aGVyRXZlbnQnLCAoKS0+IGVtaXRDb3VudEMrK1xuXHRcdFx0ZGl2LmVsLmFkZEV2ZW50TGlzdGVuZXIgJ215RXZlbnQnLCAoKS0+IGVtaXRDb3VudEQrK1xuXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEMpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZW1pdENvdW50RCkudG8uZXF1YWwoMClcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKTsgZGl2LmVtaXQoJ2Fub3RoZXJFdmVudCcpO1xuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChlbWl0Q291bnRDKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEQpLnRvLmVxdWFsKDEpXG5cdFx0XHRcblx0XHRcdGRpdi5vZmYoJ215RXZlbnQnLCBldmVudENCKVxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKTsgZGl2LmVtaXQoJ2Fub3RoZXJFdmVudCcpO1xuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChlbWl0Q291bnRDKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEQpLnRvLmVxdWFsKDIpXG5cdFx0XHRcblx0XHRcdGRpdi5vbiAnbXlFdmVudCcsICgpLT4gZW1pdENvdW50QisrXG5cdFx0XHRkaXYub2ZmKCdteUV2ZW50Jylcblx0XHRcdGRpdi5lbWl0KCdteUV2ZW50Jyk7IGRpdi5lbWl0KCdhbm90aGVyRXZlbnQnKTtcblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QykudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChlbWl0Q291bnREKS50by5lcXVhbCgzKVxuXHRcdFx0XG5cdFx0XHRkaXYub24gJ215RXZlbnQnLCAoKS0+IGVtaXRDb3VudEErK1xuXHRcdFx0ZGl2Lm9uICdteUV2ZW50JywgKCktPiBlbWl0Q291bnRCKytcblx0XHRcdGRpdi5vZmYoKVxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKTsgZGl2LmVtaXQoJ2Fub3RoZXJFdmVudCcpO1xuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChlbWl0Q291bnRDKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEQpLnRvLmVxdWFsKDQpXG5cblxuXHRcdHRlc3QgXCJFdmVudHMgY2FuIGJlIG5hbWVkIHZpYSBhICc8ZXZlbnQ+LjxuYW1lPicgc3ludGF4IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBsaXN0ZW5lcnMgbGF0ZXIgb24gd2l0aG91dCB0aGUgb3JpZ2luYWwgY2FsbGJhY2tzXCIsICgpLT5cblx0XHRcdGVtaXRDb3VudEEgPSBlbWl0Q291bnRCID0gMFxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGF0dGFjaExpc3RlbmVycyA9ICgpLT5cblx0XHRcdFx0ZGl2Lm9uICdteUV2ZW50LnNvbWVOYW1lJywgKCktPiBlbWl0Q291bnRBKys7XG5cdFx0XHRcdGRpdi5vbiAnbXlFdmVudCcsICgpLT4gZW1pdENvdW50QisrO1xuXG5cdFx0XHRhdHRhY2hMaXN0ZW5lcnMoKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMClcblxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQuc29tZU5hbWUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdFxuXHRcdFx0ZGl2Lm9mZignbXlFdmVudC5zb21lT3RoZXJOYW1lJylcblx0XHRcdGRpdi5lbWl0KCdteUV2ZW50Jylcblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDIpXG5cdFx0XHRcblx0XHRcdGRpdi5vZmYoJ215RXZlbnQuc29tZU5hbWUnKVxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMylcblx0XHRcdFxuXHRcdFx0ZGl2Lm9mZignbXlFdmVudCcpXG5cdFx0XHRhdHRhY2hMaXN0ZW5lcnMoKVxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoNClcblx0XHRcdFxuXHRcdFx0ZGl2Lm9mZignbXlFdmVudCcpXG5cdFx0XHRkaXYuZW1pdCgnbXlFdmVudCcpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCg0KVxuXG5cblx0XHR0ZXN0IFwiTXVsdGlwbGUgZXZlbnRzIGNhbiBiZSByZWdpc3RlcmVkL2RlcmVnaXN0ZXJlZCBhdCBvbmNlIHVzaW5nIHdoaXRlc3BhY2Ugc2VwYXJhdG9yc1wiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnQgPSAwXG5cdFx0XHRkaXYgPSBEb20uZGl2KClcblxuXHRcdFx0ZGl2Lm9uICdvbmUgdHdvICAgdGhyZWUnLCAoKS0+IGVtaXRDb3VudCsrXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAwXG5cblx0XHRcdGRpdi5lbWl0KCdvbmUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgMVxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDJcblxuXHRcdFx0ZGl2LmVtaXQoJ3RocmVlJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDNcblxuXHRcdFx0ZGl2Lm9mZignb25lICAgICAgdGhyZWUnKVxuXHRcdFx0ZGl2LmVtaXQoJ29uZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAzXG5cblx0XHRcdGRpdi5lbWl0KCd0d28nKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNFxuXG5cdFx0XHRkaXYuZW1pdCgndGhyZWUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNFxuXG5cdFx0XHRkaXYub2ZmKClcblx0XHRcdGRpdi5lbWl0KCdvbmUnKTsgZGl2LmVtaXQoJ3R3bycpOyBkaXYuZW1pdCgndGhyZWUnKTtcblx0XHRcdGRpdi5vbiAnb25lIHR3byAgIHRocmVlLnNvbWVOYW1lJywgKCktPiBlbWl0Q291bnQrK1xuXHRcdFx0ZGl2Lm9uICdvbmUgdHdvICAgdGhyZWUnLCAoKS0+IGVtaXRDb3VudCsrXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCA0XG5cblx0XHRcdGRpdi5lbWl0KCdvbmUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNlxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDhcblxuXHRcdFx0ZGl2LmVtaXQoJ3RocmVlJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDEwXG5cblx0XHRcdGRpdi5vZmYoJ3R3byBcXHRvbmUuc29tZU5hbWUnKVxuXHRcdFx0ZGl2LmVtaXQoJ29uZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAxMVxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDEyXG5cblx0XHRcdGRpdi5lbWl0KCd0aHJlZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAxNFxuXHRcdFx0XG5cdFx0XHRkaXYub2ZmKCdvbmUgdGhyZWUnKVxuXHRcdFx0ZGl2LmVtaXQoJ29uZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAxNFxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDE1XG5cblx0XHRcdGRpdi5lbWl0KCd0aHJlZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAxNVxuXG5cblx0XHR0ZXN0IFwiRXZlbnRzIGNhbiBiZSBsaXN0ZW5lZCBmb3Igb25jZSB2aWEgdGhlIC5vbmNlIG1ldGhvZFwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IDBcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0ZGl2Lm9uY2UgJ215Q2xpY2snLCAoZXZlbnQpLT5cblx0XHRcdFx0ZXhwZWN0KHR5cGVvZiBldmVudCkudG8uZXF1YWwgJ29iamVjdCdcblx0XHRcdFx0ZXhwZWN0KGV2ZW50LnR5cGUpLnRvLmVxdWFsICdteUNsaWNrJ1xuXG5cdFx0XHRkaXYub24gJ215Q2xpY2snLCAoKS0+IGVtaXRDb3VudEErK1xuXHRcdFx0ZGl2Lm9uY2UgJ215Q2xpY2snLCAoKS0+IGVtaXRDb3VudEIrK1xuXHRcdFx0XG5cblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDApXG5cdFx0XHRcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215Q2xpY2snKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdFxuXHRcdFx0ZGl2LmVsLmVtaXRFdmVudCgnbXlDbGljaycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgxKVxuXHRcdFx0XG5cdFx0XHRkaXYub25jZSAnbXlDbGljaycsIChldmVudCktPiBlbWl0Q291bnRCKytcblx0XHRcdFxuXHRcdFx0ZGl2LmVsLmVtaXRFdmVudCgnbXlDbGljaycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgyKVxuXHRcdFx0XG5cdFx0XHRkaXYuZWwuZW1pdEV2ZW50KCdteUNsaWNrJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCg0KVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDIpXG5cblxuXHRcdHRlc3QgXCJQcmUtZGVmaW5lZCBldmVudCBsaXN0ZW5lcnMgY2FuIGJlIHBhc3NlZCBpbiBvcHRpb25zLmV2ZW50c1wiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnQgPSAwXG5cdFx0XHRlbWl0Q29udGV4dCA9IG51bGxcblx0XHRcdGxpc3RlbmVycyA9XG5cdFx0XHRcdCdvbmUgdHdvIHRocmVlJzogKCktPiBlbWl0Q291bnQrK1xuXHRcdFx0XHQnZm91cic6ICgpLT4gZW1pdENvdW50Kytcblx0XHRcdFx0J2ZpdmUnOiAoKS0+IGVtaXRDb250ZXh0ID0gQFxuXHRcdFx0XG5cdFx0XHRkaXYgPSBEb20uZGl2KGV2ZW50czpsaXN0ZW5lcnMpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAwXG5cblx0XHRcdGRpdi5lbWl0KCdvbmUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgMVxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDJcblxuXHRcdFx0ZGl2LmVtaXQoJ3RocmVlJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDNcblxuXHRcdFx0ZGl2LmVtaXQoJ2ZvdXInKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNFxuXG5cdFx0XHRkaXYub2ZmKCdvbmUgICAgICB0aHJlZScpXG5cdFx0XHRkaXYuZW1pdCgnb25lJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDRcblxuXHRcdFx0ZGl2LmVtaXQoJ3R3bycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCA1XG5cblx0XHRcdGRpdi5lbWl0KCd0aHJlZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCA1XG5cblx0XHRcdGRpdi5lbWl0KCdmaXZlJylcblx0XHRcdGV4cGVjdChlbWl0Q29udGV4dCkudG8uZXF1YWwgZGl2XG5cblx0XHRcdGRpdi5vZmYoKVxuXHRcdFx0ZGl2LmVtaXQoJ29uZScpOyBkaXYuZW1pdCgndHdvJyk7IGRpdi5lbWl0KCd0aHJlZScpOyBkaXYuZW1pdCgnZm91cicpO1xuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNVxuXG5cdFx0XHRkaXZCID0gRG9tLmRpdihldmVudHM6bGlzdGVuZXJzKVxuXHRcdFx0ZGl2Qi5lbWl0KCdvbmUnKTsgZGl2Qi5lbWl0KCd0aHJlZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCA3XG5cdFx0XHRcblx0XHRcdGV4cGVjdChlbWl0Q29udGV4dCkudG8uZXF1YWwgZGl2XG5cdFx0XHRkaXZCLmVtaXQoJ2ZpdmUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb250ZXh0KS50by5lcXVhbCBkaXZCXG5cblxuXHRcdHRlc3QgXCJ0aGUgaW5zZXJ0ZWQgZXZlbnQgd2lsbCBiZSBwcml2YXRlbHkgZW1pdHRlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGluc2VydGVkIGludG8gdGhlIERPTVwiLCAoKS0+XG5cdFx0XHRpbnZva2VDb3VudCA9IDBcblx0XHRcdHBhcmVudEEgPSBEb20uc2VjdGlvbigpXG5cdFx0XHRwYXJlbnRCID0gRG9tLnNlY3Rpb24oKVxuXHRcdFx0bWFzdGVyUGFyZW50QiA9IERvbS5kaXYoKVxuXHRcdFx0cGFyZW50QyA9IERvbS5zZWN0aW9uKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXG5cdFx0XHRkaXYub24gJ2luc2VydGVkJywgKGVsKS0+XG5cdFx0XHRcdGV4cGVjdChAKS50by5lcXVhbChkaXYpXG5cdFx0XHRcdGV4cGVjdChlbCkudG8uZXF1YWwoZGl2LnBhcmVudClcblx0XHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KyspLnRvLmVxdWFsKDApXG5cblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwoMClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnRBKVxuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgwKVxuXHRcdFx0XG5cdFx0XHRkaXYuYXBwZW5kVG8ocGFyZW50Qi5hcHBlbmRUbyhtYXN0ZXJQYXJlbnRCKSlcblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwoMClcblx0XHRcdFxuXHRcdFx0cGFyZW50QS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgwKVxuXHRcdFx0XG5cdFx0XHRkaXYuYXBwZW5kVG8ocGFyZW50Qylcblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwoMSlcblxuXHRcdFx0ZGl2LmRldGFjaCgpXG5cdFx0XHRkaXYuYXBwZW5kVG8ocGFyZW50Qi5hcHBlbmRUbyhzYW5kYm94KSlcblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChkaXYucGFyZW50KS50by5lcXVhbCBwYXJlbnRCXG5cblx0XHRcdGRpdi5vbiAnaW5zZXJ0ZWQnLCAoKS0+IGV4cGVjdChpbnZva2VDb3VudCsrKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsIHBhcmVudEJcblx0XHRcdFxuXHRcdFx0ZGl2LmFwcGVuZFRvKHBhcmVudEMpXG5cdFx0XHRleHBlY3QoaW52b2tlQ291bnQpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwgcGFyZW50Q1xuXHRcdFx0XG5cdFx0XHRkaXYuZGV0YWNoKClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnRBKVxuXHRcdFx0ZGl2Lm9uICdpbnNlcnRlZCcsICgpLT4gaW52b2tlQ291bnQrK1xuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgzKVxuXHRcdFx0XG5cdFx0XHRkaXYuZGV0YWNoKClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnRCKVxuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgzKVxuXG5cblx0XHR0ZXN0IFwiUXVpY2tFbGVtZW50LnJlcGxhY2Ugd2lsbCB0cmlnZ2VyIHRoZSBpbnNlcnRlZCBldmVudFwiLCAoKS0+XG5cdFx0XHRpbnZva2VDb3VudCA9IDBcblx0XHRcdHBhcmVudCA9IERvbS5zZWN0aW9uKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdEEgPSBEb20uZGl2KClcblx0XHRcdEIgPSBEb20uZGl2KClcblxuXHRcdFx0Qi5vbiAnaW5zZXJ0ZWQnLCAoZWwpLT5cblx0XHRcdFx0ZXhwZWN0KEApLnRvLmVxdWFsKEIpXG5cdFx0XHRcdGV4cGVjdChlbCkudG8uZXF1YWwoQi5wYXJlbnQpXG5cdFx0XHRcdGV4cGVjdChpbnZva2VDb3VudCsrKS50by5lcXVhbCgwKVxuXG5cdFx0XHRleHBlY3QoaW52b2tlQ291bnQpLnRvLmVxdWFsIDBcblx0XHRcdGV4cGVjdChBLnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KEIucGFyZW50KS50by5lcXVhbCh1bmRlZmluZWQpXG5cblx0XHRcdHBhcmVudC5hcHBlbmQoQSlcblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwgMFxuXHRcdFx0ZXhwZWN0KEEucGFyZW50KS50by5lcXVhbChwYXJlbnQpXG5cdFx0XHRleHBlY3QoQi5wYXJlbnQpLnRvLmVxdWFsKHVuZGVmaW5lZClcblxuXHRcdFx0QS5yZXBsYWNlKEIpXG5cdFx0XHRleHBlY3QoaW52b2tlQ291bnQpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChBLnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KEIucGFyZW50KS50by5lcXVhbChwYXJlbnQpXG5cblxuXG5cblxuXG5cdHN1aXRlIFwiU3R5bGVcIiwgKCktPlxuXHRcdHRlc3QgXCJTdHlsZXMgY2FuIGJlIHNldCB2aWEgdGhlIC5zdHlsZS8uY3NzIG1ldGhvZCB3aXRoIGFyZ3MgcGFpciBvZiBbcHJvcGVydHksIHZhbHVlXVwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KHN0eWxlOnt3aWR0aDonMTVweCd9KS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0Y29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZGl2LmVsKVxuXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzE1cHgnKVxuXG5cdFx0XHRkaXYuc3R5bGUgJ3dpZHRoJywgJzI1cHgnXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLndpZHRoKS50by5lcXVhbCgnMjVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzI1cHgnKVxuXG5cdFx0XHRkaXYuc3R5bGUgJ3dpZHRoJywgJzV2aCdcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUud2lkdGgpLnRvLmVxdWFsKCc1dmgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmNvbnRhaW4oJ3B4JylcblxuXG5cdFx0dGVzdCBcIk11bHRpcGxlIFN0eWxlcyBjYW4gYmUgc2V0IHZpYSB0aGUgLnN0eWxlLy5jc3MgbWV0aG9kIGJ5IHBhc3NpbmcgYSBzdHlsZSBvYmplY3RcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdihzdHlsZTp7d2lkdGg6JzE1cHgnfSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcxNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzBweCcpXG5cblx0XHRcdGRpdi5zdHlsZSB7d2lkdGg6MjUsIGhlaWdodDonMzMnfVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcyNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzMzcHgnKVxuXG5cblx0XHR0ZXN0IFwiU3R5bGVzIGRlZmluZWQgaW4gdGhlIG9wdGlvbnMgb2JqZWN0IHdpbGwgYmUgYXBwbGllZCB2aWEgY2xhc3NOYW1lcyBhbmQgbm90IGlubGluZSBzdHlsZVwiLCAoKS0+XG5cdFx0XHRkaXZBID0gRG9tLmRpdihzdHlsZTp7d2lkdGg6MTUsIGhlaWdodDozMH0pLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXZCID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpLnN0eWxlIHt3aWR0aDoxNSwgaGVpZ2h0OjMwfVxuXG5cdFx0XHRleHBlY3QoZGl2QS5yYXcpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkIucmF3KS50by5oYXZlLnN0eWxlKCd3aWR0aCcsICcxNXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLnJhdykudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzMwcHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkIucmF3KS50by5oYXZlLnN0eWxlKCdoZWlnaHQnLCAnMzBweCcpXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZBLnJhdy5zdHlsZS53aWR0aCkudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXZCLnJhdy5zdHlsZS53aWR0aCkudG8uZXF1YWwgJzE1cHgnXG5cdFx0XHRleHBlY3QoZGl2QS5yYXcuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCAnJ1xuXHRcdFx0ZXhwZWN0KGRpdkIucmF3LnN0eWxlLmhlaWdodCkudG8uZXF1YWwgJzMwcHgnXG5cblxuXHRcdHRlc3QgXCJJZiBwYXNzZWQgYSBwcm9wZXJ0eSBuYW1lIHdpdGhvdXQgYSB2YWx1ZSwgdGhlIGNvbXB1dGVkIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5IHdpbGwgYmUgcmV0dXJuZWRcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdihzdHlsZTp7d2lkdGg6JzE1cHgnfSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMTVweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsICcwcHgnXG5cblx0XHRcdGRpdi5zdHlsZSB3aWR0aDpudWxsLCBoZWlnaHQ6IDU1XG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsIGNvbXB1dGVkU3R5bGUud2lkdGhcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsICc1NXB4J1xuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgJ3dpZHRoJywgJzE5dncnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmNvbnRhaW4gJ3B4J1xuXG5cblx0XHR0ZXN0IFwiRnVuY3Rpb25zIGNhbiBiZSBwYXNzZWQgYXMgdmFsdWVzIGZvciBwcm9wZXJ0aWVzIGluIHN0eWxlIG9iamVjdHMgd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIGVsZW1lbnQncyBvcHRpb25zLnJlbGF0ZWRJbnN0YW5jZSBhcyB0aGUgb25seSBhcmd1bWVudFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KHJhdGU6MjUpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRhcHBseVdpZHRoID0gKGV4cGVjdGVkSW5zdGFuY2UpLT5cblx0XHRcdFx0ZGl2LnN0eWxlIHdpZHRoOiAoaW5zdGFuY2UpLT5cblx0XHRcdFx0XHRleHBlY3QodHlwZW9mIGluc3RhbmNlKS50by5lcXVhbCAnb2JqZWN0J1xuXHRcdFx0XHRcdGV4cGVjdChpbnN0YW5jZSkudG8uZXF1YWwoZXhwZWN0ZWRJbnN0YW5jZSlcblx0XHRcdFx0XHRyZXR1cm4gZGl2Lm9wdGlvbnMucmF0ZVxuXG5cdFx0XHRhcHBseVdpZHRoKGRpdilcblx0XHRcdGV4cGVjdChkaXYub3B0aW9ucy5yYXRlKS50by5lcXVhbCAyNVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMjVweCdcblxuXHRcdFx0ZGl2Lm9wdGlvbnMucmF0ZSA9IDI1MFxuXHRcdFx0ZGl2LnJlbGF0ZWQgPSBhbm90aGVyT2JqID0ge31cblx0XHRcdGFwcGx5V2lkdGgoYW5vdGhlck9iailcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzI1MHB4J1xuXG5cdFx0XHRkaXYgPSBEb20uZGl2KHN0eWxlOnt3aWR0aDozMCwgaGVpZ2h0OigtPjUwKSwgZm9udFNpemU6KC0+MjApfSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXYucmF3KS50by5oYXZlLnN0eWxlICd3aWR0aCcsICczMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5yYXcpLnRvLmhhdmUuc3R5bGUgJ2hlaWdodCcsICc1MHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5yYXcpLnRvLmhhdmUuc3R5bGUgJ2ZvbnRTaXplJywgJzIwcHgnXG5cblxuXHRcdHRlc3QgXCJBIG51bGwgdmFsdWUgY2FuIGJlIHBhc3NlZCBmb3IgYSBwcm9wZXJ0eSBpbiBvcmRlciB0byBkZWxldGUgdGhhdCBzdHlsZVwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KHN0eWxlOnt3aWR0aDonMTVweCcsIGZvbnRTaXplOiAtPiAzMH0pLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXYuc3R5bGUgJ2hlaWdodCcsIDIwXG5cblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzIwcHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS53aWR0aCkudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCAnMjBweCdcblxuXHRcdFx0ZGl2LnN0eWxlIHt3aWR0aDpudWxsLCBoZWlnaHQ6MTJ9XG5cdFx0XHRleHBlY3QoZGl2LmVsKS5ub3QudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMTVweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdoZWlnaHQnLCAnMTJweCcpXG5cdFx0XHRleHBlY3QoWyd1bnNldCcsJ2luaGVyaXQnLCdpbml0aWFsJ10uc29tZSAocyktPiBzIGlzIGRpdi5lbC5zdHlsZS53aWR0aCkudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsICcxMnB4J1xuXG5cdFx0XHRkaXYuY3NzICdoZWlnaHQnLCBudWxsXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUud2lkdGgpLm5vdC50by5lcXVhbCAnJ1xuXG5cdFx0XHRkaXYuZWwuc3R5bGUud2lkdGggPSBudWxsXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLndpZHRoKS50by5lcXVhbCAnJ1xuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMTVweCcpXG5cdFx0XHRcblx0XHRcdGRpdi5jc3MgJ3dpZHRoJywgbnVsbFxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS53aWR0aCkubm90LnRvLmVxdWFsICcnXG5cdFx0XHRleHBlY3QoZGl2LmVsKS5ub3QudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMTVweCcpXG5cblx0XHRcdGRpdi5zdHlsZSAnaGVpZ2h0JywgLT4gMzBcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCAnMzBweCdcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlICdoZWlnaHQnLCAtPiBudWxsXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwgJydcblx0XHRcdFxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5mb250U2l6ZSkudG8uZXF1YWwgJzMwcHgnXG5cdFx0XHRkaXYuc3R5bGUgJ2ZvbnRTaXplJywgbnVsbFxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5mb250U2l6ZSkudG8uZXF1YWwgJydcblxuXG5cdFx0dGVzdCBcIi5zdHlsZVNhZmUoKSBjYW4gYmUgdXNlZCB0byBvYnRhaW4gdGhlIHZhbHVlIGZvciBhIGdpdmVuIHByb3BlcnR5IGV2ZW4gZm9yIG5vbi1pbnNlcnRlZCBlbGVtZW50cyBvciBlbGVtZW50cyB3aXRoIG9wdGlvbnMuc3R5bGVBZnRlckluc2VydFwiLCAoKS0+XG5cdFx0XHRzdHlsZSA9XG5cdFx0XHRcdHdpZHRoOiAnOHB4J1xuXHRcdFx0XHRoZWlnaHQ6ICc5cHgnXG5cdFx0XHRcdHpJbmRleDogKGZpZWxkKS0+IGZpZWxkLm9wdGlvbnMudGhlSW5kZXhcblx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdHdpZHRoOiAnMThweCdcblx0XHRcdFx0XHR6SW5kZXg6IChmaWVsZCktPiBmaWVsZC5vcHRpb25zLnRoZUluZGV4KjJcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAnMTAwJSdcblx0XHRcdGRpdkEgPSBEb20uZGl2IHtzdHlsZSwgdGhlSW5kZXg6JzEyJ31cblx0XHRcdGRpdkIgPSBEb20uZGl2IHtzdHlsZSwgdGhlSW5kZXg6JzI5Jywgc3R5bGVBZnRlckluc2VydDp0cnVlfVxuXHRcdFx0ZGl2QS5zdHlsZSBmb250U2l6ZToxMCwgcG9zaXRpb246J3JlbGF0aXZlJ1xuXHRcdFx0ZGl2Qi5zdHlsZSBmb250U2l6ZToxMCwgcG9zaXRpb246J3JlbGF0aXZlJ1xuXHRcdFx0cHJvcCA9IChlbCx0YXJnZXQpLT4gY29tcHV0ZWQ6ZWwuc3R5bGUodGFyZ2V0KSwgaW5saW5lOmVsLnJhdy5zdHlsZVt0YXJnZXRdLCBzYWZlOicnK2VsLnN0eWxlU2FmZSh0YXJnZXQpXG5cblx0XHRcdGV4cGVjdChwcm9wIGRpdkEsICdmb250U2l6ZScpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonMTBweCcsIHNhZmU6JzEwcHgnfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ2ZvbnRTaXplJykudG8uZXFsIHtjb21wdXRlZDonJywgaW5saW5lOicxMHB4Jywgc2FmZTonMTBweCd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZBLCAnd2lkdGgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JycsIHNhZmU6JzhweCd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZCLCAnd2lkdGgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JycsIHNhZmU6JzhweCd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZBLCAnaGVpZ2h0JykudG8uZXFsIHtjb21wdXRlZDonJywgaW5saW5lOicnLCBzYWZlOic5cHgnfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ2hlaWdodCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonJywgc2FmZTonOXB4J31cblx0XHRcdGV4cGVjdChwcm9wIGRpdkEsICd6SW5kZXgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JzEyJywgc2FmZTonMTInfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ3pJbmRleCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonJywgc2FmZTonMjknfVxuXHRcdFx0XG5cdFx0XHRkaXZBLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRkaXZCLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QocHJvcCBkaXZBLCAnd2lkdGgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JycsIHNhZmU6JzE4cHgnfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ3dpZHRoJykudG8uZXFsIHtjb21wdXRlZDonJywgaW5saW5lOicnLCBzYWZlOicxOHB4J31cblx0XHRcdGV4cGVjdChwcm9wIGRpdkEsICd6SW5kZXgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JzI0Jywgc2FmZTonMjQnfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ3pJbmRleCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonJywgc2FmZTonNTgnfVxuXHRcdFx0XG5cdFx0XHRkaXZBLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGRpdkIuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QSwgJ2hlaWdodCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonJywgc2FmZTonMTAwJSd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZCLCAnaGVpZ2h0JykudG8uZXFsIHtjb21wdXRlZDonJywgaW5saW5lOicnLCBzYWZlOicxMDAlJ31cblx0XHRcdFxuXHRcdFx0ZGl2QS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZGl2Qi5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0aGVpZ2h0QSA9IGdldENvbXB1dGVkU3R5bGUoZGl2QS5yYXcpLmhlaWdodFxuXHRcdFx0aGVpZ2h0QiA9IGdldENvbXB1dGVkU3R5bGUoZGl2Qi5yYXcpLmhlaWdodFxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QSwgJ3pJbmRleCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JzI0JywgaW5saW5lOicyNCcsIHNhZmU6JzI0J31cblx0XHRcdGV4cGVjdChwcm9wIGRpdkIsICd6SW5kZXgnKS50by5lcWwge2NvbXB1dGVkOic1OCcsIGlubGluZTonNTgnLCBzYWZlOic1OCd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZBLCAnaGVpZ2h0JykudG8uZXFsIHtjb21wdXRlZDpoZWlnaHRBLCBpbmxpbmU6JycsIHNhZmU6aGVpZ2h0QX1cblx0XHRcdGV4cGVjdChwcm9wIGRpdkIsICdoZWlnaHQnKS50by5lcWwge2NvbXB1dGVkOmhlaWdodEIsIGlubGluZTonJywgc2FmZTpoZWlnaHRCfVxuXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsIGhlaWdodEFcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlU2FmZSAnaGVpZ2h0JywgdHJ1ZSkudG8uZXF1YWwgJzEwMCUnXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsIGhlaWdodEJcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSAnaGVpZ2h0JywgdHJ1ZSkudG8uZXF1YWwgJzEwMCUnXG5cdFx0XHRcblx0XHRcdGRpdkIuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlKCdoZWlnaHQnKSkubm90LnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ2hlaWdodCcpKS5ub3QudG8uZXF1YWwoJzEwMCUnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ2hlaWdodCcpKS50by5jb250YWluKCdweCcpXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVNhZmUoJ2hlaWdodCcpKS50by5lcXVhbChkaXZCLnN0eWxlKCdoZWlnaHQnKSlcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnaGVpZ2h0JywgdHJ1ZSkpLm5vdC50by5lcXVhbChkaXZCLnN0eWxlKCdoZWlnaHQnKSlcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnaGVpZ2h0JywgdHJ1ZSkpLnRvLmVxdWFsKCcxMDAlJylcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnbWFyZ2luJywgdHJ1ZSkpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ3dpZHRoJykpLnRvLmVxdWFsKCcxOHB4JylcblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVTYWZlKCdmYWtlUHJvcCcpKS50by5lcXVhbChkaXZBKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVTYWZlKDEyMykpLnRvLmVxdWFsKGRpdkEpXG5cblx0XHRcdHRleHQgPSBEb20udGV4dCgnYWJjMTIzJykuYXBwZW5kVG8oZGl2QSlcblx0XHRcdGV4cGVjdCh0ZXh0LnN0eWxlU2FmZSgnZmFrZVByb3AnKSkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHRleHQuc3R5bGVTYWZlKDEyMykpLnRvLmVxdWFsKHVuZGVmaW5lZClcblxuXG5cdFx0dGVzdCBcIi5zdHlsZVNhZmUoKSB3aWxsIHdvcmsgd2l0aCBpbnN0YW5jZXMgd2l0aCBubyBnaXZlbiBiYXNlIHN0eWxlc1wiLCAoKS0+XG5cdFx0XHRkaXZBID0gRG9tLmRpdigpXG5cdFx0XHRkaXZCID0gRG9tKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJ2RpdicpXG5cblx0XHRcdGV4cGVjdCAoKS0+XG5cdFx0XHRcdGRpdkEuc3R5bGVTYWZlKCdoZWlnaHQnKVxuXHRcdFx0XHRkaXZCLnN0eWxlU2FmZSgnaGVpZ2h0Jylcblx0XHRcdC5ub3QudG8udGhyb3coKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsICcnXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsICcnXG5cblxuXHRcdHRlc3QgXCIuc3R5bGVQYXJzZWQoKSBpcyBhIHNob3J0aGFuZCBmb3IgcGFyc2VGbG9hdCguc3R5bGVTYWZlKCkpXCIsICgpLT5cblx0XHRcdHN0eWxlID1cblx0XHRcdFx0d2lkdGg6ICc4cHgnXG5cdFx0XHRcdGhlaWdodDogJzlweCdcblx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdHdpZHRoOiAnMThweCdcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAnMTAwJSdcblx0XHRcdGRpdkEgPSBEb20uZGl2IHtzdHlsZX1cblx0XHRcdGRpdkIgPSBEb20uZGl2IHtzdHlsZSwgc3R5bGVBZnRlckluc2VydDp0cnVlfVxuXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZSgnd2lkdGgnKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUoJ3dpZHRoJykpLnRvLmVxdWFsKCc4cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVQYXJzZWQoJ3dpZHRoJykpLnRvLmVxdWFsKHBhcnNlRmxvYXQgZGl2QS5zdHlsZVNhZmUoJ3dpZHRoJykpXG5cblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlKCdoZWlnaHQnKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUoJ2hlaWdodCcpKS50by5lcXVhbCgnOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlUGFyc2VkKCdoZWlnaHQnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZBLnN0eWxlU2FmZSgnaGVpZ2h0JykpXG5cblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlKCd3aWR0aCcpKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnd2lkdGgnKSkudG8uZXF1YWwoJzhweCcpXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVBhcnNlZCgnd2lkdGgnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZCLnN0eWxlU2FmZSgnd2lkdGgnKSlcblxuXHRcdFx0ZGl2QS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2Qi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUoJ3dpZHRoJykpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVTYWZlKCd3aWR0aCcpKS50by5lcXVhbCgnMThweCcpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVBhcnNlZCgnd2lkdGgnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZBLnN0eWxlU2FmZSgnd2lkdGgnKSlcblx0XHRcdFxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUoJ2hlaWdodCcpKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlU2FmZSgnaGVpZ2h0JykpLnRvLmVxdWFsKCc5cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVQYXJzZWQoJ2hlaWdodCcpKS50by5lcXVhbChwYXJzZUZsb2F0IGRpdkEuc3R5bGVTYWZlKCdoZWlnaHQnKSlcblxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ3dpZHRoJykpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGVTYWZlKCd3aWR0aCcpKS50by5lcXVhbCgnMThweCcpXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVBhcnNlZCgnd2lkdGgnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZCLnN0eWxlU2FmZSgnd2lkdGgnKSlcblxuXHRcdFx0ZGl2QS5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRkaXZCLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlKCd3aWR0aCcpKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlU2FmZSgnd2lkdGgnKSkudG8uZXF1YWwoJzE4cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVQYXJzZWQoJ3dpZHRoJykpLnRvLmVxdWFsKHBhcnNlRmxvYXQgZGl2QS5zdHlsZVNhZmUoJ3dpZHRoJykpXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlKCdoZWlnaHQnKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUoJ2hlaWdodCcpKS50by5lcXVhbCgnMTAwJScpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVBhcnNlZCgnaGVpZ2h0JykpLnRvLmVxdWFsKHBhcnNlRmxvYXQgZGl2QS5zdHlsZVNhZmUoJ2hlaWdodCcpKVxuXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZSgnd2lkdGgnKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVNhZmUoJ3dpZHRoJykpLnRvLmVxdWFsKCcxOHB4Jylcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlUGFyc2VkKCd3aWR0aCcpKS50by5lcXVhbChwYXJzZUZsb2F0IGRpdkIuc3R5bGVTYWZlKCd3aWR0aCcpKVxuXG5cdFx0XHRkaXZBLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXZCLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXZBLnN0YXRlICdyZWxheGVkJywgb2ZmXG5cdFx0XHRkaXZCLnN0YXRlICdyZWxheGVkJywgb2ZmXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZSgnd2lkdGgnKSkudG8uZXF1YWwoJzE4cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVTYWZlKCd3aWR0aCcpKS50by5lcXVhbCgnMThweCcpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVBhcnNlZCgnd2lkdGgnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZBLnN0eWxlU2FmZSgnd2lkdGgnKSlcblx0XHRcdFxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUoJ2hlaWdodCcpKS50by5lcXVhbCgnOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlU2FmZSgnaGVpZ2h0JykpLnRvLmVxdWFsKCc5cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVQYXJzZWQoJ2hlaWdodCcpKS50by5lcXVhbChwYXJzZUZsb2F0IGRpdkEuc3R5bGVTYWZlKCdoZWlnaHQnKSlcblxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ3dpZHRoJykpLnRvLmVxdWFsKCcxOHB4Jylcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnd2lkdGgnKSkudG8uZXF1YWwoJzE4cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGVQYXJzZWQoJ3dpZHRoJykpLnRvLmVxdWFsKHBhcnNlRmxvYXQgZGl2Qi5zdHlsZVNhZmUoJ3dpZHRoJykpXG5cblxuXHRcdHRlc3QgXCIucmVjYWxjU3R5bGUoKSByZS1hcHBsaWVzIGFsbCBmdW5jdGlvbi12YWx1ZSBzdHlsZXNcIiwgKCktPlxuXHRcdFx0Y291bnQgPSBBOjAsQjowLEM6MCxEOjAsRTowLEY6MCxHOjBcblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuQVxuXHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdGhlaWdodDogKCktPiArK2NvdW50LkJcblx0XHRcdFx0Zm9udFNpemU6ICgpLT4gKytjb3VudC5DXG5cdFx0XHRcdCRoYXBweTpcblx0XHRcdFx0XHRvcGFjaXR5OiAwLjVcblx0XHRcdFx0XHRmb250U2l6ZTogKCktPiArK2NvdW50LkRcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAoKS0+ICsrY291bnQuRVxuXHRcdFx0XHRcdGZvbnRTaXplOiAoKS0+ICsrY291bnQuRlxuXHRcdFx0XHRcdCRmdW5ueTpcblx0XHRcdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuR1xuXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjEsQjoxLEM6MSxEOjAsRTowLEY6MCxHOjBcblx0XHRcdFxuXHRcdFx0ZGl2LnJlY2FsY1N0eWxlKClcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MixCOjIsQzoyLEQ6MCxFOjAsRjowLEc6MFxuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MixCOjIsQzoyLEQ6MSxFOjAsRjowLEc6MFxuXG5cdFx0XHRkaXYucmVjYWxjU3R5bGUoKVxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQTozLEI6MyxDOjIsRDoyLEU6MCxGOjAsRzowXG5cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjMsQjozLEM6MixEOjIsRToxLEY6MSxHOjBcblxuXHRcdFx0ZGl2LnJlY2FsY1N0eWxlKClcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6NCxCOjMsQzoyLEQ6MixFOjIsRjoyLEc6MFxuXG5cdFx0XHRkaXYuc3RhdGUgJ2Z1bm55Jywgb25cblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6NCxCOjMsQzoyLEQ6MixFOjIsRjoyLEc6MVxuXG5cdFx0XHRkaXYucmVjYWxjU3R5bGUoKVxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQTo0LEI6MyxDOjIsRDoyLEU6MyxGOjMsRzoyXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnZnVubnknLCBvZmZcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6NSxCOjMsQzoyLEQ6MixFOjMsRjozLEc6MlxuXHRcdFx0XG5cdFx0XHRkaXYucmVjYWxjU3R5bGUoKVxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQTo2LEI6MyxDOjIsRDoyLEU6NCxGOjQsRzoyXG5cblxuXHRcdHRlc3QgXCIucmVjYWxjU3R5bGUoKSBhY2NlcHRzIGEgc2luZ2xlIGFyZ3VtZW50IHRvIGluZGljYXRlIGlmIHRvIHJlY2FsYyBzdHlsZSBvbiBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRjb3VudCA9IEE6MCxCOjAsQzowLEQ6MCxFOjAsRjowLEc6MFxuXHRcdFx0d3JhcHBlckNvdW50ID0gMFxuXHRcdFx0d3JhcHBlciA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAoKS0+ICsrd3JhcHBlckNvdW50XG5cdFx0XHRcblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuQVxuXHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdGhlaWdodDogKCktPiArK2NvdW50LkJcblx0XHRcdFx0Zm9udFNpemU6ICgpLT4gKytjb3VudC5DXG5cdFx0XHRcdCRoYXBweTpcblx0XHRcdFx0XHRvcGFjaXR5OiAwLjVcblx0XHRcdFx0XHRmb250U2l6ZTogKCktPiArK2NvdW50LkRcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAoKS0+ICsrY291bnQuRVxuXHRcdFx0XHRcdGZvbnRTaXplOiAoKS0+ICsrY291bnQuRlxuXHRcdFx0XHRcdCRmdW5ueTpcblx0XHRcdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuR1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8od3JhcHBlcilcblx0XHRcdGV4cGVjdCh3cmFwcGVyQ291bnQpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MSxCOjEsQzoxLEQ6MCxFOjAsRjowLEc6MFxuXHRcdFx0XG5cdFx0XHR3cmFwcGVyLnJlY2FsY1N0eWxlKClcblx0XHRcdGV4cGVjdCh3cmFwcGVyQ291bnQpLnRvLmVxdWFsIDJcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MSxCOjEsQzoxLEQ6MCxFOjAsRjowLEc6MFxuXHRcdFx0XG5cdFx0XHR3cmFwcGVyLnJlY2FsY1N0eWxlKHRydWUpXG5cdFx0XHRleHBlY3Qod3JhcHBlckNvdW50KS50by5lcXVhbCAzXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjIsQjoyLEM6MixEOjAsRTowLEY6MCxHOjBcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjIsQjoyLEM6MixEOjEsRTowLEY6MCxHOjBcblxuXHRcdFx0d3JhcHBlci5yZWNhbGNTdHlsZSgpXG5cdFx0XHRleHBlY3Qod3JhcHBlckNvdW50KS50by5lcXVhbCA0XG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjIsQjoyLEM6MixEOjEsRTowLEY6MCxHOjBcblx0XHRcdFxuXHRcdFx0d3JhcHBlci5yZWNhbGNTdHlsZSgxKVxuXHRcdFx0ZXhwZWN0KHdyYXBwZXJDb3VudCkudG8uZXF1YWwgNVxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQTozLEI6MyxDOjIsRDoyLEU6MCxGOjAsRzowXG5cblxuXHRcdHRlc3QgXCJJZiBvcHRpb25zLnJlY2FsY09uUmVzaXplIGlzIHNldCwgLnJlY2FsY1N0eWxlKCkgd2lsbCBiZSBpbnZva2VkIG9uIGVhY2ggcmVzaXplIGV2ZW50XCIsICgpLT5cblx0XHRcdGNvdW50ID0gQTowLEI6MCxDOjAsRDowXG5cdFx0XHREb20uZGl2XG5cdFx0XHRcdHN0eWxlOlxuXHRcdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuQVxuXHRcdFx0XHRcdG9wYWNpdHk6IDFcblx0XHRcdFx0XHRoZWlnaHQ6ICgpLT4gKytjb3VudC5CXG5cdFx0XHRcblx0XHRcdERvbS5kaXZcblx0XHRcdFx0cmVjYWxjT25SZXNpemU6IHRydWVcblx0XHRcdFx0c3R5bGU6XG5cdFx0XHRcdFx0d2lkdGg6ICgpLT4gKytjb3VudC5DXG5cdFx0XHRcdFx0b3BhY2l0eTogMVxuXHRcdFx0XHRcdGhlaWdodDogKCktPiArK2NvdW50LkRcblxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQToxLEI6MSxDOjEsRDoxXG5cdFx0XHRcblx0XHRcdERvbSh3aW5kb3cpLmVtaXQgJ3Jlc2l6ZSdcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MSxCOjEsQzoyLEQ6MlxuXHRcdFx0XG5cdFx0XHREb20od2luZG93KS5lbWl0ICdyZXNpemUnXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjEsQjoxLEM6MyxEOjNcblxuXG5cdFx0dGVzdCBcIklmIG9wdGlvbnMuZm9yY2VTdHlsZSBpcyBzZXQsIGFsbCByZWdpc3RlcmVkIHN0eWxlcyB3aWxsIGhhdmUgdGhlICchaW1wb3J0YW50JyBmbGFnIHNldFwiLCAoKS0+XG5cdFx0XHRzdHlsZSA9IERPTS5zdHlsZShwcm9wczppbm5lckhUTUw6XCIudGhlRGl2IHt3aWR0aDo1MHB4fVwiKVxuXHRcdFx0ZGl2QSA9IERPTS5kaXYoY2xhc3NOYW1lOid0aGVEaXYnLCBzdHlsZTp7d2lkdGg6MTAwLCBoZWlnaHQ6MTAwfSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdkIgPSBET00uZGl2KGNsYXNzTmFtZTondGhlRGl2Jywgc3R5bGU6e3dpZHRoOjEwMCwgaGVpZ2h0OjEwMH0sIGZvcmNlU3R5bGU6dHJ1ZSkuYXBwZW5kVG8oc2FuZGJveClcblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzEwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzEwMHB4J1xuXHRcdFx0XG5cdFx0XHRzdHlsZS5hcHBlbmRUbyhkb2N1bWVudC5oZWFkKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzUwcHgnXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMTAwcHgnXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZBLmF0dHIoJ3N0eWxlJykgaXMgJycgb3IgZGl2QS5hdHRyKCdzdHlsZScpIGlzIG51bGwpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChkaXZCLmF0dHIoJ3N0eWxlJykgaXMgJycgb3IgZGl2Qi5hdHRyKCdzdHlsZScpIGlzIG51bGwpLnRvLmJlLnRydWVcblx0XHRcdFxuXHRcdFx0ZGl2QS5zdHlsZSAnd2lkdGgnLCAoKS0+IDc1XG5cdFx0XHRkaXZCLnN0eWxlICd3aWR0aCcsICgpLT4gNzVcblx0XHRcdGRpdkEuc3R5bGUgJ2hlaWdodCcsIDg1XG5cdFx0XHRkaXZCLnN0eWxlICdoZWlnaHQnLCA4NVxuXHRcdFx0ZXhwZWN0KGRpdkEuYXR0ciAnc3R5bGUnKS5ub3QudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXZCLmF0dHIgJ3N0eWxlJykubm90LnRvLmVxdWFsICcnXG5cdFx0XHRleHBlY3QoZGl2QS5hdHRyICdzdHlsZScpLm5vdC50by5pbmNsdWRlICc3NXB4ICFpbXBvcnRhbnQnXG5cdFx0XHRleHBlY3QoZGl2Qi5hdHRyICdzdHlsZScpLnRvLmluY2x1ZGUgJzc1cHggIWltcG9ydGFudCdcblx0XHRcdGV4cGVjdChkaXZBLmF0dHIgJ3N0eWxlJykubm90LnRvLmluY2x1ZGUgJzg1cHggIWltcG9ydGFudCdcblx0XHRcdGV4cGVjdChkaXZCLmF0dHIgJ3N0eWxlJykudG8uaW5jbHVkZSAnODVweCAhaW1wb3J0YW50J1xuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzc1cHgnXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnNzVweCdcblx0XHRcdHN0eWxlLnJlbW92ZSgpXG5cblxuXHRcdHRlc3QgXCIuc2hvdygpLy5oaWRlKCkgd2lsbCB0b2dnbGUgdGhlIGVsZW1lbnQncyB2aXNpYmlsaXR5XCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKS5hcHBlbmRUbyBzYW5kYm94XG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlKCdkaXNwbGF5JykpLnRvLmVxdWFsICdibG9jaydcblxuXHRcdFx0ZGl2LmhpZGUoKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSgnZGlzcGxheScpKS50by5lcXVhbCAnbm9uZSdcblxuXHRcdFx0ZGl2LnNob3coKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSgnZGlzcGxheScpKS50by5lcXVhbCAnYmxvY2snXG5cblx0XHRcdGRpdi5zaG93KClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUoJ2Rpc3BsYXknKSkudG8uZXF1YWwgJ2Jsb2NrJ1xuXG5cblx0XHR0ZXN0IFwiLnNob3coKSB3aWxsIHNldCB0aGUgZWxlbWVudCdzIGRpc3BsYXkgc3R5bGUgdG8gdGhlIHByb3ZpZGVkIGFyZ3VtZW50LCBvciB0byB0aGUgdmFsdWUgcHJvdmlkZWQgaW4gdGhlIHN0eWxlIG9iamVjdFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KHN0eWxlOmRpc3BsYXk6J2lubGluZScpLmFwcGVuZFRvIHNhbmRib3hcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUoJ2Rpc3BsYXknKSkudG8uZXF1YWwgJ2lubGluZSdcblxuXHRcdFx0ZGl2LmhpZGUoKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSgnZGlzcGxheScpKS50by5lcXVhbCAnbm9uZSdcblxuXHRcdFx0ZGl2LnNob3coKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSgnZGlzcGxheScpKS50by5lcXVhbCAnaW5saW5lJ1xuXG5cdFx0XHRkaXYuaGlkZSgpXG5cdFx0XHRkaXYuc2hvdygnaW5saW5lLWJsb2NrJylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUoJ2Rpc3BsYXknKSkudG8uZXF1YWwgJ2lubGluZS1ibG9jaydcblxuXG5cdFx0dGVzdCBcIlNWRyBlbGVtZW50c1wiLCAoKS0+XG5cdFx0XHRzdmcgPSBEb20oXG5cdFx0XHRcdFsnKnN2Zydcblx0XHRcdFx0XHRzdHlsZTpcblx0XHRcdFx0XHRcdGRpc3BsYXk6ICdibG9jaydcblx0XHRcdFx0XHRcdHdpZHRoOiAxMFxuXHRcdFx0XHRcdFx0aGVpZ2h0OiAxMFxuXHRcdFx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdFx0XHR3aWR0aDogMjBcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiAyMFxuXHRcdFx0XHRdXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGV4cGVjdChzdmcuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzEwcHgnXG5cdFx0XHRleHBlY3Qoc3ZnLnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCAnMTBweCdcblxuXHRcdFx0c3ZnLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3Qoc3ZnLnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsICcyMHB4J1xuXHRcdFx0ZXhwZWN0KHN2Zy5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzIwcHgnXG5cblxuXG5cblx0c3VpdGUgXCJTdGF0ZVwiLCAoKS0+XG5cdFx0dGVzdCBcIlN0YXRlcyBjYW4gYmUgcG9sbGVkIGZvciBhIHZhbHVlIGJ5IHBhc3Npbmcgb25seSB0aGUgdGFyZ2V0IHN0YXRlJ3MgbmFtZSB0byAuc3RhdGUgJiBjYW4gYmUgdG9nZ2xlZCBvbi9vZmYgYnkgcGFzc2luZyBhIHNlY29uZCBhcmd1bWVudFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KClcblxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnZnVubnknKS50by5iZS5mYWxzZVxuXG5cdFx0XHRkaXYuc3RhdGUgJ2Z1bm55JywgdHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnZnVubnknKS50by5iZS50cnVlXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCB0cnVlXG5cdFx0XHRkaXYuc3RhdGUgJ3JlbGF4ZWQnLCB0cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdmdW5ueScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLnRydWVcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdmdW5ueScsIGZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdmdW5ueScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnJGZ1bm55JywgdHJ1ZVxuXHRcdFx0ZGl2LnN0YXRlICckYmFzZScsIHRydWVcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2Z1bm55JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYmFzZScpLnRvLmJlLmZhbHNlXG5cblxuXHRcdHRlc3QgXCJBIGtleTp2YWx1ZSBwYWlyIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIHRvZ2dsZSBzdGF0ZSBmb3IgbXVsdGlwbGUgc3RhdGVzIGF0IG9uY2VcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2EnKS50by5lcXVhbCBmYWxzZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYicpLnRvLmVxdWFsIGZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdjJykudG8uZXF1YWwgZmFsc2VcblxuXHRcdFx0ZGl2LnN0YXRlIGE6dHJ1ZSxiOjFcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2EnKS50by5lcXVhbCB0cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdiJykudG8uZXF1YWwgdHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYycpLnRvLmVxdWFsIGZhbHNlXG5cblx0XHRcdGRpdi5zdGF0ZSBiOmZhbHNlLGM6J3knXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdhJykudG8uZXF1YWwgdHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYicpLnRvLmVxdWFsIGZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdjJykudG8uZXF1YWwgdHJ1ZVxuXG5cblx0XHR0ZXN0IFwiLnN0YXRlKCkgd2l0aG91dCBhcmd1bWVudHMgc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBhY3RpdmUgc3RhdGVzXCIsICgpLT5cblx0XHRcdGVsID0gRE9NLmRpdigpXG5cdFx0XHRleHBlY3QoZWwuc3RhdGUoKSkudG8uZXFsIFtdXG5cblx0XHRcdGVsLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRlbC5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QoZWwuc3RhdGUoKSkudG8uZXFsIFsnaGFwcHknLCdyZWxheGVkJ11cblxuXHRcdFx0ZWwuc3RhdGUgJ2hhcHB5Jywgb2ZmXG5cdFx0XHRleHBlY3QoZWwuc3RhdGUoKSkudG8uZXFsIFsncmVsYXhlZCddXG5cblx0XHRcdGVsLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoZWwuc3RhdGUoKSkudG8uZXFsIFsncmVsYXhlZCcsJ2hhcHB5J11cblxuXG5cdFx0dGVzdCBcIkFsbCBzdGF0ZXMgY2FuIGJlIGNsZWFyZWQvdG9nZ2xlZCBvZmYgdmlhIC5yZXNldFN0YXRlXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXG5cdFx0XHRkaXYuc3RhdGUgJ2Z1bm55Jywgb25cblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2LnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2Z1bm55JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUudHJ1ZVxuXG5cdFx0XHRkaXYucmVzZXRTdGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdmdW5ueScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUuZmFsc2VcblxuXG5cdFx0dGVzdCBcIkEgc3RhdGUgY2FuIGJlIHRvZ2dsZWQgb24vb2ZmIHZpYSAudG9nZ2xlU3RhdGVcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRE9NLmRpdigpXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXYudG9nZ2xlU3RhdGUoJ2hhcHB5Jylcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblx0XHRcdFxuXHRcdFx0ZGl2LnRvZ2dsZVN0YXRlKCdoYXBweScpXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0XG5cdFx0XHRkaXYudG9nZ2xlU3RhdGUoJ2hhcHB5Jylcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblxuXG5cdFx0dGVzdCBcIlN0eWxlcyBjYW4gYmUgcGFzc2VkIHVuZGVyIHNwZWNpZmljIHN0YXRlcyB1c2luZyBhICckJyBwcmVmaXggYmVmb3JlIHRoZSBzdGF0ZSBuYW1lXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdCRiYXNlOlxuXHRcdFx0XHRcdHdpZHRoOiAnMTVweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICcxNXB4J1xuXHRcdFx0XHQkaGFwcHk6XG5cdFx0XHRcdFx0d2lkdGg6ICcyNXB4J1xuXHRcdFx0XHRcdG1hcmdpblRvcDogJzIwcHgnXG5cdFx0XHRcdCRyZWxheGVkOlxuXHRcdFx0XHRcdHdpZHRoOiAnMzVweCdcblx0XHRcdFx0XHRtYXJnaW5MZWZ0OiAnMTJweCdcblxuXHRcdFx0ZGl2LmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkaXYuZWwpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3ApLnRvLmVxdWFsKCcwcHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUubWFyZ2luTGVmdCkudG8uZXF1YWwoJzBweCcpXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcyNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnMjBweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5tYXJnaW5MZWZ0KS50by5lcXVhbCgnMHB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcxNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnMHB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQpLnRvLmVxdWFsKCcwcHgnKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzM1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3ApLnRvLmVxdWFsKCcyMHB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQpLnRvLmVxdWFsKCcxMnB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCczNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnMHB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQpLnRvLmVxdWFsKCcxMnB4JylcblxuXG5cdFx0dGVzdCBcIkEgc3RhdGU6ZXZlbnROYW1lIChvciBzdGF0ZTpldmVudE9wdHMpIG1hcCBjYW4gYmUgcGFzc2VkIHNldCBmb3Igb3B0aW9ucy5zdGF0ZVRyaWdnZXJzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoXG5cdFx0XHRcdHN0YXRlVHJpZ2dlcnM6XG5cdFx0XHRcdFx0aGFwcHk6IHtvbjonYmVjYW1lSGFwcHknLCBvZmY6J2JlY2FtZVNhZCd9XG5cdFx0XHRcdFx0cmVsYXhlZDogJ2lzUmVsYXhlZCcgXG5cdFx0XHRcdHN0eWxlOlxuXHRcdFx0XHRcdCRiYXNlOlx0XHR3aWR0aDogJzE1cHgnXG5cdFx0XHRcdFx0JGhhcHB5Olx0XHR3aWR0aDogJzI1cHgnXG5cdFx0XHRcdFx0JHJlbGF4ZWQ6XHR3aWR0aDogJzM1cHgnXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkaXYuZWwpXG5cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcxNXB4JylcblxuXHRcdFx0ZGl2LmVtaXQoJ2JlY2FtZUhhcHB5Jylcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzI1cHgnKVxuXG5cdFx0XHRkaXYuZW1pdCgnaXNSZWxheGVkJylcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMzVweCcpXG5cblx0XHRcdGRpdi5lbWl0KCdiZWNhbWVTYWQnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMzVweCcpXG5cblx0XHRcdGRpdi5zdGF0ZSgncmVsYXhlZCcsIG9mZilcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMTVweCcpXG5cblxuXHRcdHRlc3QgXCJvcHRpb25zLnN0YXRlVHJpZ2dlcnMgd29uJ3QgYmUgYXR0YWNoZWQgaWYgdGhleSBhcmVuJ3QgYmVpbmcgdXNlZCBpbiBzdHlsZSBvYmplY3RcIiwgKCktPlxuXHRcdFx0ZGl2QSA9IERvbS5kaXYoc3R5bGU6eyRob3ZlcjogZGlzcGxheTonYmxvY2snfSlcblx0XHRcdGRpdkIgPSBEb20uZGl2KHN0eWxlOnskZm9jdXM6IGRpc3BsYXk6J2Jsb2NrJ30pXG5cblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2hvdmVyJykudG8uZXF1YWwgb2ZmXG5cblx0XHRcdGRpdkEuZWwuZW1pdEV2ZW50ICdtb3VzZWVudGVyJ1xuXHRcdFx0ZGl2Qi5lbC5lbWl0RXZlbnQgJ21vdXNlZW50ZXInXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaG92ZXInKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2hvdmVyJykudG8uZXF1YWwgb2ZmXG5cblx0XHRcdGRpdkEuZWwuZW1pdEV2ZW50ICdtb3VzZWxlYXZlJ1xuXHRcdFx0ZGl2Qi5lbC5lbWl0RXZlbnQgJ21vdXNlbGVhdmUnXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaG92ZXInKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXZBLmVsLmVtaXRFdmVudCAnZm9jdXMnXG5cdFx0XHRkaXZCLmVsLmVtaXRFdmVudCAnZm9jdXMnXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnZm9jdXMnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdmb2N1cycpLnRvLmVxdWFsIG9uXG5cblx0XHRcdGRpdkEuZWwuZW1pdEV2ZW50ICdibHVyJ1xuXHRcdFx0ZGl2Qi5lbC5lbWl0RXZlbnQgJ2JsdXInXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnZm9jdXMnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdmb2N1cycpLnRvLmVxdWFsIG9mZlxuXG5cblx0XHR0ZXN0IFwib3B0aW9ucy5zdGF0ZVRyaWdnZXJzIGNhbiBiZSBmb3JjZWQgdG8gYmUgYXR0YWNoZWQgZXZlbiBpZiB0aGV5IGFyZW4ndCBiZWluZyB1c2VkIGluIHN0eWxlIG9iamVjdCB2aWEgLl9hdHRhY2hTdGF0ZUV2ZW50cyh0cnVlKVwiLCAoKS0+XG5cdFx0XHRhdHRhY2hTdGF0ZUV2ZW50cyA9IGlmIERvbS5kaXYoKS5fYXR0YWNoU3RhdGVFdmVudHMgdGhlbiAnX2F0dGFjaFN0YXRlRXZlbnRzJyBlbHNlICdfYWUnXG5cdFx0XHRkaXZBID0gRG9tLmRpdihzdHlsZTp7JGhvdmVyOiBkaXNwbGF5OidibG9jayd9KVxuXHRcdFx0ZGl2QiA9IERvbS5kaXYoc3R5bGU6eyRmb2N1czogZGlzcGxheTonYmxvY2snfSlcblx0XHRcdGRpdkFbYXR0YWNoU3RhdGVFdmVudHNdKHRydWUpXG5cdFx0XHRkaXZCW2F0dGFjaFN0YXRlRXZlbnRzXSh0cnVlKVxuXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaG92ZXInKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXZBLmVsLmVtaXRFdmVudCAnbW91c2VlbnRlcidcblx0XHRcdGRpdkIuZWwuZW1pdEV2ZW50ICdtb3VzZWVudGVyJ1xuXHRcdFx0ZXhwZWN0KGRpdkEuc3RhdGUgJ2hvdmVyJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9uXG5cblx0XHRcdGRpdkEuZWwuZW1pdEV2ZW50ICdtb3VzZWxlYXZlJ1xuXHRcdFx0ZGl2Qi5lbC5lbWl0RXZlbnQgJ21vdXNlbGVhdmUnXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaG92ZXInKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXZBLmVsLmVtaXRFdmVudCAnZm9jdXMnXG5cdFx0XHRkaXZCLmVsLmVtaXRFdmVudCAnZm9jdXMnXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnZm9jdXMnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2ZvY3VzJykudG8uZXF1YWwgb25cblxuXHRcdFx0ZGl2QS5lbC5lbWl0RXZlbnQgJ2JsdXInXG5cdFx0XHRkaXZCLmVsLmVtaXRFdmVudCAnYmx1cidcblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICdmb2N1cycpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2ZvY3VzJykudG8uZXF1YWwgb2ZmXG5cblxuXHRcdHRlc3QgXCJUaGUgaG92ZXIgYW5kIGZvY3VzIHN0YXRlcyB3aWxsIGJlIGxpc3RlbmVkIGZvciBhbmQgdG9nZ2xlZCBieSBkZWZhdWx0IGJ5IHRoZWlyIGFwcHJvcHJpYXRlIGV2ZW50c1wiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2IHN0eWxlOlxuXHRcdFx0XHQkYmFzZTpcblx0XHRcdFx0XHR3aWR0aDogJzE1cHgnXG5cdFx0XHRcdFx0aGVpZ2h0OiAnMTVweCdcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6ICdyZ2IoNDUsIDQ1LCA0NSknXG5cdFx0XHRcdCRob3Zlcjpcblx0XHRcdFx0XHR3aWR0aDogJzI1cHgnXG5cdFx0XHRcdFx0bWFyZ2luVG9wOiAnMjBweCdcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6ICdyZ2IoMTU1LCAxNTUsIDE1NSknXG5cdFx0XHRcdCRmb2N1czpcblx0XHRcdFx0XHR3aWR0aDogJzM1cHgnXG5cdFx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiAncmdiKDIwMCwgMjAwLCAyMDApJ1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnbWFyZ2luVG9wJywgJzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdiYWNrZ3JvdW5kQ29sb3InLCAncmdiKDQ1LCA0NSwgNDUpJylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZW50ZXInXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCd3aWR0aCcsICcyNXB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ2hlaWdodCcsICcxNXB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ21hcmdpblRvcCcsICcyMHB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ2JhY2tncm91bmRDb2xvcicsICdyZ2IoMTU1LCAxNTUsIDE1NSknKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5tYXJnaW5Ub3ApLnRvLmVxdWFsKCcnKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdCAnbW91c2VsZWF2ZSdcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnbWFyZ2luVG9wJywgJzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdiYWNrZ3JvdW5kQ29sb3InLCAncmdiKDQ1LCA0NSwgNDUpJylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZW50ZXInXG5cdFx0XHRkaXYuZW1pdCAnZm9jdXMnXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCd3aWR0aCcsICczNXB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ2hlaWdodCcsICcxNXB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ21hcmdpblRvcCcsICcyMHB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ2JhY2tncm91bmRDb2xvcicsICdyZ2IoMjAwLCAyMDAsIDIwMCknKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5tYXJnaW5Ub3ApLnRvLmVxdWFsKCcnKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdCAnbW91c2VsZWF2ZSdcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzM1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnbWFyZ2luVG9wJywgJzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdiYWNrZ3JvdW5kQ29sb3InLCAncmdiKDIwMCwgMjAwLCAyMDApJylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnJylcblxuXG5cdFx0dGVzdCBcIklmIG5vdCBwYXNzZWQgYSBzdHlsZSBtYXAgdW5kZXIgdGhlICdiYXNlJyBzdGF0ZSwgYWxsIG5vbi1zdGF0ZSBwcm9wZXJ0aWVzIG9uIHRoZSBzdHlsZSBvYmplY3Qgd2lsbCBiZSBjb25zaWRlcmVkIGFzICdiYXNlJyBzdGF0ZSBwcm9wZXJ0aWVzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAnMTVweCdcblx0XHRcdFx0aGVpZ2h0OiAnMjBweCdcblx0XHRcdFx0JGhvdmVyOlxuXHRcdFx0XHRcdHdpZHRoOiAnMjVweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICczMHB4J1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcyMHB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZW50ZXInXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzI1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMzBweCcpXG5cdFx0XHRcblx0XHRcdGRpdi5lbWl0ICdtb3VzZWxlYXZlJ1xuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcxNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzIwcHgnKVxuXG5cblx0XHR0ZXN0IFwiU3RhdGUtc3BlY2lmaWMgc3R5bGVzIHdpbGwgYmUgcmVtb3ZlZCB1cG9uIHN0YXRlIHR1cm4gb2ZmIG9yIHJlc3RvcmVkIHRvIHRoZSBiYXNlIHZhbHVlXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAnMTVweCdcblx0XHRcdFx0JGhvdmVyOlxuXHRcdFx0XHRcdHdpZHRoOiAnMjVweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICczMHB4J1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRcblx0XHRcdGRpdi5lbWl0ICdtb3VzZWVudGVyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMjVweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdoZWlnaHQnLCAnMzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRcblx0XHRcdGRpdi5lbWl0ICdtb3VzZWxlYXZlJ1xuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMTVweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdoZWlnaHQnLCAnMHB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnJylcblxuXG5cdFx0dGVzdCBcIkhpZ2hlciBvcmRlciBzdGF0ZSBzdHlsZXMgd2lsbCBoYXZlIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiB0aGUgJ2Jhc2UnIHN0eWxlIHRvIGJlIHVzZWQgYXMgcmVwbGFjbWVudHMgZm9yIHBlbmRpbmctcmVtb3ZhbCBzdGF0ZS1zdHlsZXNcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdiBzdHlsZTpcblx0XHRcdFx0d2lkdGg6ICcxNXB4J1xuXHRcdFx0XHQkaG92ZXI6XG5cdFx0XHRcdFx0d2lkdGg6ICcyNXB4J1xuXHRcdFx0XHRcdGhlaWdodDogJzMwcHgnXG5cdFx0XHRcdCRmb2N1czpcblx0XHRcdFx0XHRoZWlnaHQ6ICc0NXB4J1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcwcHgnKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdCAnbW91c2VlbnRlcidcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMjVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCczMHB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ2ZvY3VzJ1xuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcyNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzQ1cHgnKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdCAnbW91c2VsZWF2ZSdcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCc0NXB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ2JsdXInXG5cdFx0XHRkaXYuZW1pdCAnZm9jdXMnXG5cdFx0XHRkaXYuZW1pdCAnbW91c2VlbnRlcidcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMjVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCc0NXB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ2JsdXInXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzI1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMzBweCcpXG5cblxuXHRcdHRlc3QgXCJTdGF0ZSB0b2dnbGVzIHdpbGwgYmUgcGFzc2VkIHRvIGNoaWxkcmVuIGVsZW1lbnRzIHVubGVzcyBvcHRpb25zLnBhc3NTdGF0ZVRvQ2hpbGRyZW4gaXMgb2ZmXCIsICgpLT5cblx0XHRcdE1haW4gPSBEb20uZGl2KClcblx0XHRcdEEgPSBEb20uZGl2KCkuYXBwZW5kVG8oTWFpbilcblx0XHRcdEIgPSBEb20uZGl2KCkuYXBwZW5kVG8oQSlcblx0XHRcdEMgPSBEb20uZGl2KHBhc3NTdGF0ZVRvQ2hpbGRyZW46ZmFsc2UpLmFwcGVuZFRvKEEpXG5cblx0XHRcdGV4cGVjdChNYWluLnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoQS5zdGF0ZSAnaGFwcHknKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KEIuc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChDLnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cblx0XHRcdE1haW4uc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChNYWluLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChBLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChCLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChDLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblxuXHRcdFx0TWFpbi5vcHRpb25zLnBhc3NTdGF0ZVRvQ2hpbGRyZW4gPSBmYWxzZVxuXHRcdFx0TWFpbi5zdGF0ZSAnaGFwcHknLCBmYWxzZVxuXHRcdFx0ZXhwZWN0KE1haW4uc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChBLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChCLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChDLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblxuXHRcdFx0TWFpbi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0TWFpbi5vcHRpb25zLnBhc3NTdGF0ZVRvQ2hpbGRyZW4gPSB0cnVlXG5cdFx0XHRBLm9wdGlvbnMucGFzc1N0YXRlVG9DaGlsZHJlbiA9IGZhbHNlXG5cdFx0XHRNYWluLnN0YXRlICdoYXBweScsIGZhbHNlXG5cdFx0XHRleHBlY3QoTWFpbi5zdGF0ZSAnaGFwcHknKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KEEuc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChCLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChDLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblxuXG5cdFx0dGVzdCBcIlN0YXRlIHN0eWxlcyBjYW4gYmUgbmVzdGVkIHRvIHRyaWdnZXIgd2hlbiBhbGwgc3RhdGVzIGFyZSB0b2dnbGVkIG9uXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdCRiYXNlOlxuXHRcdFx0XHRcdHdpZHRoOiAnMTJweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICcxMnB4J1xuXHRcdFx0XHRcdGZvbnRTaXplOiAnMTBweCdcblx0XHRcdFx0JGZ1bm55OlxuXHRcdFx0XHRcdGZvbnRTaXplOiAnMTVweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICcxNXB4J1xuXHRcdFx0XHRcdCMgd2lkdGg6ICcxMHB4J1xuXHRcdFx0XHQkaGFwcHk6XG5cdFx0XHRcdFx0d2lkdGg6ICcxNHB4J1xuXHRcdFx0XHRcdGZvbnRTaXplOiAnMTRweCdcblx0XHRcdFx0XHQkcmVsYXhlZDpcblx0XHRcdFx0XHRcdGhlaWdodDogJzExcHgnXG5cdFx0XHRcdFx0XHRmb250U2l6ZTogJzE3cHgnXG5cdFx0XHRcdFx0XHQkZnVubnk6XG5cdFx0XHRcdFx0XHRcdHdpZHRoOiAnMTBweCdcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiAnMTRweCdcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0d2lkdGg6ICcxN3B4J1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwoJzEycHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwoJzEycHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCgnMTBweCcpXG5cblx0XHRcdGRpdi5zdGF0ZSAnZnVubnknLCBvblxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCgnMTJweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsKCcxNXB4JylcblxuXHRcdFx0ZGl2LnN0YXRlICdmdW5ueScsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCgnMTJweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCgnMTJweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsKCcxMHB4JylcblxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsKCcxNHB4Jylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsKCcxMnB4Jylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwoJzE0cHgnKVxuXG5cdFx0XHRkaXYuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCgnMTdweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCgnMTFweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsKCcxN3B4JylcblxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCgnMTdweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCgnMTJweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsKCcxMHB4JylcblxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsKCcxN3B4Jylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsKCcxMXB4Jylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwoJzE3cHgnKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2Z1bm55Jywgb25cblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwoJzEwcHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwoJzE0cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCgnMTdweCcpXG5cblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvZmZcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwoJzE3cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCgnMTVweCcpXG5cblxuXHRcdHRlc3QgXCJRdWlja0VsZW1lbnQucmVjdCBzaG91bGQgY29udGFpbiBhbiB1cGRhdGVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQncyBDbGllbnRSZWN0XCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0cmVjdEEgPSBkaXYucmVjdFxuXHRcdFx0cmVjdEIgPSBkaXYucmVjdFxuXG5cdFx0XHRleHBlY3QocmVjdEEpLnRvLmJlLmluc3RhbmNlT2YoQ2xpZW50UmVjdClcblx0XHRcdGV4cGVjdChyZWN0QikudG8uYmUuaW5zdGFuY2VPZihDbGllbnRSZWN0KVxuXHRcdFx0ZXhwZWN0KHJlY3RBKS50by5lcWwocmVjdEIpXG5cblxuXHRcdFx0ZGl2LnN0eWxlICd3aWR0aCcsICc3cHgnXG5cdFx0XHRyZWN0QyA9IGRpdi5yZWN0XG5cdFx0XHRleHBlY3QocmVjdEMpLnRvLmJlLmluc3RhbmNlT2YoQ2xpZW50UmVjdClcblx0XHRcdGV4cGVjdChyZWN0QSkudG8uZXFsKHJlY3RCKVxuXHRcdFx0ZXhwZWN0KHJlY3RBKS5ub3QudG8uZXFsKHJlY3RDKVxuXHRcdFx0ZXhwZWN0KHJlY3RBLndpZHRoKS5ub3QudG8uZXF1YWwoNylcblx0XHRcdGV4cGVjdChyZWN0Qi53aWR0aCkubm90LnRvLmVxdWFsKDcpXG5cdFx0XHRleHBlY3QocmVjdEMud2lkdGgpLnRvLmVxdWFsKDcpXG5cblxuXHRcdHRlc3QgXCJRdWlja0VsZW1lbnQud2lkdGggc2hvdWxkIHJldHVybiB0aGUgdXBkYXRlZCB2ZXJzaW9uIG9mIGFuIGVsZW1lbnQncyBjb21wdXRlZCB3aWR0aFwiLCAoKS0+XG5cdFx0XHRwYXJlbnQgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdiA9IERvbS5kaXYoKS5hcHBlbmRUbyhwYXJlbnQpXG5cdFx0XHRcblx0XHRcdHBhcmVudC5zdHlsZSB3aWR0aDonMTAwMHB4J1xuXHRcdFx0ZGl2LnN0eWxlIHdpZHRoOic1MCUnXG5cdFx0XHRleHBlY3QoZGl2LndpZHRoKS50by5lcXVhbCg1MDApXG5cdFx0XHRcblx0XHRcdGRpdi5zdHlsZSB3aWR0aDonMTAlJ1xuXHRcdFx0ZXhwZWN0KGRpdi53aWR0aCkudG8uZXF1YWwoMTAwKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6Jzk3cHgnXG5cdFx0XHRleHBlY3QoZGl2LndpZHRoKS50by5lcXVhbCg5NylcblxuXG5cdFx0dGVzdCBcIlF1aWNrRWxlbWVudC5oZWlnaHQgc2hvdWxkIHJldHVybiB0aGUgdXBkYXRlZCB2ZXJzaW9uIG9mIGFuIGVsZW1lbnQncyBjb21wdXRlZCBoZWlnaHRcIiwgKCktPlxuXHRcdFx0cGFyZW50ID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXYgPSBEb20uZGl2KCkuYXBwZW5kVG8ocGFyZW50KVxuXHRcdFx0XG5cdFx0XHRwYXJlbnQuc3R5bGUgaGVpZ2h0OicxMDAwcHgnXG5cdFx0XHRkaXYuc3R5bGUgaGVpZ2h0Oic1MCUnXG5cdFx0XHRleHBlY3QoZGl2LmhlaWdodCkudG8uZXF1YWwoNTAwKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgaGVpZ2h0OicxMCUnXG5cdFx0XHRleHBlY3QoZGl2LmhlaWdodCkudG8uZXF1YWwoMTAwKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgaGVpZ2h0Oic5N3B4J1xuXHRcdFx0ZXhwZWN0KGRpdi5oZWlnaHQpLnRvLmVxdWFsKDk3KVxuXG5cdFx0XG5cdFx0dGVzdCBcIlF1aWNrRWxlbWVudC53aWR0aC8uaGVpZ2h0IHNldHRlcnMgYXJlIHNob3J0Y3V0cyBmb3IgLnN0eWxlKCkgc2V0dGVyc1wiLCAoKS0+XG5cdFx0XHRwYXJlbnQgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdiA9IERvbS5kaXYoKS5hcHBlbmRUbyhwYXJlbnQpXG5cdFx0XHRcblx0XHRcdHBhcmVudC5zdHlsZSB3aWR0aDonMTAwMHB4JywgaGVpZ2h0OicxMDAwcHgnXG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6JzUwJScsIGhlaWdodDonNTAlJ1xuXHRcdFx0ZGl2LndpZHRoID0gZGl2LmhlaWdodCA9ICc1MCUnXG5cdFx0XHRleHBlY3QoZGl2LndpZHRoKS50by5lcXVhbCg1MDApXG5cdFx0XHRleHBlY3QoZGl2LmhlaWdodCkudG8uZXF1YWwoNTAwKVxuXHRcdFx0XG5cdFx0XHRkaXYud2lkdGggPSBkaXYuaGVpZ2h0ID0gJzEwJSdcblx0XHRcdGV4cGVjdChkaXYud2lkdGgpLnRvLmVxdWFsKDEwMClcblx0XHRcdGV4cGVjdChkaXYuaGVpZ2h0KS50by5lcXVhbCgxMDApXG5cdFx0XHRcblx0XHRcdGRpdi53aWR0aCA9IGRpdi5oZWlnaHQgPSAnOTdweCdcblx0XHRcdGV4cGVjdChkaXYud2lkdGgpLnRvLmVxdWFsKDk3KVxuXHRcdFx0ZXhwZWN0KGRpdi5oZWlnaHQpLnRvLmVxdWFsKDk3KVxuXG5cblx0XHR0ZXN0IFwiUXVpY2tFbGVtZW50Lm9yaWVudGF0aW9uIHNob3VsZCByZXR1cm4gdGhlIHVwZGF0ZWQgdmVyc2lvbiBvZiBhbiBlbGVtZW50J3MgY29tcHV0ZWQgb3JpZW50YXRpb25cIiwgKCktPlxuXHRcdFx0cGFyZW50ID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXYgPSBEb20uZGl2KCkuYXBwZW5kVG8ocGFyZW50KVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6NTAwLCBoZWlnaHQ6NDAwXG5cdFx0XHRleHBlY3QoZGl2Lm9yaWVudGF0aW9uKS50by5lcXVhbCgnbGFuZHNjYXBlJylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlIHdpZHRoOjU1MCwgaGVpZ2h0OjYwMFxuXHRcdFx0ZXhwZWN0KGRpdi5vcmllbnRhdGlvbikudG8uZXF1YWwoJ3BvcnRyYWl0Jylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlIHdpZHRoOjYwMCwgaGVpZ2h0OjYwMFxuXHRcdFx0ZXhwZWN0KGRpdi5vcmllbnRhdGlvbikudG8uZXF1YWwoJ3BvcnRyYWl0Jylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlIHdpZHRoOjYwMSwgaGVpZ2h0OjYwMFxuXHRcdFx0ZXhwZWN0KGRpdi5vcmllbnRhdGlvbikudG8uZXF1YWwoJ2xhbmRzY2FwZScpXG5cblxuXHRcdHRlc3QgXCJRdWlja0VsZW1lbnQuYXNwZWN0UmF0aW8gc2hvdWxkIHJldHVybiB0aGUgdXBkYXRlZCB2ZXJzaW9uIG9mIGFuIGVsZW1lbnQncyBjb21wdXRlZCBhc3BlY3QtcmF0aW9cIiwgKCktPlxuXHRcdFx0cGFyZW50ID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXYgPSBEb20uZGl2KCkuYXBwZW5kVG8ocGFyZW50KVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6NTAwLCBoZWlnaHQ6NDAwXG5cdFx0XHRleHBlY3QoZGl2LmFzcGVjdFJhdGlvKS50by5lcXVhbCgxLjI1KVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6NTQwLCBoZWlnaHQ6NjAwXG5cdFx0XHRleHBlY3QoZGl2LmFzcGVjdFJhdGlvKS50by5lcXVhbCgwLjkpXG5cdFx0XHRcblx0XHRcdGRpdi5zdHlsZSB3aWR0aDo2MDAsIGhlaWdodDo2MDBcblx0XHRcdGV4cGVjdChkaXYuYXNwZWN0UmF0aW8pLnRvLmVxdWFsKDEpXG5cdFx0XHRcblx0XHRcdGRpdi5zdHlsZSB3aWR0aDozMDAsIGhlaWdodDo5MDBcblx0XHRcdGV4cGVjdChkaXYuYXNwZWN0UmF0aW8pLnRvLmVxdWFsKDAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMpXG5cblxuXHRcdHRlc3QgXCJJZiBvcHRpb25zLnN0eWxlQWZ0ZXJJbnNlcnQgaXMgcGFzc2VkLCBmdW5jdGlvbiBzdHlsZXMgd2lsbCBiZSBhcHBsaWVkIG9ubHkgYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXCIsICgpLT5cblx0XHRcdHBhcmVudE9wYWNpdHlHZXR0ZXIgPSAoKS0+IGlmIEBwYXJlbnQgdGhlbiBAcGFyZW50LnN0eWxlKCdvcGFjaXR5JykgZWxzZSAnMC41J1xuXHRcdFx0ZGl2UmVnID0gRG9tLmRpdihzdHlsZTp7aGVpZ2h0OicxOXB4Jywgb3BhY2l0eTpwYXJlbnRPcGFjaXR5R2V0dGVyfSlcblx0XHRcdGRpdkEgPSBEb20uZGl2KHN0eWxlOntoZWlnaHQ6JzE5cHgnLCBvcGFjaXR5OnBhcmVudE9wYWNpdHlHZXR0ZXJ9LCBzdHlsZUFmdGVySW5zZXJ0OnRydWUpXG5cdFx0XHRkaXZCID0gRG9tLmRpdihzdHlsZTp7aGVpZ2h0OicxOXB4Jywgb3BhY2l0eTpwYXJlbnRPcGFjaXR5R2V0dGVyfSwgc3R5bGVBZnRlckluc2VydDp0cnVlKVxuXHRcdFx0ZGl2QyA9IERvbS5kaXYoc3R5bGU6e2hlaWdodDonMTlweCcsIG9wYWNpdHk6cGFyZW50T3BhY2l0eUdldHRlcn0sIHN0eWxlQWZ0ZXJJbnNlcnQ6dHJ1ZSlcblxuXHRcdFx0Y2xhc3NOYW1lID0gZGl2UmVnLnJhdy5jbGFzc05hbWUgb3IgJ25vIGNsYXNzTmFtZSdcblx0XHRcdGV4cGVjdChkaXZSZWcucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoY2xhc3NOYW1lKVxuXHRcdFx0ZXhwZWN0KGRpdkEucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoY2xhc3NOYW1lKVxuXHRcdFx0ZXhwZWN0KGRpdkIucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoY2xhc3NOYW1lKVxuXHRcdFx0ZXhwZWN0KGRpdkMucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoY2xhc3NOYW1lKVxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnMC41Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuZWwuc3R5bGUub3BhY2l0eSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qy5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2QS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KGRpdkEuZWwuc3R5bGUub3BhY2l0eSkudG8uZXF1YWwoJzEnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuZWwuc3R5bGUub3BhY2l0eSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qy5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2Qi5pbnNlcnRCZWZvcmUoc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGV4cGVjdChkaXZCLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGV4cGVjdChkaXZDLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcnKVxuXHRcdFx0XG5cdFx0XHRzYW5kYm94LmFwcGVuZENoaWxkKGRpdkMuZWwpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnMScpXG5cdFx0XHRleHBlY3QoZGl2Qi5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnMScpXG5cdFx0XHRleHBlY3QoZGl2Qy5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2Qy5wYXJlbnRcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGV4cGVjdChkaXZCLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGV4cGVjdChkaXZDLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGRpdkMuYXBwZW5kVG8oc2FuZGJveClcblxuXG5cdFx0dGVzdCBcIkFueSBzdHlsZXMgYXBwbGllZCBieSBzdGF0ZXMgYmVmb3JlIHRoZSBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTSBhbmQgd2hlbiBvcHRpb25zLnN0eWxlQWZ0ZXJJbnNlcnQgaXMgb24gd2lsbCBiZSByZS1hcHBsaWVkIGFmdGVyIGluc2VydFwiLCAoKS0+XG5cdFx0XHRkaXZSZWcgPSBEb20uZGl2KHN0eWxlOnskYmFzZTp7aGVpZ2h0Oi0+JzE5cHgnfSwgJGZ1bm55OntoZWlnaHQ6LT4nMjlweCd9LCAkaGFwcHk6e2hlaWdodDotPiczOXB4J319KVxuXHRcdFx0ZGl2QSA9IERvbS5kaXYoc3R5bGU6eyRiYXNlOntoZWlnaHQ6LT4nMTlweCd9LCAkZnVubnk6e2hlaWdodDotPicyOXB4J30sICRoYXBweTp7aGVpZ2h0Oi0+JzM5cHgnfX0sIHN0eWxlQWZ0ZXJJbnNlcnQ6dHJ1ZSlcblxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcxOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cblx0XHRcdGRpdlJlZy5zdGF0ZSAnZnVubnknLCBvblxuXHRcdFx0ZGl2QS5zdGF0ZSAnZnVubnknLCBvblxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcyOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRcblx0XHRcdGRpdlJlZy5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2QS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCczOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRcblx0XHRcdGRpdlJlZy5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZGl2QS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCczOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzM5cHgnKVxuXG5cblx0XHR0ZXN0IFwiSWYgYW4gZWxlbWVudCB3aXRoIG9wdGlvbnMuc3R5bGVBZnRlckluc2VydCBpcyBhcHBlbmRlZCBpbnRvIGEgZGV0YWNoZWQgZWxlbWVudCwgc3R5bGVzIHdpbGwgYmUgYXBwbGllZCBvbmx5IGFmdGVyIHRoZSBwYXJlbnQgaXMgYXBwZW5kZWQgdG8gdGhlIERPTVwiLCAoKS0+XG5cdFx0XHRkZXRhY2hlZFBhcmVudCA9IERvbS5kaXYoKVxuXHRcdFx0ZGl2UmVnID0gRG9tLmRpdihzdHlsZTp7aGVpZ2h0OigtPicxOXB4JyksICRoYXBweTokcmVsYXhlZDp7d2lkdGg6LT4nMzFweCd9fSlcblx0XHRcdGRpdkEgPSBEb20uZGl2KHN0eWxlOntoZWlnaHQ6KC0+JzE5cHgnKSwgJGhhcHB5OiRyZWxheGVkOnt3aWR0aDotPiczMXB4J319LCBzdHlsZUFmdGVySW5zZXJ0OnRydWUpXG5cblx0XHRcdGRpdlJlZy5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2UmVnLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGRpdkEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdkEuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0ZGl2QS5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRkaXZBLnN0eWxlICd2aXNpYmlsaXR5JywgJ2hpZGRlbidcblxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcxOXB4Jylcblx0XHRcdGV4cGVjdChkaXZSZWcuZWwuc3R5bGUud2lkdGgpLnRvLmVxdWFsKCczMXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS53aWR0aCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS52aXNpYmlsaXR5KS50by5lcXVhbCgnaGlkZGVuJylcblxuXHRcdFx0ZGl2QS5hcHBlbmRUbyhkZXRhY2hlZFBhcmVudClcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS53aWR0aCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS52aXNpYmlsaXR5KS50by5lcXVhbCgnaGlkZGVuJylcblxuXHRcdFx0ZGV0YWNoZWRQYXJlbnQuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE5cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuZWwuc3R5bGUud2lkdGgpLnRvLmVxdWFsKCczMXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLnZpc2liaWxpdHkpLnRvLmVxdWFsKCdoaWRkZW4nKVxuXG5cblx0XHR0ZXN0IFwiUXVpY2tFbGVtZW50LnBpcGVTdGF0ZSBjYW4gYmUgdXNlZCB0byByZWRpcmVjdCBhbGwgc3RhdGUgdG9nZ2xlcyB0byB0aGUgcHJvdmlkZWQgdGFyZ2V0IGVsZW1lbnRcIiwgKCktPlxuXHRcdFx0cGFyZW50QSA9IERvbS5kaXYoKVxuXHRcdFx0cGFyZW50QiA9IERvbS5kaXYocGFzc1N0YXRlVG9DaGlsZHJlbjpmYWxzZSlcblx0XHRcdGRpdkEgPSBEb20uZGl2KG51bGwpLmFwcGVuZFRvKHBhcmVudEEpXG5cdFx0XHRkaXZCID0gRG9tLmRpdihudWxsKS5hcHBlbmRUbyhwYXJlbnRCKVxuXHRcdFx0Y2hpbGRBID0gRG9tLnNwYW4oKS5hcHBlbmRUbyhkaXZBKVxuXHRcdFx0Y2hpbGRCID0gRG9tLnNwYW4oKS5hcHBlbmRUbyhkaXZCKVxuXG5cdFx0XHRkaXZBLnBpcGVTdGF0ZSgpXG5cdFx0XHRkaXZBLnN0YXRlICcxJywgb25cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICcxJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnMScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICcxJykudG8uZXF1YWwgb25cblx0XHRcdFxuXHRcdFx0ZGl2QS5waXBlU3RhdGUocGFyZW50QSlcblx0XHRcdGRpdkEuc3RhdGUgJzInLCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEEuc3RhdGUgJzInKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3RhdGUgJzInKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnMicpLnRvLmVxdWFsIG9uXG5cblx0XHRcdGRpdkEucGlwZVN0YXRlKGZhbHNlKVxuXHRcdFx0ZGl2QS5zdGF0ZSAnMi41Jywgb25cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICcyLjUnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICcyLjUnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnMi41JykudG8uZXF1YWwgb25cblx0XHRcdFxuXHRcdFx0ZGl2Qi5waXBlU3RhdGUodHJ1ZSlcblx0XHRcdGRpdkIuc3RhdGUgJzMnLCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJzMnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICczJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChjaGlsZEIuc3RhdGUgJzMnKS50by5lcXVhbCBvblxuXHRcdFx0XG5cdFx0XHRkaXZCLnBpcGVTdGF0ZShwYXJlbnRCKVxuXHRcdFx0ZGl2Qi5zdGF0ZSAnNCcsIG9uXG5cdFx0XHRleHBlY3QocGFyZW50Qi5zdGF0ZSAnNCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoZGl2Qi5zdGF0ZSAnNCcpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5zdGF0ZSAnNCcpLnRvLmVxdWFsIG9mZlxuXHRcdFx0XG5cdFx0XHRkaXZBLnBpcGVTdGF0ZShwYXJlbnRCKVxuXHRcdFx0ZGl2QS5zdGF0ZSAnNScsIG9uXG5cdFx0XHRleHBlY3QocGFyZW50QS5zdGF0ZSAnNScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJzUnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3RhdGUgJzUnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICc1JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICc1JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRCLnN0YXRlICc1JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRcblx0XHRcdGRpdkEucGlwZVN0YXRlKGZhbHNlKVxuXHRcdFx0ZGl2Qi5waXBlU3RhdGUocGFyZW50QSlcblx0XHRcdGRpdkIuc3RhdGUgJzYnLCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEEuc3RhdGUgJzYnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJzYnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICc2JykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICc2JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICc2JykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChjaGlsZEIuc3RhdGUgJzYnKS50by5lcXVhbCBvZmZcblxuXG5cdFx0dGVzdCBcIlN0YXRlcyBjYW4gYmUgbWFya2VkIGFzIHVucGFzc2FibGUgdG8gYXZvaWQgcGFzc2luZyB0byBjaGlsZHJlbiBieSBpbmNsdWRpbmcgdGhlbSBpbiBvcHRpb25zLnVucGFzc2FibGVTdGF0ZXNcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdih1bnBhc3NhYmxlU3RhdGVzOiBbJ0InLCdEJ10pXG5cdFx0XHRzcGFuQSA9IERvbS5zcGFuKCkuYXBwZW5kVG8oZGl2KVxuXHRcdFx0c3BhbkIgPSBEb20uc3BhbigpLmFwcGVuZFRvKGRpdilcblx0XHRcdHN1YlNwYW4gPSBEb20uc3BhbigpLmFwcGVuZFRvKHNwYW5CKVxuXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdBJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3BhbkEuc3RhdGUgJ0EnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzcGFuQi5zdGF0ZSAnQScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YlNwYW4uc3RhdGUgJ0EnKS50by5lcXVhbCBvZmZcblxuXHRcdFx0ZGl2LnN0YXRlICdBJywgb25cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ0EnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHNwYW5BLnN0YXRlICdBJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzcGFuQi5zdGF0ZSAnQScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3ViU3Bhbi5zdGF0ZSAnQScpLnRvLmVxdWFsIG9uXG5cblx0XHRcdGRpdi5zdGF0ZSAnQicsIG9uXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdCJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzcGFuQS5zdGF0ZSAnQicpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHNwYW5CLnN0YXRlICdCJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViU3Bhbi5zdGF0ZSAnQicpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXYuc3RhdGUgJ0MnLCBvblxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnQycpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3BhbkEuc3RhdGUgJ0MnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHNwYW5CLnN0YXRlICdDJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzdWJTcGFuLnN0YXRlICdDJykudG8uZXF1YWwgb25cblxuXHRcdFx0ZGl2LnN0YXRlICdEJywgb25cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ0QnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHNwYW5BLnN0YXRlICdEJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3BhbkIuc3RhdGUgJ0QnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJTcGFuLnN0YXRlICdEJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRcblx0XHRcdHNwYW5CLnN0YXRlICdEJywgb25cblx0XHRcdGV4cGVjdChzcGFuQi5zdGF0ZSAnRCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3ViU3Bhbi5zdGF0ZSAnRCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnRCcsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnRCcpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHNwYW5CLnN0YXRlICdEJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzdWJTcGFuLnN0YXRlICdEJykudG8uZXF1YWwgb25cblxuXG5cdFx0dGVzdCBcIldoZW4gLnN0YXRlKCkgcmVjZWl2ZXMgYSB0cnV0aHkgdmFsdWUgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRoZSBldmVudCB3aWxsIGJ1YmJsZSB1cCB0byBwYXJlbnRzIGluc3RlYWQgb2YgY2FzY2FkZSB0byBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRwYXJlbnRBID0gRG9tLnNlY3Rpb24gbnVsbCxcblx0XHRcdFx0c3ViUGFyZW50QSA9IERvbS5kaXYgbnVsbCxcblx0XHRcdFx0XHRjaGlsZEEgPSBEb20uZGl2IG51bGwsXG5cdFx0XHRcdFx0XHRzdWJDaGlsZEEgPSBEb20uZGl2KClcblx0XHRcdFxuXHRcdFx0cGFyZW50QiA9IERvbS5zZWN0aW9uIG51bGwsXG5cdFx0XHRcdHN1YlBhcmVudEIgPSBEb20uZGl2IG51bGwsXG5cdFx0XHRcdFx0Y2hpbGRCID0gRG9tLmRpdiBudWxsLFxuXHRcdFx0XHRcdFx0c3ViQ2hpbGRCID0gRG9tLmRpdigpXG5cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViUGFyZW50QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJQYXJlbnRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChjaGlsZEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViQ2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblxuXHRcdFx0Y2hpbGRBLnN0YXRlICdoYXBweScsIG9uLCB0cnVlXG5cdFx0XHRjaGlsZEIuc3RhdGUgJ2hhcHB5Jywgb25cblxuXHRcdFx0ZXhwZWN0KHBhcmVudEEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChwYXJlbnRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YlBhcmVudEEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzdWJQYXJlbnRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJDaGlsZEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblxuXHRcdFx0Y2hpbGRBLnN0YXRlICdyZWxheGVkJywgb24sIG51bGxcblx0XHRcdGNoaWxkQi5zdGF0ZSAncmVsYXhlZCcsIG9uLCAnb24nXG5cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICdyZWxheGVkJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QocGFyZW50Qi5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3ViUGFyZW50QS5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YlBhcmVudEIuc3RhdGUgJ3JlbGF4ZWQnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoY2hpbGRCLnN0YXRlICdyZWxheGVkJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzdWJDaGlsZEEuc3RhdGUgJ3JlbGF4ZWQnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQi5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9mZlxuXG5cblx0XHR0ZXN0IFwib3B0aW9ucy5zdGF0ZVRyaWdnZXJzIGNvbmZpZyBvYmplY3RzIGNhbiBzcGVjaWZ5IGEgJ2ZvcmNlJyBwcm9wZXJ0eSB3aGljaCB3aWxsIG1ha2UgdGhlbSBnZXQgYXR0YWNoZWQgZXZlbiBpZiB0aGV5IGFyZW4ndCB1c2VkXCIsICgpLT5cblx0XHRcdGRpdkEgPSBEb20uZGl2IHN0YXRlVHJpZ2dlcnM6eydoYXBweSc6IG9uOidoYXBweU9OJywgb2ZmOidoYXBweU9GRicsIGZvcmNlOnRydWV9XG5cdFx0XHRkaXZCID0gRG9tLmRpdiBzdGF0ZVRyaWdnZXJzOnsnaGFwcHknOiBvbjonaGFwcHlPTicsIG9mZjonaGFwcHlPRkYnfVxuXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXZBLnJhdy5lbWl0RXZlbnQgJ2hhcHB5T04nXG5cdFx0XHRkaXZCLnJhdy5lbWl0RXZlbnQgJ2hhcHB5T04nXG5cblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoZGl2Qi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblxuXHRcdFx0ZGl2Qi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2QS5yYXcuZW1pdEV2ZW50ICdoYXBweU9GRidcblx0XHRcdGRpdkIucmF3LmVtaXRFdmVudCAnaGFwcHlPRkYnXG5cblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblxuXG5cdFx0dGVzdCBcIm9wdGlvbnMuc3RhdGVUcmlnZ2VycyBjb25maWcgb2JqZWN0cyBjYW4gc3BlY2lmeSBhICdidWJibGVzJyBwcm9wZXJ0eSB3aGljaCB3aWxsIGNhdXNlIHRoZSBzdGF0ZSB0byBidWJibGUgdG8gcGFyZW50cyBpbnN0ZWFkIG9mIGNhc2NhZGUgdG8gY2hpbGRyZW5cIiwgKCktPlxuXHRcdFx0cGFyZW50QSA9IERvbS5zZWN0aW9uIG51bGwsXG5cdFx0XHRcdHN1YlBhcmVudEEgPSBEb20uZGl2IG51bGwsXG5cdFx0XHRcdFx0Y2hpbGRBID0gRG9tLmRpdiBzdGF0ZVRyaWdnZXJzOnsnaGFwcHknOiBvbjonaGFwcHlPTicsIG9mZjonaGFwcHlPRkYnLCBidWJibGVzOnRydWUsIGZvcmNlOnRydWV9LFxuXHRcdFx0XHRcdFx0c3ViQ2hpbGRBID0gRG9tLmRpdigpXG5cdFx0XHRcblx0XHRcdHBhcmVudEIgPSBEb20uc2VjdGlvbiBudWxsLFxuXHRcdFx0XHRzdWJQYXJlbnRCID0gRG9tLmRpdiBudWxsLFxuXHRcdFx0XHRcdGNoaWxkQiA9IERvbS5kaXYgc3RhdGVUcmlnZ2Vyczp7J2hhcHB5Jzogb246J2hhcHB5T04nLCBvZmY6J2hhcHB5T0ZGJywgZm9yY2U6dHJ1ZX0sXG5cdFx0XHRcdFx0XHRzdWJDaGlsZEIgPSBEb20uZGl2KClcblxuXHRcdFx0ZXhwZWN0KHBhcmVudEEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QocGFyZW50Qi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJQYXJlbnRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YlBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJDaGlsZEEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViQ2hpbGRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRjaGlsZEEucmF3LmVtaXRFdmVudCAnaGFwcHlPTidcblx0XHRcdGNoaWxkQi5yYXcuZW1pdEV2ZW50ICdoYXBweU9OJ1xuXG5cdFx0XHRleHBlY3QocGFyZW50QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViUGFyZW50QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHN1YlBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoY2hpbGRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3ViQ2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXG5cdFx0XHRjaGlsZEEucmF3LmVtaXRFdmVudCAnaGFwcHlPRkYnXG5cdFx0XHRjaGlsZEIucmF3LmVtaXRFdmVudCAnaGFwcHlPRkYnXG5cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViUGFyZW50QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJQYXJlbnRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChjaGlsZEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViQ2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblxuXG5cdFx0dGVzdCBcIndyYXBwZXJzIGNyZWF0ZWQgZm9yIGV4aXN0aW5nIGVsZW1lbnRzIHNob3VsZCBhdHRlbXB0IHRvIHJlc29sdmUgaWYgaXRzIGluc2VydGVkIGludG8gdGhlIERPTSBvbiBpbml0XCIsICgpLT5cblx0XHRcdGRpdkFfID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jylcblx0XHRcdGRpdkJfID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jylcblx0XHRcdHNhbmRib3guYXBwZW5kQ2hpbGQoZGl2Ql8pXG5cdFx0XHRkaXZBID0gRG9tKGRpdkFfKVxuXHRcdFx0ZGl2QiA9IERvbShkaXZCXylcblxuXHRcdFx0ZGl2QV8uc3R5bGUuaGVpZ2h0ID0gJzEwMHB4J1xuXHRcdFx0ZGl2Ql8uc3R5bGUuaGVpZ2h0ID0gJzEwMHB4J1xuXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdkEuaGVpZ2h0KS50by5lcXVhbCgnbnVtYmVyJylcblx0XHRcdGV4cGVjdCh0eXBlb2YgZGl2Qi5oZWlnaHQpLnRvLmVxdWFsKCdudW1iZXInKVxuXHRcdFx0ZXhwZWN0KGlzTmFOIGRpdkEuaGVpZ2h0KS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoaXNOYU4gZGl2Qi5oZWlnaHQpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsICcxMDBweCdcblxuXG5cdFx0dGVzdCBcInN0YXRlLWJhc2VkIHRleHRcIiwgKCktPlxuXHRcdFx0ZGl2QSA9IERvbShcblx0XHRcdFx0WydkaXYnLCBudWxsLFxuXHRcdFx0XHRcdFsndGV4dCcsXG5cdFx0XHRcdFx0XHR0ZXh0OlxuXHRcdFx0XHRcdFx0XHQkYmFzZTogJ2FiYzEyMydcblx0XHRcdFx0XHRcdFx0JGhhcHB5OiAnSGFwcHknXG5cdFx0XHRcdFx0XHRcdCRyZWxheGVkOiAnUmVsYXhlZCdcblx0XHRcdFx0XHRdXG5cdFx0XHRcdF1cblx0XHRcdClcblx0XHRcdGRpdkIgPSBEb20oXG5cdFx0XHRcdFsnZGl2JywgbnVsbCxcblx0XHRcdFx0XHRbJ3RleHQnLFxuXHRcdFx0XHRcdFx0dGV4dDpcblx0XHRcdFx0XHRcdFx0JGhhcHB5OiAnSGFwcHknXG5cdFx0XHRcdFx0XHRcdCRyZWxheGVkOiAnUmVsYXhlZCdcblx0XHRcdFx0XHRcdFx0JyRyZWxheGVkK2Z1bm55JzogJ0Z1bm55ICYgUmVsYXhlZCdcblx0XHRcdFx0XHRdXG5cdFx0XHRcdF1cblx0XHRcdClcblx0XHRcdGRpdkMgPSBEb20uZGl2KHRleHQ6eyRiYXNlOidkZWY0NTYnLCAkaGFwcHk6J2doaTc4OSd9KVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2QS50ZXh0KS50by5lcXVhbCAnYWJjMTIzJ1xuXHRcdFx0ZXhwZWN0KGRpdkIudGV4dCkudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXZDLnRleHQpLnRvLmVxdWFsICdkZWY0NTYnXG5cdFx0XHRcblx0XHRcdGRpdkEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdkIuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdkMuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdIYXBweSdcblx0XHRcdGV4cGVjdChkaXZCLnRleHQpLnRvLmVxdWFsICdIYXBweSdcblx0XHRcdGV4cGVjdChkaXZDLnRleHQpLnRvLmVxdWFsICdnaGk3ODknXG5cdFx0XHRcblx0XHRcdGRpdkEuc3RhdGUgJ2hhcHB5Jywgb2ZmXG5cdFx0XHRkaXZCLnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0ZGl2Qy5zdGF0ZSAnaGFwcHknLCBvZmZcblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdhYmMxMjMnXG5cdFx0XHRleHBlY3QoZGl2Qi50ZXh0KS50by5lcXVhbCAnJ1xuXHRcdFx0ZXhwZWN0KGRpdkMudGV4dCkudG8uZXF1YWwgJ2RlZjQ1Nidcblx0XHRcdFxuXHRcdFx0ZGl2QS5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRkaXZCLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdSZWxheGVkJ1xuXHRcdFx0ZXhwZWN0KGRpdkIudGV4dCkudG8uZXF1YWwgJ1JlbGF4ZWQnXG5cdFx0XHRcblx0XHRcdGRpdkEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdkIuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdSZWxheGVkJ1xuXHRcdFx0ZXhwZWN0KGRpdkIudGV4dCkudG8uZXF1YWwgJ1JlbGF4ZWQnXG5cdFx0XHRcblx0XHRcdGRpdkEuc3RhdGUgJ3JlbGF4ZWQnLCBvZmZcblx0XHRcdGRpdkIuc3RhdGUgJ3JlbGF4ZWQnLCBvZmZcblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdIYXBweSdcblx0XHRcdGV4cGVjdChkaXZCLnRleHQpLnRvLmVxdWFsICdIYXBweSdcblx0XHRcdFxuXHRcdFx0ZGl2Qi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRkaXZCLnN0YXRlICdmdW5ueScsIG9uXG5cdFx0XHRleHBlY3QoZGl2Qi50ZXh0KS50by5lcXVhbCAnUmVsYXhlZCdcblxuXHRcdFx0ZGl2Qi5zdGF0ZSAncmVsYXhlZCtmdW5ueScsIG9uXG5cdFx0XHRleHBlY3QoZGl2Qi50ZXh0KS50by5lcXVhbCAnRnVubnkgJiBSZWxheGVkJ1xuXG5cblx0XHR0ZXN0IFwic3RhdGUgY2hhbmdlcyB3aWxsIGVtaXQgYSBwcml2YXRlIHN0YXRlQ2hhbmdlOjxzdGF0ZT4gZXZlbnRcIiwgKCktPlxuXHRcdFx0cmVzdWx0cyA9IFtdXG5cdFx0XHRkaXYgPSBEb20uZGl2IHN0eWxlOlxuXHRcdFx0XHRjb2xvcjogJ3doaXRlJ1xuXHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdCRoYXBweTogY29sb3I6ICdibGFjaydcblx0XHRcdFxuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2FueScsIG9uXG5cdFx0XHRkaXYub24gJ3N0YXRlQ2hhbmdlOmhhcHB5JywgKHN0YXRlKS0+IHJlc3VsdHMucHVzaCBbJ2hhcHB5Jywgc3RhdGVdXG5cdFx0XHRkaXYub24gJ3N0YXRlQ2hhbmdlOnJlbGF4ZWQnLCAoc3RhdGUpLT4gcmVzdWx0cy5wdXNoIFsncmVsYXhlZCcsIHN0YXRlXVxuXHRcdFx0ZGl2Lm9uICdzdGF0ZUNoYW5nZTphcmJpdHJhcnknLCAoc3RhdGUpLT4gcmVzdWx0cy5wdXNoIFsnYXJiaXRyYXJ5Jywgc3RhdGVdXG5cdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbCBbXVxuXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl1dXG5cblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvZmZcblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl1dXG5cblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZXhwZWN0KHJlc3VsdHMpLnRvLmRlZXAuZXF1YWwgW1snaGFwcHknLG9uXSwgWydoYXBweScsb2ZmXSwgWydoYXBweScsb25dXVxuXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl0sIFsnaGFwcHknLG9uXV1cblxuXHRcdFx0ZGl2LnN0YXRlICdhbm90aGVyJywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl0sIFsnaGFwcHknLG9uXV1cblxuXHRcdFx0ZGl2LnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl0sIFsnaGFwcHknLG9uXSwgWydyZWxheGVkJyxvbl1dXG5cblx0XHRcdGRpdi5zdGF0ZSAnYXJiaXRyYXJ5Jywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl0sIFsnaGFwcHknLG9uXSwgWydyZWxheGVkJyxvbl0sIFsnYXJiaXRyYXJ5Jyxvbl1dXG5cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbCBbWydoYXBweScsb25dLCBbJ2hhcHB5JyxvZmZdLCBbJ2hhcHB5Jyxvbl0sIFsncmVsYXhlZCcsb25dLCBbJ2FyYml0cmFyeScsb25dXVxuXG5cblx0XHR0ZXN0IFwic3RhdGUtYmFzZWQgc3R5bGVzIGNhbiBiZSB1cGRhdGVkIHZpYSBRdWlja0VsZW1lbnQudXBkYXRlU3RhdGVTdHlsZXNcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdihzdHlsZTpcblx0XHRcdFx0d2lkdGg6IDVcblx0XHRcdFx0aGVpZ2h0OiA1XG5cdFx0XHRcdG1hcmdpblRvcDogNVxuXHRcdFx0XHQkaGFwcHk6XG5cdFx0XHRcdFx0bWFyZ2luVG9wOiAxMFxuXHRcdFx0XHQkcmVsYXhlZDpcblx0XHRcdFx0XHRtYXJnaW5Ub3A6IDIwXG5cdFx0XHRcdFx0d2lkdGg6IDIwXG5cdFx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdFx0aGVpZ2h0OiA0MFxuXHRcdFx0XHRcdFx0bWFyZ2luVG9wOiA0MFxuXHRcdFx0XHQkc29tZXRoaW5nRWxzZTpcblx0XHRcdFx0XHR3aWR0aDogNjBcblx0XHRcdFx0XHRtYXJnaW5Ub3A6IDYwXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRnZXRTdHlsZXMgPSAoKS0+IHdpZHRoOmRpdi5zdHlsZSgnd2lkdGgnKSwgaGVpZ2h0OmRpdi5zdHlsZSgnaGVpZ2h0JyksIG1hcmdpblRvcDpkaXYuc3R5bGUoJ21hcmdpblRvcCcpXG5cblx0XHRcdGV4cGVjdChnZXRTdHlsZXMoKSkudG8uZXFsIHdpZHRoOic1cHgnLCBoZWlnaHQ6JzVweCcsIG1hcmdpblRvcDonNXB4J1xuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChnZXRTdHlsZXMoKSkudG8uZXFsIHdpZHRoOic1cHgnLCBoZWlnaHQ6JzVweCcsIG1hcmdpblRvcDonMTBweCdcblx0XHRcdFxuXHRcdFx0ZGl2LnVwZGF0ZVN0YXRlU3R5bGVzIHt3aWR0aDo3LCBoZWlnaHQ6OCwgJGhhcHB5OnttYXJnaW5Ub3A6MTIsIGhlaWdodDoxMn19XG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonN3B4JywgaGVpZ2h0OicxMnB4JywgbWFyZ2luVG9wOicxMnB4J1xuXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb2ZmXG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonN3B4JywgaGVpZ2h0Oic4cHgnLCBtYXJnaW5Ub3A6JzVweCdcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonN3B4JywgaGVpZ2h0OicxMnB4JywgbWFyZ2luVG9wOicxMnB4J1xuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0XG5cdFx0XHRkaXYudXBkYXRlU3RhdGVTdHlsZXNcblx0XHRcdFx0JGJhc2U6XG5cdFx0XHRcdFx0d2lkdGg6IDJcblx0XHRcdFx0XHRoZWlnaHQ6IDlcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAyMFxuXHRcdFx0XHRcdCRoYXBweTpcblx0XHRcdFx0XHRcdHdpZHRoOiA0MFxuXHRcdFx0XHRcdFx0bWFyZ2luVG9wOiAtPiA0NVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonMnB4JywgaGVpZ2h0Oic5cHgnLCBtYXJnaW5Ub3A6JzVweCdcblxuXHRcdFx0ZGl2LnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChnZXRTdHlsZXMoKSkudG8uZXFsIHdpZHRoOicyMHB4JywgaGVpZ2h0OicyMHB4JywgbWFyZ2luVG9wOicyMHB4J1xuXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChnZXRTdHlsZXMoKSkudG8uZXFsIHdpZHRoOic0MHB4JywgaGVpZ2h0Oic0MHB4JywgbWFyZ2luVG9wOic0NXB4J1xuXG5cdFx0XHRkaXYuc3RhdGUge2hhcHB5Om9mZiwgcmVsYXhlZDpvZmZ9XG5cdFx0XHRkaXYuZWwuc3R5bGUubWFyZ2luVG9wID0gbnVsbFxuXHRcdFx0ZXhwZWN0KGdldFN0eWxlcygpKS50by5lcWwgd2lkdGg6JzJweCcsIGhlaWdodDonOXB4JywgbWFyZ2luVG9wOic1cHgnXG5cblx0XHRcdGRpdi5zdGF0ZSAnc29tZXRoaW5nRWxzZScsIG9uXG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonNjBweCcsIGhlaWdodDonOXB4JywgbWFyZ2luVG9wOic2MHB4J1xuXG5cblx0XHR0ZXN0IFwiZGVmYXVsdCBzdGF0ZXMgdG8gYXBwbHkgdG8gYW4gZWxlbWVudCB1cG9uIGNyZWF0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdmlhIG9wdGlvbnMuc3RhdGUgbWFwcGluZ1wiLCAoKS0+XG5cdFx0XHRlbDEgPSBET00uZGl2KClcblx0XHRcdGVsMiA9IERPTS5kaXYoc3RhdGU6e2hhcHB5Om9uLCByZWxheGVkOm9mZn0pXG5cdFx0XHRlbDMgPSBET00uZGl2KHN0YXRlOntyZWxheGVkOm9ufSlcblx0XHRcdGV4cGVjdChlbDEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoZWwxLnN0YXRlICdyZWxheGVkJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoZWwyLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoZWwyLnN0YXRlICdyZWxheGVkJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoZWwzLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGVsMy5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9uXG5cblxuXG5cdHN1aXRlIFwiTWVkaWEgUXVlcmllc1wiLCAoKS0+XG5cdFx0c3VpdGVUZWFyZG93biAoKS0+IGRpbWVuc2lvbnMucmVzdG9yZSgpIGlmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnaW5uZXJXaWR0aCcpPy5jb25maWd1cmFibGVcblx0XHRzdWl0ZVNldHVwICgpLT4gQHNraXAoKSBpZiBub3QgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdpbm5lcldpZHRoJyk/LmNvbmZpZ3VyYWJsZVxuXHRcdHRlYXJkb3duICgpLT4gRG9tLkNTUy5jbGVhclJlZ2lzdGVyZWQobGV2ZWwpIGZvciBsZXZlbCBpbiBbMC4uM11cblxuXG5cdFx0dGVzdCBcIldpbmRvdyBkaW1lbnNpb25zXCIsICgpLT5cblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoMTAwMCwgMTAwMClcblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHBvc2l0aW9uOiAncmVsYXRpdmUnXG5cdFx0XHRcdHpJbmRleDogMlxuXHRcdFx0XHR3aWR0aDogJzMwMHB4J1xuXHRcdFx0XHRoZWlnaHQ6ICczMDBweCdcblx0XHRcdFx0Zm9udFNpemU6ICczMHB4J1xuXHRcdFx0XHRsaW5lSGVpZ2h0OiAnMzBweCdcblxuXHRcdFx0XHQnQHdpbmRvdyhvcmllbnRhdGlvbjpsYW5kc2NhcGUpJzpcblx0XHRcdFx0XHRtYXJnaW5Ub3A6IDZcblxuXHRcdFx0XHQnQHdpbmRvdyhvcmllbnRhdGlvbjpwb3J0cmFpdCknOlxuXHRcdFx0XHRcdG1hcmdpblRvcDogN1xuXG5cdFx0XHRcdCdAd2luZG93KG1heC13aWR0aDo4MDApJzpcblx0XHRcdFx0XHR6SW5kZXg6IDNcblx0XHRcdFx0XHR3aWR0aDogJzI4MHB4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0B3aW5kb3cobWF4LXdpZHRoOjcwMCwgbWF4LWhlaWdodDoxMDAwKSc6XG5cdFx0XHRcdFx0ekluZGV4OiA0XG5cdFx0XHRcdFx0d2lkdGg6ICcyNTBweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICcyNTBweCdcblx0XHRcdFx0XG5cdFx0XHRcdCdAd2luZG93KG1heC1oZWlnaHQ6MTAwMCknOlxuXHRcdFx0XHRcdGZvbnRTaXplOiAnMjVweCdcblx0XHRcdFx0XG5cdFx0XHRcdCdAd2luZG93KG1pbi13aWR0aDo5MDBweCknOlxuXHRcdFx0XHRcdGZvbnRTaXplOiAnMjNweCdcblx0XHRcdFx0XG5cdFx0XHRcdCdAd2luZG93KGFzcGVjdC1yYXRpbzowLjUpJzpcblx0XHRcdFx0XHRmb250U2l6ZTogJzIxcHgnXG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzEycHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHdpbmRvdyhtaW4taGVpZ2h0OjEyMDApJzpcblx0XHRcdFx0XHRmb250U2l6ZTogJzIwcHgnXG5cblx0XHRcdGRpdi5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMidcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzMwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzMwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjNweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblRvcCcpLnRvLmVxdWFsICc3cHgnXG5cdFx0XHRcblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoOTAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjNweCdcblx0XHRcdFxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg4OTkpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICcyNXB4J1xuXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDg5OSwgMTEwMClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzMwcHgnXG5cblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoOTUwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjNweCdcblxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg5NTAsIDE5MDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICcyMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbGluZUhlaWdodCcpLnRvLmVxdWFsICcxMnB4J1xuXHRcdFx0XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDk1MCwgMTg5OSlcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzIwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzMwcHgnXG5cblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoNzkwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnekluZGV4JykudG8uZXF1YWwgJzMnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsICcyODBweCdcblxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg4MTApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMidcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzMwMHB4J1xuXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDc5MSlcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICczJ1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMjgwcHgnXG5cblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoNzAxLCA5MDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMydcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzI4MHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzMwMHB4J1xuXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDcwMCwgOTAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnekluZGV4JykudG8uZXF1YWwgJzQnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsICcyNTBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsICcyNTBweCdcblxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg3MDAsIDEwMDEpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMydcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzI4MHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzMwMHB4J1xuXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDcwMCwgMTAwMClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMjUwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCAnMjUwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5Ub3AnKS50by5lcXVhbCAnN3B4J1xuXHRcdFx0XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDExMDAsIDEwMDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5Ub3AnKS50by5lcXVhbCAnNnB4J1xuXHRcdFx0XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDExMDAsIDExMDEpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5Ub3AnKS50by5lcXVhbCAnN3B4J1xuXG5cblx0XHR0ZXN0IFwiU2VsZiBkaW1lbnNpb25zL3N0eWxlc1wiLCAoKS0+XG5cdFx0XHRwYXJlbnQgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdHNpbXVsYXRlUGFyZW50ID0gKHdpZHRoLCBoZWlnaHQpLT5cblx0XHRcdFx0cGFyZW50LnN0eWxlICd3aWR0aCcsIHdpZHRoIGlmIHdpZHRoXG5cdFx0XHRcdHBhcmVudC5zdHlsZSAnaGVpZ2h0JywgaGVpZ2h0IGlmIGhlaWdodFxuXHRcdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKClcblx0XHRcdFxuXHRcdFx0ZGl2ID0gRG9tLmRpdiBzdHlsZTpcblx0XHRcdFx0cG9zaXRpb246ICdyZWxhdGl2ZSdcblx0XHRcdFx0ekluZGV4OiAyXG5cdFx0XHRcdHRvcDogJzMwcHgnXG5cdFx0XHRcdHdpZHRoOiAnMTAwJSdcblx0XHRcdFx0aGVpZ2h0OiAnMTAwJSdcblx0XHRcdFx0Zm9udFNpemU6ICczMHB4J1xuXHRcdFx0XHRsaW5lSGVpZ2h0OiAnMzBweCdcblxuXHRcdFx0XHQnQHNlbGYob3JpZW50YXRpb246bGFuZHNjYXBlKSc6XG5cdFx0XHRcdFx0bWFyZ2luVG9wOiA2XG5cblx0XHRcdFx0J0BzZWxmKG9yaWVudGF0aW9uOnBvcnRyYWl0KSc6XG5cdFx0XHRcdFx0bWFyZ2luVG9wOiA3XG5cdFx0XHRcdFxuXHRcdFx0XHQnQHNlbGYocG9zaXRpb246cmVsYXRpdmUpJzpcblx0XHRcdFx0XHR0b3A6ICcyMHB4J1xuXG5cdFx0XHRcdCdAc2VsZihtYXgtd2lkdGg6MzUwKSc6XG5cdFx0XHRcdFx0ekluZGV4OiAzXG5cdFx0XHRcdFx0Zm9udFNpemU6ICczM3B4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BzZWxmKG1heC13aWR0aDo1MDAsIG1pbi1oZWlnaHQ6NDAwKSc6XG5cdFx0XHRcdFx0ekluZGV4OiA0XG5cdFx0XHRcdFx0Zm9udFNpemU6ICcyN3B4J1xuXHRcdFx0XHRcdGxpbmVIZWlnaHQ6ICczN3B4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BzZWxmKHpJbmRleDo0KSc6XG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzE1cHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHNlbGYobWluLXpJbmRleDo2KSc6XG5cdFx0XHRcdFx0b3BhY2l0eTogJzAnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHNlbGYobWF4LWZvbnRTaXplOjIwKSc6XG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzE5cHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHNlbGYobWluLXdpZHRoOjYwMHB4KSc6XG5cdFx0XHRcdFx0Zm9udFNpemU6ICcxOXB4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BzZWxmKGFzcGVjdC1yYXRpbzoyLjI1KSc6XG5cdFx0XHRcdFx0Zm9udFNpemU6ICcyMnB4J1xuXHRcdFx0XHRcdGxpbmVIZWlnaHQ6ICcxMnB4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BzZWxmKG1pbi1oZWlnaHQ6NzAwKSc6XG5cdFx0XHRcdFx0Zm9udFNpemU6ICc0MHB4J1xuXG5cdFx0XHRzaW11bGF0ZVBhcmVudCg0MDAsIDMwMClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnQpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMidcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzQwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzMwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMzBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMzBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblRvcCcpLnRvLmVxdWFsICc2cHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd0b3AnKS50by5lcXVhbCAnMjBweCdcblx0XHRcdFxuXHRcdFx0c2ltdWxhdGVQYXJlbnQoMzQ5LCA0MjApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnNCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzI3cHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzE1cHgnXG5cdFx0XHRcblx0XHRcdHNpbXVsYXRlUGFyZW50KDM0OSwgMzk5KVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnekluZGV4JykudG8uZXF1YWwgJzMnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICczM3B4J1xuXHRcdFx0XG5cdFx0XHRzaW11bGF0ZVBhcmVudCgzNDksIDQwMSlcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjdweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMTVweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ29wYWNpdHknKS50by5lcXVhbCAnMSdcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlKCd6SW5kZXgnLCA1KVxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdvcGFjaXR5JykudG8uZXF1YWwgJzEnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzM3cHgnXG5cdFx0XHRcblx0XHRcdGRpdi5zdHlsZSgnekluZGV4JywgMTcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdvcGFjaXR5JykudG8uZXF1YWwgJzEnXG5cdFx0XHRcblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnb3BhY2l0eScpLnRvLmVxdWFsICcwJ1xuXG5cdFx0XHRzaW11bGF0ZVBhcmVudCg5MDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICcxOXB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbGluZUhlaWdodCcpLnRvLmVxdWFsICczMHB4J1xuXHRcdFx0XG5cdFx0XHRzaW11bGF0ZVBhcmVudCg5MDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzE5cHgnXG5cdFx0XHRcblx0XHRcdHNpbXVsYXRlUGFyZW50KDkwMCwgNDAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjJweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMTJweCdcblx0XHRcdFxuXHRcdFx0c2ltdWxhdGVQYXJlbnQoMjAyNSwgOTAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnNDBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMTJweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblRvcCcpLnRvLmVxdWFsICc2cHgnXG5cdFx0XHRcblx0XHRcdHNpbXVsYXRlUGFyZW50KDIwMjUsIDIwMjYpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5Ub3AnKS50by5lcXVhbCAnN3B4J1xuXG5cblx0XHR0ZXN0IFwiUGFyZW50IGRpbWVuc2lvbnMvc3R5bGVzXCIsICgpLT5cblx0XHRcdHBhcmVudCA9IERvbS5kaXYoc3R5bGU6e3Bvc2l0aW9uOidhYnNvbHV0ZSd9KS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0c2ltdWxhdGVQYXJlbnQgPSAod2lkdGgsIGhlaWdodCktPlxuXHRcdFx0XHRwYXJlbnQuc3R5bGUgJ3dpZHRoJywgd2lkdGggaWYgd2lkdGhcblx0XHRcdFx0cGFyZW50LnN0eWxlICdoZWlnaHQnLCBoZWlnaHQgaWYgaGVpZ2h0XG5cdFx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoKVxuXHRcdFx0XG5cdFx0XHRkaXYgPSBEb20uZGl2IHN0eWxlOlxuXHRcdFx0XHRwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuXHRcdFx0XHR6SW5kZXg6IDJcblx0XHRcdFx0dG9wOiAnMzBweCdcblx0XHRcdFx0d2lkdGg6ICc0MDBweCdcblx0XHRcdFx0aGVpZ2h0OiAnMzAwcHgnXG5cdFx0XHRcdGZvbnRTaXplOiAnMzBweCdcblx0XHRcdFx0bGluZUhlaWdodDogJzMwcHgnXG5cblx0XHRcdFx0J0BwYXJlbnQob3JpZW50YXRpb246bGFuZHNjYXBlKSc6XG5cdFx0XHRcdFx0bWFyZ2luQm90dG9tOiA2XG5cblx0XHRcdFx0J0BwYXJlbnQob3JpZW50YXRpb246cG9ydHJhaXQpJzpcblx0XHRcdFx0XHRtYXJnaW5Cb3R0b206IDdcblx0XHRcdFx0XG5cdFx0XHRcdCdAcGFyZW50KHBvc2l0aW9uOnJlbGF0aXZlKSc6XG5cdFx0XHRcdFx0dG9wOiAnMjFweCdcblxuXHRcdFx0XHQnQHBhcmVudChtYXgtd2lkdGg6MzUwKSc6XG5cdFx0XHRcdFx0ekluZGV4OiAzXG5cdFx0XHRcdFx0Zm9udFNpemU6ICczNHB4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BwYXJlbnQobWF4LXdpZHRoOjUwMCwgbWluLWhlaWdodDo0MDApJzpcblx0XHRcdFx0XHR6SW5kZXg6IDRcblx0XHRcdFx0XHRmb250U2l6ZTogJzI3cHgnXG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzM3cHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHBhcmVudCh6SW5kZXg6NyknOlxuXHRcdFx0XHRcdGxpbmVIZWlnaHQ6ICcxNnB4J1xuXG5cblx0XHRcdHNpbXVsYXRlUGFyZW50KDQwMCwgMzAwKVxuXHRcdFx0ZGl2LmFwcGVuZFRvKHBhcmVudClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICcyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnNDAwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCAnMzAwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICczMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbGluZUhlaWdodCcpLnRvLmVxdWFsICczMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbWFyZ2luQm90dG9tJykudG8uZXF1YWwgJzZweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3RvcCcpLnRvLmVxdWFsICczMHB4J1xuXG5cdFx0XHRwYXJlbnQuc3R5bGUgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJ1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAndG9wJykudG8uZXF1YWwgJzMwcHgnXG5cblx0XHRcdHNpbXVsYXRlUGFyZW50KClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3RvcCcpLnRvLmVxdWFsICcyMXB4J1xuXG5cdFx0XHRzaW11bGF0ZVBhcmVudCgzNDksIDQyMClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjdweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMzdweCdcblx0XHRcdFxuXHRcdFx0c2ltdWxhdGVQYXJlbnQoMzQ5LCAzOTkpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMydcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzM0cHgnXG5cdFx0XHRcblx0XHRcdHBhcmVudC5zdHlsZSAnekluZGV4JywgJzcnXG5cdFx0XHRzaW11bGF0ZVBhcmVudCgzNDksIDQwMSlcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjdweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMTZweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ29wYWNpdHknKS50by5lcXVhbCAnMSdcblxuXG5cdFx0dGVzdCBcIlBhcmVudCBSZWYgZGltZW5zaW9ucy9zdHlsZXNcIiwgKCktPlxuXHRcdFx0cGFyZW50ID1cblx0XHRcdFx0RG9tLmRpdih7cmVmOidhYmMnfSxcblx0XHRcdFx0XHREb20uZGl2IHtpZDonZGVmJ30sXG5cdFx0XHRcdFx0XHREb20uZGl2IHtyZWY6J2doaSd9XG5cdFx0XHRcdCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdFxuXHRcdFx0ZGl2ID0gRG9tLmRpdiBzdHlsZTpcblx0XHRcdFx0cG9zaXRpb246ICdyZWxhdGl2ZSdcblx0XHRcdFx0ekluZGV4OiAyXG5cdFx0XHRcdHRvcDogJzMwcHgnXG5cdFx0XHRcdHdpZHRoOiAnNDAwcHgnXG5cdFx0XHRcdGhlaWdodDogJzMwMHB4J1xuXHRcdFx0XHRmb250U2l6ZTogJzMwcHgnXG5cdFx0XHRcdGxpbmVIZWlnaHQ6ICczMHB4J1xuXG5cdFx0XHRcdCdAI2FiYyhvcmllbnRhdGlvbjpsYW5kc2NhcGUpJzpcblx0XHRcdFx0XHRmb250V2VpZ2h0OiA2MDBcblxuXHRcdFx0XHQnQCNhYmMob3JpZW50YXRpb246cG9ydHJhaXQpJzpcblx0XHRcdFx0XHRmb250V2VpZ2h0OiA1MDBcblx0XHRcdFx0XG5cdFx0XHRcdCdAI2RlZihwb3NpdGlvbjpyZWxhdGl2ZSknOlxuXHRcdFx0XHRcdHRvcDogJzIwcHgnXG5cblx0XHRcdFx0J0AjZGVmKG1heC13aWR0aDozNTApJzpcblx0XHRcdFx0XHR6SW5kZXg6IDNcblx0XHRcdFx0XHRmb250U2l6ZTogJzMzcHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQCNnaGkobWF4LXdpZHRoOjUwMCwgbWluLWhlaWdodDo0MDApJzpcblx0XHRcdFx0XHR6SW5kZXg6IDRcblx0XHRcdFx0XHRmb250U2l6ZTogJzI3cHgnXG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzM3cHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQCNhYmMoekluZGV4OjcpJzpcblx0XHRcdFx0XHRsaW5lSGVpZ2h0OiAnMTVweCdcblxuXG5cdFx0XHRwYXJlbnQuc3R5bGUod2lkdGg6NDAwLCBoZWlnaHQ6MzAwKVxuXHRcdFx0cGFyZW50LmNoaWxkLmRlZi5zdHlsZSh3aWR0aDo0MDAsIGhlaWdodDozMDApXG5cdFx0XHRwYXJlbnQuY2hpbGQuZ2hpLnN0eWxlKHdpZHRoOjQwMCwgaGVpZ2h0OjMwMClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnQuY2hpbGQuZ2hpKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnekluZGV4JykudG8uZXF1YWwgJzInXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsICc0MDBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsICczMDBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzMwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzMwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250V2VpZ2h0JykudG8uZXF1YWwgJzYwMCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3RvcCcpLnRvLmVxdWFsICczMHB4J1xuXG5cdFx0XHRwYXJlbnQuc3R5bGUod2lkdGg6NDAwLCBoZWlnaHQ6OTAwLCBwb3NpdGlvbjoncmVsYXRpdmUnKVxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250V2VpZ2h0JykudG8uZXF1YWwgJzUwMCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3RvcCcpLnRvLmVxdWFsICczMHB4J1xuXHRcdFx0XG5cdFx0XHRwYXJlbnQuY2hpbGQuZGVmLnN0eWxlKHBvc2l0aW9uOidyZWxhdGl2ZScpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd0b3AnKS50by5lcXVhbCAnMzBweCdcblxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd0b3AnKS50by5lcXVhbCAnMjBweCdcblxuXHRcdFx0cGFyZW50LmNoaWxkLmRlZi5zdHlsZSh3aWR0aDozNDksIGhlaWdodDo0MjApXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICczJ1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMzNweCdcblx0XHRcdFxuXHRcdFx0cGFyZW50LmNoaWxkLmdoaS5zdHlsZSh3aWR0aDo0NTAsIGhlaWdodDo0MjApXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjdweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMzdweCdcblx0XHRcdFxuXHRcdFx0cGFyZW50LnN0eWxlKHpJbmRleDo3KVxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnNCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzI3cHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzE1cHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdvcGFjaXR5JykudG8uZXF1YWwgJzEnXG5cblxuXHRcdHRlc3QgXCJOZXN0ZWQgbWVkaWEgcXVlcmllc1wiLCAoKS0+XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDEwMDAsIDkwMClcblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHpJbmRleDogMlxuXG5cdFx0XHRcdCRoYXBweTpcblx0XHRcdFx0XHRtYXJnaW5SaWdodDogNVxuXHRcdFx0XHRcdCdAd2luZG93KG9yaWVudGF0aW9uOmxhbmRzY2FwZSknOlxuXHRcdFx0XHRcdFx0bWFyZ2luUmlnaHQ6IDZcblxuXHRcdFx0XHQnQHdpbmRvdyhvcmllbnRhdGlvbjpwb3J0cmFpdCknOlxuXHRcdFx0XHRcdCRyZWxheGVkOlxuXHRcdFx0XHRcdFx0bWFyZ2luUmlnaHQ6IDdcblxuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdFxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbWFyZ2luUmlnaHQnKS50by5lcXVhbCAnMHB4J1xuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblJpZ2h0JykudG8uZXF1YWwgJzZweCdcblx0XHRcdFxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg5MDAsIDEwMDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5SaWdodCcpLnRvLmVxdWFsICc1cHgnXG5cdFx0XHRcblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoMTAwMCwgOTAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbWFyZ2luUmlnaHQnKS50by5lcXVhbCAnNnB4J1xuXG5cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5SaWdodCcpLnRvLmVxdWFsICc2cHgnXG5cdFx0XHRcblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoOTAwLCAxMDAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbWFyZ2luUmlnaHQnKS50by5lcXVhbCAnN3B4J1xuXHRcdFx0XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDEwMDAsIDkwMClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblJpZ2h0JykudG8uZXF1YWwgJzZweCdcblxuXG5cblxuXG5cblx0c3VpdGUgXCJUcmF2ZXJzYWxcIiwgKCktPlxuXHRcdHRlc3QgXCJDaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsIERvbS5kaXYoKSwgJ1NvbWUgVGV4dCcpXG5cblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbGVtZW50Q2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMilcblxuXHRcdFx0ZGl2LmFwcGVuZChEb20uc3BhbigpKVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QoZGl2LmVsZW1lbnRDaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZGl2LmVsLmNoaWxkTm9kZXMubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0XG5cdFx0XHRkaXYuZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoNClcblx0XHRcdGV4cGVjdChkaXYuZWxlbWVudENoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChkaXYuZWwuY2hpbGROb2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDQpXG5cblx0XHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdFx0XHRzcGFuQSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuXHRcdFx0c3BhbkIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcblx0XHRcdHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnc29tZVRleHROb2RlJylcblx0XHRcdGNvbW1lbnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCdzb21lQ29tbWVudE5vZGUnKVxuXHRcdFx0XG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoc3BhbkEpXG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoY29tbWVudClcblx0XHRcdGRpdi5hcHBlbmRDaGlsZChzcGFuQilcblx0XHRcdGRpdi5hcHBlbmRDaGlsZCh0ZXh0KVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoNClcblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXG5cdFx0XHRkaXYkID0gRG9tKGRpdilcblx0XHRcdGV4cGVjdChkaXYkLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChkaXYkLmVsZW1lbnRDaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZGl2JC5jaGlsZHJlblswXS5yYXcpLnRvLmVxdWFsKHNwYW5BKVxuXHRcdFx0ZXhwZWN0KGRpdiQuY2hpbGRyZW5bMV0ucmF3KS50by5lcXVhbChzcGFuQilcblx0XHRcdGV4cGVjdChkaXYkLmNoaWxkcmVuWzJdLnJhdykudG8uZXF1YWwodGV4dClcblxuXG5cdFx0dGVzdCBcIlBhcmVudFwiLCAoKS0+XG5cdFx0XHRBID0gRG9tLmRpdihudWxsLCBEb20uZGl2KCksICdTb21lIFRleHQnKVxuXHRcdFx0QiA9IERvbS5kaXYoKVxuXHRcdFx0QyA9IERvbS5kaXYoKVxuXG5cdFx0XHRleHBlY3QoQS5wYXJlbnQpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMF0ucGFyZW50KS50by5lcXVhbCBBXG5cdFx0XHRleHBlY3QoQS5jaGlsZHJlblswXS5lbC5wYXJlbnROb2RlKS50by5lcXVhbCBBLmVsXG5cblx0XHRcdEIuYXBwZW5kKEEpXG5cdFx0XHRleHBlY3QoQS5wYXJlbnQpLnRvLmVxdWFsIEJcblx0XHRcdGV4cGVjdChBLmNoaWxkcmVuWzBdLnBhcmVudCkudG8uZXF1YWwgQVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMF0uZWwucGFyZW50Tm9kZSkudG8uZXF1YWwgQS5lbFxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW5bMF0pLnRvLmVxdWFsKEEpXG5cblx0XHRcdEMuYXBwZW5kKEEpXG5cdFx0XHRleHBlY3QoQS5wYXJlbnQpLnRvLmVxdWFsIENcblx0XHRcdGV4cGVjdChBLmNoaWxkcmVuWzBdLnBhcmVudCkudG8uZXF1YWwgQVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMF0uZWwucGFyZW50Tm9kZSkudG8uZXF1YWwgQS5lbFxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KEMuY2hpbGRyZW5bMF0pLnRvLmVxdWFsKEEpXG5cblxuXHRcdHRlc3QgXCJQYXJlbnRzXCIsICgpLT5cblx0XHRcdEEgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdEIgPSBEb20uZGl2KCkuYXBwZW5kVG8oQSlcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oQilcblxuXHRcdFx0ZXhwZWN0KEEucGFyZW50LmVsKS50by5lcXVhbChzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KEIucGFyZW50KS50by5lcXVhbChBKVxuXHRcdFx0ZXhwZWN0KEMucGFyZW50KS50by5lcXVhbChCKVxuXG5cdFx0XHRleHBlY3QoQS5wYXJlbnRzLmxlbmd0aCkudG8uZXF1YWwoQi5wYXJlbnRzLmxlbmd0aC0xKVxuXHRcdFx0ZXhwZWN0KEIucGFyZW50cy5sZW5ndGgpLnRvLmVxdWFsKEMucGFyZW50cy5sZW5ndGgtMSlcblx0XHRcdGV4cGVjdChCLnBhcmVudHNbMF0pLnRvLmVxdWFsKEEpXG5cdFx0XHRleHBlY3QoQy5wYXJlbnRzWzBdKS50by5lcXVhbChCKVxuXHRcdFx0ZXhwZWN0KEMucGFyZW50cy5sZW5ndGgpLnRvLmVxdWFsKDUpXG5cdFx0XHRleHBlY3QoQy5wYXJlbnRzLnNsaWNlKC0xKVswXS5lbCkudG8uZXF1YWwoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuXG5cblx0XHRzdWl0ZSBcIlBhcmVudCBNYXRjaGluZ1wiLCAoKS0+XG5cdFx0XHR0ZWFyZG93biAoKS0+IEBlbHMuQS5kZXRhY2goKVxuXHRcdFx0c3VpdGVTZXR1cCAoKS0+XG5cdFx0XHRcdEEgPSBEb20uc2VjdGlvbihyZWY6J0EnKVxuXHRcdFx0XHRCID0gRG9tLmRpdihyZWY6J0InKS5hcHBlbmRUbyhBKVxuXHRcdFx0XHRDID0gRG9tLmRpdihyZWY6J0MnKS5hcHBlbmRUbyhCKVxuXHRcdFx0XHREID0gRG9tLnNwYW4ocmVmOidEJykuYXBwZW5kVG8oQylcblx0XHRcdFx0QGVscyA9IHtBLEIsQyxEfVxuXHRcdFx0XHRcblx0XHRcdHRlc3QgXCJmdW5jdGlvbiBmaWx0ZXJcIiwgKCktPlxuXHRcdFx0XHR7QSxCLEMsRH0gPSBAZWxzXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHMpLnRvLmVxbCBbQyxCLEFdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nKG51bGwpKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nKEIpKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nICgpLT4gZmFsc2UpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50TWF0Y2hpbmcgKGVsKS0+IGVsIGlzIEIpLnRvLmVxdWFsKEIpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nIChlbCktPiBlbCBpcyBBKS50by5lcXVhbChBKVxuXHRcdFx0XHRleHBlY3QoRC5wYXJlbnRNYXRjaGluZyAoZWwpLT4gZWwgaXMgQykudG8uZXF1YWwoQylcblxuXHRcdFx0XHRBLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nIChlbCktPiBlbC5yYXcgaXMgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS50by5lcXVhbChEb20oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSlcblxuXHRcdFx0dGVzdCBcInJlZiBmaWx0ZXJcIiwgKCktPlxuXHRcdFx0XHR7QSxCLEMsRH0gPSBAZWxzXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHMpLnRvLmVxbCBbQyxCLEFdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nICdiYWRSZWYnKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nICdCJykudG8uZXF1YWwoQilcblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50TWF0Y2hpbmcgJ0EnKS50by5lcXVhbChBKVxuXHRcdFx0XHRleHBlY3QoRC5wYXJlbnRNYXRjaGluZyAnQycpLnRvLmVxdWFsKEMpXG5cblxuXHRcdHN1aXRlIFwiUGFyZW50cyBVbnRpbFwiLCAoKS0+XG5cdFx0XHRzdWl0ZVNldHVwICgpLT5cblx0XHRcdFx0QSA9IERvbS5zZWN0aW9uKHJlZjonQScpXG5cdFx0XHRcdEIgPSBEb20uZGl2KHJlZjonQicpLmFwcGVuZFRvKEEpXG5cdFx0XHRcdEMgPSBEb20uZGl2KHJlZjonQycpLmFwcGVuZFRvKEIpXG5cdFx0XHRcdEQgPSBEb20uc3BhbihyZWY6J0QnKS5hcHBlbmRUbyhDKVxuXHRcdFx0XHRAZWxzID0ge0EsQixDLER9XG5cdFx0XHRcblx0XHRcdHRlc3QgXCJmdW5jdGlvbiBmaWx0ZXJcIiwgKCktPlxuXHRcdFx0XHR7QSxCLEMsRH0gPSBAZWxzXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHMpLnRvLmVxbCBbQyxCLEFdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHNVbnRpbChudWxsKSkudG8uZXFsIFtDLEIsQV1cblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50c1VudGlsKCkpLnRvLmVxbCBbQyxCLEFdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHNVbnRpbCAoZWwpLT4gZWwgaXMgQSkudG8uZXFsIFtDLEJdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHNVbnRpbCAoZWwpLT4gZWwgaXMgQikudG8uZXFsIFtDXVxuXHRcdFx0XHRleHBlY3QoRC5wYXJlbnRzVW50aWwgKGVsKS0+IGZhbHNlKS50by5lcWwgW0MsQixBXVxuXHRcdFx0XG5cblx0XHRcdHRlc3QgXCJyZWYgZmlsdGVyXCIsICgpLT4gXG5cdFx0XHRcdHtBLEIsQyxEfSA9IEBlbHNcblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50c1VudGlsICdBJykudG8uZXFsIFtDLEJdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHNVbnRpbCAnQicpLnRvLmVxbCBbQ11cblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50c1VudGlsICdiYWRSZWYnKS50by5lcWwgW0MsQixBXVxuXG5cblx0XHR0ZXN0IFwiTmV4dFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsIEE9RG9tLmRpdigpLCBCPURvbS5kaXYoKSwgQz1Eb20uZGl2KCksIEQ9RG9tLmRpdigpLCBFPURvbS5kaXYoKSlcblxuXHRcdFx0ZXhwZWN0KEEubmV4dCkudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChDLm5leHQpLnRvLmVxdWFsKEQpXG5cdFx0XHRleHBlY3QoRS5uZXh0KS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3QoQi5uZXh0QWxsKS50by5lcWwoW0MsRCxFXSlcblxuXHRcdFxuXHRcdHRlc3QgXCJOZXh0IEVsZW1lbnRcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdihudWxsLCBBPURvbS5kaXYoKSwgQj1Eb20udGV4dCgpLCBDPURvbS5kaXYoKSwgRD1Eb20udGV4dCgpLCBFPURvbS5kaXYoKSlcblxuXHRcdFx0ZXhwZWN0KEEubmV4dCkudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChBLm5leHRFbCkudG8uZXF1YWwoQylcblx0XHRcdGV4cGVjdChCLm5leHRFbCkudG8uZXF1YWwoQylcblx0XHRcdGV4cGVjdChDLm5leHRFbCkudG8uZXF1YWwoRSlcblx0XHRcdGV4cGVjdChFLm5leHRFbCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KEEubmV4dEVsQWxsKS50by5lcWwoW0MsRV0pXG5cblxuXHRcdHRlc3QgXCJQcmV2XCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYobnVsbCwgQT1Eb20uZGl2KCksIEI9RG9tLmRpdigpLCBDPURvbS5kaXYoKSwgRD1Eb20uZGl2KCksIEU9RG9tLmRpdigpKVxuXG5cdFx0XHRleHBlY3QoRS5wcmV2KS50by5lcXVhbChEKVxuXHRcdFx0ZXhwZWN0KEMucHJldikudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChBLnByZXYpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChELnByZXZBbGwpLnRvLmVxbChbQyxCLEFdKVxuXG5cdFx0XG5cdFx0dGVzdCBcIlByZXYgRWxlbWVudFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsIEE9RG9tLmRpdigpLCBCPURvbS50ZXh0KCksIEM9RG9tLmRpdigpLCBEPURvbS50ZXh0KCksIEU9RG9tLmRpdigpKVxuXG5cdFx0XHRleHBlY3QoRS5wcmV2KS50by5lcXVhbChEKVxuXHRcdFx0ZXhwZWN0KEUucHJldkVsKS50by5lcXVhbChDKVxuXHRcdFx0ZXhwZWN0KEQucHJldkVsKS50by5lcXVhbChDKVxuXHRcdFx0ZXhwZWN0KEMucHJldkVsKS50by5lcXVhbChBKVxuXHRcdFx0ZXhwZWN0KEEucHJldkVsKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3QoRS5wcmV2RWxBbGwpLnRvLmVxbChbQyxBXSlcblxuXG5cdFx0dGVzdCBcIlNpYmxpbmdzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYobnVsbCwgQT1Eb20uZGl2KCksIEI9RG9tLnRleHQoKSwgQz1Eb20uZGl2KCksIEQ9RG9tLnRleHQoKSwgRT1Eb20uZGl2KCkpXG5cblx0XHRcdGV4cGVjdChDLnNpYmxpbmdzKS50by5lcWwoQy5wcmV2QWxsLnJldmVyc2UoKS5jb25jYXQoQy5uZXh0QWxsKSlcblx0XHRcdGV4cGVjdChDLnNpYmxpbmdzKS50by5lcWwoW0EsQixELEVdKVxuXHRcdFx0ZXhwZWN0KEMuZWxlbWVudFNpYmxpbmdzKS50by5lcWwoW0EsRV0pXG5cdFx0XHRleHBlY3QoQi5lbGVtZW50U2libGluZ3MpLnRvLmVxbChbQSxDLEVdKVxuXG5cblx0XHR0ZXN0IFwiRmlyc3QvTGFzdCBDaGlsZFwiLCAoKS0+XG5cdFx0XHRtYWluID0gRE9NLmRpdihpZDonbWFpbicpXG5cdFx0XHRkaXZBID0gRE9NLmRpdihpZDonZGl2QScpLmFwcGVuZFRvKG1haW4pXG5cdFx0XHRkaXZCID0gRE9NLmRpdihpZDonZGl2QicpLmFwcGVuZFRvKG1haW4pXG5cdFx0XHRkaXZDID0gRE9NLmRpdihpZDonZGl2QycpLmFwcGVuZFRvKG1haW4pXG5cdFx0XHRkaXZCQSA9IERPTS5kaXYoaWQ6J2RpdkJBJykuYXBwZW5kVG8oZGl2Qilcblx0XHRcdGRpdkJCID0gRE9NLmRpdihpZDonZGl2QkInKS5hcHBlbmRUbyhkaXZCKVxuXG5cdFx0XHRleHBlY3QobWFpbi5maXJzdENoaWxkKS50by5lcXVhbCBkaXZBXG5cdFx0XHRleHBlY3QobWFpbi5sYXN0Q2hpbGQpLnRvLmVxdWFsIGRpdkNcblx0XHRcdGV4cGVjdChkaXZBLmZpcnN0Q2hpbGQpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KGRpdkEubGFzdENoaWxkKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdChkaXZCLmZpcnN0Q2hpbGQpLnRvLmVxdWFsIGRpdkJBXG5cdFx0XHRleHBlY3QoZGl2Qi5sYXN0Q2hpbGQpLnRvLmVxdWFsIGRpdkJCXG5cblxuXHRcdHRlc3QgXCJDaGlsZCAoYnkgcmVmKVwiLCAoKS0+XG5cdFx0XHRkaXZBID0gXG5cdFx0XHRcdERvbS5kaXYge2lkOidkaXZBJ30sXG5cdFx0XHRcdFx0RG9tLmRpdiB7aWQ6J2NoaWxkQSd9LFxuXHRcdFx0XHRcdFx0RG9tLnNwYW4ge3JlZjonY2hpbGRBXzEnfVxuXHRcdFx0XHRcdFx0RG9tLmRpdiB7cmVmOidjaGlsZEFfMicsIGlkOidjaGlsZEFfMid9XG5cdFx0XHRcdFx0RG9tLmRpdiB7fSxcblx0XHRcdFx0XHRcdERvbS5zcGFuIHtyZWY6J2NoaWxkQl8xJ31cblx0XHRcdFx0XHRcdERvbS50ZXh0IHtpZDonY2hpbGRCXzInfSwgJ1RoZSBUZXh0J1xuXG5cblx0XHRcdGRpdkIgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2Jywge2lkOidkaXZCJ30sXG5cdFx0XHRcdFx0WydkaXYnLCB7aWQ6J2NoaWxkQScsIHN0eWxlOntjb2xvcjoncGluayd9fSxcblx0XHRcdFx0XHRcdFsnc3BhbicsIHtyZWY6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtyZWY6J2NoaWxkQV8zJywgaWQ6J2NoaWxkQV8yJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JywgbnVsbCwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XVxuXHRcdFx0KS5zcGF3bigpXG5cblx0XHRcdGRpdkMgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2JywgcmVmOidkaXZDJyxcblx0XHRcdFx0XHRbJ2RpdicsXHRyZWY6J2NoaWxkQScsXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHJlZjonZGl2QiddXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHJlZjonZGl2QyddXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JyxcdHJlZjonY2hpbGRCJyxcblx0XHRcdFx0XHRcdFsnZGl2JywgcmVmOidkaXZCJ11cblx0XHRcdFx0XHRcdFsnZGl2JywgcmVmOidkaXZDJ11cblx0XHRcdFx0XHRcdFsnZGl2JywgcmVmOidkaXZEJyxcblx0XHRcdFx0XHRcdFx0WydkaXYnLCByZWY6J2NoaWxkQiddXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHQpLnNwYXduKClcblxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2QS5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsKGRpdkEuY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2QS5jaGlsZC5jaGlsZEFfMSkudG8uZXF1YWwoZGl2QS5jaGlsZHJlblswXS5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXZBLmNoaWxkLmNoaWxkQV8yKS50by5lcXVhbChkaXZBLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBXzMpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChkaXZBLmNoaWxkLmNoaWxkQikudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRCXzEpLnRvLmVxdWFsKGRpdkEuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2QS5jaGlsZC5jaGlsZEJfMikudG8uZXF1YWwoZGl2QS5jaGlsZHJlblsxXS5jaGlsZHJlblsxXSlcblx0XHRcdGV4cGVjdChkaXZBLmNoaWxkLmNoaWxkQl8yLnR5cGUpLnRvLmVxdWFsKCd0ZXh0JylcblxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsKGRpdkIuY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEFfMSkudG8uZXF1YWwoZGl2Qi5jaGlsZHJlblswXS5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXZCLmNoaWxkLmNoaWxkQV8yKS50by5lcXVhbChkaXZCLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdKVxuXHRcdFx0ZXhwZWN0KGRpdkIuY2hpbGQuY2hpbGRBXzMpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChkaXZCLmNoaWxkLmNoaWxkQikudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KGRpdkIuY2hpbGQuY2hpbGRCXzEpLnRvLmVxdWFsKGRpdkIuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEJfMikudG8uZXF1YWwoZGl2Qi5jaGlsZHJlblsxXS5jaGlsZHJlblsxXSlcblx0XHRcdGV4cGVjdChkaXZCLmNoaWxkLmNoaWxkQS5zdHlsZSgnY29sb3InKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEEuc3R5bGVTYWZlKCdjb2xvcicpKS5ub3QudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEEuc3R5bGVTYWZlKCdjb2xvcicpLmxlbmd0aCA+PSA0KS50by5iZS50cnVlXG5cblxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBLnJhdy5nZXRBdHRyaWJ1dGUoJ2lkJykpLnRvLmVxdWFsKCdjaGlsZEEnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBLnJhdy5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmJykpLnRvLmVxdWFsKCdjaGlsZEEnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBXzEucmF3LmdldEF0dHJpYnV0ZSgnaWQnKSkudG8uZXF1YWwobnVsbClcblx0XHRcdGV4cGVjdChkaXZBLmNoaWxkLmNoaWxkQV8xLnJhdy5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmJykpLnRvLmVxdWFsKCdjaGlsZEFfMScpXG5cdFx0XHRleHBlY3QoZGl2QS5jaGlsZC5jaGlsZEFfMi5yYXcuZ2V0QXR0cmlidXRlKCdpZCcpKS50by5lcXVhbCgnY2hpbGRBXzInKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBXzIucmF3LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWYnKSkudG8uZXF1YWwoJ2NoaWxkQV8yJylcblxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGQuY2hpbGRBKS50by5lcXVhbChkaXZDLmNoaWxkcmVuWzBdKVxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGQuY2hpbGRCKS50by5lcXVhbChkaXZDLmNoaWxkcmVuWzFdKVxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGQuZGl2QikudG8uZXF1YWwoZGl2Qy5jaGlsZHJlblswXS5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXZDLmNoaWxkLmRpdkMpLnRvLmVxdWFsKGRpdkMpXG5cdFx0XHRleHBlY3QoZGl2Qy5jaGlsZC5kaXZEKS50by5lcXVhbChkaXZDLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzJdKVxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGRyZW5bMF0uY2hpbGQuZGl2QikudG8uZXF1YWwoZGl2Qy5jaGlsZHJlblswXS5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXZDLmNoaWxkcmVuWzBdLmNoaWxkLmRpdkMpLnRvLmVxdWFsKGRpdkMuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV0pXG5cdFx0XHRleHBlY3QoZGl2Qy5jaGlsZHJlblsxXS5jaGlsZC5kaXZCKS50by5lcXVhbChkaXZDLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdKVxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGRyZW5bMV0uY2hpbGQuZGl2QykudG8uZXF1YWwoZGl2Qy5jaGlsZHJlblsxXS5jaGlsZHJlblsxXSlcblx0XHRcdGV4cGVjdChkaXZDLmNoaWxkcmVuWzFdLmNoaWxkLmRpdkQpLnRvLmVxdWFsKGRpdkMuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMl0pXG5cdFx0XHRleHBlY3QoZGl2Qy5jaGlsZHJlblsxXS5jaGlsZC5jaGlsZEIpLnRvLmVxdWFsKGRpdkMuY2hpbGRyZW5bMV0pXG5cblx0XHRcdHNhbmRCb3ggPSBEb20oc2FuZGJveClcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkLmNoaWxkQSkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3guY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkLmRpdkEpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdFxuXHRcdFx0c2FuZEJveC5hcHBlbmQoZGl2QSlcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkLmNoaWxkQSkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3guY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkLmRpdkEpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkZi5kaXZBKS50by5lcXVhbChkaXZBKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3guY2hpbGQuY2hpbGRBKS50by5lcXVhbChkaXZBLmNoaWxkcmVuWzBdKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3guY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsKGRpdkEuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMV0pXG5cdFx0XHRleHBlY3Qoc2FuZEJveC5jaGlsZC5kaXZBKS50by5lcXVhbChkaXZBKVxuXG5cdFx0XHRuZXdDaGlsZCA9IERvbS5kaXYocmVmOiduZXdDaGlsZCcpXG5cdFx0XHRuZXdDaGlsZENoaWxkID0gRG9tLmRpdihyZWY6J25ld0NoaWxkQ2hpbGQnKVxuXHRcdFx0ZXhwZWN0KG5ld0NoaWxkLmNoaWxkLm5ld0NoaWxkQ2hpbGQpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChuZXdDaGlsZENoaWxkLmNoaWxkLm5ld0NoaWxkQ2hpbGQpLnRvLmVxdWFsKG5ld0NoaWxkQ2hpbGQpXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMobmV3Q2hpbGRDaGlsZC5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCgxKVxuXG5cdFx0XHRuZXdDaGlsZENoaWxkLmFwcGVuZFRvKG5ld0NoaWxkKVxuXHRcdFx0ZXhwZWN0KG5ld0NoaWxkLmNoaWxkLm5ld0NoaWxkQ2hpbGQpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChuZXdDaGlsZC5jaGlsZGYubmV3Q2hpbGRDaGlsZCkudG8uZXF1YWwobmV3Q2hpbGRDaGlsZClcblx0XHRcdGV4cGVjdChuZXdDaGlsZC5jaGlsZC5uZXdDaGlsZENoaWxkKS50by5lcXVhbChuZXdDaGlsZENoaWxkKVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKG5ld0NoaWxkQ2hpbGQuY2hpbGQpLmxlbmd0aCkudG8uZXF1YWwoMSlcblxuXHRcdFx0bmV3UGFyZW50ID0gRG9tLmRpdihyZWY6J25ld1BhcmVudCcpXG5cdFx0XHRuZXdDaGlsZC5hcHBlbmRUbyhuZXdQYXJlbnQpXG5cdFx0XHRleHBlY3QobmV3UGFyZW50LmNoaWxkLm5ld0NoaWxkQ2hpbGQpLnRvLmVxdWFsKG5ld0NoaWxkQ2hpbGQpXG5cblxuXHRcdHRlc3QgXCJJbmRleFwiLCAoKS0+XG5cdFx0XHRzZWN0aW9uID1cblx0XHRcdFx0RG9tLnNlY3Rpb24obnVsbCxcblx0XHRcdFx0XHRjaGlsZEEgPSBEb20uZGl2KClcblx0XHRcdFx0XHRjaGlsZEIgPSBEb20uZGl2KClcblx0XHRcdFx0XHRjaGlsZEMgPSBEb20uc3BhbigpXG5cdFx0XHRcdFx0Y2hpbGREID0gRG9tLnRleHQoKVxuXHRcdFx0XHRcdGNoaWxkRSA9IERvbS5zcGFuKClcblx0XHRcdFx0XHRjaGlsZEYgPSBEb20uZGl2KClcblx0XHRcdFx0KVxuXG5cdFx0XHRleHBlY3QoY2hpbGRCLmluZGV4KS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2hpbGRELmluZGV4KS50by5lcXVhbCAzXG5cdFx0XHRleHBlY3QoY2hpbGRGLmluZGV4KS50by5lcXVhbCA1XG5cblx0XHRcdGNoaWxkQy5kZXRhY2goKVxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5pbmRleCkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNoaWxkRC5pbmRleCkudG8uZXF1YWwgMlxuXHRcdFx0ZXhwZWN0KGNoaWxkRi5pbmRleCkudG8uZXF1YWwgNFxuXHRcdFx0ZXhwZWN0KGNoaWxkQy5pbmRleCkudG8uZXF1YWwgbnVsbFxuXG5cblx0XHR0ZXN0IFwiSW5kZXggKGJ5IHR5cGUpXCIsICgpLT5cblx0XHRcdHNlY3Rpb24gPVxuXHRcdFx0XHREb20uc2VjdGlvbihudWxsLFxuXHRcdFx0XHRcdGNoaWxkQSA9IERvbS5kaXYoKVxuXHRcdFx0XHRcdGNoaWxkQiA9IERvbS5kaXYoKVxuXHRcdFx0XHRcdGNoaWxkQyA9IERvbS5zcGFuKClcblx0XHRcdFx0XHRjaGlsZEQgPSBEb20udGV4dCgpXG5cdFx0XHRcdFx0Y2hpbGRFID0gRG9tLnNwYW4oKVxuXHRcdFx0XHRcdGNoaWxkRiA9IERvbS50ZXh0KClcblx0XHRcdFx0XHRjaGlsZEcgPSBEb20uZGl2KClcblx0XHRcdFx0KVxuXG5cdFx0XHRleHBlY3QoY2hpbGRCLmluZGV4VHlwZSkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNoaWxkRC5pbmRleFR5cGUpLnRvLmVxdWFsIDBcblx0XHRcdGV4cGVjdChjaGlsZEYuaW5kZXhUeXBlKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2hpbGRHLmluZGV4VHlwZSkudG8uZXF1YWwgMlxuXG5cdFx0XHRjaGlsZEMuZGV0YWNoKClcblx0XHRcdGV4cGVjdChjaGlsZEIuaW5kZXhUeXBlKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2hpbGRELmluZGV4VHlwZSkudG8uZXF1YWwgMFxuXHRcdFx0ZXhwZWN0KGNoaWxkRi5pbmRleFR5cGUpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjaGlsZEcuaW5kZXhUeXBlKS50by5lcXVhbCAyXG5cblx0XHRcdGNoaWxkQS5kZXRhY2goKVxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5pbmRleFR5cGUpLnRvLmVxdWFsIDBcblx0XHRcdGV4cGVjdChjaGlsZEQuaW5kZXhUeXBlKS50by5lcXVhbCAwXG5cdFx0XHRleHBlY3QoY2hpbGRGLmluZGV4VHlwZSkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNoaWxkRy5pbmRleFR5cGUpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjaGlsZEEuaW5kZXhUeXBlKS50by5lcXVhbCBudWxsXG5cdFx0XHRleHBlY3QoY2hpbGRDLmluZGV4VHlwZSkudG8uZXF1YWwgbnVsbFxuXG5cblx0XHR0ZXN0IFwiSW5kZXggKGJ5IHJlZilcIiwgKCktPlxuXHRcdFx0c2VjdGlvbiA9XG5cdFx0XHRcdERvbS5zZWN0aW9uKG51bGwsXG5cdFx0XHRcdFx0Y2hpbGRBID0gRG9tLmRpdihyZWY6J2FiYycpXG5cdFx0XHRcdFx0Y2hpbGRCID0gRG9tLmRpdihyZWY6J2FiYycpXG5cdFx0XHRcdFx0Y2hpbGRDID0gRG9tLnNwYW4ocmVmOidkZWYnKVxuXHRcdFx0XHRcdGNoaWxkRCA9IERvbS50ZXh0KHJlZjonYWJjJylcblx0XHRcdFx0XHRjaGlsZEUgPSBEb20uc3BhbihyZWY6J2FiYycpXG5cdFx0XHRcdFx0Y2hpbGRGID0gRG9tLnRleHQocmVmOidkZWYnKVxuXHRcdFx0XHRcdGNoaWxkRyA9IERvbS5kaXYocmVmOidhYmMnKVxuXHRcdFx0XHQpXG5cblx0XHRcdGV4cGVjdChjaGlsZEIuaW5kZXhSZWYpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjaGlsZEQuaW5kZXhSZWYpLnRvLmVxdWFsIDJcblx0XHRcdGV4cGVjdChjaGlsZEYuaW5kZXhSZWYpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjaGlsZEcuaW5kZXhSZWYpLnRvLmVxdWFsIDRcblxuXHRcdFx0Y2hpbGRDLmRldGFjaCgpXG5cdFx0XHRleHBlY3QoY2hpbGRCLmluZGV4UmVmKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2hpbGRELmluZGV4UmVmKS50by5lcXVhbCAyXG5cdFx0XHRleHBlY3QoY2hpbGRGLmluZGV4UmVmKS50by5lcXVhbCAwXG5cdFx0XHRleHBlY3QoY2hpbGRHLmluZGV4UmVmKS50by5lcXVhbCA0XG5cblx0XHRcdGNoaWxkQS5kZXRhY2goKVxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5pbmRleFJlZikudG8uZXF1YWwgMFxuXHRcdFx0ZXhwZWN0KGNoaWxkRC5pbmRleFJlZikudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNoaWxkRi5pbmRleFJlZikudG8uZXF1YWwgMFxuXHRcdFx0ZXhwZWN0KGNoaWxkRy5pbmRleFJlZikudG8uZXF1YWwgM1xuXHRcdFx0ZXhwZWN0KGNoaWxkQS5pbmRleFJlZikudG8uZXF1YWwgbnVsbFxuXHRcdFx0ZXhwZWN0KGNoaWxkQy5pbmRleFJlZikudG8uZXF1YWwgbnVsbFxuXG5cblx0XHR0ZXN0IFwiUXVlcnlcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLnRlbXBsYXRlKFxuXHRcdFx0XHRbJ2RpdicsIHtjbGFzczonZGl2LW9uZScsIGF0dHJzOm5hbWU6J2FiYzEyMyd9LFxuXHRcdFx0XHRcdFsnZGl2Jywge2NsYXNzOidjaGlsZEEnLCBzdHlsZTp7Y29sb3I6J3BpbmsnfX0sXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7Y2xhc3M6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtjbGFzczonY2hpbGRBXzEnfV1cblx0XHRcdFx0XHRcdFsnc3BhbicsIHtjbGFzczonY2hpbGRBXzEnfV1cblx0XHRcdFx0XHRcdFsnZGl2Jywge2NsYXNzOidjaGlsZEFfMid9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XHRbJ2RpdicsIGNsYXNzTmFtZTonY2hpbGRCJywgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7Y2xhc3M6J2NoaWxkQl8xJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnc2VjdGlvbicsIGNsYXNzTmFtZTonY2hpbGRCJywgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7Y2xhc3M6J2NoaWxkQl8xJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHQpLnNwYXduKCkuYXBwZW5kVG8oc2FuZEJveCA9IERvbShzYW5kYm94KSlcblxuXHRcdFx0ZXhwZWN0KGRpdi5xdWVyeSAnLmNoaWxkQScpLnRvLmVxdWFsKGRpdi5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXYucXVlcnkgJy5jaGlsZEInKS50by5lcXVhbChkaXYuY2hpbGRyZW5bMV0pXG5cdFx0XHRleHBlY3QoZGl2LnF1ZXJ5ICcuY2hpbGRCXzEnKS50by5lcXVhbChkaXYuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2LnF1ZXJ5ICcuY2hpbGRBXzEnKS50by5lcXVhbChkaXYuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2LnF1ZXJ5ICcuY2hpbGRBXzInKS50by5lcXVhbChkaXYuY2hpbGRyZW5bMF0uY2hpbGRyZW5bM10pXG5cdFx0XHRleHBlY3Qoc2FuZEJveC5xdWVyeSAnLmRpdi1vbmUnKS50by5lcXVhbChkaXYpXG5cdFx0XHRleHBlY3Qoc2FuZEJveC5xdWVyeSAnLmNoaWxkQl8xJykudG8uZXF1YWwoZGl2LmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3gucXVlcnkgJ2RpdltuYW1lPVwiYWJjMTIzXCJdJykudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3gucXVlcnkgJ3NwYW5bbmFtZT1cImFiYzEyM1wiXScpLnRvLmVxdWFsKHVuZGVmaW5lZClcblxuXG5cdFx0dGVzdCBcIlF1ZXJ5QWxsXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0WydkaXYnLCB7Y2xhc3M6J2Rpdi1vbmUnLCBhdHRyczpuYW1lOidhYmMxMjMnfSxcblx0XHRcdFx0XHRbJ2RpdicsIHtjbGFzczonY2hpbGRBJywgc3R5bGU6e2NvbG9yOidwaW5rJ319LFxuXHRcdFx0XHRcdFx0WydzcGFuJywge2NsYXNzOidjaGlsZEFfMSd9XVxuXHRcdFx0XHRcdFx0WydkaXYnLCB7Y2xhc3M6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7Y2xhc3M6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtjbGFzczonY2hpbGRBXzInfV1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0WydkaXYnLCBjbGFzc05hbWU6J2NoaWxkQicsIFxuXHRcdFx0XHRcdFx0WydzcGFuJywge2NsYXNzOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XHRbJ3NlY3Rpb24nLCBjbGFzc05hbWU6J2NoaWxkQicsIFxuXHRcdFx0XHRcdFx0WydzcGFuJywge2NsYXNzOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XVxuXHRcdFx0KS5zcGF3bigpLmFwcGVuZFRvKHNhbmRCb3ggPSBEb20oc2FuZGJveCkpXG5cblx0XHRcdGV4cGVjdChkaXYucXVlcnlBbGwoJy5jaGlsZEEnKS5lbGVtZW50cykudG8uZXFsKFtkaXYuY2hpbGRyZW5bMF1dKVxuXHRcdFx0ZXhwZWN0KGRpdi5xdWVyeUFsbCgnLmNoaWxkQicpLmVsZW1lbnRzKS50by5lcWwoW2Rpdi5jaGlsZHJlblsxXSwgZGl2LmNoaWxkcmVuWzJdXSlcblx0XHRcdGV4cGVjdChkaXYucXVlcnlBbGwoJy5jaGlsZEJfMScpLmVsZW1lbnRzKS50by5lcWwoW2Rpdi5jaGlsZHJlblsxXS5jaGlsZHJlblswXSwgZGl2LmNoaWxkcmVuWzJdLmNoaWxkcmVuWzBdXSlcblx0XHRcdGV4cGVjdChkaXYucXVlcnlBbGwoJy5jaGlsZEFfMScpLmVsZW1lbnRzKS50by5lcWwoW2Rpdi5jaGlsZHJlblswXS5jaGlsZHJlblswXSwgZGl2LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdLCBkaXYuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMl1dKVxuXHRcdFx0ZXhwZWN0KGRpdi5xdWVyeUFsbCgnLmNoaWxkQV8yJykuZWxlbWVudHMpLnRvLmVxbChbZGl2LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzNdXSlcblx0XHRcdGV4cGVjdChzYW5kQm94LnF1ZXJ5QWxsKCcuZGl2LW9uZScpLmVsZW1lbnRzKS50by5lcWwoW2Rpdl0pXG5cdFx0XHRleHBlY3Qoc2FuZEJveC5xdWVyeUFsbCgnLmNoaWxkQl8xJykuZWxlbWVudHMpLnRvLmVxbChbZGl2LmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdLCBkaXYuY2hpbGRyZW5bMl0uY2hpbGRyZW5bMF1dKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3gucXVlcnlBbGwoJ2RpdltuYW1lPVwiYWJjMTIzXCJdJykuZWxlbWVudHMpLnRvLmVxbChbZGl2XSlcblx0XHRcdGV4cGVjdChzYW5kQm94LnF1ZXJ5QWxsKCdzcGFuW25hbWU9XCJhYmMxMjNcIl0nKS5lbGVtZW50cykudG8uZXFsKFtdKVxuXHRcdFx0ZXhwZWN0KGRpdi50ZXh0KS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzYW5kQm94LnF1ZXJ5QWxsKCcuY2hpbGRCXzEnKS50ZXh0KCdhYmMxMjMnKS5lbGVtZW50cykudG8uZXFsKFtkaXYuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0sIGRpdi5jaGlsZHJlblsyXS5jaGlsZHJlblswXV0pXG5cdFx0XHRleHBlY3QoZGl2LnRleHQpLnRvLmVxdWFsKCdhYmMxMjNhYmMxMjMnKVxuXG5cblx0XHR0ZXN0IFwiUXVlcnkvUXVlcnlBbGwgc2hvcnRjdXRzXCIsICgpLT5cblx0XHRcdGV4cGVjdChEb20ucXVlcnkoJ2hlYWQnKSkudG8uZXF1YWwoRG9tKGRvY3VtZW50KS5xdWVyeSgnaGVhZCcpKVxuXHRcdFx0ZXhwZWN0KERvbS5xdWVyeSgnYm9keScpKS50by5lcXVhbChEb20oZG9jdW1lbnQpLnF1ZXJ5KCdib2R5JykpXG5cdFx0XHRcblx0XHRcdGFsbEEgPSBEb20ucXVlcnlBbGwoJ3NlY3Rpb24nKS5lbGVtZW50c1xuXHRcdFx0YWxsQiA9IERvbShkb2N1bWVudCkucXVlcnlBbGwoJ3NlY3Rpb24nKS5lbGVtZW50c1xuXHRcdFx0ZXhwZWN0KGFsbEEubGVuZ3RoKS50by5lcXVhbChhbGxCLmxlbmd0aClcblx0XHRcdGZvciBlbCxpbmRleCBpbiBhbGxBXG5cdFx0XHRcdGV4cGVjdChhbGxBW2luZGV4XSkudG8uZXF1YWwoYWxsQltpbmRleF0pXG5cdFx0XHRyZXR1cm5cblxuXG5cblx0c3VpdGUgXCJNYW5pcHVsYXRpb25cIiwgKCktPlxuXHRcdHRlc3QgXCIuYXBwZW5kKClcIiwgKCktPlxuXHRcdFx0QSA9IERvbS5kaXYoKVxuXHRcdFx0QiA9IERvbS5kaXYoKVxuXHRcdFx0QyA9IERvbS50ZXh0KClcblx0XHRcdEQgPSBEb20uZGl2KClcblx0XHRcdE1haW5BID0gRG9tLmRpdihudWxsLCBBLCBCLCBDLCBEKVxuXHRcdFx0TWFpbkIgPSBEb20uZGl2KClcblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoQSwgQiwgQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKClcblxuXHRcdFx0TWFpbkIuYXBwZW5kKEEpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5BKShCLCBDLCBEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQikoQSlcblxuXHRcdFx0Qy5hcHBlbmRUbyhNYWluQilcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkEpKEIsIEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5CKShBLCBDKVxuXG5cblxuXHRcdHRlc3QgXCIucHJlcGVuZCgpXCIsICgpLT5cblx0XHRcdEEgPSBEb20uZGl2KClcblx0XHRcdEIgPSBEb20uZGl2KClcblx0XHRcdEMgPSBEb20udGV4dCgpXG5cdFx0XHREID0gRG9tLmRpdigpXG5cdFx0XHRNYWluQSA9IERvbS5kaXYobnVsbCwgQSwgQiwgQywgRClcblx0XHRcdE1haW5CID0gRG9tLmRpdigpXG5cblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkEpKEEsIEIsIEMsIEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5CKSgpXG5cblx0XHRcdE1haW5CLnByZXBlbmQoQSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkEpKEIsIEMsIEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5CKShBKVxuXG5cdFx0XHRDLnByZXBlbmRUbyhNYWluQilcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkEpKEIsIEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5CKShDLCBBKVxuXG5cblx0XHR0ZXN0IFwiLmFmdGVyKClcIiwgKCktPlxuXHRcdFx0QSA9IERvbS5kaXYoKVxuXHRcdFx0QiA9IERvbS5kaXYoKVxuXHRcdFx0QyA9IERvbS50ZXh0KClcblx0XHRcdEQgPSBEb20uZGl2KClcblx0XHRcdE1haW5BID0gRG9tLmRpdihudWxsLCBBLCBCLCBDLCBEKVxuXHRcdFx0TWFpbkIgPSBEb20uZGl2KClcblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoQSwgQiwgQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKClcblxuXHRcdFx0TWFpbkIuYXBwZW5kKEIpXG5cdFx0XHRCLmFmdGVyKEEpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5BKShDLCBEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQikoQiwgQSlcblxuXHRcdFx0Qy5pbnNlcnRBZnRlcihCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKEIsIEMsIEEpXG5cblxuXHRcdHRlc3QgXCIuYmVmb3JlKClcIiwgKCktPlxuXHRcdFx0QSA9IERvbS5kaXYoKVxuXHRcdFx0QiA9IERvbS5kaXYoKVxuXHRcdFx0QyA9IERvbS50ZXh0KClcblx0XHRcdEQgPSBEb20uZGl2KClcblx0XHRcdE1haW5BID0gRG9tLmRpdihudWxsLCBBLCBCLCBDLCBEKVxuXHRcdFx0TWFpbkIgPSBEb20uZGl2KClcblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoQSwgQiwgQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKClcblxuXHRcdFx0TWFpbkIuYXBwZW5kKEIpXG5cdFx0XHRCLmJlZm9yZShBKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKEEsIEIpXG5cblx0XHRcdEMuaW5zZXJ0QmVmb3JlKEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5BKShEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQikoQSwgQywgQilcblxuXG5cdFx0dGVzdCBcIi5kZXRhY2goKVwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnQgPSAwXG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsICdJbm5lciBUZXh0IEhlcmUnKVxuXHRcdFx0ZGl2Lm9uICdiZWVwJywgKCktPiBlbWl0Q291bnQrK1xuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRkaXYuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkubm90LnRvLmV4aXN0XG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUudHJ1ZVxuXHRcdFx0XG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdi5lbWl0KCdiZWVwJylcblx0XHRcdGV4cGVjdChzYW5kYm94LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChkaXYucGFyZW50LmVsKS50by5lcXVhbChzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLnRydWVcblxuXHRcdFx0ZGl2LmRldGFjaCgpXG5cdFx0XHRkaXYuZW1pdCgnYmVlcCcpXG5cdFx0XHRleHBlY3Qoc2FuZGJveC5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkubm90LnRvLmV4aXN0XG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUudHJ1ZVxuXG5cblx0XHR0ZXN0IFwiLnJlbW92ZSgpXCIsICgpLT5cblx0XHRcdGVtaXRDb3VudCA9IDBcblx0XHRcdGRpdiA9IERvbS5kaXYobnVsbCwgJ0lubmVyIFRleHQgSGVyZScpXG5cdFx0XHRkaXYub24gJ2JlZXAnLCAoKS0+IGVtaXRDb3VudCsrXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cblx0XHRcdGV4cGVjdChkaXYucGFyZW50KS5ub3QudG8uZXhpc3Rcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cdFx0XHRcblx0XHRcdGRpdi5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZGl2LmVtaXQoJ2JlZXAnKVxuXHRcdFx0ZXhwZWN0KHNhbmRib3guY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQuZWwpLnRvLmVxdWFsKHNhbmRib3gpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUudHJ1ZVxuXG5cdFx0XHRkaXYucmVtb3ZlKClcblx0XHRcdGRpdi5lbWl0KCdiZWVwJylcblx0XHRcdGV4cGVjdChzYW5kYm94LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChkaXYucGFyZW50KS5ub3QudG8uZXhpc3Rcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUuZmFsc2VcblxuXG5cdFx0dGVzdCBcIi5lbXB0eSgpXCIsICgpLT5cblx0XHRcdE1haW4gPSBEb20uZGl2KClcblx0XHRcdEEgPSBEb20uZGl2KCkuYXBwZW5kVG8oTWFpbilcblx0XHRcdEIgPSBEb20uZGl2KCkuYXBwZW5kVG8oTWFpbilcblx0XHRcdEEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEIuc3RhdGUgJ2hhcHB5Jywgb25cblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShBLCBCKVxuXHRcdFx0ZXhwZWN0KEEuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KEIuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXG5cdFx0XHRNYWluLmVtcHR5KClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoKVxuXHRcdFx0ZXhwZWN0KEEucGFyZW50KS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3QoQi5wYXJlbnQpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChBLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChCLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblxuXG5cdFx0dGVzdCBcIi53cmFwKClcIiwgKCktPlxuXHRcdFx0TWFpbiA9IERvbS5kaXYoKVxuXHRcdFx0QSA9IERvbS5kaXYoKS5hcHBlbmRUbyhNYWluKVxuXHRcdFx0QiA9IERvbS5kaXYoKS5hcHBlbmRUbyhNYWluKVxuXHRcdFx0QyA9IERvbS5kaXYoKVxuXHRcdFx0d3JhcEEgPSBEb20uc2VjdGlvbigpXG5cdFx0XHR3cmFwQiA9IERvbS5zZWN0aW9uKClcblx0XHRcdHdyYXBDID0gRG9tLnNlY3Rpb24oKVxuXHRcdFx0QS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0Qi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0Qy5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0d3JhcEEuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0d3JhcEIuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0d3JhcEMuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShBLCBCKVxuXHRcdFx0XG5cdFx0XHRBLndyYXAod3JhcEEpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW4pKHdyYXBBLCBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZSh3cmFwQSkoQSlcblx0XHRcdFxuXHRcdFx0Qi53cmFwKHdyYXBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKSh3cmFwQSwgd3JhcEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBBKShBKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZSh3cmFwQikoQilcblx0XHRcdFxuXHRcdFx0Qi53cmFwKHdyYXBBKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKSh3cmFwQSwgd3JhcEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBBKShBLCBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZSh3cmFwQikoKVxuXHRcdFx0XG5cdFx0XHR3cmFwQy5hcHBlbmRUbyh3cmFwQilcblx0XHRcdEMud3JhcCh3cmFwQylcblx0XHRcdEMud3JhcCgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW4pKHdyYXBBLCB3cmFwQilcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUod3JhcEEpKEEsIEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBCKSh3cmFwQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUod3JhcEMpKEMpXG5cdFx0XHRcblx0XHRcdEMud3JhcChDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKSh3cmFwQSwgd3JhcEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBBKShBLCBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZSh3cmFwQikod3JhcEMpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBDKShDKVxuXG5cdFx0XHRleHBlY3QoQS5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoQi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoQy5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3Qod3JhcEEuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3Qod3JhcEIuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3Qod3JhcEMuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cblxuXHRcdHRlc3QgXCIudW53cmFwKClcIiwgKCktPlxuXHRcdFx0TWFpbiA9IERvbS5kaXYoKVxuXHRcdFx0QSA9IERvbS5kaXYoKS5wcmVwZW5kVG8oTWFpbilcblx0XHRcdEIgPSBEb20uZGl2KCkuYXBwZW5kVG8oQSlcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oQSlcblx0XHRcdEQgPSBEb20uZGl2KCkuYXBwZW5kVG8oQylcblx0XHRcdEUgPSBEb20uZGl2KCkuYXBwZW5kVG8oRClcblx0XHRcdEEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEIuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEMuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEQuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEUuc3RhdGUgJ2hhcHB5Jywgb25cblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShBKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKShCLCBDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShCKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEMpKEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKEUpXG5cblx0XHRcdEUudW53cmFwKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoQiwgQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQikoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKShFKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShEKSgpXG5cblx0XHRcdEIudW53cmFwKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQiwgQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShCKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEMpKEUpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKClcblxuXHRcdFx0RS51bndyYXAoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShCLCBFKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEIpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQykoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShEKSgpXG5cblx0XHRcdEEuaW5zZXJ0QWZ0ZXIoQilcblx0XHRcdEMuYXBwZW5kVG8oQSlcblx0XHRcdEQuYXBwZW5kVG8oQSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQiwgQSwgRSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQikoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKClcblxuXHRcdFx0RC51bndyYXAoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShCLCBDLCBELCBFKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEIpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQykoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShEKSgpXG5cblxuXG5cdFx0dGVzdCBcIi5yZXBsYWNlKClcIiwgKCktPlxuXHRcdFx0TWFpbiA9IERvbS5kaXYoKVxuXHRcdFx0QSA9IERvbS5kaXYoKS5hcHBlbmRUbyhNYWluKVxuXHRcdFx0QiA9IERvbS5kaXYoKS5hcHBlbmRUbyhNYWluKVxuXHRcdFx0QyA9IERvbS5kaXYoKS5hcHBlbmRUbyhBKVxuXHRcdFx0RCA9IERvbS5kaXYoKS5hcHBlbmRUbyhBKVxuXHRcdFx0RSA9IERvbS5kaXYoKS5hcHBlbmRUbyhEKVxuXHRcdFx0XG5cdFx0XHRBLnJlcGxhY2UoKTsgRS5yZXBsYWNlKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQSwgQilcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQikoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKEUpXG5cdFx0XHRcblx0XHRcdEMucmVwbGFjZShFKS5hcHBlbmRUbyhCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShBLCBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKShFLCBEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShCKShDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKClcblx0XHRcdFxuXHRcdFx0RC5yZXBsYWNlKEUpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW4pKEEsIEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEEpKEUpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEIpKEMpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEMpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoRCkoKVxuXHRcdFx0XG5cdFx0XHRCLnJlcGxhY2UoQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQSwgQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoRSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQikoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKClcblx0XHRcdFxuXHRcdFx0QS5yZXBsYWNlKEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW4pKEQsIEMpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEEpKEUpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEIpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQykoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShEKSgpXG5cdFx0XHRcblx0XHRcdEIucmVwbGFjZShEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKShFKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShCKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEMpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoRCkoKVxuXG5cblx0XHR0ZXN0IFwiLmNsb25lKClcIiwgKCktPlxuXHRcdFx0ZW1pdENvdW50ID0gMFxuXHRcdFx0c2FuZEJveCA9IERvbShzYW5kYm94KVxuXHRcdFx0b3B0cyA9IHtzdHlsZTogJGJhc2U6e3dpZHRoOiczNHB4J30sICRoYXBweTp7aGVpZ2h0Oic5OXB4J30sICRyZWxheGVkOntvcGFjaXR5OicwLjUnfX1cblx0XHRcdEEgPSBEb20uZGl2KG9wdHMsICdTb21lIElubmVyIFRleHQnKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0QS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0QS5vbiAncHJpdmF0ZUV2ZW50JywgKCktPiBlbWl0Q291bnQrK1xuXHRcdFx0Y2hpbGRBID0gRG9tLmRpdigpLmFwcGVuZFRvKEEpXG5cdFx0XHRjaGlsZEIgPSBEb20uc3BhbigpLmFwcGVuZFRvKEEpXG5cdFx0XHRCID0gQS5jbG9uZSgpXG5cblx0XHRcdEEuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0QS5lbWl0KCdwcml2YXRlRXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChBLnBhcmVudCkudG8uZXF1YWwoc2FuZEJveClcblx0XHRcdGV4cGVjdChBLmNzcyAnd2lkdGgnKS50by5lcXVhbCgnMzRweCcpXG5cdFx0XHRleHBlY3QoQS5jc3MgJ2hlaWdodCcpLnRvLmVxdWFsKCc5OXB4Jylcblx0XHRcdGV4cGVjdChBLmNzcyAnb3BhY2l0eScpLnRvLmVxdWFsKCcwLjUnKVxuXHRcdFx0ZXhwZWN0KEEuc2libGluZ3MubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMF0uZWwudGV4dENvbnRlbnQpLnRvLmVxdWFsICdTb21lIElubmVyIFRleHQnXG5cdFx0XHRleHBlY3QoQS5jaGlsZHJlblsxXSkudG8uZXF1YWwoY2hpbGRBKVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMl0pLnRvLmVxdWFsKGNoaWxkQilcblx0XHRcdGV4cGVjdChCKS5ub3QudG8uZXF1YWwoQSlcblx0XHRcdGV4cGVjdChCLnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0c2FuZEJveC5hcHBlbmQoQilcblxuXHRcdFx0ZXhwZWN0KEIucGFyZW50KS50by5lcXVhbChzYW5kQm94KVxuXHRcdFx0ZXhwZWN0KEIuY3NzICd3aWR0aCcpLnRvLmVxdWFsKCczNHB4Jylcblx0XHRcdGV4cGVjdChCLmNzcyAnaGVpZ2h0JykudG8uZXF1YWwoJzk5cHgnKVxuXHRcdFx0ZXhwZWN0KEIuY3NzICdvcGFjaXR5JykudG8uZXF1YWwoJzEnKVxuXHRcdFx0ZXhwZWN0KEIuc2libGluZ3MubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW5bMF0uZWwudGV4dENvbnRlbnQpLnRvLmVxdWFsICdTb21lIElubmVyIFRleHQnXG5cdFx0XHRleHBlY3QoQi5jaGlsZHJlblswXSkubm90LnRvLmVxdWFsKEEuY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoQi5jaGlsZHJlblsxXSkubm90LnRvLmVxdWFsKGNoaWxkQSlcblx0XHRcdGV4cGVjdChCLmNoaWxkcmVuWzJdKS5ub3QudG8uZXF1YWwoY2hpbGRCKVxuXHRcdFx0ZXhwZWN0KEIuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KEIuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS5mYWxzZVxuXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgxKVxuXHRcdFx0Qi5lbWl0KCdwcml2YXRlRXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMilcblx0XHRcdFxuXHRcdFx0QS5vZmYoKVxuXHRcdFx0QS5lbWl0KCdwcml2YXRlRXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMilcblx0XHRcdEIuZW1pdCgncHJpdmF0ZUV2ZW50Jylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsKDMpXG5cblxuXHRcdHRlc3QgXCIucHJvcCgpIC0gZWxlbWVudCBwcm9wZXJ0eSBnZXR0ZXIvc2V0dGVyXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2LnByb3AgJ215UHJvcCcpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdteVByb3AnLCAxOTIpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdteVByb3AnKS50by5lcXVhbCAxOTJcblx0XHRcdGV4cGVjdChkaXYucHJvcCAnbXlQcm9wJywgJzE5MicpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdteVByb3AnKS50by5lcXVhbCAnMTkyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdhbm90aGVyUHJvcCcsIFsxLDIsM10pLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdhbm90aGVyUHJvcCcpLnRvLmVxbCBbMSwyLDNdXG5cdFx0XHRleHBlY3QoZGl2LmVsLm15UHJvcCkudG8uZXF1YWwgJzE5Midcblx0XHRcdGV4cGVjdChkaXYuZWwuYW5vdGhlclByb3ApLnRvLmVxbCBbMSwyLDNdIFxuXG5cdFx0XHRkaXYuZWwubGFzdFByb3AgPSA5OTk5XG5cdFx0XHRleHBlY3QoZGl2LmVsLmxhc3RQcm9wKS50by5lcXVhbCA5OTk5XG5cdFx0XHRleHBlY3QoZGl2LnByb3AgJ2xhc3RQcm9wJykudG8uZXF1YWwgOTk5OVxuXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMoZGl2LmVsKSkubm90LnRvLmNvbnRhaW4oJ3Byb21pc2VJc0xhc3QnKVxuXHRcdFx0XG5cdFx0XHRkaXYucHJvcCAncHJvbWlzZUlzTGFzdCcsICdvdmVyOWsnXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMoZGl2LmVsKSkudG8uY29udGFpbigncHJvbWlzZUlzTGFzdCcpXG5cdFx0XHRcblx0XHRcdGRpdi5wcm9wICdwcm9taXNlSXNMYXN0JywgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMoZGl2LmVsKSkudG8uY29udGFpbigncHJvbWlzZUlzTGFzdCcpXG5cdFx0XHRcblx0XHRcdGRpdi5wcm9wICdwcm9taXNlSXNMYXN0JywgbnVsbFxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKGRpdi5lbCkpLnRvLmNvbnRhaW4oJ3Byb21pc2VJc0xhc3QnKVxuXG5cdFx0XHRkaXYucHJvcCB7YWJjOjEyMywgZGVmOjQ1Nn1cblx0XHRcdGV4cGVjdChkaXYuZWwuYWJjKS50by5lcXVhbCAxMjNcblx0XHRcdGV4cGVjdChkaXYuZWwuZGVmKS50by5lcXVhbCA0NTZcblxuXG5cdFx0dGVzdCBcIi5hdHRyKCkgLSBlbGVtZW50IGF0dHJpYnV0ZSBnZXR0ZXIvc2V0dGVyXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2LmF0dHIgJ215QXR0cicpLnRvLmVxdWFsIG51bGxcblx0XHRcdGV4cGVjdChkaXYuYXR0ciAnbXlBdHRyJywgMTkyKS50by5lcXVhbCBkaXZcblx0XHRcdGV4cGVjdChkaXYuYXR0ciAnbXlBdHRyJykudG8uZXF1YWwgJzE5Midcblx0XHRcdGV4cGVjdChkaXYuYXR0ciAnbXlBdHRyJywgJzE5MicpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5hdHRyICdteUF0dHInKS50by5lcXVhbCAnMTkyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5hdHRyICdhbm90aGVyQXR0cicsIFsxLDIsM10pLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5hdHRyICdhbm90aGVyQXR0cicpLnRvLmVxdWFsICcxLDIsMydcblx0XHRcdGV4cGVjdChkaXYuZWwuZ2V0QXR0cmlidXRlICdteUF0dHInKS50by5lcXVhbCAnMTkyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ2Fub3RoZXJBdHRyJykudG8uZXFsICcxLDIsMydcblxuXHRcdFx0ZGl2LmVsLnNldEF0dHJpYnV0ZSAnbGFzdEF0dHInLCA5OTk5XG5cdFx0XHRleHBlY3QoZGl2LmVsLmdldEF0dHJpYnV0ZSAnbGFzdEF0dHInKS50by5lcXVhbCAnOTk5OSdcblx0XHRcdGV4cGVjdChkaXYuYXR0ciAnbGFzdEF0dHInKS50by5lcXVhbCAnOTk5OSdcblxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ3Byb21pc2VJc0xhc3QnKS50by5lcXVhbCBudWxsXG5cdFx0XHRcblx0XHRcdGRpdi5hdHRyICdwcm9taXNlSXNMYXN0JywgJ292ZXI5aydcblx0XHRcdGV4cGVjdChkaXYuZWwuZ2V0QXR0cmlidXRlICdwcm9taXNlSXNMYXN0JykudG8uZXF1YWwgJ292ZXI5aydcblx0XHRcdFxuXHRcdFx0ZGl2LmF0dHIgJ3Byb21pc2VJc0xhc3QnXG5cdFx0XHRleHBlY3QoZGl2LmVsLmdldEF0dHJpYnV0ZSAncHJvbWlzZUlzTGFzdCcpLnRvLmVxdWFsICdvdmVyOWsnXG5cdFx0XHRcblx0XHRcdGRpdi5hdHRyICdwcm9taXNlSXNMYXN0JywgbnVsbFxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ3Byb21pc2VJc0xhc3QnKS50by5lcXVhbCBudWxsXG5cblx0XHRcdGRpdi5hdHRyIHthYmM6MTIzLCBkZWY6NDU2fVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ2FiYycpLnRvLmVxdWFsICcxMjMnXG5cdFx0XHRleHBlY3QoZGl2LmVsLmdldEF0dHJpYnV0ZSAnZGVmJykudG8uZXF1YWwgJzQ1NidcblxuXHRcdFx0ZGl2LmF0dHIge2FiYzoxMjMsIGRlZjpudWxsfVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ2FiYycpLnRvLmVxdWFsICcxMjMnXG5cdFx0XHRleHBlY3QoZGl2LmVsLmdldEF0dHJpYnV0ZSAnZGVmJykudG8uZXF1YWwgbnVsbFxuXG5cblx0XHR0ZXN0IFwiLmh0bWwgLSBpbm5lckhUTUwgZ2V0dGVyL3NldHRlclwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsIERvbS5kaXYoKSwgJ1NvbWUgdGV4dCcsIERvbS5zcGFuKCksIERvbS5kaXYoKSlcblxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDQpXG5cdFx0XHRleHBlY3QoZGl2Lmh0bWwpLnRvLmVxdWFsKGRpdi5lbC5pbm5lckhUTUwpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoNClcblxuXHRcdFx0ZGl2Lmh0bWwgPSAnPHNlY3Rpb24gSUQ9XCJ0ZXN0XCI+PC9zZWN0aW9uPidcblx0XHRcdGV4cGVjdChkaXYuaHRtbCkudG8uZXF1YWwoJzxzZWN0aW9uIGlkPVwidGVzdFwiPjwvc2VjdGlvbj4nKVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuWzBdLmVsLmlkKS50by5lcXVhbCgndGVzdCcpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuWzBdLmVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpLnRvLmVxdWFsKCdzZWN0aW9uJylcblxuXG5cdFx0dGVzdCBcIi50ZXh0IC0gdGV4dENvbnRlbnQgZ2V0dGVyL3NldHRlclwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsICdTb21lIHRleHQnLCBEb20uc3BhbihudWxsLCAnSW5uZXIgVGV4dCcpKVxuXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChkaXYudGV4dCkudG8uZXF1YWwoZGl2LmVsLnRleHRDb250ZW50KVxuXHRcdFx0ZXhwZWN0KGRpdi50ZXh0KS50by5lcXVhbCgnU29tZSB0ZXh0SW5uZXIgVGV4dCcpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMilcblxuXHRcdFx0ZGl2LnRleHQgPSAnbmV3VGV4dCdcblx0XHRcdGV4cGVjdChkaXYudGV4dCkudG8uZXF1YWwoJ25ld1RleHQnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC50ZXh0Q29udGVudCkudG8uZXF1YWwoJ25ld1RleHQnKVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuWzBdLmVsLm5vZGVUeXBlKS50by5lcXVhbCgzKVxuXG5cblx0XHR0ZXN0IFwiLmFkZENsYXNzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgY2xhc3M6J3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cdFx0XHRcblx0XHRcdGRpdi5hZGRDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cdFx0XHRcblx0XHRcdGRpdi5hZGRDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cdFx0XHRcblx0XHRcdGRpdi5yYXcuY2xhc3NOYW1lID0gZGl2LnJhdy5jbGFzc05hbWUucmVwbGFjZSAnbmV3LXNlbGVjdG9yJywgJyAnXG5cdFx0XHRleHBlY3QoZGl2LnJhdy5jbGFzc05hbWUpLnRvLmVxdWFsICdzb21lLXNlbGVjdG9yIGFub3RoZXJTZWxlY3RvciAucGVyaW9kIGFubm95aW5nLV8tc2VsZWN0b3IgICdcblx0XHRcdFxuXHRcdFx0ZGl2LmFkZENsYXNzKCduZXctc2VsZWN0b3InKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnc29tZS1zZWxlY3RvciBhbm90aGVyU2VsZWN0b3IgLnBlcmlvZCBhbm5veWluZy1fLXNlbGVjdG9yIG5ldy1zZWxlY3Rvcidcblx0XHRcdFxuXHRcdFx0ZGl2LmFkZENsYXNzKCcucGVyaW9kJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cdFx0XHRcblx0XHRcdGRpdi5hZGRDbGFzcygncGVyaW9kJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3IgcGVyaW9kJ1xuXG5cblx0XHR0ZXN0IFwiLnJlbW92ZUNsYXNzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgY2xhc3M6J3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cdFx0XHRcblx0XHRcdGRpdi5hZGRDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cblx0XHRcdGRpdi5yZW1vdmVDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvcidcblxuXHRcdFx0ZGl2LnJlbW92ZUNsYXNzKCduZXctc2VsZWN0b3InKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnc29tZS1zZWxlY3RvciBhbm90aGVyU2VsZWN0b3IgLnBlcmlvZCBhbm5veWluZy1fLXNlbGVjdG9yJ1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRkaXYucmVtb3ZlQ2xhc3MoJ3NvbWUtc2VsZWN0b3InKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3Rvcidcblx0XHRcdFx0XHRcdFxuXHRcdFx0ZGl2LnJlbW92ZUNsYXNzKCdwZXJpb2QnKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3Rvcidcblx0XHRcdFx0XHRcdFxuXHRcdFx0ZGl2LnJlbW92ZUNsYXNzKCcucGVyaW9kJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ2Fub3RoZXJTZWxlY3RvciBhbm5veWluZy1fLXNlbGVjdG9yJ1xuXG5cblx0XHR0ZXN0IFwiLnRvZ2dsZUNsYXNzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgY2xhc3M6J3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cdFx0XHRcblx0XHRcdGRpdi50b2dnbGVDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cblx0XHRcdGRpdi50b2dnbGVDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvcidcblxuXHRcdFx0ZGl2LnRvZ2dsZUNsYXNzKCduZXctc2VsZWN0b3InKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnc29tZS1zZWxlY3RvciBhbm90aGVyU2VsZWN0b3IgLnBlcmlvZCBhbm5veWluZy1fLXNlbGVjdG9yIG5ldy1zZWxlY3Rvcidcblx0XHRcdFx0XHRcdFxuXHRcdFx0ZGl2LnRvZ2dsZUNsYXNzKCduZXctc2VsZWN0b3InKVxuXHRcdFx0ZGl2LnRvZ2dsZUNsYXNzKCdzb21lLXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ2Fub3RoZXJTZWxlY3RvciAucGVyaW9kIGFubm95aW5nLV8tc2VsZWN0b3InXG5cdFx0XHRcdFx0XHRcblx0XHRcdGRpdi50b2dnbGVDbGFzcygnc29tZS1zZWxlY3RvcicpXG5cdFx0XHRleHBlY3QoZGl2LnJhdy5jbGFzc05hbWUpLnRvLmVxdWFsICdhbm90aGVyU2VsZWN0b3IgLnBlcmlvZCBhbm5veWluZy1fLXNlbGVjdG9yIHNvbWUtc2VsZWN0b3InXG5cdFx0XHRcdFx0XHRcblx0XHRcdGRpdi50b2dnbGVDbGFzcygncGVyaW9kJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ2Fub3RoZXJTZWxlY3RvciAucGVyaW9kIGFubm95aW5nLV8tc2VsZWN0b3Igc29tZS1zZWxlY3RvciBwZXJpb2QnXG5cdFx0XHRcdFx0XHRcblx0XHRcdGRpdi50b2dnbGVDbGFzcygnLnBlcmlvZCcpXG5cdFx0XHRleHBlY3QoZGl2LnJhdy5jbGFzc05hbWUpLnRvLmVxdWFsICdhbm90aGVyU2VsZWN0b3IgYW5ub3lpbmctXy1zZWxlY3RvciBzb21lLXNlbGVjdG9yIHBlcmlvZCdcblx0XHRcdFx0XHRcdFxuXHRcdFx0ZGl2LnRvZ2dsZUNsYXNzKCdhbm5veWluZy1fLXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ2Fub3RoZXJTZWxlY3RvciBzb21lLXNlbGVjdG9yIHBlcmlvZCdcblxuXG5cdFx0dGVzdCBcIi5zZXRSZWZcIiwgKCktPlxuXHRcdFx0ZWwgPSBET00uZGl2KHJlZjonbmFtZTEnKVxuXHRcdFx0ZXhwZWN0KGVsLnJlZikudG8uZXF1YWwgJ25hbWUxJ1xuXHRcdFx0ZXhwZWN0KGVsLm9wdGlvbnMucmVmKS50by5lcXVhbCAnbmFtZTEnXG5cdFx0XHRleHBlY3QoZWwuYXR0ciAnZGF0YS1yZWYnKS50by5lcXVhbCAnbmFtZTEnXG5cblx0XHRcdGVsLnNldFJlZiAnbmFtZTInXG5cdFx0XHRleHBlY3QoZWwucmVmKS50by5lcXVhbCAnbmFtZTInXG5cdFx0XHRleHBlY3QoZWwub3B0aW9ucy5yZWYpLnRvLmVxdWFsICduYW1lMidcblx0XHRcdGV4cGVjdChlbC5hdHRyICdkYXRhLXJlZicpLnRvLmVxdWFsICduYW1lMidcblxuXG5cblxuXHRcdHRlc3QgXCJBcHBlbmRpbmcvcHJlcGVuZGluZyBlbGVtZW50cyB0byBhIHRleHQgbm9kZSBzaG91bGQgZG8gbm90aGluZ1wiLCAoKS0+XG5cdFx0XHR0ZXh0ID0gRG9tLnRleHQoJ2FiYzEyMycpXG5cdFx0XHRleHBlY3QodGV4dC50ZXh0KS50by5lcXVhbCgnYWJjMTIzJylcblx0XHRcdGV4cGVjdCh0ZXh0LnJhdy5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMClcblxuXHRcdFx0dGV4dC5hcHBlbmQoRG9tLnRleHQoJ2RlZicpKVxuXHRcdFx0ZXhwZWN0KHRleHQudGV4dCkudG8uZXF1YWwoJ2FiYzEyMycpXG5cdFx0XHRleHBlY3QodGV4dC5yYXcuY2hpbGROb2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDApXG5cblx0XHRcdHRleHQucHJlcGVuZChEb20uZGl2KG51bGwsICdkZWYnKSlcblx0XHRcdGV4cGVjdCh0ZXh0LnRleHQpLnRvLmVxdWFsKCdhYmMxMjMnKVxuXHRcdFx0ZXhwZWN0KHRleHQucmF3LmNoaWxkTm9kZXMubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsICc0NTYnKVxuXHRcdFx0ZGl2LmFwcGVuZFRvKHRleHQpXG5cdFx0XHRleHBlY3QodGV4dC50ZXh0KS50by5lcXVhbCgnYWJjMTIzJylcblx0XHRcdGV4cGVjdCh0ZXh0LnJhdy5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChkaXYucGFyZW50KS50by5lcXVhbCh1bmRlZmluZWQpXG5cblxuXG5cblx0c3VpdGUgXCJCYXRjaFwiLCAoKS0+XG5cdFx0dGVzdCBcIkRvbS5iYXRjaCgpIHRha2VzIGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgZWxlbWVudHMgb3IgUXVpY2tEb20gZWxlbWVudHMgYW5kIHJldmVhbHMgdGhlIFF1aWNrRWxlbWVudCBBUEkgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIGZvciBlYWNoIGVsZW1lbnRcIiwgKCktPlxuXHRcdFx0c2FuZEJveCA9IERvbShzYW5kYm94KVxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cdFx0XHRBID0gRG9tLmRpdigpLmFwcGVuZFRvKGRpdilcblx0XHRcdEIgPSBEb20uc2VjdGlvbigpLmFwcGVuZFRvKGRpdilcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oZGl2KVxuXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHNhbmRCb3gpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoZGl2KShBLCBCLCBDKVxuXG5cdFx0XHREb20uYmF0Y2goW0EsQixDXSlcblx0XHRcdFx0LmFwcGVuZFRvKHNhbmRCb3gpXG5cdFx0XHRcdC5zdHlsZSAnb3BhY2l0eScsIDAuNVxuXHRcdFx0XHQuY3NzIHtoZWlnaHQ6MzAsIGJhY2tncm91bmRDb2xvcjoncGluayd9XG5cdFx0XHRcdC5hcHBlbmQgJ1NvbWUgSW5uZXIgVGV4dCdcblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShzYW5kQm94KShBLCBCLCBDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShkaXYpKClcblxuXHRcdFx0ZXhwZWN0KGdldENvbXB1dGVkU3R5bGUoQS5lbCkub3BhY2l0eSkudG8uZXF1YWwoJzAuNScpXG5cdFx0XHRleHBlY3QoZ2V0Q29tcHV0ZWRTdHlsZShDLmVsKS5vcGFjaXR5KS50by5lcXVhbCgnMC41Jylcblx0XHRcdGV4cGVjdChnZXRDb21wdXRlZFN0eWxlKEIuZWwpLmhlaWdodCkudG8uZXF1YWwoJzMwcHgnKVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEMuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW5bMF0uZWwudGV4dENvbnRlbnQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQnKVxuXG5cblx0XHR0ZXN0IFwiSWYgYSB0cnV0aHkgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSAybmQgYXJnIG9mIERvbS5iYXRjaCgpLCBhbiBhcnJheSB3aWxsIGJlIHJldHVybmVkIGZvciB0aGUgZmlyc3QgbWV0aG9kIGludm9rZWQgY29udGFpbmluZyB0aGUgcmVzdWx0IGZvciBlYWNoIGVsZW1lbnQgcHJvdmlkZWRcIiwgKCktPlxuXHRcdFx0c2FuZEJveCA9IERvbShzYW5kYm94KVxuXHRcdFx0QSA9IERvbS5kaXYoKS5hcHBlbmRUbyhzYW5kQm94KVxuXHRcdFx0QiA9IERvbS5zZWN0aW9uKCkuYXBwZW5kVG8oc2FuZEJveClcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZEJveClcblxuXHRcdFx0YmF0Y2gxID0gRG9tLmJhdGNoKFtBLEIsQ10pXG5cdFx0XHRiYXRjaDIgPSBEb20uYmF0Y2goW0EsQixDXSwgdHJ1ZSlcblxuXHRcdFx0ZXhwZWN0KGJhdGNoMS5zdHlsZSgnd2lkdGgnKSkudG8uZXF1YWwoYmF0Y2gxKVxuXHRcdFx0ZXhwZWN0KGJhdGNoMS5zdHlsZSgnd2lkdGgnLCA0NykpLnRvLmVxdWFsKGJhdGNoMSlcblx0XHRcdGV4cGVjdChiYXRjaDIuc3R5bGUoJ3dpZHRoJykpLnRvLmVxbChbJzQ3cHgnLCAnNDdweCcsICc0N3B4J10pXG5cdFx0XHRleHBlY3QoYmF0Y2gyLnN0eWxlKCd3aWR0aCcsIDMzKSkudG8uZXFsKFtBLEIsQ10pXG5cdFx0XHRleHBlY3QoYmF0Y2gyLnN0eWxlKCd3aWR0aCcpKS50by5lcWwoWyczM3B4JywgJzMzcHgnLCAnMzNweCddKVxuXG5cblx0XHR0ZXN0IFwiSWYgdGhlIC5yZXR1cm4oKSBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgYmF0Y2ggaW5zdGFuY2UsIGl0IHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgc2V0IGZyb20gdGhlIGxhc3QgbWV0aG9kIGludm9jYXRpb25cIiwgKCktPlxuXHRcdFx0c2FuZEJveCA9IERvbShzYW5kYm94KVxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cdFx0XHRBID0gRG9tLmRpdigpLmFwcGVuZFRvKGRpdilcblx0XHRcdEIgPSBEb20uc2VjdGlvbigpLmFwcGVuZFRvKGRpdilcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oZGl2KVxuXHRcdFx0XG5cdFx0XHRyZXN1bHQgPSBEb20uYmF0Y2goW0EsQixDXSlcblx0XHRcdFx0LmFwcGVuZFRvKHNhbmRCb3gpXG5cdFx0XHRcdC5zdHlsZSAnb3BhY2l0eScsIDAuNVxuXHRcdFx0XHQuY3NzIHtoZWlnaHQ6MzAsIGJhY2tncm91bmRDb2xvcjoncGluayd9XG5cdFx0XHRcdC5hcHBlbmQgJ1NvbWUgSW5uZXIgVGV4dCdcblx0XHRcdFx0LnN0eWxlICdvcGFjaXR5J1xuXHRcdFx0XHQucmV0dXJuKClcblxuXHRcdFx0ZXhwZWN0KHJlc3VsdCkudG8uZXFsIFsnMC41JywnMC41JywnMC41J11cblx0XHRcdGV4cGVjdChEb20uYmF0Y2goW0EsQixDXSkuY3NzKCd3aWR0aCcsICczOHB4JykuY3NzKCd3aWR0aCcpLnJldHVybigpKS50by5lcWwgWyczOHB4JywnMzhweCcsJzM4cHgnXVxuXG5cblx0XHR0ZXN0IFwiSWYgdGhlIC5yZXR1cm4oKSBtZXRob2QgaXMgaW52b2tlZCB3aXRoIGEgdHJ1dGh5IGFyZ3VtZW50LCBpdCB3aWxsIGNhdXNlIHRoZSBuZXh0IG1ldGhvZCBpbnZvY2F0aW9uIHRvIHJldHVybiB0aGUgcmVzdWx0cyBvZiB0aGUgaW52b2NhdGlvbiBmb3IgZWFjaCBlbGVtZW50IHByb3ZpZGVkXCIsICgpLT5cblx0XHRcdHNhbmRCb3ggPSBEb20oc2FuZGJveClcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0QSA9IERvbS5kaXYoKS5hcHBlbmRUbyhkaXYpXG5cdFx0XHRCID0gRG9tLnNlY3Rpb24oKS5hcHBlbmRUbyhkaXYpXG5cdFx0XHRDID0gRG9tLmRpdigpLmFwcGVuZFRvKGRpdilcblx0XHRcdFxuXHRcdFx0cmVzdWx0ID0gRG9tLmJhdGNoKFtBLEIsQ10pXG5cdFx0XHRcdC5hcHBlbmRUbyhzYW5kQm94KVxuXHRcdFx0XHQuc3R5bGUgJ29wYWNpdHknLCAwLjVcblx0XHRcdFx0LmNzcyB7aGVpZ2h0OjMwLCBiYWNrZ3JvdW5kQ29sb3I6J3BpbmsnfVxuXHRcdFx0XHQuYXBwZW5kICdTb21lIElubmVyIFRleHQnXG5cdFx0XHRcdC5yZXR1cm4odHJ1ZSlcblx0XHRcdFx0LnN0eWxlICdvcGFjaXR5J1xuXG5cdFx0XHRleHBlY3QocmVzdWx0KS50by5lcWwgWycwLjUnLCcwLjUnLCcwLjUnXVxuXHRcdFx0ZXhwZWN0KERvbS5iYXRjaChbQSxCLENdKS5jc3MoJ3dpZHRoJywgJzM4cHgnKS5jc3MoJ2hlaWdodCcsICcyOHB4JykucmV0dXJuKHRydWUpLmNzcygnd2lkdGgnKSkudG8uZXFsIFsnMzhweCcsJzM4cHgnLCczOHB4J11cblxuXG5cdFx0dGVzdCBcIkludm9raW5nIHRoZSAucmV2ZXJzZSgpIG1ldGhvZCBvbiB0aGUgYmF0Y2ggaW5zdGFuY2Ugd2lsbCByZXZlcnNlIHRoZSBlbGVtZW50cyBhcnJheSBpbiB0aGUgYmF0Y2ggYW5kIHRodXMgdGhlIGV4ZWN1dGlvbiBvcmRlclwiLCAoKS0+XG5cdFx0XHRBID0gRG9tLmRpdihudWxsLCAnQUFBJykuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdEIgPSBEb20uZGl2KG51bGwsICdCQkInKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0QyA9IERvbS5kaXYobnVsbCwgJ0NDQycpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRhcnIgPSBbQSxCLENdXG5cdFx0XHRleHBlY3QoRG9tLmJhdGNoKGFycikuZWxlbWVudHMpLm5vdC50by5lcXVhbChhcnIpXG5cdFx0XHRleHBlY3QoRG9tLmJhdGNoKGFycikuZWxlbWVudHMpLnRvLmVxbCBbQSxCLENdXG5cdFx0XHRleHBlY3QoRG9tLmJhdGNoKGFycikucmV2ZXJzZSgpLmVsZW1lbnRzKS50by5lcWwgW0MsQixBXVxuXHRcdFx0ZXhwZWN0KERvbS5iYXRjaChhcnIsMSkudGV4dCgpKS50by5lcWwgWydBQUEnLCdCQkInLCdDQ0MnXVxuXHRcdFx0ZXhwZWN0KERvbS5iYXRjaChhcnIsMSkucmV2ZXJzZSgpLnRleHQoKSkudG8uZXFsIFsnQ0NDJywnQkJCJywnQUFBJ11cblx0XHRcdGV4cGVjdChEb20uYmF0Y2goYXJyLDEpLnJldmVyc2UoKS50ZXh0KCkpLnRvLmVxbCBbJ0NDQycsJ0JCQicsJ0FBQSddXG5cdFx0XHRleHBlY3QoRG9tLmJhdGNoKGFyciwxKS5yZXZlcnNlKCkucmV2ZXJzZSgpLnRleHQoKSkudG8uZXFsIFsnQUFBJywnQkJCJywnQ0NDJ11cblxuXG5cdFx0dGVzdCBcIkJhdGNoLnRleHQvLmh0bWwgYXJlIG1ldGhvZHMgaW5zdGVhZCBvZiBnZXR0ZXJzL3NldHRlcnNcIiwgKCktPlxuXHRcdFx0ZGl2QSA9IERvbS5kaXYobnVsbCwgJ1RoZSBkaXZBJylcblx0XHRcdGRpdkIgPSBEb20uZGl2KG51bGwsICdUaGUgZGl2QicpXG5cdFx0XHRiYXRjaCA9IERvbS5iYXRjaChbZGl2QSwgZGl2Ql0sIHRydWUpXG5cblx0XHRcdGV4cGVjdChiYXRjaC5odG1sKCkpLnRvLmVxbCBbJ1RoZSBkaXZBJywgJ1RoZSBkaXZCJ11cblx0XHRcdGV4cGVjdChiYXRjaC50ZXh0KCkpLnRvLmVxbCBbJ1RoZSBkaXZBJywgJ1RoZSBkaXZCJ11cblx0XHRcdFxuXHRcdFx0YmF0Y2guaHRtbCgnPHNwYW4+VGhlIGRpdjwvc3Bhbj4nKVxuXHRcdFx0ZXhwZWN0KGJhdGNoLmh0bWwoKSkudG8uZXFsIFsnPHNwYW4+VGhlIGRpdjwvc3Bhbj4nLCAnPHNwYW4+VGhlIGRpdjwvc3Bhbj4nXVxuXHRcdFx0ZXhwZWN0KGJhdGNoLnRleHQoKSkudG8uZXFsIFsnVGhlIGRpdicsICdUaGUgZGl2J11cblxuXHRcdFx0YmF0Y2gudGV4dCgnVEhFIERJVicpXG5cdFx0XHRleHBlY3QoYmF0Y2guaHRtbCgpKS50by5lcWwgWydUSEUgRElWJywgJ1RIRSBESVYnXVxuXHRcdFx0ZXhwZWN0KGJhdGNoLnRleHQoKSkudG8uZXFsIFsnVEhFIERJVicsICdUSEUgRElWJ11cblxuXG5cblx0c3VpdGUgXCJUZW1wbGF0ZXNcIiwgKCktPlxuXHRcdHRlc3QgXCJBIHJldXNhYmxlIHRlbXBsYXRlIGNhbiBiZSBnZW5lcmF0ZWQgdmlhIFF1aWNrRG9tLnRlbXBsYXRlKClcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoWydzcGFuJywgaWQ6J3RoZVNwYW4nXSlcblxuXHRcdFx0ZXhwZWN0KHR5cGVvZiB0ZW1wbGF0ZSkudG8uZXF1YWwoJ29iamVjdCcpXG5cdFx0XHRleHBlY3QodGVtcGxhdGUudHlwZSkudG8uZXF1YWwoJ3NwYW4nKVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLm9wdGlvbnMpLnRvLmVxbChpZDondGhlU3BhbicpXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW4pLnRvLmVxbChbXSlcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlcyBjYW4gYmUgdHVybmVkIGludG8gUXVpY2tEb20gaW5zdGFuY2VzIHZpYSB0ZW1wbGF0ZS5zcGF3bigpIG9yIGJ5IHBhc3NpbmcgYXMgYXJnIHRvIFF1aWNrRG9tXCIsICgpLT5cblx0XHRcdHRlbXBsYXRlID0gRG9tLnRlbXBsYXRlKFsnZGl2JywgY2xhc3NOYW1lOidzb21lLWRpdicsICdTb21lIElubmVyIFRleHQnXSlcblx0XHRcdHNwYXduQSA9IHRlbXBsYXRlLnNwYXduKClcblx0XHRcdHNwYXduQS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0c3Bhd25CID0gRG9tKHRlbXBsYXRlKVxuXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsKS50by5iZS5pbnN0YW5jZU9mKEhUTUxEaXZFbGVtZW50KVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbCkudG8uYmUuaW5zdGFuY2VPZihIVE1MRGl2RWxlbWVudClcblx0XHRcdGV4cGVjdChzcGF3bkEpLm5vdC50by5lcXVhbChzcGF3bkIpXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsKS5ub3QudG8uZXF1YWwoc3Bhd25CLmVsKVxuXHRcdFx0ZXhwZWN0KHNwYXduQS5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3Qoc3Bhd25CLnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsLnRleHRDb250ZW50KS50by5lcXVhbCgnU29tZSBJbm5lciBUZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwudGV4dENvbnRlbnQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQS5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdzb21lLWRpdicpXG5cblxuXHRcdHRlc3QgXCJUZW1wbGF0ZXMgY2FuIGJlIGNyZWF0ZWQgZnJvbSBRdWlja0VsZW1lbnQgaW5zdGFuY2VzXCIsICgpLT5cblx0XHRcdHNlY3Rpb24gPSBEb20uc2VjdGlvbihjbGFzc05hbWU6J3NpbmdsZVNlY3Rpb24nLCAnU29tZSBJbm5lciBUZXh0Jylcblx0XHRcdHNlY3Rpb24uc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdHNlY3Rpb25UZW1wbGF0ZSA9IHNlY3Rpb24udG9UZW1wbGF0ZSgpXG5cdFx0XHR0ZW1wbGF0ZVNwYXduID0gc2VjdGlvblRlbXBsYXRlLnNwYXduKClcblxuXHRcdFx0ZXhwZWN0KHNlY3Rpb25UZW1wbGF0ZSkubm90LnRvLmVxdWFsKHNlY3Rpb24pXG5cdFx0XHRleHBlY3QodGVtcGxhdGVTcGF3bi5lbCkubm90LnRvLmVxdWFsKHNlY3Rpb24uZWwpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVTcGF3bi5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdzaW5nbGVTZWN0aW9uJylcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZVNwYXduLnRleHQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQnKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlU3Bhd24uc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2VcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlcyBjYW4gYmUgY3JlYXRlZCBmcm9tIERPTSBFbGVtZW50c1wiLCAoKS0+XG5cdFx0XHRzZWN0aW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJylcblx0XHRcdHNlY3Rpb25FbC5jbGFzc05hbWUgPSAnc2luZ2xlU2VjdGlvbidcblx0XHRcdHNlY3Rpb25FbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSAnU29tZSBJbm5lciBUZXh0Jylcblx0XHRcdHNlY3Rpb25UZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShzZWN0aW9uRWwpXG5cdFx0XHR0ZW1wbGF0ZVNwYXduID0gc2VjdGlvblRlbXBsYXRlLnNwYXduKClcblxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlU3Bhd24uZWwpLm5vdC50by5lcXVhbChzZWN0aW9uRWwpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVTcGF3bi5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdzaW5nbGVTZWN0aW9uJylcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZVNwYXduLnRleHQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQnKVxuXG5cblx0XHR0ZXN0IFwiVGVtcGxhdGVzIGNhbiBiZSBleHRlbmRlZCB2aWEgdGVtcGxhdGUuZXh0ZW5kXCIsICgpLT5cblx0XHRcdHRlbXBsYXRlID0gRG9tLnRlbXBsYXRlKFsnZGl2JywgY2xhc3NOYW1lOidzb21lLWRpdicsICdTb21lIElubmVyIFRleHQnXSlcblx0XHRcdHRlbXBsYXRlQ29weUEgPSB0ZW1wbGF0ZS5leHRlbmQge3R5cGU6J3NwYW4nLCBvcHRpb25zOntjbGFzc05hbWU6J3NvbWUtc3Bhbid9LCBjaGlsZHJlbjpbXX1cblx0XHRcdHRlbXBsYXRlQ29weUIgPSB0ZW1wbGF0ZS5leHRlbmQge29wdGlvbnM6e2lkOid0aGVNYWluRGl2J30sIGNoaWxkcmVuOlsnVGhlIE90aGVyIElubmVyIFRleHQnXX1cblx0XHRcdHRlbXBsYXRlQ29weUMgPSB0ZW1wbGF0ZS5leHRlbmQoXG5cdFx0XHRcdFsnc2VjdGlvbidcblx0XHRcdFx0XHRjbGFzc05hbWU6J3NvbWUtc2VjdGlvbidcblx0XHRcdFx0XHRbJ2RpdicsIG51bGwsICdWZXJ5ICddXG5cdFx0XHRcdFx0WydkaXYnLCBudWxsXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7c3R5bGU6Zm9udFdlaWdodDo1MDB9LCdOZXN0ZWQgJ11cblx0XHRcdFx0XHRcdCdJbm5lciBUZXh0J1xuXHRcdFx0XHRcdF1cblx0XHRcdFx0XVxuXHRcdFx0KVxuXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5QSkubm90LnRvLmVxdWFsKHRlbXBsYXRlKVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weUIpLm5vdC50by5lcXVhbCh0ZW1wbGF0ZSlcblx0XHRcdHNwYXduID0gdGVtcGxhdGUuc3Bhd24oKVxuXHRcdFx0c3Bhd25BID0gdGVtcGxhdGVDb3B5QS5zcGF3bigpXG5cdFx0XHRzcGF3bkIgPSB0ZW1wbGF0ZUNvcHlCLnNwYXduKClcblx0XHRcdHNwYXduQyA9IHRlbXBsYXRlQ29weUMuc3Bhd24oKVxuXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ2RpdicpXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwuY2xhc3NOYW1lKS50by5lcXVhbCgnc29tZS1kaXYnKVxuXHRcdFx0ZXhwZWN0KHNwYXduLmVsLmlkKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzcGF3bi50ZXh0KS50by5lcXVhbCgnU29tZSBJbm5lciBUZXh0JylcblxuXHRcdFx0ZXhwZWN0KHNwYXduQS5lbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsLmNsYXNzTmFtZSkudG8uZXF1YWwoJ3NvbWUtc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsLmlkKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzcGF3bkEudGV4dCkudG8uZXF1YWwoJ1NvbWUgSW5uZXIgVGV4dCcpXG5cblx0XHRcdGV4cGVjdChzcGF3bkIuZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ2RpdicpXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmVsLmNsYXNzTmFtZSkudG8uZXF1YWwoJ3NvbWUtZGl2Jylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwuaWQpLnRvLmVxdWFsKCd0aGVNYWluRGl2Jylcblx0XHRcdGV4cGVjdChzcGF3bkIudGV4dCkudG8uZXF1YWwoJ1RoZSBPdGhlciBJbm5lciBUZXh0JylcblxuXHRcdFx0ZXhwZWN0KHNwYXduQy5lbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnc2VjdGlvbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25DLmVsLmNsYXNzTmFtZSkudG8uZXF1YWwoJ3NvbWUtc2VjdGlvbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25DLmVsLmlkKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzcGF3bkMudGV4dCkudG8uZXF1YWwoJ1ZlcnkgTmVzdGVkIElubmVyIFRleHQnKVxuXG5cblx0XHR0ZXN0IFwiVGVtcGxhdGVzIGNhbiBiZSBzcGF3bmVkIHZpYSBleHRlbmRlZCBjb25maWcgYnkgcGFzc2luZyBhIG5ldyBjb25maWcgb2JqZWN0IHRvIHRlbXBsYXRlLnNwYXduKClcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2JywgY2xhc3NOYW1lOidzb21lLWRpdicsXG5cdFx0XHRcdFx0J1NvbWUgSW5uZXIgVGV4dCcsXG5cdFx0XHRcdFx0WydzdHJvbmcnLCB7Y2xhc3NOYW1lOidoaWdobGlnaHRlZCcsIHN0eWxlOntvcGFjaXR5OjAuOX19LCAnIC0gQm9sZGVkIFRleHQnXVxuXHRcdFx0XHRdXG5cdFx0XHQpXG5cdFx0XHRzcGF3blJhdyA9IHRlbXBsYXRlLnNwYXduKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdHNwYXduQSA9IHRlbXBsYXRlLnNwYXduKHR5cGU6J3NlY3Rpb24nLCBvcHRpb25zOntjbGFzc05hbWU6J3NvbWUtc2VjdGlvbicsIHN0eWxlOntvcGFjaXR5OjAuN319KS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0c3Bhd25CID0gdGVtcGxhdGUuc3Bhd24oXG5cdFx0XHRcdG9wdGlvbnM6XG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiAnbWFpbi1kaXYnXG5cdFx0XHRcdFx0aWQ6ICd0aGVNYWluRGl2J1xuXHRcdFx0XHRcdHN0eWxlOiBvcGFjaXR5OiAwLjVcblx0XHRcdFx0Y2hpbGRyZW46IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc3Bhbidcblx0XHRcdFx0XHRcdGNoaWxkcmVuOiBbXG5cdFx0XHRcdFx0XHRcdHR5cGU6J3RleHQnXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnM6IHt0ZXh0OiAnTWFpbiBJbm5lciBUZXh0J31cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dHlwZTogJ2InXG5cdFx0XHRcdFx0XHRvcHRpb25zOlxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICdzdXBlci1oaWdobGlnaHRlZCdcblx0XHRcdFx0XHRcdFx0c3R5bGU6IG9wYWNpdHk6ICcwLjInXG5cdFx0XHRcdFx0XHRjaGlsZHJlbjogW1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7dGV4dDogJyAtIFZlcnkgQm9sZGVkIFRleHQnfVxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0eXBlOiAndGV4dCdcblx0XHRcdFx0XHRcdG9wdGlvbnM6IHt0ZXh0OiAnICsgT3RoZXIgVGV4dCd9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnZGl2Jylcblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdzb21lLWRpdicpXG5cdFx0XHRleHBlY3Qoc3Bhd25SYXcuZWwuaWQpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KHNwYXduUmF3LnRleHQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQgLSBCb2xkZWQgVGV4dCcpXG5cdFx0XHRleHBlY3Qoc3Bhd25SYXcuZWwpLnRvLmhhdmUuc3R5bGUoJ29wYWNpdHknLCcxJylcblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5jaGlsZE5vZGVzWzBdLm5vZGVOYW1lKS50by5lcXVhbCgnI3RleHQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduUmF3LmVsLmNoaWxkTm9kZXNbMV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ3N0cm9uZycpXG5cdFx0XHRleHBlY3Qoc3Bhd25SYXcuZWwuY2hpbGROb2Rlc1sxXS5jbGFzc05hbWUpLnRvLmluY2x1ZGUoJ2hpZ2hsaWdodGVkJylcblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5jaGlsZE5vZGVzWzFdKS50by5oYXZlLnN0eWxlKCdvcGFjaXR5JywgJzAuOScpXG5cblx0XHRcdGV4cGVjdChzcGF3bkEuZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ3NlY3Rpb24nKVxuXHRcdFx0ZXhwZWN0KHNwYXduQS5lbC5jbGFzc05hbWUpLnRvLmluY2x1ZGUoJ3NvbWUtc2VjdGlvbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsLmlkKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzcGF3bkEudGV4dCkudG8uZXF1YWwoJ1NvbWUgSW5uZXIgVGV4dCAtIEJvbGRlZCBUZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwpLnRvLmhhdmUuc3R5bGUoJ29wYWNpdHknLCcwLjcnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQS5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwuY2hpbGROb2Rlc1swXS5ub2RlTmFtZSkudG8uZXF1YWwoJyN0ZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwuY2hpbGROb2Rlc1sxXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnc3Ryb25nJylcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwuY2hpbGROb2Rlc1sxXS5jbGFzc05hbWUpLnRvLmluY2x1ZGUoJ2hpZ2hsaWdodGVkJylcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwuY2hpbGROb2Rlc1sxXSkudG8uaGF2ZS5zdHlsZSgnb3BhY2l0eScsICcwLjknKVxuXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpLnRvLmVxdWFsKCdkaXYnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbC5jbGFzc05hbWUpLnRvLmluY2x1ZGUoJ21haW4tZGl2Jylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwuaWQpLnRvLmVxdWFsKCd0aGVNYWluRGl2Jylcblx0XHRcdGV4cGVjdChzcGF3bkIudGV4dCkudG8uZXF1YWwoJ01haW4gSW5uZXIgVGV4dCAtIFZlcnkgQm9sZGVkIFRleHQgKyBPdGhlciBUZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwpLnRvLmhhdmUuc3R5bGUoJ29wYWNpdHknLCcwLjUnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwuY2hpbGROb2Rlc1swXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmVsLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmVsLmNoaWxkTm9kZXNbMV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ2InKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbC5jaGlsZE5vZGVzWzFdLmNsYXNzTmFtZSkudG8uaW5jbHVkZSgnc3VwZXItaGlnaGxpZ2h0ZWQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbC5jaGlsZE5vZGVzWzFdKS50by5oYXZlLnN0eWxlKCdvcGFjaXR5JywgJzAuMicpXG5cblxuXHRcdHRlc3QgXCJUZW1wbGF0ZS5leHRlbmQvc3Bhd24oKSBjYW4gYWNjZXB0IGEgdGVtcGxhdGUgdHJlZSBhcnJheVwiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZSBbJ2RpdicsIHN0eWxlOnsnb3BhY2l0eSc6MC41fSwgWydzcGFuJywgbnVsbCwgJ3RleHQgb2Ygc3BhbiddLCBbJ2RpdicsIG51bGwsICd0ZXh0IG9mIGRpdiddXVxuXHRcdFx0Y2xvbmVBID0gdGVtcGxhdGUuZXh0ZW5kKFsnc2VjdGlvbicsIHN0eWxlOnsnb3BhY2l0eSc6MC44fV0pXG5cdFx0XHRjbG9uZUIgPSB0ZW1wbGF0ZS5leHRlbmQoWydzcGFuJywgbnVsbCwgWydkaXYnXV0pXG5cdFx0XHRjbG9uZUMgPSB0ZW1wbGF0ZS5leHRlbmQoWydzZWN0aW9uJywge2NsYXNzTmFtZTondGhlLXNlY3Rpb24nLCBzdHlsZTp7Y29sb3I6J2JsdWUnfX0sIFsnc2VjdGlvbicsIG51bGwsICd0ZXh0IG9mIHN1YnNlY3Rpb24nXSwgJ2p1c3QgYSB0ZXh0IG5vZGUnXSlcblx0XHRcdHNwYXduID0gdGVtcGxhdGUuc3Bhd24oWydzcGFuJywgc3R5bGU6eyd3aWR0aCc6MTkwLCAnb3BhY2l0eSc6MC40fSwgJ3NvIG5pY2UnXSkuYXBwZW5kVG8oc2FuZGJveClcblxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLnR5cGUpLnRvLmVxdWFsICdkaXYnXG5cdFx0XHRleHBlY3QodGVtcGxhdGUub3B0aW9ucykudG8uZXFsIHtzdHlsZTp7J29wYWNpdHknOjAuNX19XG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAyXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMF0udHlwZSkudG8uZXF1YWwgJ3NwYW4nXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMF0uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0ub3B0aW9ucy50ZXh0KS50by5lcXVhbCAndGV4dCBvZiBzcGFuJ1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmNoaWxkcmVuWzFdLnR5cGUpLnRvLmVxdWFsICdkaXYnXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMV0uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0ub3B0aW9ucy50ZXh0KS50by5lcXVhbCAndGV4dCBvZiBkaXYnXG5cblx0XHRcdGV4cGVjdChjbG9uZUEudHlwZSkudG8uZXF1YWwgJ3NlY3Rpb24nXG5cdFx0XHRleHBlY3QoY2xvbmVBLm9wdGlvbnMpLnRvLmVxbCB7c3R5bGU6eydvcGFjaXR5JzowLjh9fVxuXHRcdFx0ZXhwZWN0KGNsb25lQS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDJcblx0XHRcdGV4cGVjdChjbG9uZUEuY2hpbGRyZW5bMF0udHlwZSkudG8uZXF1YWwgJ3NwYW4nXG5cdFx0XHRleHBlY3QoY2xvbmVBLmNoaWxkcmVuWzBdLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNsb25lQS5jaGlsZHJlblswXS5jaGlsZHJlblswXS5vcHRpb25zLnRleHQpLnRvLmVxdWFsICd0ZXh0IG9mIHNwYW4nXG5cdFx0XHRleHBlY3QoY2xvbmVBLmNoaWxkcmVuWzFdLnR5cGUpLnRvLmVxdWFsICdkaXYnXG5cdFx0XHRleHBlY3QoY2xvbmVBLmNoaWxkcmVuWzFdLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNsb25lQS5jaGlsZHJlblsxXS5jaGlsZHJlblswXS5vcHRpb25zLnRleHQpLnRvLmVxdWFsICd0ZXh0IG9mIGRpdidcblxuXHRcdFx0ZXhwZWN0KGNsb25lQi50eXBlKS50by5lcXVhbCAnc3Bhbidcblx0XHRcdGV4cGVjdChjbG9uZUIub3B0aW9ucykudG8uZXFsIHtzdHlsZTp7J29wYWNpdHknOjAuNX19XG5cdFx0XHRleHBlY3QoY2xvbmVCLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMlxuXHRcdFx0ZXhwZWN0KGNsb25lQi5jaGlsZHJlblswXS50eXBlKS50by5lcXVhbCAnZGl2J1xuXHRcdFx0ZXhwZWN0KGNsb25lQi5jaGlsZHJlblswXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjbG9uZUIuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0ub3B0aW9ucy50ZXh0KS50by5lcXVhbCAndGV4dCBvZiBzcGFuJ1xuXHRcdFx0ZXhwZWN0KGNsb25lQi5jaGlsZHJlblsxXS50eXBlKS50by5lcXVhbCAnZGl2J1xuXHRcdFx0ZXhwZWN0KGNsb25lQi5jaGlsZHJlblsxXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjbG9uZUIuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0ub3B0aW9ucy50ZXh0KS50by5lcXVhbCAndGV4dCBvZiBkaXYnXG5cblx0XHRcdGV4cGVjdChjbG9uZUMudHlwZSkudG8uZXF1YWwgJ3NlY3Rpb24nXG5cdFx0XHRleHBlY3QoY2xvbmVDLm9wdGlvbnMpLnRvLmVxbCB7Y2xhc3NOYW1lOid0aGUtc2VjdGlvbicsIHN0eWxlOnsnb3BhY2l0eSc6MC41LCAnY29sb3InOidibHVlJ319XG5cdFx0XHRleHBlY3QoY2xvbmVDLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMlxuXHRcdFx0ZXhwZWN0KGNsb25lQy5jaGlsZHJlblswXS50eXBlKS50by5lcXVhbCAnc2VjdGlvbidcblx0XHRcdGV4cGVjdChjbG9uZUMuY2hpbGRyZW5bMF0uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2xvbmVDLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLm9wdGlvbnMudGV4dCkudG8uZXF1YWwgJ3RleHQgb2Ygc3Vic2VjdGlvbidcblx0XHRcdGV4cGVjdChjbG9uZUMuY2hpbGRyZW5bMV0udHlwZSkudG8uZXF1YWwgJ3RleHQnXG5cdFx0XHRleHBlY3QoY2xvbmVDLmNoaWxkcmVuWzFdLm9wdGlvbnMudGV4dCkudG8uZXF1YWwgJ2p1c3QgYSB0ZXh0IG5vZGUnXG5cblx0XHRcdHNwYXduLnN0eWxlICdkaXNwbGF5JywgJ2Jsb2NrJ1xuXHRcdFx0ZXhwZWN0KHNwYXduLmVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpLnRvLmVxdWFsICdzcGFuJ1xuXHRcdFx0ZXhwZWN0KHNwYXduLmVsKS50by5oYXZlLnN0eWxlICdvcGFjaXR5JywgJzAuNCdcblx0XHRcdGV4cGVjdChzcGF3bi5lbCkudG8uaGF2ZS5zdHlsZSAnd2lkdGgnLCAnMTkwcHgnXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwuY2hpbGROb2Rlcy5sZW5ndGgpLnRvLmVxdWFsIDJcblx0XHRcdGV4cGVjdChzcGF3bi5lbC5jaGlsZE5vZGVzWzBdLm5vZGVUeXBlKS50by5lcXVhbCAzXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwuY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCkudG8uZXF1YWwgJ3NvIG5pY2UnXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwuY2hpbGROb2Rlc1sxXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCAnZGl2J1xuXHRcdFx0ZXhwZWN0KHNwYXduLmVsLmNoaWxkTm9kZXNbMV0udGV4dENvbnRlbnQpLnRvLmVxdWFsICd0ZXh0IG9mIGRpdidcblxuXHRcdFx0IyBleHBlY3QgKCktPlxuXHRcdFx0IyBcdERvbS50ZW1wbGF0ZShbJ2RpdiddKS5leHRlbmQoWydzcGFuJywgbnVsbCwgWydkaXYnLCBudWxsLCBbJ3NlY3Rpb24nXV1dKVxuXHRcdFx0IyAubm90LnRvLnRocm93KClcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlLmV4dGVuZC9zcGF3bigpIGNhbiBhY2NlcHQgb3RoZXIgdGVtcGxhdGUgaW5zdGFuY2VzIGFzIGNoaWxkcmVuIHdoaWNoIHdpbGwgcmVwbGFjZSBleGlzdGluZyBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZSBbJ2RpdicsIG51bGwsIFsnc3BhbicsIHtzdHlsZTpvcGFjaXR5OjAuNX1dLCAnb3JpZ2luYWwgdGV4dCddXG5cdFx0XHRjaGlsZEEgPSBEb20udGVtcGxhdGUgWydkaXYnLCB7c3R5bGU6Zm9udEZhbWlseToncGluayd9XVxuXHRcdFx0Y2hpbGRCID0gRG9tLnRlbXBsYXRlICdyZXBsYWNlZCB0ZXh0J1xuXHRcdFx0Y2hpbGRDID0gRG9tLnRlbXBsYXRlIFsnc2VjdGlvbiddXG5cdFx0XHR0ZW1wbGF0ZUNvcHkgPSB0ZW1wbGF0ZS5leHRlbmQoWydzcGFuJywge3N0eWxlOmZvbnRTaXplOic3N3B4J30sIGNoaWxkQSwgY2hpbGRCLCBjaGlsZENdKVxuXHRcdFx0c3Bhd25lZEEgPSB0ZW1wbGF0ZS5zcGF3bigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRzcGF3bmVkQiA9IHRlbXBsYXRlQ29weS5zcGF3bigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRzcGF3bmVkQyA9IHRlbXBsYXRlLnNwYXduKFsnc3BhbicsIHtzdHlsZTpmb250U2l6ZTonNzdweCd9LCBjaGlsZEEsIGNoaWxkQiwgY2hpbGRDXSkuYXBwZW5kVG8oc2FuZGJveClcblxuXHRcdFx0ZXhwZWN0KHNwYXduZWRBLnR5cGUpLnRvLmVxdWFsKCdkaXYnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRBLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChzcGF3bmVkQS5jaGlsZHJlblswXS50eXBlKS50by5lcXVhbCgnc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEEuY2hpbGRyZW5bMF0ucmF3KS50by5oYXZlLnN0eWxlKCdvcGFjaXR5JywgJzAuNScpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEEuY2hpbGRyZW5bMF0ucmF3KS50by5oYXZlLnN0eWxlKCdmb250RmFtaWx5JywgJycpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEEuY2hpbGRyZW5bMV0udHlwZSkudG8uZXF1YWwoJ3RleHQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRBLnRleHQpLnRvLmVxdWFsKCdvcmlnaW5hbCB0ZXh0JylcblxuXHRcdFx0ZXhwZWN0KHNwYXduZWRCLnR5cGUpLnRvLmVxdWFsKCdzcGFuJylcblx0XHRcdGV4cGVjdChzcGF3bmVkQi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEIuY2hpbGRyZW5bMF0udHlwZSkudG8uZXF1YWwoJ2RpdicpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEIuY2hpbGRyZW5bMF0ucmF3KS50by5oYXZlLnN0eWxlKCdvcGFjaXR5JywgJycpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEIuY2hpbGRyZW5bMF0ucmF3KS50by5oYXZlLnN0eWxlKCdmb250RmFtaWx5JywgJ3BpbmsnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRCLmNoaWxkcmVuWzFdLnR5cGUpLnRvLmVxdWFsKCd0ZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bmVkQi50ZXh0KS50by5lcXVhbCgncmVwbGFjZWQgdGV4dCcpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEIuY2hpbGRyZW5bMl0udHlwZSkudG8uZXF1YWwoJ3NlY3Rpb24nKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRCLnJhdykudG8uaGF2ZS5zdHlsZSgnZm9udFNpemUnLCAnNzdweCcpXG5cblx0XHRcdGV4cGVjdChzcGF3bmVkQy50eXBlKS50by5lcXVhbCgnc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEMuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRDLmNoaWxkcmVuWzBdLnR5cGUpLnRvLmVxdWFsKCdkaXYnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRDLmNoaWxkcmVuWzBdLnJhdykudG8uaGF2ZS5zdHlsZSgnb3BhY2l0eScsICcnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRDLmNoaWxkcmVuWzBdLnJhdykudG8uaGF2ZS5zdHlsZSgnZm9udEZhbWlseScsICdwaW5rJylcblx0XHRcdGV4cGVjdChzcGF3bmVkQy5jaGlsZHJlblsxXS50eXBlKS50by5lcXVhbCgndGV4dCcpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEMudGV4dCkudG8uZXF1YWwoJ3JlcGxhY2VkIHRleHQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRDLmNoaWxkcmVuWzJdLnR5cGUpLnRvLmVxdWFsKCdzZWN0aW9uJylcblx0XHRcdGV4cGVjdChzcGF3bmVkQy5yYXcpLnRvLmhhdmUuc3R5bGUoJ2ZvbnRTaXplJywgJzc3cHgnKVxuXG5cblx0XHR0ZXN0IFwiVGVtcGxhdGUuZXh0ZW5kL3NwYXduKCkgd2lsbCBjb25zaWRlciB0aGUgcGFzc2VkIG9iamVjdCBhcyB0aGUgb3B0aW9ucyBvYmplY3QgaWYgaXQgZG9lc24ndCBjb250YWluIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcHNcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGUgPSBET00udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdGRlZmF1bHRzOiB0ZXh0OiAnZGVmYXVsdCdcblx0XHRcdFx0XHRjb21wdXRlcnM6IHRleHQ6ICh0ZXh0KS0+IEB0ZXh0ID0gdGV4dFxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdFsnc3BhbicsIHJlZjondGhlU3BhbiddXG5cdFx0XHRcdF1cblx0XHRcdClcblxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLm9wdGlvbnMuc3R5bGUpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLm9wdGlvbnMubGFiZWwpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmV4dGVuZChvcHRpb25zOmxhYmVsOidhYmMxMjMnKS5vcHRpb25zLmxhYmVsKS50by5lcXVhbCAnYWJjMTIzJ1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmV4dGVuZChsYWJlbDonZGVmNDU2Jykub3B0aW9ucy5sYWJlbCkudG8uZXF1YWwgJ2RlZjQ1Nidcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5leHRlbmQoc3R5bGU6J2RlZjQ1NicpLm9wdGlvbnMuc3R5bGUpLnRvLmVxdWFsICdkZWY0NTYnXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuZXh0ZW5kKHN0eWxlOidkZWY0NTYnLCB0eXBlOidzZWN0aW9uJykub3B0aW9ucy5zdHlsZSkudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuZXh0ZW5kKGNoaWxkcmVuOnRoZVNwYW46c3R5bGU6J2doaTc4OScpLmNoaWxkLnRoZVNwYW4ub3B0aW9ucy5zdHlsZSkudG8uZXF1YWwgJ2doaTc4OSdcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5leHRlbmQoY2hpbGRyZW46W2RlZmF1bHRzOidnaGk3ODknXSkuY2hpbGQudGhlU3Bhbi5vcHRpb25zLmRlZmF1bHRzKS50by5lcXVhbCAnZ2hpNzg5J1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLnNwYXduKGNoaWxkcmVuOnRoZVNwYW46Y2xhc3NOYW1lOidHSEk3ODknKS5jaGlsZC50aGVTcGFuLnJhdy5jbGFzc05hbWUpLnRvLmVxdWFsICdHSEk3ODknXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuc3Bhd24oKS50ZXh0KS50by5lcXVhbCAnZGVmYXVsdCdcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5zcGF3bihkZWZhdWx0czp0ZXh0OidkaWZmJykudGV4dCkudG8uZXF1YWwgJ2RpZmYnXG5cblxuXHRcdHRlc3QgXCJUZW1wbGF0ZXMgY2FuIGhhdmUgb3RoZXIgdGVtcGxhdGVzIGFzIHRoZWlyIGNoaWxkcmVuXCIsICgpLT5cblx0XHRcdGhlYWRlclRlbXBsYXRlID0gRG9tLnRlbXBsYXRlIFsnaGVhZGVyJywge3N0eWxlOidoZWlnaHQnOicyMDBweCd9LFxuXHRcdFx0XHRbJ3NwYW4nLCB7c3R5bGU6J3RleHRBbGlnbic6J2NlbnRlcid9LCAnVGhpcyBpcyBib2xkZWQgdGV4dCddXG5cdFx0XHRcdCcgd2hpbGUgdGhpcyBpcyBub3QnXG5cdFx0XHRdXG5cdFx0XHRoZWFkZXJUZW1wbGF0ZUNsb25lID0gRG9tLnRlbXBsYXRlKGhlYWRlclRlbXBsYXRlKVxuXHRcdFx0c2VjdGlvblRlbXBsYXRlID0gRG9tLnRlbXBsYXRlIFsnc2VjdGlvbicsIG51bGwsIGhlYWRlclRlbXBsYXRlXVxuXHRcdFx0c2VjdGlvbiA9IHNlY3Rpb25UZW1wbGF0ZS5zcGF3bigpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGV4cGVjdChoZWFkZXJUZW1wbGF0ZUNsb25lKS50by5lcXVhbChoZWFkZXJUZW1wbGF0ZSlcblx0XHRcdGV4cGVjdChzZWN0aW9uVGVtcGxhdGUuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb25UZW1wbGF0ZS5jaGlsZHJlblswXSkudG8uZXF1YWwoaGVhZGVyVGVtcGxhdGUpXG5cdFx0XHRleHBlY3Qoc2VjdGlvblRlbXBsYXRlLmNoaWxkcmVuWzBdLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzBdLnR5cGUpLnRvLmVxdWFsKCdoZWFkZXInKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMF0uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24udGV4dCkudG8uZXF1YWwoJ1RoaXMgaXMgYm9sZGVkIHRleHQgd2hpbGUgdGhpcyBpcyBub3QnKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uc3R5bGUoJ3RleHRBbGlnbicpKS50by5lcXVhbCgnY2VudGVyJylcblxuXG5cdFx0dGVzdCBcIkEgZ2xvYmFsIG9wdGlvbnMgb2JqZWN0IGNhbiBiZSBwYXNzZWQgYXMgdGhlIDJuZCBhcmcgdG8gdGVtcGxhdGUuZXh0ZW5kL3NwYXduKCkgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0ZW1wbGF0ZXMsIHNwYXducywgJiB0aGVpciBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRvYmogPSBteUhlaWdodDonMTUwcHgnXG5cdFx0XHRvYmoub2JqID0gb2JqXG5cdFx0XHRkeW5hbWljSGVpZ2h0U3R5bGUgPSAnaGVpZ2h0JzogKHJlbGF0ZWQpLT4gZXhwZWN0KHJlbGF0ZWQpLnRvLmVxdWFsKG9iaik7IHJlbGF0ZWQubXlIZWlnaHRcblx0XHRcdFxuXHRcdFx0aGVhZGVyVGVtcGxhdGUgPSBEb20udGVtcGxhdGUgWydoZWFkZXInLCB7c3R5bGU6J3dpZHRoJzonMjNweCd9LFxuXHRcdFx0XHRbJ2RpdicsIHtzdHlsZTond2lkdGgnOicyM3B4J30sICdUaGlzIGlzIGJvbGRlZCB0ZXh0J11cblx0XHRcdFx0JyB3aGlsZSB0aGlzIGlzIG5vdCdcblx0XHRcdF1cblx0XHRcdHNlY3Rpb25UZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZSBbJ3NlY3Rpb24nLCB7c3R5bGU6J3dpZHRoJzonMjNweCd9LCBoZWFkZXJUZW1wbGF0ZV1cblx0XHRcdHNlY3Rpb24gPSBzZWN0aW9uVGVtcGxhdGUuc3Bhd24oe29wdGlvbnM6e3JlbGF0ZWQ6d2luZG93fX0sIHtyZWxhdGVkOm9iaiwgc3R5bGU6ZHluYW1pY0hlaWdodFN0eWxlfSkuYXBwZW5kVG8oc2FuZGJveClcblxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24ucmF3LnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE1MHB4Jylcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzBdLnJhdy5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcxNTBweCcpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS5jaGlsZHJlblswXS5yYXcuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMTUwcHgnKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24ucmF3LnN0eWxlLndpZHRoKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzBdLnJhdy5zdHlsZS53aWR0aCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS5jaGlsZHJlblswXS5yYXcuc3R5bGUud2lkdGgpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMF0udHlwZSkudG8uZXF1YWwoJ2hlYWRlcicpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi50ZXh0KS50by5lcXVhbCgnVGhpcyBpcyBib2xkZWQgdGV4dCB3aGlsZSB0aGlzIGlzIG5vdCcpXG5cblxuXHRcdHRlc3QgXCJUZW1wbGF0ZSBjaGlsZHJlbiBjYW4gYmUgbmF2aWdhdGVkIGJ5IHJlZiB1c2luZyB0aGUgLmNoaWxkIHByb3BlcnR5XCIsICgpLT5cblx0XHRcdHRlbXBsYXRlID0gXG5cdFx0XHRcdERvbS50ZW1wbGF0ZSBbJ2RpdicsIHtpZDonZGl2QSd9LFxuXHRcdFx0XHRcdFsnZGl2Jywge2lkOidjaGlsZEEnfSxcblx0XHRcdFx0XHRcdFsnc3BhbicsIHtyZWY6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtyZWY6J2NoaWxkQV8yJywgaWQ6J2NoaWxkQV8yJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JywgbnVsbCwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZEJfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cblx0XHRcdGV4cGVjdCh0eXBlb2YgdGVtcGxhdGUuY2hpbGQpLnRvLmVxdWFsICdvYmplY3QnXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXModGVtcGxhdGUuY2hpbGQpLmxlbmd0aCkudG8uZXF1YWwoNilcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5kaXZBKS50by5lcXVhbCB0ZW1wbGF0ZVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmNoaWxkLmNoaWxkQS50eXBlKS50by5lcXVhbCAnZGl2J1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmNoaWxkLmNoaWxkQSkudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5jaGlsZEFfMSkudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5jaGlsZEFfMikudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5jaGlsZEJfMSkudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5jaGlsZEJfMikudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMV1cblxuXHRcdFx0cmVuZGVyZWQgPSB0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRleHBlY3QocmVuZGVyZWQuY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsIHJlbmRlcmVkLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzFdXG5cdFx0XHRleHBlY3QocmVuZGVyZWQudGV4dCkudG8uZXF1YWwoJ1RoZSBUZXh0JylcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlJ3MgY2hpbGRyZW4gY2FuIGJlIGV4dGVuZC9zcGF3bmVkIHdpdGggYSB7cmVmOm5ld0NoaWxkfSBtYXAgaW5zdGVhZCBvZiBhIHBvc2l0aW9uYWwgYXJyYXlcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGVNYWluID0gXG5cdFx0XHRcdERvbS50ZW1wbGF0ZSBbJ2RpdicsIHtpZDonZGl2QSd9LFxuXHRcdFx0XHRcdFsnZGl2Jywge2lkOidjaGlsZEEnfSxcblx0XHRcdFx0XHRcdFsnc3BhbicsIHtyZWY6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtyZWY6J2NoaWxkQV8yJywgaWQ6J2NoaWxkQV8yJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JywgbnVsbCwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZEJfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHR0ZW1wbGF0ZUNvcHkgPSB0ZW1wbGF0ZU1haW4uZXh0ZW5kIFsnc2VjdGlvbicsIG51bGwsIFxuXHRcdFx0XHRjaGlsZEE6XG5cdFx0XHRcdFx0dHlwZTogJ2Zvcm0nXG5cdFx0XHRcdFx0b3B0aW9uczpcblx0XHRcdFx0XHRcdHN0eWxlOiBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ1xuXHRcdFx0XHRjaGlsZEFfMjpcblx0XHRcdFx0XHRbJ2EnLCB7aWQ6J0NISUxEYV8yJywgaHJlZjonaHR0cDovL2dvb2dsZS5jb20nfSxcblx0XHRcdFx0XHRcdFsndGV4dCcsIHtyZWY6J2NoaWxkQV8yXzEnLCB0ZXh0OidOZXcgVGV4dCd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0Y2hpbGRDOlxuXHRcdFx0XHRcdFsnZGl2JywgcmVmOidjaGlsZEQnXVxuXHRcdFx0XSwge3ZhbHVlOid0aGVWYWx1ZSd9XG5cdFx0XHRcblx0XHRcdHRlbXBsYXRlQ29weTIgPSB0ZW1wbGF0ZU1haW4uZXh0ZW5kIGNoaWxkcmVuOlxuXHRcdFx0XHRjaGlsZEE6XG5cdFx0XHRcdFx0Y2hpbGRyZW46IG5ld0NoaWxkOiBbJ2RpdiddXG5cdFx0XHRcdGNoaWxkQV8yOlxuXHRcdFx0XHRcdFsnYScsIHtpZDonQ0hJTERhXzInLCBocmVmOidodHRwOi8vZ29vZ2xlLmNvbSd9LFxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge3JlZjonY2hpbGRBXzJfMScsIHRleHQ6J05ldyBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRjaGlsZEM6XG5cdFx0XHRcdFx0WydkaXYnLCByZWY6J2NoaWxkRCddXG5cblx0XHRcdGV4cGVjdCh0eXBlb2YgdGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQV8yXzEpLm5vdC50by5lcXVhbCAndW5kZWZpbmVkJ1xuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlTWFpbi5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCg2KVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlQ29weS5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCg4KVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmRpdkEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEudHlwZSkudG8uZXF1YWwgJ2Zvcm0nXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQV8xKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRBXzIpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5DSElMRGFfMikudG8uZXF1YWwgdGVtcGxhdGVDb3B5LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQV8yXzEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblswXS5jaGlsZHJlblsxXS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEFfMl8xLm9wdGlvbnMudGV4dCkudG8uZXF1YWwgJ05ldyBUZXh0J1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEJfMSkudG8uZXF1YWwgdGVtcGxhdGVDb3B5LmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQl8yKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMV1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRDKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGREKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMl1cblxuXHRcdFx0cmVuZGVyZWQgPSB0ZW1wbGF0ZUNvcHkuc3Bhd24oKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHJlbmRlcmVkLmNoaWxkKS5sZW5ndGgpLnRvLmVxdWFsKDgpXG5cdFx0XHRleHBlY3QocmVuZGVyZWQuY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsIHJlbmRlcmVkLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzFdXG5cdFx0XHRleHBlY3QocmVuZGVyZWQuY2hpbGQuY2hpbGRBLnJhdykudG8uaGF2ZS5zdHlsZSAnZGlzcGxheScsICdpbmxpbmUtYmxvY2snXG5cdFx0XHRleHBlY3QocmVuZGVyZWQuY2hpbGQuQ0hJTERhXzIucHJvcCgnaHJlZicpKS50by5jb250YWluICdodHRwOi8vZ29vZ2xlLmNvbSdcblx0XHRcdGV4cGVjdChyZW5kZXJlZC5jaGlsZC5jaGlsZEJfMS5wcm9wKCd2YWx1ZScpKS50by5lcXVhbCgndGhlVmFsdWUnKVxuXHRcdFx0ZXhwZWN0KHJlbmRlcmVkLmNoaWxkLmNoaWxkRC5hdHRyKCdkYXRhLXJlZicpKS50by5lcXVhbCgnY2hpbGREJylcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlcyBjYW4gYmUgcGFzc2VkIGFzIHJlcGxhY2VtZW50L25ldyBjaGlsZHJlbiBpbiB7cmVmOm5ld0NoaWxkfSBleHRlbnNpb24gbWFwc1wiLCAoKS0+XG5cdFx0XHRjaGlsZEEgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2Jywge2lkOidjaGlsZEEnfSxcblx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEFfMSd9XVxuXHRcdFx0XHRcdFsnZGl2Jywge3JlZjonY2hpbGRBXzInLCBpZDonY2hpbGRBXzInfV1cblx0XHRcdFx0XVxuXHRcdFx0KVxuXHRcdFx0Y2hpbGRCID0gRG9tLnRlbXBsYXRlKFxuXHRcdFx0XHRbJ2RpdicsIHJlZjonY2hpbGRCJywgXG5cdFx0XHRcdFx0WydzcGFuJywge3JlZjonY2hpbGRCXzEnfV1cblx0XHRcdFx0XHRbJ3RleHQnLCB7aWQ6J2NoaWxkQl8yJywgdGV4dDonVGhlIFRleHQnfV1cblx0XHRcdFx0XVxuXHRcdFx0KVxuXHRcdFx0Y2hpbGRDID0gRG9tLnRlbXBsYXRlKFxuXHRcdFx0XHRbJ2RpdicsIHtpZDonY2hpbGRDJ30sIFxuXHRcdFx0XHRcdFsnc3BhbicsIHtyZWY6J2NoaWxkQ18xJ31dXG5cdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZENfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdF1cblx0XHRcdClcblx0XHRcdHRlbXBsYXRlTWFpbiA9IFxuXHRcdFx0XHREb20udGVtcGxhdGUgWydkaXYnLCB7aWQ6J2RpdkEnfSxcblx0XHRcdFx0XHRjaGlsZEEsXG5cdFx0XHRcdFx0Y2hpbGRCXG5cdFx0XHRcdF1cblx0XHRcdHRlbXBsYXRlQ29weSA9IHRlbXBsYXRlTWFpbi5leHRlbmQgWydzZWN0aW9uJywgbnVsbCwgXG5cdFx0XHRcdGNoaWxkQTogdHlwZTogJ2Zvcm0nXG5cdFx0XHRcdGNoaWxkQjogY2hpbGRCLmV4dGVuZChyZWY6J0NoaWxkQicpXG5cdFx0XHRcdGNoaWxkQzogY2hpbGRDLmV4dGVuZChyZWY6J0NoaWxkQycpXG5cdFx0XHRdLCB7dmFsdWU6J3RoZVZhbHVlJ31cblxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlTWFpbi5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCg3KVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlQ29weS5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCgxMClcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZU1haW4uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmRpdkEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEudHlwZSkudG8uZXF1YWwgJ2Zvcm0nXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLkNoaWxkQikudG8uZXF1YWwgdGVtcGxhdGVDb3B5LmNoaWxkcmVuWzFdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQl8xKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblsxXS5jaGlsZHJlblsxXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlTWFpbi5jaGlsZC5jaGlsZEMpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEMpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5DaGlsZEMpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblsyXVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlTWFpbi5zcGF3bigpLmNoaWxkKS5sZW5ndGgpLnRvLmVxdWFsKDcpXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXModGVtcGxhdGVDb3B5LnNwYXduKCkuY2hpbGQpLmxlbmd0aCkudG8uZXF1YWwoMTApXG5cblxuXHRcdHRlc3QgXCJyZWYtY2hpbGRyZW4gbWFwcyBzaG91bGRuJ3QgYmUgbW9kaWZpZWQgYnkgdGhlIHRlbXBsYXRlIGV4dGVuZGVyXCIsICgpLT5cblx0XHRcdGNvbmZpZyA9IGNoaWxkcmVuOiBjaGlsZEFfMToge3R5cGU6J2RpdicsIG9wdGlvbnM6IHtzdHlsZToge2Rpc3BsYXk6J25vbmUnfX19XG5cdFx0XHR0ZW1wbGF0ZUEgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2Jywge3JlZjonZGl2QSd9XG5cdFx0XHRcdFx0WydkaXYnLCB7cmVmOidjaGlsZEEnfVxuXHRcdFx0XHRcdFx0WydzcGFuJywge3JlZjonY2hpbGRBXzEnfV1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdF1cblx0XHRcdClcblx0XHRcdHRlbXBsYXRlQS5jaGlsZC5jaGlsZEFfMVxuXHRcdFx0dGVtcGxhdGVCID0gdGVtcGxhdGVBLmV4dGVuZCgpXG5cdFx0XHR0ZW1wbGF0ZUMgPSB0ZW1wbGF0ZUEuZXh0ZW5kKGNvbmZpZylcblx0XHRcdHRlbXBsYXRlRCA9IHRlbXBsYXRlQS5leHRlbmQoY29uZmlnKVxuXHRcdFx0c3Bhd25BID0gdGVtcGxhdGVBLnNwYXduKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdHNwYXduQiA9IHRlbXBsYXRlQi5zcGF3bigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRzcGF3bkMgPSB0ZW1wbGF0ZUMuc3Bhd24oKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0c3Bhd25EID0gdGVtcGxhdGVELnNwYXduKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChzcGF3bkEuY2hpbGQuY2hpbGRBXzEudHlwZSkudG8uZXF1YWwgJ3NwYW4nXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmNoaWxkLmNoaWxkQV8xLnN0eWxlICdkaXNwbGF5JykudG8uZXF1YWwgJ2lubGluZSdcblx0XHRcdGV4cGVjdChzcGF3bkIuY2hpbGQuY2hpbGRBXzEudHlwZSkudG8uZXF1YWwgJ3NwYW4nXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmNoaWxkLmNoaWxkQV8xLnN0eWxlICdkaXNwbGF5JykudG8uZXF1YWwgJ2lubGluZSdcblx0XHRcdGV4cGVjdChzcGF3bkMuY2hpbGQuY2hpbGRBXzEudHlwZSkudG8uZXF1YWwgJ2Rpdidcblx0XHRcdGV4cGVjdChzcGF3bkMuY2hpbGQuY2hpbGRBXzEuc3R5bGUgJ2Rpc3BsYXknKS50by5lcXVhbCAnbm9uZSdcblx0XHRcdGV4cGVjdChzcGF3bkQuY2hpbGQuY2hpbGRBXzEudHlwZSkudG8uZXF1YWwgJ2Rpdidcblx0XHRcdGV4cGVjdChzcGF3bkQuY2hpbGQuY2hpbGRBXzEuc3R5bGUgJ2Rpc3BsYXknKS50by5lcXVhbCAnbm9uZSdcblxuXHRcdHRlc3QgXCJOdWxsIHZhbHVlcyBpbiByZWYtY2hpbGRyZW4gbWFwIHdpbGwgcmVtb3ZlIHRoZSBjaGlsZCBmcm9tIHRoZSB0ZW1wbGF0ZVwiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZU1haW4gPSBcblx0XHRcdFx0RG9tLnRlbXBsYXRlIFsnZGl2Jywge2lkOidkaXZBJ30sXG5cdFx0XHRcdFx0WydkaXYnLCB7aWQ6J2NoaWxkQSd9LFxuXHRcdFx0XHRcdFx0WydzcGFuJywge3JlZjonY2hpbGRBXzEnfV1cblx0XHRcdFx0XHRcdFsnZGl2Jywge3JlZjonY2hpbGRBXzInLCBpZDonY2hpbGRBXzInfV1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0WydkaXYnLCB7cmVmOidjaGlsZEInfSwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZEJfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2Jywge2lkOidjaGlsZEMnfSwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZENfMSd9XVxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZENfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHR0ZW1wbGF0ZUNvcHkgPSB0ZW1wbGF0ZU1haW4uZXh0ZW5kIFsnc2VjdGlvbicsIG51bGwsIFxuXHRcdFx0XHRjaGlsZEE6XG5cdFx0XHRcdFx0dHlwZTogJ2Zvcm0nXG5cdFx0XHRcdFx0b3B0aW9uczpcblx0XHRcdFx0XHRcdHN0eWxlOiBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ1xuXG5cdFx0XHRcdGNoaWxkQV8xOiBudWxsXG5cdFx0XHRcdGNoaWxkQV8yOlxuXHRcdFx0XHRcdFsnYScsIHtpZDonQ0hJTERhXzInLCBocmVmOidodHRwOi8vZ29vZ2xlLmNvbSd9LFxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge3JlZjonY2hpbGRBXzJfMScsIHRleHQ6J05ldyBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRjaGlsZEJfMTogbnVsbFxuXHRcdFx0XHRjaGlsZEM6IG51bGxcblx0XHRcdF1cblxuXHRcdFx0ZXhwZWN0KHR5cGVvZiB0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRBXzJfMSkubm90LnRvLmVxdWFsICd1bmRlZmluZWQnXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXModGVtcGxhdGVNYWluLmNoaWxkKS5sZW5ndGgpLnRvLmVxdWFsKDEwKVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlQ29weS5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCg2KVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmRpdkEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEudHlwZSkudG8uZXF1YWwgJ2Zvcm0nXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVNYWluLmNoaWxkLmNoaWxkQV8xKS50by5lcXVhbCB0ZW1wbGF0ZU1haW4uY2hpbGQuY2hpbGRBXzFcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRBXzEpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEFfMikudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLkNISUxEYV8yKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRBXzJfMSkudG8uZXF1YWwgdGVtcGxhdGVDb3B5LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQV8yXzEub3B0aW9ucy50ZXh0KS50by5lcXVhbCAnTmV3IFRleHQnXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQl8xKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblsxXS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlTWFpbi5jaGlsZC5jaGlsZEJfMSkudG8uZXF1YWwgdGVtcGxhdGVNYWluLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVNYWluLmNoaWxkLmNoaWxkQl8yKS50by5lcXVhbCB0ZW1wbGF0ZU1haW4uY2hpbGRyZW5bMV0uY2hpbGRyZW5bMV1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZU1haW4uY2hpbGQuY2hpbGRDKS50by5lcXVhbCB0ZW1wbGF0ZU1haW4uY2hpbGRyZW5bMl1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRDKS50by5lcXVhbCB1bmRlZmluZWRcblxuXG5cdFx0dGVzdCBcIk51bGwgdmFsdWVzIGluIG9wdGlvbnMgb2JqZWN0IHdpbGwgZGVsZXRlIGtleXMgZHVyaW5nIHRlbXBsYXRlIGV4dGVuc2lvblwiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZUEgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdHJlZjogJ3RoZURpdidcblx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHR2YWx1ZUE6ICgpLT4gMVxuXHRcdFx0XHRcdFx0dmFsdWVCOiAoKS0+IDJcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRzdHlsZTpcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiAncmVsYXRpdmUnXG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDEwMFxuXHRcdFx0XHRcdFx0JGFjdGl2ZTpcblx0XHRcdFx0XHRcdFx0d2lkdGg6IDIwMFxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IDIwMFxuXHRcdFx0XHRdXG5cdFx0XHQpXG5cdFx0XHR0ZW1wbGF0ZUIgPSB0ZW1wbGF0ZUEuZXh0ZW5kKFxuXHRcdFx0XHRvcHRpb25zOlxuXHRcdFx0XHRcdHJlZjogbnVsbFxuXHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdHZhbHVlQTogbnVsbFxuXHRcdFx0XHRcdFx0dmFsdWVCOiAoKS0+IDNcblxuXHRcdFx0XHRcdHN0eWxlOlxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBudWxsXG5cdFx0XHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdFx0XHQkYWN0aXZlOlxuXHRcdFx0XHRcdFx0XHR3aWR0aDogbnVsbFxuXHRcdFx0KVxuXG5cdFx0XHRzcGF3bkEgPSB0ZW1wbGF0ZUEuc3Bhd24oKVxuXHRcdFx0c3Bhd25CID0gdGVtcGxhdGVCLnNwYXduKClcblxuXHRcdFx0ZXhwZWN0KHNwYXduQS5yZWYpLnRvLmVxdWFsICd0aGVEaXYnXG5cdFx0XHRleHBlY3Qoc3Bhd25CLnJlZikudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QodHlwZW9mIHNwYXduQS5vcHRpb25zLmNvbXB1dGVycy52YWx1ZUEpLnRvLmVxdWFsICdmdW5jdGlvbidcblx0XHRcdGV4cGVjdCh0eXBlb2Ygc3Bhd25CLm9wdGlvbnMuY29tcHV0ZXJzLnZhbHVlQSkudG8uZXF1YWwgJ3VuZGVmaW5lZCdcblx0XHRcdGV4cGVjdCh0eXBlb2Ygc3Bhd25BLm9wdGlvbnMuY29tcHV0ZXJzLnZhbHVlQikudG8uZXF1YWwgJ2Z1bmN0aW9uJ1xuXHRcdFx0ZXhwZWN0KHR5cGVvZiBzcGF3bkIub3B0aW9ucy5jb21wdXRlcnMudmFsdWVCKS50by5lcXVhbCAnZnVuY3Rpb24nXG5cdFx0XHRleHBlY3Qoc3Bhd25BLm9wdGlvbnMuY29tcHV0ZXJzLnZhbHVlQigpKS50by5lcXVhbCAyXG5cdFx0XHRleHBlY3Qoc3Bhd25CLm9wdGlvbnMuY29tcHV0ZXJzLnZhbHVlQigpKS50by5lcXVhbCAzXG5cdFx0XHRleHBlY3Qoc3Bhd25BLm9wdGlvbnMuc3R5bGUucG9zaXRpb24pLnRvLmVxdWFsICdyZWxhdGl2ZSdcblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucy5zdHlsZS5wb3NpdGlvbikudG8uZXF1YWwgJ3JlbGF0aXZlJ1xuXHRcdFx0ZXhwZWN0KHNwYXduQS5vcHRpb25zLnN0eWxlLndpZHRoKS50by5lcXVhbCAxMDBcblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucy5zdHlsZS53aWR0aCkudG8uZXF1YWwgMTAwXG5cdFx0XHRleHBlY3Qoc3Bhd25BLm9wdGlvbnMuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCAxMDBcblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucy5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHNwYXduQS5vcHRpb25zLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHNwYXduQi5vcHRpb25zLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChzcGF3bkEub3B0aW9ucy5zdHlsZS4kYWN0aXZlLndpZHRoKS50by5lcXVhbCAyMDBcblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucy5zdHlsZS4kYWN0aXZlLndpZHRoKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdChzcGF3bkEub3B0aW9ucy5zdHlsZS4kYWN0aXZlLmhlaWdodCkudG8uZXF1YWwgMjAwXG5cdFx0XHRleHBlY3Qoc3Bhd25CLm9wdGlvbnMuc3R5bGUuJGFjdGl2ZS5oZWlnaHQpLnRvLmVxdWFsIDIwMFxuXG5cblx0XHR0ZXN0IFwiV2hlbiBzcGF3bmluZyBlbGVtZW50cyB0aGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBzcGF3bnMgc2hvdWxkIGJlIGEgY2xvbmUgb2YgdGhlIHRlbXBsYXRlJ3Mgb3B0aW9uc1wiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZUEgPSBEb20udGVtcGxhdGUgWydkaXYnLCBzdHlsZTp7ZGlzcGxheTonYmxvY2snfV1cblx0XHRcdHRlbXBsYXRlQiA9IERvbS50ZW1wbGF0ZSBbJ2RpdicsIHN0eWxlOntkaXNwbGF5OidibG9jayd9XVxuXHRcdFx0c3Bhd25BID0gdGVtcGxhdGVBLnNwYXduKHJlZjonYScpICMgUGFzc2VkIG9wdGlvbnMgdG8gbWVyZ2Ugd2l0aCBvcmlnXG5cdFx0XHRzcGF3bkIgPSB0ZW1wbGF0ZUEuc3Bhd24oKVxuXG5cdFx0XHRleHBlY3Qoc3Bhd25BLm9wdGlvbnMpLm5vdC50by5lcXVhbCh0ZW1wbGF0ZUEub3B0aW9ucylcblx0XHRcdGV4cGVjdChzcGF3bkEub3B0aW9ucy5zdHlsZSkubm90LnRvLmVxdWFsKHRlbXBsYXRlQS5vcHRpb25zLnN0eWxlKVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQS5vcHRpb25zLnN0eWxlLiRiYXNlKS50by5lcXVhbCh1bmRlZmluZWQpXG5cblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucykubm90LnRvLmVxdWFsKHRlbXBsYXRlQi5vcHRpb25zKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5vcHRpb25zLnN0eWxlKS5ub3QudG8uZXF1YWwodGVtcGxhdGVCLm9wdGlvbnMuc3R5bGUpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVCLm9wdGlvbnMuc3R5bGUuJGJhc2UpLnRvLmVxdWFsKHVuZGVmaW5lZClcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlcyB3aWxsIGJlIHNwYXduZWQgd2hlbiBhcHBlbmRlZCB0byBET00gZWxlbWVudHNcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoWydzcGFuJywge3JlZjondGhlU3Bhbid9LCAnc29tZVRleHQnXSlcblx0XHRcdGRpdiA9IERvbS5kaXYobnVsbCwgJ2xhYmVsOiAnKVxuXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGRpdi50ZXh0KS50by5lcXVhbCAnbGFiZWw6ICdcblx0XHRcdGRpdi5hcHBlbmQgdGVtcGxhdGVcblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAyXG5cdFx0XHRleHBlY3QoZGl2LnRleHQpLnRvLmVxdWFsICdsYWJlbDogc29tZVRleHQnXG5cdFx0XHRkaXYucHJlcGVuZCB0ZW1wbGF0ZVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDNcblx0XHRcdGV4cGVjdChkaXYudGV4dCkudG8uZXF1YWwgJ3NvbWVUZXh0bGFiZWw6IHNvbWVUZXh0J1xuXG5cblx0XHRzdWl0ZSBcIkRhdGEgY29tcHV0ZXJzXCIsICgpLT5cblx0XHRcdHRlc3QgXCJUZW1wbGF0ZXMgYWNjZXB0IG9wdGlvbnMuY29tcHV0ZXJzIGZuIG1hcCB3aGljaCB3aWxsIGJlIGludm9rZWQgd2l0aCBwcm92aWRlZCBvcHRpb25zLmRhdGEgdXBvbiBzcGF3bmluZ1wiLCAoKS0+XG5cdFx0XHRcdHJlY2VpdmVkRGF0YSA9IG51bGxcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6ICdzb21lTGFiZWwnOiAoZGF0YSktPiByZWNlaXZlZERhdGEgPSBkYXRhIG9yICdub3RoaW5nJ1xuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxdWFsKG51bGwpXG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXF1YWwobnVsbClcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKHtkYXRhOidzb21lTGFiZWwnOid3b3Jrcyd9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcXVhbCgnd29ya3MnKVxuXG5cblx0XHRcdHRlc3QgXCJDb21wdXRlcnMgd2lsbCBiZSBoYXZlIHRoZSBzcGF3bmVkIFF1aWNrRWxlbWVudCBpbnN0YW5jZSBhcyB0aGVpciBjb250ZXh0XCIsICgpLT5cblx0XHRcdFx0Y29udGV4dCA9IG51bGxcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6ICdzb21lTGFiZWwnOiAoZGF0YSktPiBjb250ZXh0ID0gdGhpc1xuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXG5cdFx0XHRcdGV4cGVjdChjb250ZXh0KS50by5lcXVhbChudWxsKVxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChjb250ZXh0KS50by5lcXVhbChudWxsKVxuXHRcdFx0XHRcblx0XHRcdFx0aW5zdGFuY2UgPSB0ZW1wbGF0ZS5zcGF3bih7ZGF0YTonc29tZUxhYmVsJzp1bmRlZmluZWR9KVxuXHRcdFx0XHRleHBlY3QoY29udGV4dCkudG8uZXF1YWwoaW5zdGFuY2UpXG5cblxuXHRcdFx0dGVzdCBcIlZhbHVlcyBzcGVjaWZpZWQgaW4gb3B0aW9ucy5kZWZhdWx0cyB3aWxsIGJlIHVzZWQgaWYgbm90IHNwZWNpZmllZCBpbiBvcHRpb25zLmRhdGEgdXBvbiBzcGF3bmluZ1wiLCAoKS0+XG5cdFx0XHRcdHJlc3VsdHMgPSB7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5maXJzdCA9IGRhdGEudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRcdFx0XHQnc2Vjb25kJzogKGRhdGEpLT4gcmVzdWx0cy5zZWNvbmQgPSBkYXRhLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0XHRcdFx0J3RoaXJkJzogKGRhdGEpLT4gcmVzdWx0cy50aGlyZCA9IGRhdGEudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRcdFx0ZGVmYXVsdHM6XG5cdFx0XHRcdFx0XHRcdCdmaXJzdCc6ICdmaXJzdFZhbHVlIGhlcmUnXG5cdFx0XHRcdFx0XHRcdCd0aGlyZCc6ICd0aGlyZFZhbHVlIGhlcmUnXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsKHt9KVxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsKHtmaXJzdDonZmlyc3R2YWx1ZSBoZXJlJywgdGhpcmQ6J3RoaXJkdmFsdWUgaGVyZSd9KVxuXHRcdFx0XHRcblx0XHRcdFx0aW5zdGFuY2UgPSB0ZW1wbGF0ZS5zcGF3bih7ZGF0YTondGhpcmQnOidjdXN0b212YWx1ZSBoZXJlJ30pXG5cdFx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsKHtmaXJzdDonZmlyc3R2YWx1ZSBoZXJlJywgdGhpcmQ6J2N1c3RvbXZhbHVlIGhlcmUnfSlcblxuXG5cdFx0XHR0ZXN0IFwiVmFsdWVzIGNhbiBiZSBvZiBhbnkgdHlwZVwiLCAoKS0+XG5cdFx0XHRcdHJlc3VsdHMgPSB7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5maXJzdCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0J3NlY29uZCc6IChkYXRhKS0+IHJlc3VsdHMuc2Vjb25kID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQndGhpcmQnOiAoZGF0YSktPiByZXN1bHRzLnRoaXJkID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQnZm91cnRoJzogKGRhdGEpLT4gcmVzdWx0cy5mb3VydGggPSBkYXRhXG5cdFx0XHRcdFx0XHRcdCdmaWZ0aCc6IChkYXRhKS0+IHJlc3VsdHMuZmlmdGggPSBkYXRhXG5cdFx0XHRcdFx0XHRcdCdzaXh0aCc6IChkYXRhKS0+IHJlc3VsdHMuc2l4dGggPSBkYXRhXG5cdFx0XHRcdFx0XHRkZWZhdWx0czpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogWydhYmMnLCAnMTIzJ11cblx0XHRcdFx0XHRcdFx0J3RoaXJkJzoge2E6MSwgYjoxMn1cblx0XHRcdFx0XHRcdFx0J3NpeHRoJzogOTk5XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0XG5cdFx0XHRcdGluc3RhbmNlID0gdGVtcGxhdGUuc3Bhd24oZGF0YTpcblx0XHRcdFx0XHQnc2Vjb25kJzogbnVsbFxuXHRcdFx0XHRcdCdmb3VydGgnOiAxOVxuXHRcdFx0XHRcdCdmaWZ0aCc6IGZhbHNlXG5cdFx0XHRcdFx0J3NpeHRoJzogdW5kZWZpbmVkXG5cdFx0XHRcdClcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMpLnRvLmRlZXAuZXF1YWxcblx0XHRcdFx0XHRmaXJzdDogWydhYmMnLCAnMTIzJ11cblx0XHRcdFx0XHRzZWNvbmQ6IG51bGxcblx0XHRcdFx0XHR0aGlyZDoge2E6MSwgYjoxMn1cblx0XHRcdFx0XHRmb3VydGg6IDE5XG5cdFx0XHRcdFx0ZmlmdGg6IGZhbHNlXG5cdFx0XHRcdFx0c2l4dGg6IHVuZGVmaW5lZFxuXG5cdFx0XHRcdGV4cGVjdChPYmplY3Qua2V5cyhyZXN1bHRzKS5sZW5ndGgpLnRvLmVxdWFsKDYpXG5cblxuXHRcdFx0dGVzdCBcIlZhbHVlcyBpbiBvcHRpb25zLmRhdGEgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIGNvbXB1dGVyIHdpbGwgYmUgc2tpcHBlZFwiLCAoKS0+XG5cdFx0XHRcdHJlc3VsdHMgPSB7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5maXJzdCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0J3NlY29uZCc6IChkYXRhKS0+IHJlc3VsdHMuc2Vjb25kID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQndGhpcmQnOiAoZGF0YSktPiByZXN1bHRzLnRoaXJkID0gZGF0YVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXG5cdFx0XHRcdFxuXHRcdFx0XHRpbnN0YW5jZSA9IHRlbXBsYXRlLnNwYXduKGRhdGE6XG5cdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXHRcdFx0XHRcdCdzZWNvbmQnOiAnc2Vjb25kIHZhbHVlJ1xuXHRcdFx0XHRcdCd0aGlyZCc6ICd0aGlyZCB2YWx1ZSdcblx0XHRcdFx0XHQnZm91cnRoJzogJ2ZvdXJ0aCB2YWx1ZSdcblx0XHRcdFx0KVxuXHRcdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbFxuXHRcdFx0XHRcdCdmaXJzdCc6ICdmaXJzdCB2YWx1ZSdcblx0XHRcdFx0XHQnc2Vjb25kJzogJ3NlY29uZCB2YWx1ZSdcblx0XHRcdFx0XHQndGhpcmQnOiAndGhpcmQgdmFsdWUnXG5cblx0XHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHJlc3VsdHMpLmxlbmd0aCkudG8uZXF1YWwoMylcblxuXG5cdFx0XHR0ZXN0IFwiQ29tcHV0ZXJzIGluIHRlbXBsYXRlIGNoaWxkcmVuIHdpbGwgcmVjZWl2ZSB0aGUgcGFyZW50J3Mgb3B0aW9ucy5kYXRhXCIsICgpLT5cblx0XHRcdFx0cmVzdWx0cyA9IHBhcmVudDp7fSwgY2hpbGRBOnt9LCBjaGlsZEI6e30sIGNoaWxkQzp7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5wYXJlbnQuZmlyc3QgPSBkYXRhXG5cdFx0XHRcdFx0XHRcdCdzZWNvbmQnOiAoZGF0YSktPiByZXN1bHRzLnBhcmVudC5zZWNvbmQgPSBkYXRhXG5cdFx0XHRcdFx0XHRcdCd0aGlyZCc6IChkYXRhKS0+IHJlc3VsdHMucGFyZW50LnRoaXJkID0gZGF0YVxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOlxuXHRcdFx0XHRcdFx0XHRcdCdmaXJzdCc6IChkYXRhKS0+IHJlc3VsdHMuY2hpbGRBLmZpcnN0ID0gZGF0YVxuXHRcdFx0XHRcdFx0XHRcdCdzZWNvbmQnOiAoZGF0YSktPiByZXN1bHRzLmNoaWxkQS5zZWNvbmQgPSBkYXRhXG5cdFx0XHRcdFx0XHRcdFx0J3RoaXJkJzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZEEudGhpcmQgPSBkYXRhXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRbJ2RpdicsIG51bGwsXG5cdFx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0XHRcdCdmaXJzdCc6IChkYXRhKS0+IHJlc3VsdHMuY2hpbGRCLmZpcnN0ID0gZGF0YVxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZvdXJ0aCc6IChkYXRhKS0+IHJlc3VsdHMuY2hpbGRCLmZvdXJ0aCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdFx0XHQnZmlyc3QnOiAoZGF0YSktPiByZXN1bHRzLmNoaWxkQy5maXJzdCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0XHRcdCdzaXh0aCc6IChkYXRhKS0+IHJlc3VsdHMuY2hpbGRDLnNpeHRoID0gZGF0YVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0XG5cdFx0XHRcdGluc3RhbmNlID0gdGVtcGxhdGUuc3Bhd24oZGF0YTpcblx0XHRcdFx0XHQnZmlyc3QnOiAnZmlyc3QgdmFsdWUnXG5cdFx0XHRcdFx0J3NlY29uZCc6ICdzZWNvbmQgdmFsdWUnXG5cdFx0XHRcdFx0J3RoaXJkJzogJ3RoaXJkIHZhbHVlJ1xuXHRcdFx0XHRcdCdmb3VydGgnOiAnZm91cnRoIHZhbHVlJ1xuXHRcdFx0XHQpXG5cdFx0XHRcdGV4cGVjdChyZXN1bHRzLnBhcmVudCkudG8uZGVlcC5lcXVhbFxuXHRcdFx0XHRcdCdmaXJzdCc6ICdmaXJzdCB2YWx1ZSdcblx0XHRcdFx0XHQnc2Vjb25kJzogJ3NlY29uZCB2YWx1ZSdcblx0XHRcdFx0XHQndGhpcmQnOiAndGhpcmQgdmFsdWUnXG5cdFx0XHRcdFxuXHRcdFx0XHRleHBlY3QocmVzdWx0cy5jaGlsZEEpLnRvLmRlZXAuZXF1YWxcblx0XHRcdFx0XHQnZmlyc3QnOiAnZmlyc3QgdmFsdWUnXG5cdFx0XHRcdFx0J3NlY29uZCc6ICdzZWNvbmQgdmFsdWUnXG5cdFx0XHRcdFx0J3RoaXJkJzogJ3RoaXJkIHZhbHVlJ1xuXHRcdFx0XHRcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMuY2hpbGRCKS50by5kZWVwLmVxdWFsXG5cdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXHRcdFx0XHRcdCdmb3VydGgnOiAnZm91cnRoIHZhbHVlJ1xuXHRcdFx0XHRcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMuY2hpbGRDKS50by5kZWVwLmVxdWFsXG5cdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXG5cblx0XHRcdHRlc3QgXCJQYXJlbnQgZGVmYXVsdHMgd2lsbCBub3QgYmUgcGFzc2VkIHRvIGNoaWxkcmVuXCIsICgpLT5cblx0XHRcdFx0cmVzdWx0cyA9IHBhcmVudDp7fSwgY2hpbGQ6e31cblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdCdmaXJzdCc6IChkYXRhKS0+IHJlc3VsdHMucGFyZW50LmZpcnN0ID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQnc2Vjb25kJzogKGRhdGEpLT4gcmVzdWx0cy5wYXJlbnQuc2Vjb25kID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQndGhpcmQnOiAoZGF0YSktPiByZXN1bHRzLnBhcmVudC50aGlyZCA9IGRhdGFcblx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHQnc2Vjb25kJzogJ3NlY29uZCB2YWx1ZSdcblx0XHRcdFx0XHRcdFx0J2ZvdXJ0aCc6ICdmb3VydGggdmFsdWUnXG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZC5maXJzdCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0XHQnc2Vjb25kJzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZC5zZWNvbmQgPSBkYXRhXG5cdFx0XHRcdFx0XHRcdFx0J3RoaXJkJzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZC50aGlyZCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0XHQnZm91cnRoJzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZC5mb3VydGggPSBkYXRhXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHRcdCdmaXJzdCc6ICdmaXJzdCB2YWx1ZSdcblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdClcblx0XHRcdFx0XG5cdFx0XHRcdGluc3RhbmNlID0gdGVtcGxhdGUuc3Bhd24oZGF0YTpcblx0XHRcdFx0XHQndGhpcmQnOiAndGhpcmQgdmFsdWUnXG5cdFx0XHRcdClcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMucGFyZW50KS50by5kZWVwLmVxdWFsXG5cdFx0XHRcdFx0J3NlY29uZCc6ICdzZWNvbmQgdmFsdWUnXG5cdFx0XHRcdFx0J3RoaXJkJzogJ3RoaXJkIHZhbHVlJ1xuXHRcdFx0XHRcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMuY2hpbGQpLnRvLmRlZXAuZXF1YWxcblx0XHRcdFx0XHQnZmlyc3QnOiAnZmlyc3QgdmFsdWUnXG5cdFx0XHRcdFx0J3RoaXJkJzogJ3RoaXJkIHZhbHVlJ1xuXG5cblx0XHRcdHRlc3QgXCJEZWZhdWx0cyBzaG91bGQgb25seSBiZSBhcHBsaWVkIG9uY2VcIiwgKCktPlxuXHRcdFx0XHRjb3VudCA9IHBhcmVudDowLCBjaGlsZDowLCBjaGlsZENoaWxkOjBcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRyZWY6ICdwYXJlbnQnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdCdmaXJzdCc6IChkYXRhKS0+IGNvdW50LnBhcmVudCsrXG5cdFx0XHRcdFx0XHRkZWZhdWx0czpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0cmVmOiAnY2hpbGQnXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0XHQnZmlyc3QnOiAoZGF0YSktPiBjb3VudC5wYXJlbnQrK1xuXHRcdFx0XHRcdFx0XHRcdCdzZWNvbmQnOiAoZGF0YSktPiBjb3VudC5jaGlsZCsrXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHRcdCdzZWNvbmQnOiAnc2Vjb25kIHZhbHVlJ1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdFx0cmVmOiAnY2hpbGQnXG5cdFx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOlxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZvdXJ0aCc6IChkYXRhKS0+IGNvdW50LmNoaWxkQ2hpbGQrK1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZvdXJ0aCc6ICdmb3VydGggdmFsdWUnXG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdClcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKGRhdGE6J3RoaXJkJzondGhpcmQgdmFsdWUnKVxuXHRcdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBwYXJlbnQ6MSwgY2hpbGQ6MSwgY2hpbGRDaGlsZDoxXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIHBhcmVudDoyLCBjaGlsZDoyLCBjaGlsZENoaWxkOjJcblxuXG5cdFx0XHR0ZXN0IFwiRGF0YS9kZWZhdWx0cyBzaG91bGQgYmUgYXBwbGllZCBldmVuIHdoZW4gcGFyZW50IGRvZXNuJ3QgaGF2ZSBjb21wdXRlcnNcIiwgKCktPlxuXHRcdFx0XHRjb3VudCA9IDBcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnLCBudWxsLFxuXHRcdFx0XHRcdFx0WydzZWN0aW9uJywgbnVsbCxcblx0XHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOlxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gY291bnQrK1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bihkYXRhOidmaXJzdCc6J3NlY29uZCB2YWx1ZScpXG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcXVhbCgyKVxuXG5cblx0XHRcdHRlc3QgXCJEYXRhIGNhbiBiZSByZS1hcHBsaWVkIHZpYSAuYXBwbHlEYXRhKGRhdGEpXCIsICgpLT5cblx0XHRcdFx0cmVzdWx0cyA9IHt9OyBjb3VudCA9IHthOjAsIGI6MCwgYzowLCBkOjAsIGU6MCwgZjowfVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2EnOiAoZGF0YSktPiByZXN1bHRzLmEgPSBkYXRhO1x0Y291bnQuYSsrXG5cdFx0XHRcdFx0XHRcdCdiJzogKGRhdGEpLT4gcmVzdWx0cy5iID0gZGF0YTtcdGNvdW50LmIrK1xuXHRcdFx0XHRcdFx0XHQnYyc6IChkYXRhKS0+IHJlc3VsdHMuYyA9IGRhdGE7XHRjb3VudC5jKytcblx0XHRcdFx0XHRcdFx0J2QnOiAoZGF0YSktPiByZXN1bHRzLmQgPSBkYXRhO1x0Y291bnQuZCsrXG5cdFx0XHRcdFx0XHRcdCdlJzogKGRhdGEpLT4gcmVzdWx0cy5lID0gZGF0YTtcdGNvdW50LmUrK1xuXHRcdFx0XHRcdFx0XHQnZic6IChkYXRhKS0+IHJlc3VsdHMuZiA9IGRhdGE7XHRjb3VudC5mKytcblx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHQnYSc6IDFcblx0XHRcdFx0XHRcdFx0J2MnOiAzXG5cdFx0XHRcdFx0XHRcdCdmJzogNlxuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXG5cdFx0XHRcdFxuXHRcdFx0XHRpbnN0YW5jZSA9IHRlbXBsYXRlLnNwYXduKGRhdGE6IHtiOjIsIGQ6NCwgZTo1LCBmOjZ9KVxuXHRcdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbCB7YToxLCBiOjIsIGM6MywgZDo0LCBlOjUsIGY6Nn1cblx0XHRcdFx0ZXhwZWN0KGNvdW50KS50by5kZWVwLmVxdWFsIHthOjEsIGI6MSwgYzoxLCBkOjEsIGU6MSwgZjoxfVxuXG5cdFx0XHRcdGluc3RhbmNlLmFwcGx5RGF0YShhOjExLCBiOjIyLCBkOjQ0LCBlOjU1KVxuXHRcdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbCB7YToxMSwgYjoyMiwgYzozLCBkOjQ0LCBlOjU1LCBmOjZ9XG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZGVlcC5lcXVhbCB7YToyLCBiOjIsIGM6MiwgZDoyLCBlOjIsIGY6Mn1cblxuXG5cdFx0XHR0ZXN0IFwiVGhlICdfaW5pdCcgY29tcHV0ZXIgd2lsbCBiZSBydW4gYnkgZGVmYXVsdCBvbiB0ZW1wbGF0ZSBzcGF3biByZWdhcmRsZXNzIG9mIGRhdGFcIiwgKCktPlxuXHRcdFx0XHRjb3VudCA9IHt9XG5cdFx0XHRcdHRlbXBsYXRlID0gRG9tLnRlbXBsYXRlKFxuXHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0cmVmOiAnZGl2QSdcblx0XHRcdFx0XHRcdGNvbXB1dGVyczogX2luaXQ6ICgpLT4gY291bnRbQHJlZl0/PTA7IGNvdW50W0ByZWZdKytcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdHJlZjogJ2RpdkInXG5cdFx0XHRcdFx0XHRcdGRhdGE6IGZpcnN0OiAnMSdcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOiBfaW5pdDogKCktPiBjb3VudFtAcmVmXT89MDsgY291bnRbQHJlZl0rK1xuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0cmVmOiAnZGl2Qydcblx0XHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdFx0cmVmOiAnZGl2RCdcblx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0XHRcdHJlZjogJ2RpdkUnXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6IF9pbml0OiAoKS0+IGNvdW50W0ByZWZdPz0wOyBjb3VudFtAcmVmXSsrXG5cdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdFxuXHRcdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCB7fVxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIGRpdkE6MSwgZGl2QjoxLCBkaXZFOjFcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgZGl2QToyLCBkaXZCOjIsIGRpdkU6MlxuXHRcdFx0XHRcblx0XHRcdFx0dGVtcGxhdGUuY2hpbGQuZGl2Qi5zcGF3bihkYXRhOnNlY29uZDonMicpXG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIGRpdkE6MiwgZGl2QjozLCBkaXZFOjJcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLmNoaWxkLmRpdkMuc3Bhd24oKVxuXHRcdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBkaXZBOjIsIGRpdkI6MywgZGl2RTozXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZS5jaGlsZC5kaXZDLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgZGl2QToyLCBkaXZCOjMsIGRpdkU6NFxuXG5cblx0XHRcdHRlc3QgXCJUaGUgJ19pbml0JyBjb21wdXRlciB3aWxsIGJlIHBhc3NlZCBhbGwgb2YgdGhlIGRhdGEgdGhlIHRlbXBsYXRlIHNwYXduIHJlY2VpdmVzXCIsICgpLT5cblx0XHRcdFx0cmVzdWx0ID0gZGl2QTp7fSwgZGl2Qjp7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdHJlZjogJ2RpdkEnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdGhyZWY6IChocmVmKS0+IHJlc3VsdFtAcmVmXS5ocmVmID0gaHJlZlxuXHRcdFx0XHRcdFx0XHRuYW1lOiAobmFtZSktPiByZXN1bHRbQHJlZl0ubmFtZSA9IG5hbWVcblx0XHRcdFx0XHRcdFx0X2luaXQ6ICgpLT4gcmVzdWx0W0ByZWZdLl9pbml0ID0gYXJndW1lbnRzWzBdXG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRyZWY6ICdkaXZQcm94eSdcblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRcdHJlZjogJ2RpdkInXG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdHM6IGZpcnN0OiAnMSdcblx0XHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdFx0XHRocmVmOiAoaHJlZiktPiByZXN1bHRbQHJlZl0uaHJlZiA9IGhyZWZcblx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6IChuYW1lKS0+IHJlc3VsdFtAcmVmXS5uYW1lID0gbmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0X2luaXQ6ICgpLT4gcmVzdWx0W0ByZWZdLl9pbml0ID0gYXJndW1lbnRzWzBdXG5cdFx0XHRcdFx0XHRcdF1cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdClcblx0XHRcdFx0ZXhwZWN0ZWQgPSBcblx0XHRcdFx0XHRocmVmOiAnYWJjJ1xuXHRcdFx0XHRcdG5hbWU6ICcxMjMnXG5cdFx0XHRcdFx0X2luaXQ6IHtocmVmOidhYmMnLCBuYW1lOicxMjMnLCB2YWx1ZTonZGVmJywgc2l6ZTonNDU2J31cblx0XHRcdFx0XG5cdFx0XHRcdFxuXHRcdFx0XHRleHBlY3QocmVzdWx0KS50by5lcWwgZGl2QTp7fSwgZGl2Qjp7fVxuXHRcdFx0XHRcblx0XHRcdFx0dGVtcGxhdGUuc3Bhd24oZGF0YTp7aHJlZjonYWJjJywgbmFtZTonMTIzJywgdmFsdWU6J2RlZicsIHNpemU6JzQ1Nid9KVxuXHRcdFx0XHRleHBlY3QocmVzdWx0KS50by5lcWwge2RpdkE6ZXhwZWN0ZWQsIGRpdkI6ZXhwZWN0ZWR9XG5cdFx0XHRcdFxuXHRcdFx0XHRkZWxldGUgcmVzdWx0LmRpdkFcblx0XHRcdFx0ZGl2QjogbnVsbFxuXHRcdFx0XHR0ZW1wbGF0ZS5jaGlsZC5kaXZCLnNwYXduKGRhdGE6e2hyZWY6J2FiYycsIG5hbWU6JzEyMycsIHZhbHVlOidkZWYnLCBzaXplOic0NTYnfSlcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdCkudG8uZXFsIHtkaXZCOmV4cGVjdGVkfVxuXG5cblx0XHRcdHRlc3QgXCJEYXRhIGNhbiBiZSBzcGVjaWZpZWQgdmlhIG9wdGlvbnMgb2JqZWN0XCIsICgpLT5cblx0XHRcdFx0cmVjZWl2ZWREYXRhID0gbnVsbFxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczogJ3NvbWVMYWJlbCc6IChkYXRhKS0+IHJlY2VpdmVkRGF0YSA9IGRhdGEgb3IgJ25vdGhpbmcnXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdHRlbXBsYXRlQ29weSA9IHRlbXBsYXRlLmV4dGVuZChvcHRpb25zOmRhdGE6eydzb21lTGFiZWwnOid3b3Jrcyd9KVxuXG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXF1YWwobnVsbClcblx0XHRcdFx0dGVtcGxhdGVDb3B5LnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXF1YWwoJ3dvcmtzJylcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKG9wdGlvbnM6ZGF0YTp7J3NvbWVMYWJlbCc6J2Fsc28gd29ya3MnfSlcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXF1YWwoJ2Fsc28gd29ya3MnKVxuXG5cblx0XHRcdHRlc3QgXCJEYXRhIHNwZWNpZmllZCBpbiBjaGlsZHJlbidzIG9wdGlvbnMgb2JqZWN0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlIHBhcmVudCdzIGRhdGFcIiwgKCktPlxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBhYmM6bnVsbCwgZGVmOm51bGxcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnLCBudWxsXG5cblx0XHRcdFx0XHRcdFsnc3Bhbidcblx0XHRcdFx0XHRcdFx0ZGF0YTogYWJjOiAxMjNcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOlxuXHRcdFx0XHRcdFx0XHRcdCdhYmMnOiAoZGF0YSktPiByZWNlaXZlZERhdGEuYWJjID0gZGF0YSBvciAnbm90aGluZydcblx0XHRcdFx0XHRcdFx0XHQnZGVmJzogKGRhdGEpLT4gcmVjZWl2ZWREYXRhLmRlZiA9IGRhdGEgb3IgJ25vdGhpbmcnXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdHRlbXBsYXRlQ29weSA9IHRlbXBsYXRlLmV4dGVuZChvcHRpb25zOmRhdGE6e2RlZjo0NTZ9KVxuXG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXFsKGFiYzoxMjMsIGRlZjpudWxsKVxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBhYmM6bnVsbCwgZGVmOm51bGxcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlQ29weS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbChhYmM6MTIzLCBkZWY6NDU2KVxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBhYmM6bnVsbCwgZGVmOm51bGxcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKG9wdGlvbnM6ZGF0YTp7ZGVmOjc4OX0pXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbChhYmM6MTIzLCBkZWY6Nzg5KVxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBhYmM6bnVsbCwgZGVmOm51bGxcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKG9wdGlvbnM6ZGF0YTp7YWJjOjc4OX0pXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbChhYmM6Nzg5LCBkZWY6bnVsbClcblxuXG5cdFx0XHR0ZXN0IFwiRGF0YSB3b24ndCBiZSBwYXNzZWQgdG8gY2hpbGRyZW4gaWYgb3B0aW9ucy5wYXNzRGF0YVRvQ2hpbGRyZW4gaXMgZmFsc2VcIiwgKCktPlxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBwYXJlbnQ6bnVsbCwgY2hpbGQ6bnVsbFxuXHRcdFx0XHR0ZW1wbGF0ZTEgPSBET00udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6IGFiYzogKGRhdGEpLT4gcmVjZWl2ZWREYXRhLnBhcmVudCA9IGRhdGFcblxuXHRcdFx0XHRcdFx0WydzcGFuJ1xuXHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6IGFiYzogKGRhdGEpLT4gcmVjZWl2ZWREYXRhLmNoaWxkID0gZGF0YVxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXHRcdFx0XHR0ZW1wbGF0ZTIgPSB0ZW1wbGF0ZTEuZXh0ZW5kKHBhc3NEYXRhVG9DaGlsZHJlbjpmYWxzZSlcblx0XHRcdFx0XG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbCBwYXJlbnQ6bnVsbCwgY2hpbGQ6bnVsbFxuXHRcdFx0XHRcblx0XHRcdFx0ZWwxID0gdGVtcGxhdGUxLnNwYXduKGRhdGE6e2FiYzoxMjN9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcWwgcGFyZW50OjEyMywgY2hpbGQ6MTIzXG5cblx0XHRcdFx0cmVjZWl2ZWREYXRhID0gcGFyZW50Om51bGwsIGNoaWxkOm51bGxcblx0XHRcdFx0ZWwyID0gdGVtcGxhdGUyLnNwYXduKGRhdGE6e2FiYzoxMjN9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcWwgcGFyZW50OjEyMywgY2hpbGQ6bnVsbFxuXHRcdFx0XHRcblx0XHRcdFx0cmVjZWl2ZWREYXRhID0gcGFyZW50Om51bGwsIGNoaWxkOm51bGxcblx0XHRcdFx0ZWwxLmFwcGx5RGF0YSh7YWJjOjQ1Nn0pXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbCBwYXJlbnQ6NDU2LCBjaGlsZDo0NTZcblx0XHRcdFx0XG5cdFx0XHRcdHJlY2VpdmVkRGF0YSA9IHBhcmVudDpudWxsLCBjaGlsZDpudWxsXG5cdFx0XHRcdGVsMi5hcHBseURhdGEoe2FiYzo0NTZ9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcWwgcGFyZW50OjQ1NiwgY2hpbGQ6bnVsbFxuXHRcdFx0XHRcblx0XHRcdFx0ZWwyLmxhc3RDaGlsZC5hcHBseURhdGEoe2FiYzo3ODl9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcWwgcGFyZW50OjQ1NiwgY2hpbGQ6Nzg5XG5cblxuXHRcdFx0dGVzdCBcIkRhdGEgc2hvdWxkIGJlIGludm9rZWQgZm9yIHBhcmVudHMgYWZ0ZXIgaW52b2tlZCBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRcdGhpc3RvcnkgPSBbXVxuXHRcdFx0XHRjb21wdXRlcnMgPSBcblx0XHRcdFx0XHRfaW5pdDogKCktPiBoaXN0b3J5LnB1c2goQHJlZilcblx0XHRcdFx0XHRhYmM6ICgpLT4gaGlzdG9yeS5wdXNoKEByZWYpXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERPTS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidwYXJlbnQnfVxuXHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidjaGlsZDEnfVxuXHRcdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0XHR7Y29tcHV0ZXJzLCBpZDonY2hpbGQyJ31cblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidjaGlsZDMnfVxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXHRcdFx0XHRleHBlY3QoaGlzdG9yeSkudG8uZXFsIFtdXG5cdFx0XHRcdGVsID0gdGVtcGxhdGUuc3Bhd24oKVxuXHRcdFx0XHRleHBlY3QoaGlzdG9yeSkudG8uZXFsIFsnY2hpbGQyJywgJ2NoaWxkMScsICdjaGlsZDMnLCAncGFyZW50J11cblxuXHRcdFx0XHRoaXN0b3J5Lmxlbmd0aCA9IDBcblx0XHRcdFx0ZWwuYXBwbHlEYXRhKGFiYzoxMjMpXG5cdFx0XHRcdGV4cGVjdChoaXN0b3J5KS50by5lcWwgWydjaGlsZDInLCAnY2hpbGQxJywgJ2NoaWxkMycsICdwYXJlbnQnXVxuXG5cblx0XHRcdHRlc3QgXCJDb21wdXRlcnMgd2lsbCBiZSBpbnZva2VkIG9ubHkgb25lIHRpbWUgcGVyIGVsZW1lbnQgaWYgb3B0aW9ucy5pbnZva2VDb21wdXRlcnNPbmNlIGlzIG9uXCIsICgpLT5cblx0XHRcdFx0aGlzdG9yeSA9IFtdXG5cdFx0XHRcdGNvbXB1dGVycyA9ICBhYmM6ICgpLT4gaGlzdG9yeS5wdXNoKEByZWYpXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERPTS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidwYXJlbnQnLCBpbnZva2VDb21wdXRlcnNPbmNlOnRydWV9XG5cdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0e2NvbXB1dGVycywgaWQ6J2NoaWxkMSd9XG5cdFx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidjaGlsZDInLCBpbnZva2VDb21wdXRlcnNPbmNlOnRydWV9XG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHR7Y29tcHV0ZXJzLCBpZDonY2hpbGQzJ31cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdClcblx0XHRcdFx0ZXhwZWN0KGhpc3RvcnkpLnRvLmVxbCBbXVxuXHRcdFx0XHRlbCA9IHRlbXBsYXRlLnNwYXduKGRhdGE6YWJjOjEyMylcblx0XHRcdFx0ZXhwZWN0KGhpc3RvcnkpLnRvLmVxbCBbJ2NoaWxkMicsICdjaGlsZDEnLCAnY2hpbGQzJywgJ3BhcmVudCddXG5cblx0XHRcdFx0aGlzdG9yeS5sZW5ndGggPSAwXG5cdFx0XHRcdGVsLmFwcGx5RGF0YShhYmM6MTIzKVxuXHRcdFx0XHRleHBlY3QoaGlzdG9yeSkudG8uZXFsIFsnY2hpbGQxJywgJ2NoaWxkMyddXG5cblx0XHRcdFx0aGlzdG9yeS5sZW5ndGggPSAwXG5cdFx0XHRcdGVsLmFwcGx5RGF0YShhYmM6NDU2KVxuXHRcdFx0XHRleHBlY3QoaGlzdG9yeSkudG8uZXFsIFsnY2hpbGQxJywgJ2NoaWxkMyddXG5cblxuXG5cdHN1aXRlIFwiTWlzY1wiLCAoKS0+XG5cdFx0dGVzdCBcIlF1aWNrRG9tLmlzVGVtcGxhdGVcIiwgKCktPlxuXHRcdFx0ZXhwZWN0KERvbS5pc1RlbXBsYXRlIERvbS50ZW1wbGF0ZShbJ2RpdiddKSkudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KERvbS5pc1RlbXBsYXRlIERvbS5kaXYoKSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNUZW1wbGF0ZSBEb20uZGl2KClbMF0pLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzVGVtcGxhdGUge30pLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzVGVtcGxhdGUgJ3N0cmluZycpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzVGVtcGxhdGUgNSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNUZW1wbGF0ZSBmYWxzZSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNUZW1wbGF0ZSB0cnVlKS50by5iZS5mYWxzZVxuXHRcdFxuXG5cdFx0dGVzdCBcIlF1aWNrRG9tLmlzUXVpY2tFbFwiLCAoKS0+XG5cdFx0XHRleHBlY3QoRG9tLmlzUXVpY2tFbCBEb20udGVtcGxhdGUoWydkaXYnXSkpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzUXVpY2tFbCBEb20uZGl2KCkpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChEb20uaXNRdWlja0VsIERvbS50ZXh0KCkpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChEb20uaXNRdWlja0VsIERvbS5kaXYoKVswXSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNRdWlja0VsIHt9KS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc1F1aWNrRWwgJ3N0cmluZycpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzUXVpY2tFbCA1KS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc1F1aWNrRWwgZmFsc2UpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzUXVpY2tFbCB0cnVlKS50by5iZS5mYWxzZVxuXHRcdFxuXG5cdFx0dGVzdCBcIlF1aWNrRG9tLmlzRWxcIiwgKCktPlxuXHRcdFx0ZXhwZWN0KERvbS5pc0VsIERvbS50ZW1wbGF0ZShbJ2RpdiddKSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNFbCBEb20uZGl2KCkpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzRWwgRG9tLnRleHQoKSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNFbCBEb20uZGl2KClbMF0pLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChEb20uaXNFbCBEb20udGV4dCgpWzBdKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc0VsIHt9KS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc0VsICdzdHJpbmcnKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc0VsIDUpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzRWwgZmFsc2UpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzRWwgdHJ1ZSkudG8uYmUuZmFsc2Vcblx0XHRcblxuXHRcdHRlc3QgXCJTdHJpbmdpZmljYXRpb25cIiwgKCktPlxuXHRcdFx0c2VjdGlvbiA9IERvbShcblx0XHRcdFx0WydzZWN0aW9uJyx7XG5cdFx0XHRcdFx0aWQ6ICd0aGVTZWN0aW9uJ1xuXHRcdFx0XHRcdGNsYXNzTmFtZTogJ3RoZVNlY3Rpb25DbGFzcydcblx0XHRcdFx0XHRzdHlsZTpcblx0XHRcdFx0XHRcdCdwb3NpdGlvbic6ICdyZWxhdGl2ZSdcblx0XHRcdFx0XHRcdCdvcGFjaXR5JzogMC41XG5cdFx0XHRcdFx0XHQnZm9udFNpemUnOiAoKS0+ICcyOXB4J1xuXHRcdFx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdFx0XHRmb250U2l6ZTogJzExcHgnXG5cdFx0XHRcdFx0XHRcdCRyZWxheGVkOlxuXHRcdFx0XHRcdFx0XHRcdGZvbnRTaXplOiAnOHB4J1xuXHRcdFx0XHR9XG5cdFx0XHRcdFx0WydkaXYnLCB7aWQ6J2NoaWxkQScsIHN0eWxlOnBvc2l0aW9uOidyZWxhdGl2ZSd9LCAnY2hpbGRBLWlubmVydGV4dCddXG5cdFx0XHRcdFx0J3NlY3Rpb24taW5uZXJ0ZXh0J1xuXHRcdFx0XHRcdFsnc3BhbicsIHtpZDonY2hpbGRCJywgcmVmOidjaGlsZEItcmVmIScsIHN0eWxlOnBvc2l0aW9uOidhYnNvbHV0ZSd9XG5cdFx0XHRcdFx0XHQnY2hpbGRCLWlubmVydGV4dCdcblx0XHRcdFx0XHRcdFsndGV4dCcsIHt0ZXh0OidjaGlsZEItaW5uZXJ0ZXh0IDInfV1cblx0XHRcdFx0XHRcdFsnYScsIHt1cmw6J2h0dHBzOi8vZ29vZ2xlLmNvbSd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XVxuXHRcdFx0KS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0d2luZG93LnN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkoc2VjdGlvbiwgbnVsbCwgMilcblx0XHRcdHNlY3Rpb25Db3B5ID0gRG9tKEpTT04ucGFyc2Uoc3RyaW5naWZpZWQpKS5hcHBlbmRUbyhzYW5kYm94KVxuXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkudHlwZSkudG8uZXF1YWwoc2VjdGlvbi50eXBlKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb25Db3B5LnJlZikudG8uZXF1YWwoc2VjdGlvbi5yZWYpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuZWwuaWQpLnRvLmVxdWFsKHNlY3Rpb24uZWwuaWQpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuZWwuY2xhc3NOYW1lKS50by5lcXVhbChzZWN0aW9uLmVsLmNsYXNzTmFtZSlcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5zdHlsZSAncG9zaXRpb24nKS50by5lcXVhbChzZWN0aW9uLnN0eWxlICdwb3NpdGlvbicpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuc3R5bGUgJ29wYWNpdHknKS50by5lcXVhbChzZWN0aW9uLnN0eWxlICdvcGFjaXR5Jylcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5zdHlsZSAnZm9udFNpemUnKS5ub3QudG8uZXF1YWwoc2VjdGlvbi5zdHlsZSAnZm9udFNpemUnKVxuXHRcdFx0XG5cdFx0XHRzZWN0aW9uLnN0eWxlICdmb250U2l6ZScsIG51bGxcblx0XHRcdHNlY3Rpb24uc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdHNlY3Rpb25Db3B5LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwoc2VjdGlvbi5zdHlsZSAnZm9udFNpemUnKVxuXHRcdFx0XG5cdFx0XHRzZWN0aW9uLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdHNlY3Rpb25Db3B5LnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbChzZWN0aW9uLnN0eWxlICdmb250U2l6ZScpXG5cdFx0XHRcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKHNlY3Rpb24uY2hpbGRyZW4ubGVuZ3RoKVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHNlY3Rpb25Db3B5LmNoaWxkKS5sZW5ndGgpLnRvLmVxdWFsKE9iamVjdC5rZXlzKHNlY3Rpb24uY2hpbGQpLmxlbmd0aClcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS50ZXh0KS50by5lcXVhbChzZWN0aW9uLnRleHQpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuaHRtbCkudG8uZXF1YWwoc2VjdGlvbi5odG1sKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb25Db3B5LmNoaWxkcmVuWzBdLnN0eWxlICdwb3NpdGlvbicpLnRvLmVxdWFsKHNlY3Rpb24uY2hpbGRyZW5bMF0uc3R5bGUgJ3Bvc2l0aW9uJylcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5jaGlsZHJlblsyXS5zdHlsZSAncG9zaXRpb24nKS50by5lcXVhbChzZWN0aW9uLmNoaWxkcmVuWzJdLnN0eWxlICdwb3NpdGlvbicpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuY2hpbGRyZW5bMl0ucmVmKS50by5lcXVhbChzZWN0aW9uLmNoaWxkcmVuWzJdLnJlZilcblxuXG5cdFx0dGVzdCBcIkNoYWluaW5nXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0Y2hhaW5SZXN1bHQgPSBkaXZcblx0XHRcdFx0LnN0YXRlKCdhYmMnLCBvbilcblx0XHRcdFx0LnJlc2V0U3RhdGUoKVxuXHRcdFx0XHQuc3R5bGUoKVxuXHRcdFx0XHQuY3NzKCd3aWR0aCcsIDEyKVxuXHRcdFx0XHQuYXR0cigndGVzdCcsIDEyMylcblx0XHRcdFx0LnByb3AoJ2Fub3RoZXJUZXN0JywgMTIzKVxuXHRcdFx0XHQudXBkYXRlU3RhdGVTdHlsZXMoe2hlaWdodDo1MH0pXG5cdFx0XHRcdC51cGRhdGVTdGF0ZVRleHRzKHskYmFzZTonYWJjJ30pXG5cdFx0XHRcdC5hcHBlbmQoKVxuXHRcdFx0XHQuYXBwZW5kVG8oKVxuXHRcdFx0XHQucHJlcGVuZCgpXG5cdFx0XHRcdC5wcmVwZW5kVG8oKVxuXHRcdFx0XHQuYmVmb3JlKClcblx0XHRcdFx0LmFmdGVyKClcblx0XHRcdFx0Lmluc2VydEJlZm9yZSgpXG5cdFx0XHRcdC5pbnNlcnRBZnRlcigpXG5cdFx0XHRcdC5kZXRhY2goKVxuXHRcdFx0XHQud3JhcChEb20uc2VjdGlvbigpKVxuXHRcdFx0XHQudW53cmFwKClcblx0XHRcdFx0LndyYXAoRG9tLmhlYWRlcigpKVxuXHRcdFx0XHQucmVwbGFjZSgpXG5cdFx0XHRcdC5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0XHQud3JhcChoZWFkPURvbS5oZWFkZXIoKSlcblx0XHRcdFx0Lm9uKCdhYmMnLCAoKS0+KVxuXHRcdFx0XHQuZW1pdCgnYWJjJylcblx0XHRcdFx0Lm9mZignYWJjJylcblx0XHRcdFx0Lm9mZigpXG5cblx0XHRcdGV4cGVjdChjaGFpblJlc3VsdCkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KHNhbmRib3guY2hpbGRyZW5bMF0pLnRvLmVxdWFsKGhlYWQuZWwpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwoaGVhZClcblx0XHRcdGV4cGVjdChkaXYuY3NzICd3aWR0aCcpLnRvLmVxdWFsKCcxMnB4JylcblxuXG5cdFx0dGVzdCBcIkludmFsaWQgQXJndW1lbnRzXCIsICgpLT5cblx0XHRcdHRleHQgPSBEb20udGV4dCgnc29tZVRleHQnLCB7bG9zdE9wdHM6dHJ1ZX0pXG5cdFx0XHRkaXYgPSBEb20uZGl2KHtsb3N0T3B0czp0cnVlfSlcblxuXHRcdFx0ZXhwZWN0KERvbSgpKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdChEb20obnVsbCkpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KERvbSh7fSkpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KGRpdi51cGRhdGVPcHRpb25zKCkpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KHRleHQub3B0aW9ucy5sb3N0T3B0cykudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoZGl2Lm9wdGlvbnMubG9zdE9wdHMpLnRvLmVxdWFsIHRydWVcblx0XHRcdGV4cGVjdChkaXYub24oKSkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2Lm9uKCdhYmMnKSkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2Lm9uKCdhYmMnLCB7fSkpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5vbmNlKCdhYmMnKSkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2Lm9mZignc29tZXRoaW5nRmFrZScpKS50by5lcXVhbCBkaXZcblxuXHRcdFx0ZW1pdENvdW50ID0gMDsgZGl2Lm9uICdzb21ldGhpbmcnLCBjYj0oKS0+IGVtaXRDb3VudCsrXG5cdFx0XHRleHBlY3QoZGl2LmVtaXQoJycpKS50by5lcXVhbChkaXYpXG5cdFx0XHRleHBlY3QoZGl2LmVtaXQoKSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGRpdi5lbWl0UHJpdmF0ZSgnbm9uZScpKS50by5lcXVhbChkaXYpXG5cdFx0XHRleHBlY3QoZGl2LmVtaXRQcml2YXRlKCcnKSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGRpdi5lbWl0UHJpdmF0ZSgpKS50by5lcXVhbChkaXYpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbWl0KCdzb21ldGhpbmcnKSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChkaXYub2ZmKCdzb21ldGhpbmcnLCAoKS0+KSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGRpdi5lbWl0KCdzb21ldGhpbmcnKSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMilcblxuXHRcdFx0ZGl2LmNzcyhudWxsLCAnMTI5Jylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUubnVsbCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlKCkpLnRvLmVxbCBbXVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZShudWxsLCBvbikpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSgxMjMsIG9uKSkudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdiYXNlJywgb24pLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYmFzZScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICckd2hhdGV2cycsIG9uKS50by5lcXVhbCBkaXZcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ3doYXRldnMnKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdhbm90aGVyJykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2Fub3RoZXInLCBvbikudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdhbm90aGVyJykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYW5vdGhlcicsIHVuZGVmaW5lZCkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdhbm90aGVyJykudG8uYmUuZmFsc2VcblxuXHRcdFx0ZXhwZWN0KGRpdi51cGRhdGVTdGF0ZVN0eWxlcyB7JGJhc2U6e3dpZHRoOjF9fSkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2LnVwZGF0ZVN0YXRlU3R5bGVzIG51bGwpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi51cGRhdGVTdGF0ZVRleHRzIHskYmFzZTonYWJjJ30pLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi51cGRhdGVTdGF0ZVRleHRzIG51bGwpLnRvLmVxdWFsIGRpdlxuXG5cdFx0XHRkaXYuYXBwZW5kVG8oRG9tIHNhbmRib3gpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwoRG9tIHNhbmRib3gpXG5cblx0XHRcdGRpdi5hcHBlbmQodHJ1ZSlcblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0ZGl2LmFwcGVuZFRvKGRvY3VtZW50KVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LnByZXBlbmQodHJ1ZSlcblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0ZGl2LnByZXBlbmRUbyh0cnVlKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LmFmdGVyKHRydWUpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGRpdi5pbnNlcnRBZnRlcigxMjMpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwoRG9tIHNhbmRib3gpXG5cdFx0XHRkaXYuYmVmb3JlKHRydWUpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGRpdi5pbnNlcnRCZWZvcmUoMTIzKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LndyYXAoMTIzKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LnJlcGxhY2UoMTIzKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LmRldGFjaCgpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZGl2LnVud3JhcCgpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KERvbShzYW5kYm94KS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDBcblxuXHRcdFx0ZGl2LmFwcGVuZFRvKERvbSBzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KERvbShzYW5kYm94KS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDFcblx0XHRcdGlmIERvbShzYW5kYm94KS5fcmVtb3ZlQ2hpbGRcblx0XHRcdFx0RG9tKHNhbmRib3gpLl9yZW1vdmVDaGlsZCh0ZXh0KVxuXHRcdFx0XHREb20oc2FuZGJveCkuX3JlbW92ZUNoaWxkKERvbS5kaXYoKSlcblx0XHRcdFx0ZXhwZWN0KERvbShzYW5kYm94KS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDFcblxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLmJhdGNoKClcblx0XHRcdFx0LnRvLnRocm93KClcblx0XHRcdFxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLmJhdGNoKHt9KVxuXHRcdFx0XHQudG8udGhyb3coKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QgKCktPiBEb20uYmF0Y2goNTQzMilcblx0XHRcdFx0LnRvLnRocm93KClcblx0XHRcdFxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLmJhdGNoKFtdKVxuXHRcdFx0XHQudG8udGhyb3coKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QgKCktPiBEb20uYmF0Y2goWzEyXSkuYXBwZW5kKERvbS5kaXYoKSlcblx0XHRcdFx0LnRvLnRocm93KClcblx0XHRcdFxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLmJhdGNoKFsxMl0pXG5cdFx0XHRcdC5ub3QudG8udGhyb3coKVxuXHRcdFx0XG5cdFx0XHQjIGV4cGVjdCAoKS0+IERvbS5iYXRjaCgkKCdkaXYnKSlcblx0XHRcdCMgXHQubm90LnRvLnRocm93KClcblxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLnRlbXBsYXRlKClcblx0XHRcdFx0LnRvLnRocm93KClcblxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLnRlbXBsYXRlKG51bGwpXG5cdFx0XHRcdC50by50aHJvdygpXG5cblx0XHRcdGV4cGVjdCAoKS0+IERvbS50ZW1wbGF0ZSh7fSlcblx0XHRcdFx0LnRvLnRocm93KClcblxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLnRlbXBsYXRlKFs4NDgyLCB7Y2xhc3NOYW1lOid0J31dKVxuXHRcdFx0XHQudG8udGhyb3coKVxuXG5cdFx0XHRleHBlY3QgKCktPiBEb20udGVtcGxhdGUoWydkaXYnLCAnc29tZVN0cmluZyddKVxuXHRcdFx0XHQudG8udGhyb3coKVxuXG5cdFx0XHRleHBlY3QgKCktPiBEb20udGVtcGxhdGUoWydkaXYnLCBudWxsLCAnU29tZSBJbm5lciBUZXh0J10pXG5cdFx0XHRcdC5ub3QudG8udGhyb3coKVxuXG5cdFx0XHRleHBlY3QgKCktPiBEb20uZGl2KHN0eWxlOntvcGFjaXR5OjAuNSwgJ0BhYmMobWF4LXdpZHRoOjM5MCknOntvcGFjaXR5OjF9fSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdFx0Lm5vdC50by50aHJvdygpXG5cblx0XHRcdGV4cGVjdCgoKS0+XG5cdFx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0XHRkaXYucGlwZVN0YXRlKGRpdilcblx0XHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblx0XHRcdCkubm90LnRvLnRocm93KClcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbkhUTUxFbGVtZW50OjpvbkV2ZW50ID0gKGV2ZW50TmFtZSwgY2FsbGJhY2spLT5cblx0aWYgQGFkZEV2ZW50TGlzdGVuZXJcblx0XHRAYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKVxuXHRlbHNlXG5cdFx0QGF0dGFjaEV2ZW50KFwib24je2V2ZW50TmFtZX1cIiwgY2FsbGJhY2spXG5cblxuSFRNTEVsZW1lbnQ6OnJlbW92ZUV2ZW50ID0gKGV2ZW50TmFtZSwgY2FsbGJhY2spLT5cblx0aWYgQHJlbW92ZUV2ZW50TGlzdGVuZXJcblx0XHRAcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKVxuXHRlbHNlXG5cdFx0QGRldGFjaEV2ZW50KFwib24je2V2ZW50TmFtZX1cIiwgY2FsbGJhY2spXG5cblxuSFRNTEVsZW1lbnQ6OmVtaXRFdmVudCA9IChldmVudE5hbWUpLT5cblx0ZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKVxuXHRldmVudC5pbml0RXZlbnQoZXZlbnROYW1lLCB0cnVlLCBmYWxzZSlcblx0QGRpc3BhdGNoRXZlbnQoZXZlbnQpXG5cblxuaWYgSFRNTEVsZW1lbnQubmFtZSBpc250ICdIVE1MRWxlbWVudCdcblx0SFRNTEVsZW1lbnQubmFtZSA9ICdIVE1MRWxlbWVudCdcblx0VGV4dC5uYW1lID0gJ1RleHQnXG5cdG5vbkVsZW1lbnRTdWZmaXggPSBbXG5cdFx0J09wdGlvbnNDb2xsZWN0aW9uJ1xuXHRcdCdGb3JtQ29udHJvbHNDb2xsZWN0aW9uJ1xuXHRcdCdEb2N1bWVudCdcblx0XHQnQ29sbGVjdGlvbidcblx0XHQnQWxsQ29sbGVjdGlvbidcblx0XVxuXHRlbGVtZW50U3VmZml4ID0gW1xuXHRcdFwiVmlkZW9cIixcIlVua25vd25cIixcIlVMaXN0XCIsXCJUcmFja1wiLFwiVGl0bGVcIixcblx0XHRcIlRleHRBcmVhXCIsXCJUZW1wbGF0ZVwiLFwiVGFibGVTZWN0aW9uXCIsXCJUYWJsZVJvd1wiLFxuXHRcdFwiVGFibGVcIixcIlRhYmxlQ29sXCIsXCJUYWJsZUNlbGxcIixcIlRhYmxlQ2FwdGlvblwiLFxuXHRcdFwiU3R5bGVcIixcIlNwYW5cIixcIlNvdXJjZVwiLFwiU2xvdFwiLFwiU2hhZG93XCIsXCJTZWxlY3RcIixcblx0XHRcIlNjcmlwdFwiLFwiUXVvdGVcIixcIlByb2dyZXNzXCIsXCJQcmVcIixcIlBpY3R1cmVcIixcblx0XHRcIlBhcmFtXCIsXCJQYXJhZ3JhcGhcIixcIk91dHB1dFwiLFwiT3B0aW9uXCIsXCJPcHRHcm91cFwiLFxuXHRcdFwiT2JqZWN0XCIsXCJPTGlzdFwiLFwiTW9kXCIsXCJNZXRlclwiLFwiTWV0YVwiLFwiTWVudVwiLFxuXHRcdFwiTWVkaWFcIixcIk1hcnF1ZWVcIixcIk1hcFwiLFwiTGlua1wiLFwiTGVnZW5kXCIsXCJMYWJlbFwiLFxuXHRcdFwiTElcIixcIklucHV0XCIsXCJJbWFnZVwiLFwiSUZyYW1lXCIsXCJIdG1sXCIsXCJIZWFkaW5nXCIsXG5cdFx0XCJIZWFkXCIsXCJIUlwiLFwiRnJhbWVTZXRcIixcIkZyYW1lXCIsXCJGb3JtXCIsXCJGb250XCIsXG5cdFx0XCJGaWVsZFNldFwiLFwiRW1iZWRcIixcIkRpdlwiLFwiRGlyZWN0b3J5XCIsXCJEaWFsb2dcIixcblx0XHRcIkRldGFpbHNcIixcIkRhdGFMaXN0XCIsXCJETGlzdFwiLFwiQ29udGVudFwiLFwiQ2FudmFzXCIsXG5cdFx0XCJCdXR0b25cIixcIkJvZHlcIixcIkJhc2VcIixcIkJSXCIsXCJBdWRpb1wiLFwiQXJlYVwiLFwiQW5jaG9yXCJcblx0XVxuXG5cdGZvciBjcmVhdG9yIGluIG5vbkVsZW1lbnRTdWZmaXhcblx0XHR3aW5kb3dbXCJIVE1MI3tjcmVhdG9yfVwiXT8ubmFtZSA9IFwiSFRNTCN7Y3JlYXRvcn1cIlxuXG5cdGZvciBjcmVhdG9yIGluIGVsZW1lbnRTdWZmaXhcblx0XHR3aW5kb3dbXCJIVE1MI3tjcmVhdG9yfUVsZW1lbnRcIl0/Lm5hbWUgPSBcIkhUTUwje2NyZWF0b3J9RWxlbWVudFwiXG5cblx0d2luZG93LlNWR0VsZW1lbnQ/Lm5hbWUgPSAnU1ZHRWxlbWVudCdcblx0d2luZG93LlNWR1NWR0VsZW1lbnQ/Lm5hbWUgPSAnU1ZHU1ZHRWxlbWVudCdcblx0d2luZG93LlNWR1BvbHlsaW5lRWxlbWVudD8ubmFtZSA9ICdTVkdQb2x5bGluZUVsZW1lbnQnXG5cbndpbmRvdy5DbGllbnRSZWN0ID89IERPTVJlY3RcblxuXG5cblxuIiwie1xuICBcIm5hbWVcIjogXCJxdWlja2RvbVwiLFxuICBcInZlcnNpb25cIjogXCIxLjAuODlcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkZhc3QgJiBsaWdodCBET00gZWxlbWVudCBtYW5hZ2VtZW50IHN1cHBvcnRpbmcganF1ZXJ5LWxpa2UgbWV0aG9kcywgdGVtcGxhdGVzLCAmIHN0YXRlLWJhc2VkIHN0eWxpbmdcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9xdWlja2RvbS5qc1wiLFxuICBcImJyb3dzZXJcIjoge1xuICAgIFwiLi9kZWJ1Z1wiOiBcImRpc3QvcXVpY2tkb20uZGVidWcuanNcIixcbiAgICBcIi4vZGlzdC9xdWlja2RvbS5qc1wiOiBcInNyYy9pbmRleC5jb2ZmZWVcIlxuICB9LFxuICBcImJyb3dzZXJpZnlcIjoge1xuICAgIFwidHJhbnNmb3JtXCI6IFtcbiAgICAgIFwic2ltcGx5aW1wb3J0L2NvbXBhdFwiXG4gICAgXVxuICB9LFxuICBcInNpbXBseWltcG9ydFwiOiB7XG4gICAgXCJmaW5hbFRyYW5zZm9ybVwiOiBbXG4gICAgICBbXG4gICAgICAgIFwiYmFiZWxpZnlcIixcbiAgICAgICAge1xuICAgICAgICAgIFwicHJlc2V0c1wiOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiQGJhYmVsL3ByZXNldC1lbnZcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwibW9kdWxlc1wiOiBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCIuY29uZmlnL3RyYW5zZm9ybXMvbWluaWZ5LXN1cGVyXCIsXG4gICAgICBcIi5jb25maWcvdHJhbnNmb3Jtcy9taW5pZnktcmVuYW1lXCIsXG4gICAgICBcIi5jb25maWcvdHJhbnNmb3Jtcy9taW5pZnktc2ltcGxlXCJcbiAgICBdXG4gIH0sXG4gIFwiZGlyZWN0b3JpZXNcIjoge1xuICAgIFwidGVzdFwiOiBcInRlc3RcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicG9zdHZlcnNpb25cIjogXCJucG0gcnVuIGJ1aWxkICYmIGdpdCBhZGQgLiAmJiBnaXQgY29tbWl0IC1hIC1tICdbQnVpbGRdJ1wiLFxuICAgIFwicHJlcHVibGlzaE9ubHlcIjogXCJucG0gcnVuIHRlc3Q6dHJhdmlzXCIsXG4gICAgXCJwb3N0cHVibGlzaFwiOiBcImdpdCBwdXNoXCIsXG4gICAgXCJ3YXRjaFwiOiBcImNha2UgLWQgd2F0Y2hcIixcbiAgICBcImJ1aWxkXCI6IFwiY2FrZSAtZCBidWlsZCAmJiBjYWtlIGJ1aWxkICYmIGNha2UgbWVhc3VyZSAmJiBjcCAtciBidWlsZC8qIGRpc3QvXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biB0ZXN0OmJyb3dzZXIgLXMgfHwgdHJ1ZVwiLFxuICAgIFwidGVzdDp0cmF2aXNcIjogXCJucG0gcnVuIHRlc3Q6YnJvd3NlciAtcyAmJiBucG0gcnVuIHRlc3Q6bWluaWZpZWQgLXNcIixcbiAgICBcInRlc3Q6bG9jYWxcIjogXCJvcGVuIHRlc3QvdGVzdHJ1bm5lci5odG1sXCIsXG4gICAgXCJ0ZXN0Om1pbmlmaWVkXCI6IFwibWluaWZpZWQ9MSBucG0gcnVuIHRlc3Q6YnJvd3NlciAtcyB8fCB0cnVlXCIsXG4gICAgXCJ0ZXN0Omthcm1hXCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7ICAga2FybWEgc3RhcnQgLmNvbmZpZy9rYXJtYS5jb25mLmNvZmZlZVwiLFxuICAgIFwidGVzdDpicm93c2VyXCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7IGthcm1hIHN0YXJ0IC0tc2luZ2xlLXJ1biAtLWJyb3dzZXJzIEVsZWN0cm9uIC5jb25maWcva2FybWEuY29uZi5jb2ZmZWVcIixcbiAgICBcInRlc3Q6Y2hyb21lXCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7ICBrYXJtYSBzdGFydCAtLXNpbmdsZS1ydW4gLS1icm93c2VycyBDaHJvbWUgLmNvbmZpZy9rYXJtYS5jb25mLmNvZmZlZVwiLFxuICAgIFwidGVzdDpmaXJlZm94XCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7IGthcm1hIHN0YXJ0IC0tc2luZ2xlLXJ1biAtLWJyb3dzZXJzIEZpcmVmb3ggLmNvbmZpZy9rYXJtYS5jb25mLmNvZmZlZVwiLFxuICAgIFwidGVzdDpzYWZhcmlcIjogXCJjYWtlIGluc3RhbGw6dGVzdDsgIGthcm1hIHN0YXJ0IC0tc2luZ2xlLXJ1biAtLWJyb3dzZXJzIFNhZmFyaSAuY29uZmlnL2thcm1hLmNvbmYuY29mZmVlXCIsXG4gICAgXCJ0ZXN0OnNhdWNlXCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7ICAgc2F1Y2U9MSBrYXJtYSBzdGFydCAuY29uZmlnL2thcm1hLmNvbmYuY29mZmVlXCIsXG4gICAgXCJjb3ZlcmFnZVwiOiBcImNha2UgaW5zdGFsbDpjb3ZlcmFnZTsgbnBtIHJ1biBjb3ZlcmFnZTpydW4gJiYgbnBtIHJ1biBjb3ZlcmFnZTpiYWRnZVwiLFxuICAgIFwiY292ZXJhZ2U6cnVuXCI6IFwiY292ZXJhZ2U9dHJ1ZSBucG0gcnVuIHRlc3Q6ZWxlY3Ryb25cIixcbiAgICBcImNvdmVyYWdlOmJhZGdlXCI6IFwiYmFkZ2UtZ2VuIC1kIC4vLmNvbmZpZy9iYWRnZXMvY292ZXJhZ2VcIixcbiAgICBcImNvdmVyYWdlOnNob3dcIjogXCJvcGVuIGNvdmVyYWdlL2xjb3YtcmVwb3J0L2luZGV4Lmh0bWxcIlxuICB9LFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxrYWxlbi9xdWlja2RvbS5naXRcIlxuICB9LFxuICBcImF1dGhvclwiOiBcImRhbmllbGthbGVuXCIsXG4gIFwibGljZW5zZVwiOiBcIklTQ1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGthbGVuL3F1aWNrZG9tL2lzc3Vlc1wiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsa2FsZW4vcXVpY2tkb20jcmVhZG1lXCIsXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBkYW5pZWxrYWxlbi9pc1wiOiBcIl4yLjAuMFwiLFxuICAgIFwicXVpY2tjc3NcIjogXCJeMS4zLjRcIixcbiAgICBcInNtYXJ0LWV4dGVuZFwiOiBcIl4xLjcuM1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImJsdWViaXJkXCI6IFwiXjMuNS4wXCIsXG4gICAgXCJjaGFsa1wiOiBcIl4yLjAuMVwiLFxuICAgIFwiY29mZmVlLXNjcmlwdFwiOiBcIl4xLjEyLjZcIixcbiAgICBcImV4ZWNhXCI6IFwiXjAuNy4wXCIsXG4gICAgXCJmcy1qZXRwYWNrXCI6IFwiXjAuMTMuM1wiLFxuICAgIFwicHJvbWlzZS1icmVha1wiOiBcIl4wLjEuMlwiLFxuICAgIFwic2VtdmVyXCI6IFwiXjUuMy4wXCJcbiAgfVxufVxuIiwib3JpZ0Rlc2NyaXB0b3JzID0gXG5cdCdpbm5lcldpZHRoJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdpbm5lcldpZHRoJylcblx0J2lubmVySGVpZ2h0JzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdpbm5lckhlaWdodCcpXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3ICgpLT5cblx0b3ZlcndyaXR0ZW4gPSBmYWxzZVxuXHRjdXJyZW50ID0gd2lkdGg6d2luZG93LmlubmVyV2lkdGgsIGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHRcblx0XG5cdGdldFJlYWwgPSAoZGltZW5zaW9uKS0+XG5cdFx0ZGltZW5zaW9uID0gJ2lubmVyJytkaW1lbnNpb24ucmVwbGFjZSAvXFxiLi8sIChsZXR0ZXIpLT4gbGV0dGVyLnRvVXBwZXJDYXNlKClcblx0XHRvcmlnRGVzY3JpcHRvcnNbZGltZW5zaW9uXS5nZXQuY2FsbCh3aW5kb3cpXG5cblx0b3ZlcndyaXRlID0gKCktPiB1bmxlc3Mgb3ZlcndyaXR0ZW5cblx0XHRvdmVyd3JpdHRlbiA9IHRydWVcblx0XHRcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkgd2luZG93LCAnaW5uZXJXaWR0aCcsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdGdldDogKCktPiBjdXJyZW50LndpZHRoXG5cdFx0XHRzZXQ6IChuZXdWYWx1ZSktPiBjdXJyZW50LndpZHRoID0gbmV3VmFsdWVcblx0XHRcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkgd2luZG93LCAnaW5uZXJIZWlnaHQnLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRnZXQ6ICgpLT4gY3VycmVudC5oZWlnaHRcblx0XHRcdHNldDogKG5ld1ZhbHVlKS0+IGN1cnJlbnQuaGVpZ2h0ID0gbmV3VmFsdWVcblx0XG5cblx0QHNpbXVsYXRlID0gKHdpZHRoLCBoZWlnaHQpLT5cblx0XHRjdXJyZW50LndpZHRoID0gd2lkdGggaWYgd2lkdGhcblx0XHRjdXJyZW50LmhlaWdodCA9IGhlaWdodCBpZiBoZWlnaHRcblx0XHRcblx0XHRvdmVyd3JpdGUoKVxuXHRcdGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jylcblx0XHRldmVudC5pbml0RXZlbnQoJ3Jlc2l6ZScsIHRydWUsIGZhbHNlKVxuXHRcdHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuXG5cblx0QHJlc3RvcmUgPSAoKS0+XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5IHdpbmRvdywgJ2lubmVyV2lkdGgnLCBvcmlnRGVzY3JpcHRvcnMuaW5uZXJXaWR0aFxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB3aW5kb3csICdpbm5lckhlaWdodCcsIG9yaWdEZXNjcmlwdG9ycy5pbm5lckhlaWdodFxuXG5cblx0cmV0dXJuIEAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2NoYWknKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gY2hhaVN0eWxlXG5cbmZ1bmN0aW9uIGNoYWlTdHlsZShjaGFpLCB1dGlscykge1xuICBjb25zdCB7QXNzZXJ0aW9ufSA9IGNoYWlcbiAgY29uc3Qge2ZsYWd9ID0gdXRpbHNcbiAgbGV0IHNhbXBsZURpdiwgc2FtcGxlU3R5bGUsIHNhbXBsZUlmcmFtZVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3N0eWxlJywgZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlID0gJycpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKClcblxuICAgIGNvbnN0IGlzTm9uQ29sb3JzID0gc3R5bGVbcHJvcGVydHldID09PSAncmdiYSgwLCAwLCAwLCAwKScgLy8gd2Via2l0XG4gICAgICB8fCBzdHlsZVtwcm9wZXJ0eV0gPT09ICd0cmFuc3BhcmVudCcgLy8gZmlyZWZveFxuXG4gICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGlzTm9uQ29sb3JzXG4gICAgICA/ICcnXG4gICAgICA6IHN0eWxlW3Byb3BlcnR5XVxuXG4gICAgY29uc3QgYXNzZXJ0aW9uID0gdmFsdWVcbiAgICAgID8gY29tcGFyZUNTU1ZhbHVlKHByb3BlcnR5VmFsdWUsIHZhbHVlKVxuICAgICAgOiBCb29sZWFuKHByb3BlcnR5VmFsdWUpXG5cbiAgICBjb25zdCBlbGVtZW50VGFnID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGNvbnN0IHRocm93TWVzc2FnZSA9IGBleHBlY3QgJHtlbGVtZW50VGFnfSB0byBoYXZlIHske3Byb3BlcnR5fTogJHt2YWx1ZX19LCBpcyByZWNlaXZpbmcgeyR7cHJvcGVydHl9OiAke3Byb3BlcnR5VmFsdWV9fWBcbiAgICBjb25zdCB0aHJvd01lc3NhZ2VOZWdhdGl2ZSA9IGBleHBlY3QgJHtlbGVtZW50VGFnfSB0byBub3QgaGF2ZSB7JHtwcm9wZXJ0eX06ICR7dmFsdWV9fSwgaXMgcmVjZWl2aW5nIHske3Byb3BlcnR5fTogJHtwcm9wZXJ0eVZhbHVlfX1gXG5cbiAgICB0aGlzLmFzc2VydChhc3NlcnRpb24sIHRocm93TWVzc2FnZSwgdGhyb3dNZXNzYWdlTmVnYXRpdmUsIHZhbHVlKVxuXG4gICAgZnVuY3Rpb24gY29tcGFyZUNTU1ZhbHVlKGNvbXB1dGVkLCBleHBlY3RlZCkge1xuICAgICAgY29uc3QgcHJvcGVydHlIaWZlbkNhc2UgPSBwcm9wZXJ0eS5yZXBsYWNlKC9bQS1aXS9nLCAobWF0Y2gpID0+ICctJyArIG1hdGNoLnRvTG93ZXJDYXNlKCkpXG4gICAgICBpZiAoIXNhbXBsZURpdikge1xuICAgICAgICBzYW1wbGVJZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKVxuICAgICAgICBzYW1wbGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICBzYW1wbGVTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNhbXBsZURpdilcblxuICAgICAgICBzYW1wbGVJZnJhbWUuYXBwZW5kQ2hpbGQoc2FtcGxlRGl2KVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNhbXBsZUlmcmFtZSlcbiAgICAgIH1cbiAgICAgIHNhbXBsZURpdi5zdHlsZS5mb250U2l6ZSA9IHN0eWxlLmZvbnRTaXplXG4gICAgICBzYW1wbGVEaXYuc3R5bGUuc2V0UHJvcGVydHkocHJvcGVydHlIaWZlbkNhc2UsIGV4cGVjdGVkLCAnaW1wb3J0YW50JylcbiAgICAgIGNvbnN0IHZhbHVlID0gc2FtcGxlU3R5bGVbcHJvcGVydHldXG5cbiAgICAgIGNvbnN0IGhhc0F1dG9WYWx1ZSA9IHZhbHVlLmluY2x1ZGVzKCdhdXRvJylcbiAgICAgIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXhwKHZhbHVlKS5yZXBsYWNlKC9hdXRvL2csICcoXFxcXGQrKC5cXFxcZCspP3B4fGF1dG8pJykpXG4gICAgICBzYW1wbGVEaXYuc3R5bGUuZm9udFNpemUgPSBudWxsXG4gICAgICBzYW1wbGVEaXYuc3R5bGVbcHJvcGVydHlIaWZlbkNhc2VdID0gbnVsbFxuXG4gICAgICByZXR1cm4gaGFzQXV0b1ZhbHVlXG4gICAgICAgID8gcmVnLnRlc3QoY29tcHV0ZWQpXG4gICAgICAgIDogY29tcHV0ZWQgPT09IHZhbHVlXG4gICAgfVxuICB9KVxufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmVuamFtaW5nci9SZWdFeHAuZXNjYXBlL2Jsb2IvbWFzdGVyL3BvbHlmaWxsLmpzXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC9bXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpXG59XG4iLCIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgdXNlZCA9IFtdO1xuXG4vKiFcbiAqIENoYWkgdmVyc2lvblxuICovXG5cbmV4cG9ydHMudmVyc2lvbiA9ICc0LjEuMic7XG5cbi8qIVxuICogQXNzZXJ0aW9uIEVycm9yXG4gKi9cblxuZXhwb3J0cy5Bc3NlcnRpb25FcnJvciA9IHJlcXVpcmUoJ2Fzc2VydGlvbi1lcnJvcicpO1xuXG4vKiFcbiAqIFV0aWxzIGZvciBwbHVnaW5zIChub3QgZXhwb3J0ZWQpXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL2NoYWkvdXRpbHMnKTtcblxuLyoqXG4gKiAjIC51c2UoZnVuY3Rpb24pXG4gKlxuICogUHJvdmlkZXMgYSB3YXkgdG8gZXh0ZW5kIHRoZSBpbnRlcm5hbHMgb2YgQ2hhaS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICogQHJldHVybnMge3RoaXN9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnVzZSA9IGZ1bmN0aW9uIChmbikge1xuICBpZiAoIX51c2VkLmluZGV4T2YoZm4pKSB7XG4gICAgZm4oZXhwb3J0cywgdXRpbCk7XG4gICAgdXNlZC5wdXNoKGZuKTtcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzO1xufTtcblxuLyohXG4gKiBVdGlsaXR5IEZ1bmN0aW9uc1xuICovXG5cbmV4cG9ydHMudXRpbCA9IHV0aWw7XG5cbi8qIVxuICogQ29uZmlndXJhdGlvblxuICovXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NoYWkvY29uZmlnJyk7XG5leHBvcnRzLmNvbmZpZyA9IGNvbmZpZztcblxuLyohXG4gKiBQcmltYXJ5IGBBc3NlcnRpb25gIHByb3RvdHlwZVxuICovXG5cbnZhciBhc3NlcnRpb24gPSByZXF1aXJlKCcuL2NoYWkvYXNzZXJ0aW9uJyk7XG5leHBvcnRzLnVzZShhc3NlcnRpb24pO1xuXG4vKiFcbiAqIENvcmUgQXNzZXJ0aW9uc1xuICovXG5cbnZhciBjb3JlID0gcmVxdWlyZSgnLi9jaGFpL2NvcmUvYXNzZXJ0aW9ucycpO1xuZXhwb3J0cy51c2UoY29yZSk7XG5cbi8qIVxuICogRXhwZWN0IGludGVyZmFjZVxuICovXG5cbnZhciBleHBlY3QgPSByZXF1aXJlKCcuL2NoYWkvaW50ZXJmYWNlL2V4cGVjdCcpO1xuZXhwb3J0cy51c2UoZXhwZWN0KTtcblxuLyohXG4gKiBTaG91bGQgaW50ZXJmYWNlXG4gKi9cblxudmFyIHNob3VsZCA9IHJlcXVpcmUoJy4vY2hhaS9pbnRlcmZhY2Uvc2hvdWxkJyk7XG5leHBvcnRzLnVzZShzaG91bGQpO1xuXG4vKiFcbiAqIEFzc2VydCBpbnRlcmZhY2VcbiAqL1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnLi9jaGFpL2ludGVyZmFjZS9hc3NlcnQnKTtcbmV4cG9ydHMudXNlKGFzc2VydCk7XG4iLCIvKiFcbiAqIGFzc2VydGlvbi1lcnJvclxuICogQ29weXJpZ2h0KGMpIDIwMTMgSmFrZSBMdWVyIDxqYWtlQHF1YWxpYW5jeS5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKiFcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogb25lIG9iamVjdCB0byBhbm90aGVyIGV4Y2x1ZGluZyBhbnkgb3JpZ2luYWxseVxuICogbGlzdGVkLiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBge31gLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBleGNsdWRlZCBwcm9wZXJ0aWVzIC4uLlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cblxuZnVuY3Rpb24gZXhjbHVkZSAoKSB7XG4gIHZhciBleGNsdWRlcyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICBmdW5jdGlvbiBleGNsdWRlUHJvcHMgKHJlcywgb2JqKSB7XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmICghfmV4Y2x1ZGVzLmluZGV4T2Yoa2V5KSkgcmVzW2tleV0gPSBvYmpba2V5XTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBleHRlbmRFeGNsdWRlICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICAgLCBpID0gMFxuICAgICAgLCByZXMgPSB7fTtcblxuICAgIGZvciAoOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhjbHVkZVByb3BzKHJlcywgYXJnc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbn07XG5cbi8qIVxuICogUHJpbWFyeSBFeHBvcnRzXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBBc3NlcnRpb25FcnJvcjtcblxuLyoqXG4gKiAjIyMgQXNzZXJ0aW9uRXJyb3JcbiAqXG4gKiBBbiBleHRlbnNpb24gb2YgdGhlIEphdmFTY3JpcHQgYEVycm9yYCBjb25zdHJ1Y3RvciBmb3JcbiAqIGFzc2VydGlvbiBhbmQgdmFsaWRhdGlvbiBzY2VuYXJpb3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIHRvIGluY2x1ZGUgKG9wdGlvbmFsKVxuICogQHBhcmFtIHtjYWxsZWV9IHN0YXJ0IHN0YWNrIGZ1bmN0aW9uIChvcHRpb25hbClcbiAqL1xuXG5mdW5jdGlvbiBBc3NlcnRpb25FcnJvciAobWVzc2FnZSwgX3Byb3BzLCBzc2YpIHtcbiAgdmFyIGV4dGVuZCA9IGV4Y2x1ZGUoJ25hbWUnLCAnbWVzc2FnZScsICdzdGFjaycsICdjb25zdHJ1Y3RvcicsICd0b0pTT04nKVxuICAgICwgcHJvcHMgPSBleHRlbmQoX3Byb3BzIHx8IHt9KTtcblxuICAvLyBkZWZhdWx0IHZhbHVlc1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdVbnNwZWNpZmllZCBBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuc2hvd0RpZmYgPSBmYWxzZTtcblxuICAvLyBjb3B5IGZyb20gcHJvcGVydGllc1xuICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICB0aGlzW2tleV0gPSBwcm9wc1trZXldO1xuICB9XG5cbiAgLy8gY2FwdHVyZSBzdGFjayB0cmFjZVxuICBzc2YgPSBzc2YgfHwgYXJndW1lbnRzLmNhbGxlZTtcbiAgaWYgKHNzZiAmJiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHNzZik7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgdGhpcy5zdGFjayA9IGUuc3RhY2s7XG4gICAgfVxuICB9XG59XG5cbi8qIVxuICogSW5oZXJpdCBmcm9tIEVycm9yLnByb3RvdHlwZVxuICovXG5cbkFzc2VydGlvbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblxuLyohXG4gKiBTdGF0aWNhbGx5IHNldCBuYW1lXG4gKi9cblxuQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnQXNzZXJ0aW9uRXJyb3InO1xuXG4vKiFcbiAqIEVuc3VyZSBjb3JyZWN0IGNvbnN0cnVjdG9yXG4gKi9cblxuQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXNzZXJ0aW9uRXJyb3I7XG5cbi8qKlxuICogQWxsb3cgZXJyb3JzIHRvIGJlIGNvbnZlcnRlZCB0byBKU09OIGZvciBzdGF0aWMgdHJhbnNmZXIuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlIHN0YWNrIChkZWZhdWx0OiBgdHJ1ZWApXG4gKiBAcmV0dXJuIHtPYmplY3R9IG9iamVjdCB0aGF0IGNhbiBiZSBgSlNPTi5zdHJpbmdpZnlgXG4gKi9cblxuQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIChzdGFjaykge1xuICB2YXIgZXh0ZW5kID0gZXhjbHVkZSgnY29uc3RydWN0b3InLCAndG9KU09OJywgJ3N0YWNrJylcbiAgICAsIHByb3BzID0gZXh0ZW5kKHsgbmFtZTogdGhpcy5uYW1lIH0sIHRoaXMpO1xuXG4gIC8vIGluY2x1ZGUgc3RhY2sgaWYgZXhpc3RzIGFuZCBub3QgdHVybmVkIG9mZlxuICBpZiAoZmFsc2UgIT09IHN0YWNrICYmIHRoaXMuc3RhY2spIHtcbiAgICBwcm9wcy5zdGFjayA9IHRoaXMuc3RhY2s7XG4gIH1cblxuICByZXR1cm4gcHJvcHM7XG59O1xuIiwiLyohXG4gKiBjaGFpXG4gKiBDb3B5cmlnaHQoYykgMjAxMSBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qIVxuICogRGVwZW5kZW5jaWVzIHRoYXQgYXJlIHVzZWQgZm9yIG11bHRpcGxlIGV4cG9ydHMgYXJlIHJlcXVpcmVkIGhlcmUgb25seSBvbmNlXG4gKi9cblxudmFyIHBhdGh2YWwgPSByZXF1aXJlKCdwYXRodmFsJyk7XG5cbi8qIVxuICogdGVzdCB1dGlsaXR5XG4gKi9cblxuZXhwb3J0cy50ZXN0ID0gcmVxdWlyZSgnLi90ZXN0Jyk7XG5cbi8qIVxuICogdHlwZSB1dGlsaXR5XG4gKi9cblxuZXhwb3J0cy50eXBlID0gcmVxdWlyZSgndHlwZS1kZXRlY3QnKTtcblxuLyohXG4gKiBleHBlY3RUeXBlcyB1dGlsaXR5XG4gKi9cbmV4cG9ydHMuZXhwZWN0VHlwZXMgPSByZXF1aXJlKCcuL2V4cGVjdFR5cGVzJyk7XG5cbi8qIVxuICogbWVzc2FnZSB1dGlsaXR5XG4gKi9cblxuZXhwb3J0cy5nZXRNZXNzYWdlID0gcmVxdWlyZSgnLi9nZXRNZXNzYWdlJyk7XG5cbi8qIVxuICogYWN0dWFsIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLmdldEFjdHVhbCA9IHJlcXVpcmUoJy4vZ2V0QWN0dWFsJyk7XG5cbi8qIVxuICogSW5zcGVjdCB1dGlsXG4gKi9cblxuZXhwb3J0cy5pbnNwZWN0ID0gcmVxdWlyZSgnLi9pbnNwZWN0Jyk7XG5cbi8qIVxuICogT2JqZWN0IERpc3BsYXkgdXRpbFxuICovXG5cbmV4cG9ydHMub2JqRGlzcGxheSA9IHJlcXVpcmUoJy4vb2JqRGlzcGxheScpO1xuXG4vKiFcbiAqIEZsYWcgdXRpbGl0eVxuICovXG5cbmV4cG9ydHMuZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xuXG4vKiFcbiAqIEZsYWcgdHJhbnNmZXJyaW5nIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLnRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyohXG4gKiBEZWVwIGVxdWFsIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLmVxbCA9IHJlcXVpcmUoJ2RlZXAtZXFsJyk7XG5cbi8qIVxuICogRGVlcCBwYXRoIGluZm9cbiAqL1xuXG5leHBvcnRzLmdldFBhdGhJbmZvID0gcGF0aHZhbC5nZXRQYXRoSW5mbztcblxuLyohXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IGV4aXN0c1xuICovXG5cbmV4cG9ydHMuaGFzUHJvcGVydHkgPSBwYXRodmFsLmhhc1Byb3BlcnR5O1xuXG4vKiFcbiAqIEZ1bmN0aW9uIG5hbWVcbiAqL1xuXG5leHBvcnRzLmdldE5hbWUgPSByZXF1aXJlKCdnZXQtZnVuYy1uYW1lJyk7XG5cbi8qIVxuICogYWRkIFByb3BlcnR5XG4gKi9cblxuZXhwb3J0cy5hZGRQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vYWRkUHJvcGVydHknKTtcblxuLyohXG4gKiBhZGQgTWV0aG9kXG4gKi9cblxuZXhwb3J0cy5hZGRNZXRob2QgPSByZXF1aXJlKCcuL2FkZE1ldGhvZCcpO1xuXG4vKiFcbiAqIG92ZXJ3cml0ZSBQcm9wZXJ0eVxuICovXG5cbmV4cG9ydHMub3ZlcndyaXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL292ZXJ3cml0ZVByb3BlcnR5Jyk7XG5cbi8qIVxuICogb3ZlcndyaXRlIE1ldGhvZFxuICovXG5cbmV4cG9ydHMub3ZlcndyaXRlTWV0aG9kID0gcmVxdWlyZSgnLi9vdmVyd3JpdGVNZXRob2QnKTtcblxuLyohXG4gKiBBZGQgYSBjaGFpbmFibGUgbWV0aG9kXG4gKi9cblxuZXhwb3J0cy5hZGRDaGFpbmFibGVNZXRob2QgPSByZXF1aXJlKCcuL2FkZENoYWluYWJsZU1ldGhvZCcpO1xuXG4vKiFcbiAqIE92ZXJ3cml0ZSBjaGFpbmFibGUgbWV0aG9kXG4gKi9cblxuZXhwb3J0cy5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QgPSByZXF1aXJlKCcuL292ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCcpO1xuXG4vKiFcbiAqIENvbXBhcmUgYnkgaW5zcGVjdCBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmNvbXBhcmVCeUluc3BlY3QgPSByZXF1aXJlKCcuL2NvbXBhcmVCeUluc3BlY3QnKTtcblxuLyohXG4gKiBHZXQgb3duIGVudW1lcmFibGUgcHJvcGVydHkgc3ltYm9scyBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMgPSByZXF1aXJlKCcuL2dldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMnKTtcblxuLyohXG4gKiBHZXQgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi9nZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcycpO1xuXG4vKiFcbiAqIENoZWNrcyBlcnJvciBhZ2FpbnN0IGEgZ2l2ZW4gc2V0IG9mIGNyaXRlcmlhXG4gKi9cblxuZXhwb3J0cy5jaGVja0Vycm9yID0gcmVxdWlyZSgnY2hlY2stZXJyb3InKTtcblxuLyohXG4gKiBQcm94aWZ5IHV0aWxcbiAqL1xuXG5leHBvcnRzLnByb3hpZnkgPSByZXF1aXJlKCcuL3Byb3hpZnknKTtcblxuLyohXG4gKiBhZGRMZW5ndGhHdWFyZCB1dGlsXG4gKi9cblxuZXhwb3J0cy5hZGRMZW5ndGhHdWFyZCA9IHJlcXVpcmUoJy4vYWRkTGVuZ3RoR3VhcmQnKTtcblxuLyohXG4gKiBpc1Byb3h5RW5hYmxlZCBoZWxwZXJcbiAqL1xuXG5leHBvcnRzLmlzUHJveHlFbmFibGVkID0gcmVxdWlyZSgnLi9pc1Byb3h5RW5hYmxlZCcpO1xuXG4vKiFcbiAqIGlzTmFOIG1ldGhvZFxuICovXG5cbmV4cG9ydHMuaXNOYU4gPSByZXF1aXJlKCcuL2lzTmFOJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvKipcbiAgICogIyMjIGNvbmZpZy5pbmNsdWRlU3RhY2tcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBzdGFjayB0cmFjZVxuICAgKiBpcyBpbmNsdWRlZCBpbiBBc3NlcnRpb24gZXJyb3IgbWVzc2FnZS4gRGVmYXVsdCBvZiBmYWxzZVxuICAgKiBzdXBwcmVzc2VzIHN0YWNrIHRyYWNlIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgKlxuICAgKiAgICAgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrID0gdHJ1ZTsgIC8vIGVuYWJsZSBzdGFjayBvbiBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGluY2x1ZGVTdGFjazogZmFsc2UsXG5cbiAgLyoqXG4gICAqICMjIyBjb25maWcuc2hvd0RpZmZcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBvciBub3RcbiAgICogdGhlIGBzaG93RGlmZmAgZmxhZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93blxuICAgKiBBc3NlcnRpb25FcnJvcnMuIGBmYWxzZWAgd2lsbCBhbHdheXMgYmUgYGZhbHNlYDsgYHRydWVgXG4gICAqIHdpbGwgYmUgdHJ1ZSB3aGVuIHRoZSBhc3NlcnRpb24gaGFzIHJlcXVlc3RlZCBhIGRpZmZcbiAgICogYmUgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgc2hvd0RpZmY6IHRydWUsXG5cbiAgLyoqXG4gICAqICMjIyBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGRcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIHNldHMgbGVuZ3RoIHRocmVzaG9sZCBmb3IgYWN0dWFsIGFuZFxuICAgKiBleHBlY3RlZCB2YWx1ZXMgaW4gYXNzZXJ0aW9uIGVycm9ycy4gSWYgdGhpcyB0aHJlc2hvbGQgaXMgZXhjZWVkZWQsIGZvclxuICAgKiBleGFtcGxlIGZvciBsYXJnZSBkYXRhIHN0cnVjdHVyZXMsIHRoZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIHNvbWV0aGluZ1xuICAgKiBsaWtlIGBbIEFycmF5KDMpIF1gIG9yIGB7IE9iamVjdCAocHJvcDEsIHByb3AyKSB9YC5cbiAgICpcbiAgICogU2V0IGl0IHRvIHplcm8gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0cnVuY2F0aW5nIGFsdG9nZXRoZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VyZnVsIHdoZW4gZG9pbmcgYXNzZXJ0aW9ucyBvbiBhcnJheXM6IGhhdmluZyB0aGlzXG4gICAqIHNldCB0byBhIHJlYXNvbmFibGUgbGFyZ2UgdmFsdWUgbWFrZXMgdGhlIGZhaWx1cmUgbWVzc2FnZXMgcmVhZGlseVxuICAgKiBpbnNwZWN0YWJsZS5cbiAgICpcbiAgICogICAgIGNoYWkuY29uZmlnLnRydW5jYXRlVGhyZXNob2xkID0gMDsgIC8vIGRpc2FibGUgdHJ1bmNhdGluZ1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdHJ1bmNhdGVUaHJlc2hvbGQ6IDQwLFxuXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnVzZVByb3h5XG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBkZWZpbmVzIGlmIGNoYWkgd2lsbCB1c2UgYSBQcm94eSB0byB0aHJvd1xuICAgKiBhbiBlcnJvciB3aGVuIGEgbm9uLWV4aXN0ZW50IHByb3BlcnR5IGlzIHJlYWQsIHdoaWNoIHByb3RlY3RzIHVzZXJzXG4gICAqIGZyb20gdHlwb3Mgd2hlbiB1c2luZyBwcm9wZXJ0eS1iYXNlZCBhc3NlcnRpb25zLlxuICAgKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy51c2VQcm94eSA9IGZhbHNlOyAgLy8gZGlzYWJsZSB1c2Ugb2YgUHJveHlcbiAgICpcbiAgICogVGhpcyBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgcmVnYXJkbGVzcyBvZiB0aGlzIGNvbmZpZyB2YWx1ZVxuICAgKiBpbiBlbnZpcm9ubWVudHMgdGhhdCBkb24ndCBzdXBwb3J0IHByb3hpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdXNlUHJveHk6IHRydWUsXG5cbiAgLyoqXG4gICAqICMjIyBjb25maWcucHJveHlFeGNsdWRlZEtleXNcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZSBhc3NlcnRpb24uXG4gICAqIFRoaXMgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBlbnZpcm9ubWVudCBDaGFpIGlzIHJ1bm5pbmcgaW4gc3VwcG9ydHMgcHJveGllcyBhbmRcbiAgICogaWYgdGhlIGB1c2VQcm94eWAgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzIGVuYWJsZWQuXG4gICAqIEJ5IGRlZmF1bHQsIGB0aGVuYCBhbmQgYGluc3BlY3RgIHdpbGwgbm90IHRocm93IGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZVxuICAgKiBhc3NlcnRpb24gb2JqZWN0IGJlY2F1c2UgdGhlIGAuaW5zcGVjdGAgcHJvcGVydHkgaXMgcmVhZCBieSBgdXRpbC5pbnNwZWN0YCAoZm9yIGV4YW1wbGUsIHdoZW5cbiAgICogdXNpbmcgYGNvbnNvbGUubG9nYCBvbiB0aGUgYXNzZXJ0aW9uIG9iamVjdCkgYW5kIGAudGhlbmAgaXMgbmVjZXNzYXJ5IGZvciBwcm9taXNlIHR5cGUtY2hlY2tpbmcuXG4gICAqXG4gICAqICAgICAvLyBCeSBkZWZhdWx0IHRoZXNlIGtleXMgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlIGFzc2VydGlvbiBvYmplY3RcbiAgICogICAgIGNoYWkuY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzID0gWyd0aGVuJywgJ2luc3BlY3QnXTtcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgcHJveHlFeGNsdWRlZEtleXM6IFsndGhlbicsICdpbnNwZWN0JywgJ3RvSlNPTiddXG59O1xuIiwiLyohXG4gKiBjaGFpXG4gKiBodHRwOi8vY2hhaWpzLmNvbVxuICogQ29weXJpZ2h0KGMpIDIwMTEtMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfY2hhaSwgdXRpbCkge1xuICAvKiFcbiAgICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAgICovXG5cbiAgdmFyIEFzc2VydGlvbkVycm9yID0gX2NoYWkuQXNzZXJ0aW9uRXJyb3JcbiAgICAsIGZsYWcgPSB1dGlsLmZsYWc7XG5cbiAgLyohXG4gICAqIE1vZHVsZSBleHBvcnQuXG4gICAqL1xuXG4gIF9jaGFpLkFzc2VydGlvbiA9IEFzc2VydGlvbjtcblxuICAvKiFcbiAgICogQXNzZXJ0aW9uIENvbnN0cnVjdG9yXG4gICAqXG4gICAqIENyZWF0ZXMgb2JqZWN0IGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogYEFzc2VydGlvbmAgb2JqZWN0cyBjb250YWluIG1ldGFkYXRhIGluIHRoZSBmb3JtIG9mIGZsYWdzLiBUaHJlZSBmbGFncyBjYW5cbiAgICogYmUgYXNzaWduZWQgZHVyaW5nIGluc3RhbnRpYXRpb24gYnkgcGFzc2luZyBhcmd1bWVudHMgdG8gdGhpcyBjb25zdHJ1Y3RvcjpcbiAgICpcbiAgICogLSBgb2JqZWN0YDogVGhpcyBmbGFnIGNvbnRhaW5zIHRoZSB0YXJnZXQgb2YgdGhlIGFzc2VydGlvbi4gRm9yIGV4YW1wbGUsIGluXG4gICAqICAgdGhlIGFzc2VydGlvbiBgZXhwZWN0KG51bUtpdHRlbnMpLnRvLmVxdWFsKDcpO2AsIHRoZSBgb2JqZWN0YCBmbGFnIHdpbGxcbiAgICogICBjb250YWluIGBudW1LaXR0ZW5zYCBzbyB0aGF0IHRoZSBgZXF1YWxgIGFzc2VydGlvbiBjYW4gcmVmZXJlbmNlIGl0IHdoZW5cbiAgICogICBuZWVkZWQuXG4gICAqXG4gICAqIC0gYG1lc3NhZ2VgOiBUaGlzIGZsYWcgY29udGFpbnMgYW4gb3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmVcbiAgICogICBwcmVwZW5kZWQgdG8gdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCdzIGdlbmVyYXRlZCBieSB0aGUgYXNzZXJ0aW9uIHdoZW4gaXRcbiAgICogICBmYWlscy5cbiAgICpcbiAgICogLSBgc3NmaWA6IFRoaXMgZmxhZyBzdGFuZHMgZm9yIFwic3RhcnQgc3RhY2sgZnVuY3Rpb24gaW5kaWNhdG9yXCIuIEl0XG4gICAqICAgY29udGFpbnMgYSBmdW5jdGlvbiByZWZlcmVuY2UgdGhhdCBzZXJ2ZXMgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvclxuICAgKiAgIHJlbW92aW5nIGZyYW1lcyBmcm9tIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgZXJyb3IgdGhhdCdzIGNyZWF0ZWQgYnkgdGhlXG4gICAqICAgYXNzZXJ0aW9uIHdoZW4gaXQgZmFpbHMuIFRoZSBnb2FsIGlzIHRvIHByb3ZpZGUgYSBjbGVhbmVyIHN0YWNrIHRyYWNlIHRvXG4gICAqICAgZW5kIHVzZXJzIGJ5IHJlbW92aW5nIENoYWkncyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdGUgdGhhdCBpdCBvbmx5IHdvcmtzXG4gICAqICAgaW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2VgLCBhbmQgb25seSB3aGVuXG4gICAqICAgYENoYWkuY29uZmlnLmluY2x1ZGVTdGFja2AgaGFzbid0IGJlZW4gc2V0IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIC0gYGxvY2tTc2ZpYDogVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBgc3NmaWAgZmxhZ1xuICAgKiAgIHNob3VsZCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWUsIGV2ZW4gYXMgYXNzZXJ0aW9ucyBhcmUgY2hhaW5lZCBvZmYgb2ZcbiAgICogICB0aGlzIG9iamVjdC4gVGhpcyBpcyB1c3VhbGx5IHNldCB0byBgdHJ1ZWAgd2hlbiBjcmVhdGluZyBhIG5ldyBhc3NlcnRpb25cbiAgICogICBmcm9tIHdpdGhpbiBhbm90aGVyIGFzc2VydGlvbi4gSXQncyBhbHNvIHRlbXBvcmFyaWx5IHNldCB0byBgdHJ1ZWAgYmVmb3JlXG4gICAqICAgYW4gb3ZlcndyaXR0ZW4gYXNzZXJ0aW9uIGdldHMgY2FsbGVkIGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iaiB0YXJnZXQgb2YgdGhlIGFzc2VydGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIChvcHRpb25hbCkgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3NmaSAob3B0aW9uYWwpIHN0YXJ0aW5nIHBvaW50IGZvciByZW1vdmluZyBzdGFjayBmcmFtZXNcbiAgICogQHBhcmFtIHtCb29sZWFufSBsb2NrU3NmaSAob3B0aW9uYWwpIHdoZXRoZXIgb3Igbm90IHRoZSBzc2ZpIGZsYWcgaXMgbG9ja2VkXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBmdW5jdGlvbiBBc3NlcnRpb24gKG9iaiwgbXNnLCBzc2ZpLCBsb2NrU3NmaSkge1xuICAgIGZsYWcodGhpcywgJ3NzZmknLCBzc2ZpIHx8IEFzc2VydGlvbik7XG4gICAgZmxhZyh0aGlzLCAnbG9ja1NzZmknLCBsb2NrU3NmaSk7XG4gICAgZmxhZyh0aGlzLCAnb2JqZWN0Jywgb2JqKTtcbiAgICBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcblxuICAgIHJldHVybiB1dGlsLnByb3hpZnkodGhpcyk7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXNzZXJ0aW9uLCAnaW5jbHVkZVN0YWNrJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fzc2VydGlvbi5pbmNsdWRlU3RhY2sgaXMgZGVwcmVjYXRlZCwgdXNlIGNoYWkuY29uZmlnLmluY2x1ZGVTdGFjayBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuIGNvbmZpZy5pbmNsdWRlU3RhY2s7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fzc2VydGlvbi5pbmNsdWRlU3RhY2sgaXMgZGVwcmVjYXRlZCwgdXNlIGNoYWkuY29uZmlnLmluY2x1ZGVTdGFjayBpbnN0ZWFkLicpO1xuICAgICAgY29uZmlnLmluY2x1ZGVTdGFjayA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFzc2VydGlvbiwgJ3Nob3dEaWZmJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiBjb25maWcuc2hvd0RpZmY7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC4nKTtcbiAgICAgIGNvbmZpZy5zaG93RGlmZiA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgdXRpbC5hZGRQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgICB1dGlsLmFkZE1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QgPSBmdW5jdGlvbiAobmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgICB1dGlsLmFkZENoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9O1xuXG4gIEFzc2VydGlvbi5vdmVyd3JpdGVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICAgIHV0aWwub3ZlcndyaXRlUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfTtcblxuICBBc3NlcnRpb24ub3ZlcndyaXRlTWV0aG9kID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgdXRpbC5vdmVyd3JpdGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfTtcblxuICBBc3NlcnRpb24ub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kID0gZnVuY3Rpb24gKG5hbWUsIGZuLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gICAgdXRpbC5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuLCBjaGFpbmluZ0JlaGF2aW9yKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5hc3NlcnQoZXhwcmVzc2lvbiwgbWVzc2FnZSwgbmVnYXRlTWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCwgc2hvd0RpZmYpXG4gICAqXG4gICAqIEV4ZWN1dGVzIGFuIGV4cHJlc3Npb24gYW5kIGNoZWNrIGV4cGVjdGF0aW9ucy4gVGhyb3dzIEFzc2VydGlvbkVycm9yIGZvciByZXBvcnRpbmcgaWYgdGVzdCBkb2Vzbid0IHBhc3MuXG4gICAqXG4gICAqIEBuYW1lIGFzc2VydFxuICAgKiBAcGFyYW0ge1BoaWxvc29waGljYWx9IGV4cHJlc3Npb24gdG8gYmUgdGVzdGVkXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBtZXNzYWdlIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZXhwcmVzc2lvbiBmYWlsc1xuICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbmVnYXRlZE1lc3NhZ2Ugb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIG5lZ2F0ZWRNZXNzYWdlIHRvIGRpc3BsYXkgaWYgbmVnYXRlZCBleHByZXNzaW9uIGZhaWxzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkIHZhbHVlIChyZW1lbWJlciB0byBjaGVjayBmb3IgbmVnYXRpb24pXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbCAob3B0aW9uYWwpIHdpbGwgZGVmYXVsdCB0byBgdGhpcy5vYmpgXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hvd0RpZmYgKG9wdGlvbmFsKSB3aGVuIHNldCB0byBgdHJ1ZWAsIGFzc2VydCB3aWxsIGRpc3BsYXkgYSBkaWZmIGluIGFkZGl0aW9uIHRvIHRoZSBtZXNzYWdlIGlmIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIEFzc2VydGlvbi5wcm90b3R5cGUuYXNzZXJ0ID0gZnVuY3Rpb24gKGV4cHIsIG1zZywgbmVnYXRlTXNnLCBleHBlY3RlZCwgX2FjdHVhbCwgc2hvd0RpZmYpIHtcbiAgICB2YXIgb2sgPSB1dGlsLnRlc3QodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoZmFsc2UgIT09IHNob3dEaWZmKSBzaG93RGlmZiA9IHRydWU7XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gZXhwZWN0ZWQgJiYgdW5kZWZpbmVkID09PSBfYWN0dWFsKSBzaG93RGlmZiA9IGZhbHNlO1xuICAgIGlmICh0cnVlICE9PSBjb25maWcuc2hvd0RpZmYpIHNob3dEaWZmID0gZmFsc2U7XG5cbiAgICBpZiAoIW9rKSB7XG4gICAgICBtc2cgPSB1dGlsLmdldE1lc3NhZ2UodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHZhciBhY3R1YWwgPSB1dGlsLmdldEFjdHVhbCh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZywge1xuICAgICAgICAgIGFjdHVhbDogYWN0dWFsXG4gICAgICAgICwgZXhwZWN0ZWQ6IGV4cGVjdGVkXG4gICAgICAgICwgc2hvd0RpZmY6IHNob3dEaWZmXG4gICAgICB9LCAoY29uZmlnLmluY2x1ZGVTdGFjaykgPyB0aGlzLmFzc2VydCA6IGZsYWcodGhpcywgJ3NzZmknKSk7XG4gICAgfVxuICB9O1xuXG4gIC8qIVxuICAgKiAjIyMgLl9vYmpcbiAgICpcbiAgICogUXVpY2sgcmVmZXJlbmNlIHRvIHN0b3JlZCBgYWN0dWFsYCB2YWx1ZSBmb3IgcGx1Z2luIGRldmVsb3BlcnMuXG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ19vYmonLFxuICAgIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbGFnKHRoaXMsICdvYmplY3QnKTtcbiAgICAgIH1cbiAgICAsIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnLCB2YWwpO1xuICAgICAgfVxuICB9KTtcbn07XG4iLCIvKiFcbiAqIGNoYWlcbiAqIGh0dHA6Ly9jaGFpanMuY29tXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2hhaSwgXykge1xuICB2YXIgQXNzZXJ0aW9uID0gY2hhaS5Bc3NlcnRpb25cbiAgICAsIEFzc2VydGlvbkVycm9yID0gY2hhaS5Bc3NlcnRpb25FcnJvclxuICAgICwgZmxhZyA9IF8uZmxhZztcblxuICAvKipcbiAgICogIyMjIExhbmd1YWdlIENoYWluc1xuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGFyZSBwcm92aWRlZCBhcyBjaGFpbmFibGUgZ2V0dGVycyB0byBpbXByb3ZlIHRoZSByZWFkYWJpbGl0eVxuICAgKiBvZiB5b3VyIGFzc2VydGlvbnMuXG4gICAqXG4gICAqICoqQ2hhaW5zKipcbiAgICpcbiAgICogLSB0b1xuICAgKiAtIGJlXG4gICAqIC0gYmVlblxuICAgKiAtIGlzXG4gICAqIC0gdGhhdFxuICAgKiAtIHdoaWNoXG4gICAqIC0gYW5kXG4gICAqIC0gaGFzXG4gICAqIC0gaGF2ZVxuICAgKiAtIHdpdGhcbiAgICogLSBhdFxuICAgKiAtIG9mXG4gICAqIC0gc2FtZVxuICAgKiAtIGJ1dFxuICAgKiAtIGRvZXNcbiAgICpcbiAgICogQG5hbWUgbGFuZ3VhZ2UgY2hhaW5zXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIFsgJ3RvJywgJ2JlJywgJ2JlZW4nXG4gICwgJ2lzJywgJ2FuZCcsICdoYXMnLCAnaGF2ZSdcbiAgLCAnd2l0aCcsICd0aGF0JywgJ3doaWNoJywgJ2F0J1xuICAsICdvZicsICdzYW1lJywgJ2J1dCcsICdkb2VzJyBdLmZvckVhY2goZnVuY3Rpb24gKGNoYWluKSB7XG4gICAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KGNoYWluKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAubm90XG4gICAqXG4gICAqIE5lZ2F0ZXMgYWxsIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHt9KS50by5ub3QudGhyb3coKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLm5vdC5oYXZlLnByb3BlcnR5KCdiJyk7XG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5iZS5hbignYXJyYXknKS50aGF0LmRvZXMubm90LmluY2x1ZGUoMyk7XG4gICAqXG4gICAqIEp1c3QgYmVjYXVzZSB5b3UgY2FuIG5lZ2F0ZSBhbnkgYXNzZXJ0aW9uIHdpdGggYC5ub3RgIGRvZXNuJ3QgbWVhbiB5b3VcbiAgICogc2hvdWxkLiBXaXRoIGdyZWF0IHBvd2VyIGNvbWVzIGdyZWF0IHJlc3BvbnNpYmlsaXR5LiBJdCdzIG9mdGVuIGJlc3QgdG9cbiAgICogYXNzZXJ0IHRoYXQgdGhlIG9uZSBleHBlY3RlZCBvdXRwdXQgd2FzIHByb2R1Y2VkLCByYXRoZXIgdGhhbiBhc3NlcnRpbmdcbiAgICogdGhhdCBvbmUgb2YgY291bnRsZXNzIHVuZXhwZWN0ZWQgb3V0cHV0cyB3YXNuJ3QgcHJvZHVjZWQuIFNlZSBpbmRpdmlkdWFsXG4gICAqIGFzc2VydGlvbnMgZm9yIHNwZWNpZmljIGd1aWRhbmNlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmVxdWFsKDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLm5vdC5lcXVhbCgxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEBuYW1lIG5vdFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ25vdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBmbGFnKHRoaXMsICduZWdhdGUnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcFxuICAgKlxuICAgKiBDYXVzZXMgYWxsIGAuZXF1YWxgLCBgLmluY2x1ZGVgLCBgLm1lbWJlcnNgLCBgLmtleXNgLCBhbmQgYC5wcm9wZXJ0eWBcbiAgICogYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gdXNlIGRlZXAgZXF1YWxpdHkgaW5zdGVhZCBvZiBzdHJpY3RcbiAgICogKGA9PT1gKSBlcXVhbGl0eS4gU2VlIHRoZSBgZGVlcC1lcWxgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcFxuICAgKiBlcXVhbGl0eSBhbGdvcml0aG06IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgZXF1YWxzIGB7YTogMX1gXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5kZWVwLmVxdWFsKHthOiAxfSk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuZXF1YWwoe2E6IDF9KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGluY2x1ZGVzIGB7YTogMX1gXG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLmRlZXAuaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KFt7YTogMX1dKS50by5ub3QuaW5jbHVkZSh7YTogMX0pO1xuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGluY2x1ZGVzIGB4OiB7YTogMX1gXG4gICAqICAgICBleHBlY3Qoe3g6IHthOiAxfX0pLnRvLmRlZXAuaW5jbHVkZSh7eDoge2E6IDF9fSk7XG4gICAqICAgICBleHBlY3Qoe3g6IHthOiAxfX0pLnRvLm5vdC5pbmNsdWRlKHt4OiB7YTogMX19KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGhhcyBtZW1iZXIgYHthOiAxfWBcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8uaGF2ZS5kZWVwLm1lbWJlcnMoW3thOiAxfV0pO1xuICAgKiAgICAgZXhwZWN0KFt7YTogMX1dKS50by5ub3QuaGF2ZS5tZW1iZXJzKFt7YTogMX1dKTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBzZXQgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBoYXMga2V5IGB7YTogMX1gXG4gICAqICAgICBleHBlY3QobmV3IFNldChbe2E6IDF9XSkpLnRvLmhhdmUuZGVlcC5rZXlzKFt7YTogMX1dKTtcbiAgICogICAgIGV4cGVjdChuZXcgU2V0KFt7YTogMX1dKSkudG8ubm90LmhhdmUua2V5cyhbe2E6IDF9XSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIHByb3BlcnR5IGB4OiB7YTogMX1gXG4gICAqICAgICBleHBlY3Qoe3g6IHthOiAxfX0pLnRvLmhhdmUuZGVlcC5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqICAgICBleHBlY3Qoe3g6IHthOiAxfX0pLnRvLm5vdC5oYXZlLnByb3BlcnR5KCd4Jywge2E6IDF9KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2RlZXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnZGVlcCcsIHRydWUpO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5uZXN0ZWRcbiAgICpcbiAgICogRW5hYmxlcyBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGluIGFsbCBgLnByb3BlcnR5YCBhbmQgYC5pbmNsdWRlYFxuICAgKiBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbi5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YToge2I6IFsneCcsICd5J119fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ2EuYlsxXScpO1xuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5uZXN0ZWQuaW5jbHVkZSh7J2EuYlsxXSc6ICd5J30pO1xuICAgKlxuICAgKiBJZiBgLmAgb3IgYFtdYCBhcmUgcGFydCBvZiBhbiBhY3R1YWwgcHJvcGVydHkgbmFtZSwgdGhleSBjYW4gYmUgZXNjYXBlZCBieVxuICAgKiBhZGRpbmcgdHdvIGJhY2tzbGFzaGVzIGJlZm9yZSB0aGVtLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHsnLmEnOiB7J1tiXSc6ICd4J319KS50by5oYXZlLm5lc3RlZC5wcm9wZXJ0eSgnXFxcXC5hLlxcXFxbYlxcXFxdJyk7XG4gICAqICAgICBleHBlY3QoeycuYSc6IHsnW2JdJzogJ3gnfX0pLnRvLm5lc3RlZC5pbmNsdWRlKHsnXFxcXC5hLlxcXFxbYlxcXFxdJzogJ3gnfSk7XG4gICAqXG4gICAqIGAubmVzdGVkYCBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBgLm93bmAuXG4gICAqXG4gICAqIEBuYW1lIG5lc3RlZFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ25lc3RlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBmbGFnKHRoaXMsICduZXN0ZWQnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAub3duXG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5wcm9wZXJ0eWAgYW5kIGAuaW5jbHVkZWAgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW5cbiAgICogdG8gaWdub3JlIGluaGVyaXRlZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAgICAgT2JqZWN0LnByb3RvdHlwZS5iID0gMjtcbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duLnByb3BlcnR5KCdhJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdiJykuYnV0Lm5vdC5vd24ucHJvcGVydHkoJ2InKTsgXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5vd24uaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZSh7YjogMn0pLmJ1dC5ub3Qub3duLmluY2x1ZGUoe2I6IDJ9KTtcbiAgICpcbiAgICogYC5vd25gIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGAubmVzdGVkYC5cbiAgICpcbiAgICogQG5hbWUgb3duXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnb3duJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ293bicsIHRydWUpO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5vcmRlcmVkXG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5tZW1iZXJzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byByZXF1aXJlIHRoYXRcbiAgICogbWVtYmVycyBiZSBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmhhdmUub3JkZXJlZC5tZW1iZXJzKFsxLCAyXSlcbiAgICogICAgICAgLmJ1dC5ub3QuaGF2ZS5vcmRlcmVkLm1lbWJlcnMoWzIsIDFdKTtcbiAgICpcbiAgICogV2hlbiBgLmluY2x1ZGVgIGFuZCBgLm9yZGVyZWRgIGFyZSBjb21iaW5lZCwgdGhlIG9yZGVyaW5nIGJlZ2lucyBhdCB0aGVcbiAgICogc3RhcnQgb2YgYm90aCBhcnJheXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhbMSwgMl0pXG4gICAqICAgICAgIC5idXQubm90LmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKFsyLCAzXSk7XG4gICAqXG4gICAqIEBuYW1lIG9yZGVyZWRcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdvcmRlcmVkJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ29yZGVyZWQnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuYW55XG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5rZXlzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byBvbmx5IHJlcXVpcmUgdGhhdFxuICAgKiB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlbiBrZXlzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZlxuICAgKiBgLmFsbGAsIHdoaWNoIHJlcXVpcmVzIHRoYXQgdGhlIHRhcmdldCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLm5vdC5oYXZlLmFueS5rZXlzKCdjJywgJ2QnKTtcbiAgICpcbiAgICogU2VlIHRoZSBgLmtleXNgIGRvYyBmb3IgZ3VpZGFuY2Ugb24gd2hlbiB0byB1c2UgYC5hbnlgIG9yIGAuYWxsYC5cbiAgICpcbiAgICogQG5hbWUgYW55XG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnYW55JywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ2FueScsIHRydWUpO1xuICAgIGZsYWcodGhpcywgJ2FsbCcsIGZhbHNlKTtcbiAgfSk7XG5cblxuICAvKipcbiAgICogIyMjIC5hbGxcbiAgICpcbiAgICogQ2F1c2VzIGFsbCBgLmtleXNgIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluIHRvIHJlcXVpcmUgdGhhdCB0aGVcbiAgICogdGFyZ2V0IGhhdmUgYWxsIG9mIHRoZSBnaXZlbiBrZXlzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiBgLmFueWAsIHdoaWNoXG4gICAqIG9ubHkgcmVxdWlyZXMgdGhhdCB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlbiBrZXlzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIE5vdGUgdGhhdCBgLmFsbGAgaXMgdXNlZCBieSBkZWZhdWx0IHdoZW4gbmVpdGhlciBgLmFsbGAgbm9yIGAuYW55YCBhcmVcbiAgICogYWRkZWQgZWFybGllciBpbiB0aGUgY2hhaW4uIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhZGQgYC5hbGxgIGFueXdheVxuICAgKiBiZWNhdXNlIGl0IGltcHJvdmVzIHJlYWRhYmlsaXR5LlxuICAgKlxuICAgKiBTZWUgdGhlIGAua2V5c2AgZG9jIGZvciBndWlkYW5jZSBvbiB3aGVuIHRvIHVzZSBgLmFueWAgb3IgYC5hbGxgLlxuICAgKlxuICAgKiBAbmFtZSBhbGxcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdhbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnYWxsJywgdHJ1ZSk7XG4gICAgZmxhZyh0aGlzLCAnYW55JywgZmFsc2UpO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5hKHR5cGVbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCdzIHR5cGUgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHN0cmluZyBgdHlwZWAuIFR5cGVzXG4gICAqIGFyZSBjYXNlIGluc2Vuc2l0aXZlLiBTZWUgdGhlIGB0eXBlLWRldGVjdGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZVxuICAgKiB0eXBlIGRldGVjdGlvbiBhbGdvcml0aG06IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvdHlwZS1kZXRlY3QuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmJlLmEoJ3N0cmluZycpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uYmUuYW4oJ29iamVjdCcpO1xuICAgKiAgICAgZXhwZWN0KG51bGwpLnRvLmJlLmEoJ251bGwnKTtcbiAgICogICAgIGV4cGVjdCh1bmRlZmluZWQpLnRvLmJlLmFuKCd1bmRlZmluZWQnKTtcbiAgICogICAgIGV4cGVjdChuZXcgRXJyb3IpLnRvLmJlLmFuKCdlcnJvcicpO1xuICAgKiAgICAgZXhwZWN0KFByb21pc2UucmVzb2x2ZSgpKS50by5iZS5hKCdwcm9taXNlJyk7XG4gICAqICAgICBleHBlY3QobmV3IEZsb2F0MzJBcnJheSkudG8uYmUuYSgnZmxvYXQzMmFycmF5Jyk7XG4gICAqICAgICBleHBlY3QoU3ltYm9sKCkpLnRvLmJlLmEoJ3N5bWJvbCcpO1xuICAgKlxuICAgKiBgLmFgIHN1cHBvcnRzIG9iamVjdHMgdGhhdCBoYXZlIGEgY3VzdG9tIHR5cGUgc2V0IHZpYSBgU3ltYm9sLnRvU3RyaW5nVGFnYC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHtcbiAgICogICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdteUN1c3RvbVR5cGUnXG4gICAqICAgICB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG15T2JqKS50by5iZS5hKCdteUN1c3RvbVR5cGUnKS5idXQubm90LmFuKCdvYmplY3QnKTtcbiAgICpcbiAgICogSXQncyBvZnRlbiBiZXN0IHRvIHVzZSBgLmFgIHRvIGNoZWNrIGEgdGFyZ2V0J3MgdHlwZSBiZWZvcmUgbWFraW5nIG1vcmVcbiAgICogYXNzZXJ0aW9ucyBvbiB0aGUgc2FtZSB0YXJnZXQuIFRoYXQgd2F5LCB5b3UgYXZvaWQgdW5leHBlY3RlZCBiZWhhdmlvciBmcm9tXG4gICAqIGFueSBhc3NlcnRpb24gdGhhdCBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIHRhcmdldCdzIHR5cGUuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5iZS5hbignYXJyYXknKS50aGF0LmluY2x1ZGVzKDIpO1xuICAgKiAgICAgZXhwZWN0KFtdKS50by5iZS5hbignYXJyYXknKS50aGF0LmlzLmVtcHR5O1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmFgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG9cbiAgICogYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyB0aGUgZXhwZWN0ZWQgdHlwZSwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXRcbiAgICogaXNuJ3Qgb25lIG9mIG1hbnkgdW5leHBlY3RlZCB0eXBlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uYmUuYSgnc3RyaW5nJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLm5vdC5iZS5hbignYXJyYXknKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuYWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvXG4gICAqIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kXG4gICAqIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmEoJ3N0cmluZycsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYSgnc3RyaW5nJyk7XG4gICAqXG4gICAqIGAuYWAgY2FuIGFsc28gYmUgdXNlZCBhcyBhIGxhbmd1YWdlIGNoYWluIHRvIGltcHJvdmUgdGhlIHJlYWRhYmlsaXR5IG9mXG4gICAqIHlvdXIgYXNzZXJ0aW9ucy4gXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5oYXZlLmEucHJvcGVydHkoJ2InKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuYWAuXG4gICAqXG4gICAqIEBuYW1lIGFcbiAgICogQGFsaWFzIGFuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhbiAodHlwZSwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgYXJ0aWNsZSA9IH5bICdhJywgJ2UnLCAnaScsICdvJywgJ3UnIF0uaW5kZXhPZih0eXBlLmNoYXJBdCgwKSkgPyAnYW4gJyA6ICdhICc7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdHlwZSA9PT0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSAnICsgYXJ0aWNsZSArIHR5cGVcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlICcgKyBhcnRpY2xlICsgdHlwZVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCdhbicsIGFuKTtcbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnYScsIGFuKTtcblxuICAvKipcbiAgICogIyMjIC5pbmNsdWRlKHZhbFssIG1zZ10pXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIHN0cmluZywgYC5pbmNsdWRlYCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHN0cmluZyBgdmFsYFxuICAgKiBpcyBhIHN1YnN0cmluZyBvZiB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5pbmNsdWRlKCdmb28nKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGFuIGFycmF5LCBgLmluY2x1ZGVgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYHZhbGAgaXMgYVxuICAgKiBtZW1iZXIgb2YgdGhlIHRhcmdldC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUoMik7XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhbiBvYmplY3QsIGAuaW5jbHVkZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3RcbiAgICogYHZhbGAncyBwcm9wZXJ0aWVzIGFyZSBhIHN1YnNldCBvZiB0aGUgdGFyZ2V0J3MgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMiwgYzogM30pLnRvLmluY2x1ZGUoe2E6IDEsIGI6IDJ9KTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgU2V0IG9yIFdlYWtTZXQsIGAuaW5jbHVkZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBgdmFsYCBpcyBhXG4gICAqIG1lbWJlciBvZiB0aGUgdGFyZ2V0LiBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobSBpcyB1c2VkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDJdKSkudG8uaW5jbHVkZSgyKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgTWFwLCBgLmluY2x1ZGVgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYHZhbGAgaXMgb25lIG9mXG4gICAqIHRoZSB2YWx1ZXMgb2YgdGhlIHRhcmdldC4gU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG0gaXMgdXNlZC5cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl1dKSkudG8uaW5jbHVkZSgyKTtcbiAgICpcbiAgICogQmVjYXVzZSBgLmluY2x1ZGVgIGRvZXMgZGlmZmVyZW50IHRoaW5ncyBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgdHlwZSwgaXQnc1xuICAgKiBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIHRhcmdldCdzIHR5cGUgYmVmb3JlIHVzaW5nIGAuaW5jbHVkZWAuIFNlZSB0aGUgYC5hYFxuICAgKiBkb2MgZm9yIGluZm8gb24gdGVzdGluZyBhIHRhcmdldCdzIHR5cGUuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5iZS5hbignYXJyYXknKS50aGF0LmluY2x1ZGVzKDIpO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzdHJpY3QgKGA9PT1gKSBlcXVhbGl0eSBpcyB1c2VkIHRvIGNvbXBhcmUgYXJyYXkgbWVtYmVycyBhbmRcbiAgICogb2JqZWN0IHByb3BlcnRpZXMuIEFkZCBgLmRlZXBgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5XG4gICAqIGluc3RlYWQgKFdlYWtTZXQgdGFyZ2V0cyBhcmUgbm90IHN1cHBvcnRlZCkuIFNlZSB0aGUgYGRlZXAtZXFsYCBwcm9qZWN0XG4gICAqIHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaW5jbHVkZXMgYHthOiAxfWBcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8uZGVlcC5pbmNsdWRlKHthOiAxfSk7XG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLm5vdC5pbmNsdWRlKHthOiAxfSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaW5jbHVkZXMgYHg6IHthOiAxfWBcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uZGVlcC5pbmNsdWRlKHt4OiB7YTogMX19KTtcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8ubm90LmluY2x1ZGUoe3g6IHthOiAxfX0pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHRhcmdldCdzIHByb3BlcnRpZXMgYXJlIHNlYXJjaGVkIHdoZW4gd29ya2luZyB3aXRoXG4gICAqIG9iamVjdHMuIFRoaXMgaW5jbHVkZXMgcHJvcGVydGllcyB0aGF0IGFyZSBpbmhlcml0ZWQgYW5kL29yIG5vbi1lbnVtZXJhYmxlLlxuICAgKiBBZGQgYC5vd25gIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGV4Y2x1ZGUgdGhlIHRhcmdldCdzIGluaGVyaXRlZFxuICAgKiBwcm9wZXJ0aWVzIGZyb20gdGhlIHNlYXJjaC5cbiAgICpcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5vd24uaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZSh7YjogMn0pLmJ1dC5ub3Qub3duLmluY2x1ZGUoe2I6IDJ9KTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGEgdGFyZ2V0IG9iamVjdCBpcyBhbHdheXMgb25seSBzZWFyY2hlZCBmb3IgYHZhbGAncyBvd25cbiAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBgLmRlZXBgIGFuZCBgLm93bmAgY2FuIGJlIGNvbWJpbmVkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogMn19KS50by5kZWVwLm93bi5pbmNsdWRlKHthOiB7YjogMn19KTtcbiAgICpcbiAgICogQWRkIGAubmVzdGVkYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBlbmFibGUgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiB3aGVuXG4gICAqIHJlZmVyZW5jaW5nIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5uZXN0ZWQuaW5jbHVkZSh7J2EuYlsxXSc6ICd5J30pO1xuICAgKlxuICAgKiBJZiBgLmAgb3IgYFtdYCBhcmUgcGFydCBvZiBhbiBhY3R1YWwgcHJvcGVydHkgbmFtZSwgdGhleSBjYW4gYmUgZXNjYXBlZCBieVxuICAgKiBhZGRpbmcgdHdvIGJhY2tzbGFzaGVzIGJlZm9yZSB0aGVtLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHsnLmEnOiB7J1tiXSc6IDJ9fSkudG8ubmVzdGVkLmluY2x1ZGUoeydcXFxcLmEuXFxcXFtiXFxcXF0nOiAyfSk7XG4gICAqXG4gICAqIGAuZGVlcGAgYW5kIGAubmVzdGVkYCBjYW4gYmUgY29tYmluZWQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IHtiOiBbe2M6IDN9XX19KS50by5kZWVwLm5lc3RlZC5pbmNsdWRlKHsnYS5iWzBdJzoge2M6IDN9fSk7XG4gICAqXG4gICAqIGAub3duYCBhbmQgYC5uZXN0ZWRgIGNhbm5vdCBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5pbmNsdWRlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8ubm90LmluY2x1ZGUoJ3RhY28nKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLm5vdC5pbmNsdWRlKDQpO1xuICAgKiBcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAuaW5jbHVkZWAgd2hlbiB0aGUgdGFyZ2V0IGlzIGFuIG9iamVjdC5cbiAgICogVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnMgYnkgYXNzZXJ0aW5nIHRoYXQgdGhlXG4gICAqIHRhcmdldCBvYmplY3QgZG9lc24ndCBoYXZlIGFsbCBvZiBgdmFsYCdzIGtleS92YWx1ZSBwYWlycyBidXQgbWF5IG9yIG1heVxuICAgKiBub3QgaGF2ZSBzb21lIG9mIHRoZW0uIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQnc1xuICAgKiBleHBlY3RlZCwgYW5kIHRoZW4gd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgb2JqZWN0IGlzbid0IGV2ZW4gZXhwZWN0ZWQgdG8gaGF2ZSBgdmFsYCdzIGtleXMsIGl0J3NcbiAgICogb2Z0ZW4gYmVzdCB0byBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHtjOiAzfSkudG8ubm90LmhhdmUuYW55LmtleXMoJ2EnLCAnYicpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHtjOiAzfSkudG8ubm90LmluY2x1ZGUoe2E6IDEsIGI6IDJ9KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBgdmFsYCdzIGtleXMsIGl0J3Mgb2Z0ZW4gYmVzdCB0b1xuICAgKiBhc3NlcnQgdGhhdCBlYWNoIG9mIHRoZSBwcm9wZXJ0aWVzIGhhcyBpdHMgZXhwZWN0ZWQgdmFsdWUsIHJhdGhlciB0aGFuXG4gICAqIGFzc2VydGluZyB0aGF0IGVhY2ggcHJvcGVydHkgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAzLCBiOiA0fSkudG8uaW5jbHVkZSh7YTogMywgYjogNH0pOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAzLCBiOiA0fSkudG8ubm90LmluY2x1ZGUoe2E6IDEsIGI6IDJ9KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuaW5jbHVkZWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaW5jbHVkZSg0LCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaW5jbHVkZSg0KTtcbiAgICpcbiAgICogYC5pbmNsdWRlYCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgbGFuZ3VhZ2UgY2hhaW4sIGNhdXNpbmcgYWxsIGAubWVtYmVyc2AgYW5kXG4gICAqIGAua2V5c2AgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gcmVxdWlyZSB0aGUgdGFyZ2V0IHRvIGJlIGFcbiAgICogc3VwZXJzZXQgb2YgdGhlIGV4cGVjdGVkIHNldCwgcmF0aGVyIHRoYW4gYW4gaWRlbnRpY2FsIHNldC4gTm90ZSB0aGF0XG4gICAqIGAubWVtYmVyc2AgaWdub3JlcyBkdXBsaWNhdGVzIGluIHRoZSBzdWJzZXQgd2hlbiBgLmluY2x1ZGVgIGlzIGFkZGVkLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCdzIGtleXMgYXJlIGEgc3VwZXJzZXQgb2YgWydhJywgJ2InXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyLCBjOiAzfSkudG8uaW5jbHVkZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDIsIGM6IDN9KS50by5ub3QuaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgaXMgYSBzdXBlcnNldCBvZiBbMSwgMl0gYnV0IG5vdCBpZGVudGljYWxcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUubWVtYmVycyhbMSwgMl0pO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8ubm90LmhhdmUubWVtYmVycyhbMSwgMl0pO1xuICAgKlxuICAgKiAgICAgLy8gRHVwbGljYXRlcyBpbiB0aGUgc3Vic2V0IGFyZSBpZ25vcmVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlLm1lbWJlcnMoWzEsIDIsIDIsIDJdKTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGFkZGluZyBgLmFueWAgZWFybGllciBpbiB0aGUgY2hhaW4gY2F1c2VzIHRoZSBgLmtleXNgIGFzc2VydGlvblxuICAgKiB0byBpZ25vcmUgYC5pbmNsdWRlYC5cbiAgICpcbiAgICogICAgIC8vIEJvdGggYXNzZXJ0aW9ucyBhcmUgaWRlbnRpY2FsXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5pbmNsdWRlLmFueS5rZXlzKCdhJywgJ2InKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUuYW55LmtleXMoJ2EnLCAnYicpO1xuICAgKlxuICAgKiBUaGUgYWxpYXNlcyBgLmluY2x1ZGVzYCwgYC5jb250YWluYCwgYW5kIGAuY29udGFpbnNgIGNhbiBiZSB1c2VkXG4gICAqIGludGVyY2hhbmdlYWJseSB3aXRoIGAuaW5jbHVkZWAuXG4gICAqXG4gICAqIEBuYW1lIGluY2x1ZGVcbiAgICogQGFsaWFzIGNvbnRhaW5cbiAgICogQGFsaWFzIGluY2x1ZGVzXG4gICAqIEBhbGlhcyBjb250YWluc1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oYSwgYikge1xuICAgIHJldHVybiAoXy5pc05hTihhKSAmJiBfLmlzTmFOKGIpKSB8fCBhID09PSBiO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IgKCkge1xuICAgIGZsYWcodGhpcywgJ2NvbnRhaW5zJywgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbmNsdWRlICh2YWwsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIFxuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBvYmpUeXBlID0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG5lZ2F0ZSA9IGZsYWcodGhpcywgJ25lZ2F0ZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgaXNEZWVwID0gZmxhZyh0aGlzLCAnZGVlcCcpXG4gICAgICAsIGRlc2NyaXB0b3IgPSBpc0RlZXAgPyAnZGVlcCAnIDogJyc7XG5cbiAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG5cbiAgICB2YXIgaW5jbHVkZWQgPSBmYWxzZTtcblxuICAgIHN3aXRjaCAob2JqVHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaW5kZXhPZih2YWwpICE9PSAtMTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3dlYWtzZXQnOlxuICAgICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgICAgZmxhZ01zZyArICd1bmFibGUgdG8gdXNlIC5kZWVwLmluY2x1ZGUgd2l0aCBXZWFrU2V0JyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzZmlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaGFzKHZhbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICB2YXIgaXNFcWwgPSBpc0RlZXAgPyBfLmVxbCA6IFNhbWVWYWx1ZVplcm87XG4gICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBpc0VxbChpdGVtLCB2YWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBfLmVxbChpdGVtLCB2YWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluY2x1ZGVkID0gb2JqLmhhcyh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IG9iai5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gXy5lcWwoaXRlbSwgdmFsKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRoaXMgYmxvY2sgaXMgZm9yIGFzc2VydGluZyBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdC5cbiAgICAgICAgLy8gYF8uZXhwZWN0VHlwZXNgIGlzbid0IHVzZWQgaGVyZSBiZWNhdXNlIGAuaW5jbHVkZWAgc2hvdWxkIHdvcmsgd2l0aFxuICAgICAgICAvLyBvYmplY3RzIHdpdGggYSBjdXN0b20gYEBAdG9TdHJpbmdUYWdgLlxuICAgICAgICBpZiAodmFsICE9PSBPYmplY3QodmFsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICAgIGZsYWdNc2cgKyAnb2JqZWN0IHRlc3RlZCBtdXN0IGJlIGFuIGFycmF5LCBhIG1hcCwgYW4gb2JqZWN0LCdcbiAgICAgICAgICAgICAgKyAnIGEgc2V0LCBhIHN0cmluZywgb3IgYSB3ZWFrc2V0LCBidXQgJyArIG9ialR5cGUgKyAnIGdpdmVuJyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzZmlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb3BzID0gT2JqZWN0LmtleXModmFsKVxuICAgICAgICAgICwgZmlyc3RFcnIgPSBudWxsXG4gICAgICAgICAgLCBudW1FcnJzID0gMDtcbiAgXG4gICAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICB2YXIgcHJvcEFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24ob2JqKTtcbiAgICAgICAgICBfLnRyYW5zZmVyRmxhZ3ModGhpcywgcHJvcEFzc2VydGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgZmxhZyhwcm9wQXNzZXJ0aW9uLCAnbG9ja1NzZmknLCB0cnVlKTtcbiAgXG4gICAgICAgICAgaWYgKCFuZWdhdGUgfHwgcHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBwcm9wQXNzZXJ0aW9uLnByb3BlcnR5KHByb3AsIHZhbFtwcm9wXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICBcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFfLmNoZWNrRXJyb3IuY29tcGF0aWJsZUNvbnN0cnVjdG9yKGVyciwgQXNzZXJ0aW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdEVyciA9PT0gbnVsbCkgZmlyc3RFcnIgPSBlcnI7XG4gICAgICAgICAgICBudW1FcnJzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcbiAgXG4gICAgICAgIC8vIFdoZW4gdmFsaWRhdGluZyAubm90LmluY2x1ZGUgd2l0aCBtdWx0aXBsZSBwcm9wZXJ0aWVzLCB3ZSBvbmx5IHdhbnRcbiAgICAgICAgLy8gdG8gdGhyb3cgYW4gYXNzZXJ0aW9uIGVycm9yIGlmIGFsbCBvZiB0aGUgcHJvcGVydGllcyBhcmUgaW5jbHVkZWQsXG4gICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UgdGhyb3cgdGhlIGZpcnN0IHByb3BlcnR5IGFzc2VydGlvbiBlcnJvciB0aGF0IHdlXG4gICAgICAgIC8vIGVuY291bnRlcmVkLlxuICAgICAgICBpZiAobmVnYXRlICYmIHByb3BzLmxlbmd0aCA+IDEgJiYgbnVtRXJycyA9PT0gcHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RFcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFzc2VydCBpbmNsdXNpb24gaW4gY29sbGVjdGlvbiBvciBzdWJzdHJpbmcgaW4gYSBzdHJpbmcuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpbmNsdWRlZFxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byAnICsgZGVzY3JpcHRvciArICdpbmNsdWRlICcgKyBfLmluc3BlY3QodmFsKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgJyArIGRlc2NyaXB0b3IgKyAnaW5jbHVkZSAnICsgXy5pbnNwZWN0KHZhbCkpO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnaW5jbHVkZScsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnY29udGFpbicsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnY29udGFpbnMnLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2luY2x1ZGVzJywgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuXG4gIC8qKlxuICAgKiAjIyMgLm9rXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGxvb3NlbHkgKGA9PWApIGVxdWFsIHRvIGB0cnVlYC4gSG93ZXZlciwgaXQnc1xuICAgKiBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBvciBkZWVwbHkgZXF1YWwgdG9cbiAgICogaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlKS50by5iZS50cnVlOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHRydWUpLnRvLmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5va2AuXG4gICAqXG4gICAqICAgICBleHBlY3QoMCkudG8uZXF1YWwoMCk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMCkudG8ubm90LmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSkudG8uYmUuZmFsc2U7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoZmFsc2UpLnRvLm5vdC5iZS5vazsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QobnVsbCkudG8uYmUubnVsbDsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChudWxsKS50by5ub3QuYmUub2s7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8uYmUudW5kZWZpbmVkOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8ubm90LmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLm9rO1xuICAgKlxuICAgKiBAbmFtZSBva1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ29rJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB0cnV0aHknXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5Jyk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLnRydWVcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QodHJ1ZSkudG8uYmUudHJ1ZTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC50cnVlYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhbiBub3RcbiAgICogZXF1YWwgdG8gYHRydWVgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZhbHNlKS50by5iZS5mYWxzZTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChmYWxzZSkudG8ubm90LmJlLnRydWU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5iZS50cnVlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLnRydWU7XG4gICAqXG4gICAqIEBuYW1lIHRydWVcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCd0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICB0cnVlID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB0cnVlJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzZSdcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyBmYWxzZSA6IHRydWVcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5mYWxzZVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBzdHJpY3RseSAoYD09PWApIGVxdWFsIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoZmFsc2UpLnRvLmJlLmZhbHNlO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmZhbHNlYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlKS50by5iZS50cnVlOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHRydWUpLnRvLm5vdC5iZS5mYWxzZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLmZhbHNlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZmFsc2U7XG4gICAqXG4gICAqIEBuYW1lIGZhbHNlXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGZhbHNlID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzZSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZSdcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyB0cnVlIDogZmFsc2VcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5udWxsXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0cmljdGx5IChgPT09YCkgZXF1YWwgdG8gYG51bGxgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG51bGwpLnRvLmJlLm51bGw7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubnVsbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyIHRoYW4gbm90XG4gICAqIGVxdWFsIHRvIGBudWxsYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUubnVsbDsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5udWxsO1xuICAgKlxuICAgKiBAbmFtZSBudWxsXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbnVsbCA9PT0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgbnVsbCdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIG51bGwnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAudW5kZWZpbmVkXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0cmljdGx5IChgPT09YCkgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICBleHBlY3QodW5kZWZpbmVkKS50by5iZS51bmRlZmluZWQ7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAudW5kZWZpbmVkYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLnVuZGVmaW5lZDsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS51bmRlZmluZWQ7XG4gICAqXG4gICAqIEBuYW1lIHVuZGVmaW5lZFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ3VuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdW5kZWZpbmVkID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWQnXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSB1bmRlZmluZWQnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuTmFOXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGV4YWN0bHkgYE5hTmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoTmFOKS50by5iZS5OYU47XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuTmFOYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhbiBub3RcbiAgICogZXF1YWwgdG8gYE5hTmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmVxdWFsKCdmb28nKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8ubm90LmJlLk5hTjsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5OYU47XG4gICAqXG4gICAqIEBuYW1lIE5hTlxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ05hTicsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgXy5pc05hTihmbGFnKHRoaXMsICdvYmplY3QnKSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBOYU4nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIE5hTidcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5leGlzdFxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBub3Qgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBlaXRoZXIgYG51bGxgIG9yXG4gICAqIGB1bmRlZmluZWRgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0b1xuICAgKiBpdHMgZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uZXhpc3Q7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KDApLnRvLmVxdWFsKDApOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDApLnRvLmV4aXN0OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5leGlzdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QobnVsbCkudG8uYmUubnVsbDsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChudWxsKS50by5ub3QuZXhpc3Q7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8uYmUudW5kZWZpbmVkOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8ubm90LmV4aXN0OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChudWxsLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uZXhpc3Q7XG4gICAqXG4gICAqIEBuYW1lIGV4aXN0XG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZXhpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbCA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWRcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gZXhpc3QnXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBleGlzdCdcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5lbXB0eVxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBzdHJpbmcgb3IgYXJyYXksIGAuZW1wdHlgIGFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0J3NcbiAgICogYGxlbmd0aGAgcHJvcGVydHkgaXMgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBgMGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoW10pLnRvLmJlLmVtcHR5O1xuICAgKiAgICAgZXhwZWN0KCcnKS50by5iZS5lbXB0eTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgbWFwIG9yIHNldCwgYC5lbXB0eWAgYXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQncyBgc2l6ZWBcbiAgICogcHJvcGVydHkgaXMgc3RyaWN0bHkgZXF1YWwgdG8gYDBgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoKSkudG8uYmUuZW1wdHk7XG4gICAqICAgICBleHBlY3QobmV3IE1hcCgpKS50by5iZS5lbXB0eTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgbm9uLWZ1bmN0aW9uIG9iamVjdCwgYC5lbXB0eWAgYXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXRcbiAgICogZG9lc24ndCBoYXZlIGFueSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBQcm9wZXJ0aWVzIHdpdGggU3ltYm9sLWJhc2VkXG4gICAqIGtleXMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNvdW50LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHt9KS50by5iZS5lbXB0eTtcbiAgICpcbiAgICogQmVjYXVzZSBgLmVtcHR5YCBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIHRhcmdldCdzIHR5cGUsIGl0J3NcbiAgICogaW1wb3J0YW50IHRvIGNoZWNrIHRoZSB0YXJnZXQncyB0eXBlIGJlZm9yZSB1c2luZyBgLmVtcHR5YC4gU2VlIHRoZSBgLmFgXG4gICAqIGRvYyBmb3IgaW5mbyBvbiB0ZXN0aW5nIGEgdGFyZ2V0J3MgdHlwZS5cbiAgICpcbiAgICogICAgIGV4cGVjdChbXSkudG8uYmUuYW4oJ2FycmF5JykudGhhdC5pcy5lbXB0eTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5lbXB0eWAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW5cbiAgICogYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGNvbnRhaW5zIGl0cyBleHBlY3RlZCBudW1iZXIgb2YgdmFsdWVzLFxuICAgKiByYXRoZXIgdGhhbiBhc3NlcnRpbmcgdGhhdCBpdCdzIG5vdCBlbXB0eS5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5ub3QuYmUuZW1wdHk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDIsIDNdKSkudG8uaGF2ZS5wcm9wZXJ0eSgnc2l6ZScsIDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDIsIDNdKSkudG8ubm90LmJlLmVtcHR5OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChPYmplY3Qua2V5cyh7YTogMX0pKS50by5oYXZlLmxlbmd0aE9mKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmJlLmVtcHR5OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10sICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5lbXB0eTtcbiAgICpcbiAgICogQG5hbWUgZW1wdHlcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIGl0ZW1zQ291bnQ7XG5cbiAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG5cbiAgICBzd2l0Y2ggKF8udHlwZSh2YWwpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGl0ZW1zQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21hcCc6XG4gICAgICBjYXNlICdzZXQnOlxuICAgICAgICBpdGVtc0NvdW50ID0gdmFsLnNpemU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2Vha21hcCc6XG4gICAgICBjYXNlICd3ZWFrc2V0JzpcbiAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIGZsYWdNc2cgKyAnLmVtcHR5IHdhcyBwYXNzZWQgYSB3ZWFrIGNvbGxlY3Rpb24nLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIHZhciBtc2cgPSBmbGFnTXNnICsgJy5lbXB0eSB3YXMgcGFzc2VkIGEgZnVuY3Rpb24gJyArIF8uZ2V0TmFtZSh2YWwpO1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobXNnLnRyaW0oKSwgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh2YWwgIT09IE9iamVjdCh2YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgICAgZmxhZ01zZyArICcuZW1wdHkgd2FzIHBhc3NlZCBub24tc3RyaW5nIHByaW1pdGl2ZSAnICsgXy5pbnNwZWN0KHZhbCksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBzc2ZpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpdGVtc0NvdW50ID0gT2JqZWN0LmtleXModmFsKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIDAgPT09IGl0ZW1zQ291bnRcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgZW1wdHknXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBlbXB0eSdcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5hcmd1bWVudHNcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gdGVzdCAoKSB7XG4gICAqICAgICAgIGV4cGVjdChhcmd1bWVudHMpLnRvLmJlLmFyZ3VtZW50cztcbiAgICogICAgIH1cbiAgICpcbiAgICogICAgIHRlc3QoKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5hcmd1bWVudHNgLiBIb3dldmVyLCBpdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gYXNzZXJ0IHdoaWNoIHR5cGUgdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBiZSwgcmF0aGVyIHRoYW5cbiAgICogYXNzZXJ0aW5nIHRoYXQgaXRzIG5vdCBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmJlLmEoJ3N0cmluZycpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuYmUuYXJndW1lbnRzOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7fSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmFyZ3VtZW50cztcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuQXJndW1lbnRzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmFyZ3VtZW50c2AuXG4gICAqXG4gICAqIEBuYW1lIGFyZ3VtZW50c1xuICAgKiBAYWxpYXMgQXJndW1lbnRzXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGNoZWNrQXJndW1lbnRzICgpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgdHlwZSA9IF8udHlwZShvYmopO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAnQXJndW1lbnRzJyA9PT0gdHlwZVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhcmd1bWVudHMgYnV0IGdvdCAnICsgdHlwZVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYXJndW1lbnRzJ1xuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2FyZ3VtZW50cycsIGNoZWNrQXJndW1lbnRzKTtcbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdBcmd1bWVudHMnLCBjaGVja0FyZ3VtZW50cyk7XG5cbiAgLyoqXG4gICAqICMjIyAuZXF1YWwodmFsWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byB0aGUgZ2l2ZW4gYHZhbGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7XG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmVxdWFsKCdmb28nKTtcbiAgICogXG4gICAqIEFkZCBgLmRlZXBgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5IGluc3RlYWQuIFNlZSB0aGVcbiAgICogYGRlZXAtZXFsYCBwcm9qZWN0IHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGVxdWFscyBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uZGVlcC5lcXVhbCh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmVxdWFsKHthOiAxfSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBlcXVhbHMgYFsxLCAyXWBcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmRlZXAuZXF1YWwoWzEsIDJdKTtcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLm5vdC5lcXVhbChbMSwgMl0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmVxdWFsYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIHZhbHVlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuZXF1YWwoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmVxdWFsYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5lcXVhbCgyKTtcbiAgICpcbiAgICogVGhlIGFsaWFzZXMgYC5lcXVhbHNgIGFuZCBgZXFgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuZXF1YWxgLlxuICAgKlxuICAgKiBAbmFtZSBlcXVhbFxuICAgKiBAYWxpYXMgZXF1YWxzXG4gICAqIEBhbGlhcyBlcVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEVxdWFsICh2YWwsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKTtcbiAgICBpZiAoZmxhZyh0aGlzLCAnZGVlcCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lcWwodmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgdmFsID09PSBvYmpcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfSdcbiAgICAgICAgLCB2YWxcbiAgICAgICAgLCB0aGlzLl9vYmpcbiAgICAgICAgLCB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxdWFsJywgYXNzZXJ0RXF1YWwpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdlcXVhbHMnLCBhc3NlcnRFcXVhbCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxJywgYXNzZXJ0RXF1YWwpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmVxbChvYmpbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBkZWVwbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGBvYmpgLiBTZWUgdGhlXG4gICAqIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgaXMgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBlcXVhbCB0byB7YTogMX1cbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YTogMX0pLmJ1dC5ub3QuZXF1YWwoe2E6IDF9KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBpcyBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGVxdWFsIHRvIFsxLCAyXVxuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uZXFsKFsxLCAyXSkuYnV0Lm5vdC5lcXVhbChbMSwgMl0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmVxbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGRlZXBseSBlcXVhbCB0byBpdHMgZXhwZWN0ZWQgdmFsdWUsIHJhdGhlclxuICAgKiB0aGFuIG5vdCBkZWVwbHkgZXF1YWwgdG8gb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIHZhbHVlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YTogMX0pOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmVxbCh7YjogMn0pOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5lcWxgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlXG4gICAqIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YjogMn0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5lcWwoe2I6IDJ9KTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuZXFsc2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5lcWxgLlxuICAgKlxuICAgKiBUaGUgYC5kZWVwLmVxdWFsYCBhc3NlcnRpb24gaXMgYWxtb3N0IGlkZW50aWNhbCB0byBgLmVxbGAgYnV0IHdpdGggb25lXG4gICAqIGRpZmZlcmVuY2U6IGAuZGVlcC5lcXVhbGAgY2F1c2VzIGRlZXAgZXF1YWxpdHkgY29tcGFyaXNvbnMgdG8gYWxzbyBiZSB1c2VkXG4gICAqIGZvciBhbnkgb3RoZXIgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4uXG4gICAqXG4gICAqIEBuYW1lIGVxbFxuICAgKiBAYWxpYXMgZXFsc1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBfLmVxbChvYmosIGZsYWcodGhpcywgJ29iamVjdCcpKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgI3tleHB9J1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZGVlcGx5IGVxdWFsICN7ZXhwfSdcbiAgICAgICwgb2JqXG4gICAgICAsIHRoaXMuX29ialxuICAgICAgLCB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxbCcsIGFzc2VydEVxbCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxbHMnLCBhc3NlcnRFcWwpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmFib3ZlKG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LlxuICAgKiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0byBpdHMgZXhwZWN0ZWRcbiAgICogdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uZXF1YWwoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYWJvdmUoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHZhbHVlIG9mIHRoZVxuICAgKiB0YXJnZXQncyBgbGVuZ3RoYCBwcm9wZXJ0eSBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG51bWJlciBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmFib3ZlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmFib3ZlYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYWJvdmUoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5hYm92ZSgyKTtcbiAgICpcbiAgICogVGhlIGFsaWFzZXMgYC5ndGAgYW5kIGAuZ3JlYXRlclRoYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAuYWJvdmVgLlxuICAgKlxuICAgKiBAbmFtZSBhYm92ZVxuICAgKiBAYWxpYXMgZ3RcbiAgICogQGFsaWFzIGdyZWF0ZXJUaGFuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRBYm92ZSAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuICAgIFxuICAgIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgPT09ICdkYXRlJyAmJiBuVHlwZSAhPT0gJ2RhdGUnKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBhYm92ZSBtdXN0IGJlIGEgZGF0ZSc7XG4gICAgfSBlbHNlIGlmIChuVHlwZSAhPT0gJ251bWJlcicgJiYgKGRvTGVuZ3RoIHx8IG9ialR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBhYm92ZSBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gJ2RhdGUnICYmIG9ialR5cGUgIT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHByaW50T2JqID0gKG9ialR5cGUgPT09ICdzdHJpbmcnKSA/IFwiJ1wiICsgb2JqICsgXCInXCIgOiBvYmo7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAnZXhwZWN0ZWQgJyArIHByaW50T2JqICsgJyB0byBiZSBhIG51bWJlciBvciBhIGRhdGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICB9XG5cbiAgICBpZiAoZG9MZW5ndGgpIHtcbiAgICAgIHZhciBsZW4gPSBvYmoubGVuZ3RoO1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgbGVuID4gblxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggYWJvdmUgI3tleHB9IGJ1dCBnb3QgI3thY3R9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgbGVuZ3RoIGFib3ZlICN7ZXhwfSdcbiAgICAgICAgLCBuXG4gICAgICAgICwgbGVuXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBvYmogPiBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IG1vc3QgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnYWJvdmUnLCBhc3NlcnRBYm92ZSk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2d0JywgYXNzZXJ0QWJvdmUpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdncmVhdGVyVGhhbicsIGFzc2VydEFib3ZlKTtcblxuICAvKipcbiAgICogIyMjIC5sZWFzdChuWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXIgb3IgYSBkYXRlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW5cbiAgICogbnVtYmVyIG9yIGRhdGUgYG5gIHJlc3BlY3RpdmVseS4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG9cbiAgICogaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmVxdWFsKDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLmF0LmxlYXN0KDEpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5iZS5hdC5sZWFzdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLmxlbmd0aE9mYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBhc3NlcnQgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAqIGBuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZi5hdC5sZWFzdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi5hdC5sZWFzdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubGVhc3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5iZS5hdC5sZWFzdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubGVhc3RgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlXG4gICAqIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5hdC5sZWFzdCgyLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmF0LmxlYXN0KDIpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5ndGVgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAubGVhc3RgLlxuICAgKlxuICAgKiBAbmFtZSBsZWFzdFxuICAgKiBAYWxpYXMgZ3RlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRMZWFzdCAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIG5UeXBlICE9PSAnZGF0ZScpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlJztcbiAgICB9IGVsc2UgaWYgKG5UeXBlICE9PSAnbnVtYmVyJyAmJiAoZG9MZW5ndGggfHwgb2JqVHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBudW1iZXInO1xuICAgIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSAnZGF0ZScgJiYgb2JqVHlwZSAhPT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgcHJpbnRPYmogPSAob2JqVHlwZSA9PT0gJ3N0cmluZycpID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICdleHBlY3RlZCAnICsgcHJpbnRPYmogKyAnIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIGlmIChkb0xlbmd0aCkge1xuICAgICAgdmFyIGxlbiA9IG9iai5sZW5ndGg7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBsZW4gPj0gblxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggYXQgbGVhc3QgI3tleHB9IGJ1dCBnb3QgI3thY3R9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggYmVsb3cgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICAgLCBsZW5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA+PSBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbGVhc3QgI3tleHB9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGJlbG93ICN7ZXhwfSdcbiAgICAgICAgLCBuXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2xlYXN0JywgYXNzZXJ0TGVhc3QpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdndGUnLCBhc3NlcnRMZWFzdCk7XG5cbiAgLyoqXG4gICAqICMjIyAuYmVsb3coblssIG1zZ10pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgbnVtYmVyIG9yIGEgZGF0ZSBsZXNzIHRoYW4gdGhlIGdpdmVuIG51bWJlciBvciBkYXRlIGBuYCByZXNwZWN0aXZlbHkuXG4gICAqIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZFxuICAgKiB2YWx1ZS5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5iZWxvdygyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLmxlbmd0aE9mYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBhc3NlcnQgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIGBuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZi5iZWxvdyg0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aCgzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYmVsb3coNCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmJlbG93YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5ub3QuYmUuYmVsb3coMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmJlbG93YCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYmVsb3coMSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5iZWxvdygxKTtcbiAgICpcbiAgICogVGhlIGFsaWFzZXMgYC5sdGAgYW5kIGAubGVzc1RoYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAuYmVsb3dgLlxuICAgKlxuICAgKiBAbmFtZSBiZWxvd1xuICAgKiBAYWxpYXMgbHRcbiAgICogQGFsaWFzIGxlc3NUaGFuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRCZWxvdyAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIG5UeXBlICE9PSAnZGF0ZScpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBkYXRlJztcbiAgICB9IGVsc2UgaWYgKG5UeXBlICE9PSAnbnVtYmVyJyAmJiAoZG9MZW5ndGggfHwgb2JqVHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBudW1iZXInO1xuICAgIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSAnZGF0ZScgJiYgb2JqVHlwZSAhPT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgcHJpbnRPYmogPSAob2JqVHlwZSA9PT0gJ3N0cmluZycpID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICdleHBlY3RlZCAnICsgcHJpbnRPYmogKyAnIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIGlmIChkb0xlbmd0aCkge1xuICAgICAgdmFyIGxlbiA9IG9iai5sZW5ndGg7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBsZW4gPCBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIGxlbmd0aCBiZWxvdyAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgYSBsZW5ndGggYmVsb3cgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICAgLCBsZW5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA8IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBiZWxvdyAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbGVhc3QgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnYmVsb3cnLCBhc3NlcnRCZWxvdyk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2x0JywgYXNzZXJ0QmVsb3cpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdsZXNzVGhhbicsIGFzc2VydEJlbG93KTtcblxuICAvKipcbiAgICogIyMjIC5tb3N0KG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXJcbiAgICogb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0byBpdHNcbiAgICogZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYXQubW9zdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYXQubW9zdCgxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLmxlbmd0aE9mYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBhc3NlcnQgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyIGBuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZi5hdC5tb3N0KDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmF0Lm1vc3QoNCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm1vc3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmVxdWFsKDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLm5vdC5iZS5hdC5tb3N0KDEpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5tb3N0YCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYXQubW9zdCgxLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMiwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmF0Lm1vc3QoMSk7XG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmx0ZWAgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5tb3N0YC5cbiAgICpcbiAgICogQG5hbWUgbW9zdFxuICAgKiBAYWxpYXMgbHRlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRNb3N0IChuLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZG9MZW5ndGggPSBmbGFnKHRoaXMsICdkb0xlbmd0aCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgbXNnUHJlZml4ID0gKChmbGFnTXNnKSA/IGZsYWdNc2cgKyAnOiAnIDogJycpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopLnRvTG93ZXJDYXNlKClcbiAgICAgICwgblR5cGUgPSBfLnR5cGUobikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBzaG91bGRUaHJvdyA9IHRydWU7XG5cbiAgICBpZiAoZG9MZW5ndGgpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KCdsZW5ndGgnKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIG5UeXBlICE9PSAnZGF0ZScpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIGRhdGUnO1xuICAgIH0gZWxzZSBpZiAoblR5cGUgIT09ICdudW1iZXInICYmIChkb0xlbmd0aCB8fCBvYmpUeXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICd0aGUgYXJndW1lbnQgdG8gbW9zdCBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gJ2RhdGUnICYmIG9ialR5cGUgIT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHByaW50T2JqID0gKG9ialR5cGUgPT09ICdzdHJpbmcnKSA/IFwiJ1wiICsgb2JqICsgXCInXCIgOiBvYmo7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAnZXhwZWN0ZWQgJyArIHByaW50T2JqICsgJyB0byBiZSBhIG51bWJlciBvciBhIGRhdGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICB9XG5cbiAgICBpZiAoZG9MZW5ndGgpIHtcbiAgICAgIHZhciBsZW4gPSBvYmoubGVuZ3RoO1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgbGVuIDw9IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgbGVuZ3RoIGF0IG1vc3QgI3tleHB9IGJ1dCBnb3QgI3thY3R9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggYWJvdmUgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICAgLCBsZW5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA8PSBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbW9zdCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbW9zdCcsIGFzc2VydE1vc3QpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdsdGUnLCBhc3NlcnRNb3N0KTtcblxuICAvKipcbiAgICogIyMjIC53aXRoaW4oc3RhcnQsIGZpbmlzaFssIG1zZ10pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgbnVtYmVyIG9yIGEgZGF0ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuXG4gICAqIG51bWJlciBvciBkYXRlIGBzdGFydGAsIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlciBvciBkYXRlIGBmaW5pc2hgIHJlc3BlY3RpdmVseS5cbiAgICogSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkXG4gICAqIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmVxdWFsKDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLndpdGhpbigxLCAzKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUud2l0aGluKDIsIDMpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5iZS53aXRoaW4oMSwgMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHZhbHVlIG9mIHRoZVxuICAgKiB0YXJnZXQncyBgbGVuZ3RoYCBwcm9wZXJ0eSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlclxuICAgKiBgc3RhcnRgLCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIgYGZpbmlzaGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2Yud2l0aGluKDIsIDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLndpdGhpbigyLCA0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAud2l0aGluYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUud2l0aGluKDIsIDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC53aXRoaW5gIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCg0KS50by5iZS53aXRoaW4oMSwgMywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDQsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS53aXRoaW4oMSwgMyk7XG4gICAqXG4gICAqIEBuYW1lIHdpdGhpblxuICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnQgbG93ZXIgYm91bmQgaW5jbHVzaXZlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmaW5pc2ggdXBwZXIgYm91bmQgaW5jbHVzaXZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCd3aXRoaW4nLCBmdW5jdGlvbiAoc3RhcnQsIGZpbmlzaCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIHN0YXJ0VHlwZSA9IF8udHlwZShzdGFydCkudG9Mb3dlckNhc2UoKVxuICAgICAgLCBmaW5pc2hUeXBlID0gXy50eXBlKGZpbmlzaCkudG9Mb3dlckNhc2UoKVxuICAgICAgLCBzaG91bGRUaHJvdyA9IHRydWVcbiAgICAgICwgcmFuZ2UgPSAoc3RhcnRUeXBlID09PSAnZGF0ZScgJiYgZmluaXNoVHlwZSA9PT0gJ2RhdGUnKVxuICAgICAgICAgID8gc3RhcnQudG9VVENTdHJpbmcoKSArICcuLicgKyBmaW5pc2gudG9VVENTdHJpbmcoKVxuICAgICAgICAgIDogc3RhcnQgKyAnLi4nICsgZmluaXNoO1xuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIChzdGFydFR5cGUgIT09ICdkYXRlJyB8fCBmaW5pc2hUeXBlICE9PSAnZGF0ZScpKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudHMgdG8gd2l0aGluIG11c3QgYmUgZGF0ZXMnO1xuICAgIH0gZWxzZSBpZiAoKHN0YXJ0VHlwZSAhPT0gJ251bWJlcicgfHwgZmluaXNoVHlwZSAhPT0gJ251bWJlcicpICYmIChkb0xlbmd0aCB8fCBvYmpUeXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICd0aGUgYXJndW1lbnRzIHRvIHdpdGhpbiBtdXN0IGJlIG51bWJlcnMnO1xuICAgIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSAnZGF0ZScgJiYgb2JqVHlwZSAhPT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgcHJpbnRPYmogPSAob2JqVHlwZSA9PT0gJ3N0cmluZycpID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICdleHBlY3RlZCAnICsgcHJpbnRPYmogKyAnIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIGlmIChkb0xlbmd0aCkge1xuICAgICAgdmFyIGxlbiA9IG9iai5sZW5ndGg7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBsZW4gPj0gc3RhcnQgJiYgbGVuIDw9IGZpbmlzaFxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggd2l0aGluICcgKyByYW5nZVxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgbGVuZ3RoIHdpdGhpbiAnICsgcmFuZ2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA+PSBzdGFydCAmJiBvYmogPD0gZmluaXNoXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgd2l0aGluICcgKyByYW5nZVxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSB3aXRoaW4gJyArIHJhbmdlXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuaW5zdGFuY2VvZihjb25zdHJ1Y3RvclssIG1zZ10pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBgY29uc3RydWN0b3JgLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gQ2F0ICgpIHsgfVxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBDYXQoKSkudG8uYmUuYW4uaW5zdGFuY2VvZihDYXQpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uYmUuYW4uaW5zdGFuY2VvZihBcnJheSk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuaW5zdGFuY2VvZmAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuYmUuYW4uaW5zdGFuY2VvZihBcnJheSk7XG4gICAqXG4gICAqIGAuaW5zdGFuY2VvZmAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmFuLmluc3RhbmNlb2YoQXJyYXksICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYW4uaW5zdGFuY2VvZihBcnJheSk7XG4gICAqXG4gICAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBFUzUsIGAuaW5zdGFuY2VvZmAgbWF5IG5vdCBhbHdheXMgd29yayBhcyBleHBlY3RlZFxuICAgKiB3aGVuIHVzaW5nIGEgdHJhbnNwaWxlciBzdWNoIGFzIEJhYmVsIG9yIFR5cGVTY3JpcHQuIEluIHBhcnRpY3VsYXIsIGl0IG1heVxuICAgKiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cyB3aGVuIHN1YmNsYXNzaW5nIGJ1aWx0LWluIG9iamVjdCBzdWNoIGFzXG4gICAqIGBBcnJheWAsIGBFcnJvcmAsIGFuZCBgTWFwYC4gU2VlIHlvdXIgdHJhbnNwaWxlcidzIGRvY3MgZm9yIGRldGFpbHM6XG4gICAqXG4gICAqIC0gKFtCYWJlbF0oaHR0cHM6Ly9iYWJlbGpzLmlvL2RvY3MvdXNhZ2UvY2F2ZWF0cy8jY2xhc3NlcykpXG4gICAqIC0gKFtUeXBlU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29yaykpXG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmluc3RhbmNlT2ZgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuaW5zdGFuY2VvZmAuXG4gICAqXG4gICAqIEBuYW1lIGluc3RhbmNlb2ZcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBhbGlhcyBpbnN0YW5jZU9mXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEluc3RhbmNlT2YgKGNvbnN0cnVjdG9yLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcblxuICAgIHZhciB0YXJnZXQgPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgIHZhciBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuICAgIHZhciBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc0luc3RhbmNlT2YgPSB0YXJnZXQgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArICdUaGUgaW5zdGFuY2VvZiBhc3NlcnRpb24gbmVlZHMgYSBjb25zdHJ1Y3RvciBidXQgJ1xuICAgICAgICAgICAgKyBfLnR5cGUoY29uc3RydWN0b3IpICsgJyB3YXMgZ2l2ZW4uJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgc3NmaVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHZhciBuYW1lID0gXy5nZXROYW1lKGNvbnN0cnVjdG9yKTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgbmFtZSA9ICdhbiB1bm5hbWVkIGNvbnN0cnVjdG9yJztcbiAgICB9XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgaXNJbnN0YW5jZU9mXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGFuIGluc3RhbmNlIG9mICcgKyBuYW1lXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhbiBpbnN0YW5jZSBvZiAnICsgbmFtZVxuICAgICk7XG4gIH07XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaW5zdGFuY2VvZicsIGFzc2VydEluc3RhbmNlT2YpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdpbnN0YW5jZU9mJywgYXNzZXJ0SW5zdGFuY2VPZik7XG5cbiAgLyoqXG4gICAqICMjIyAucHJvcGVydHkobmFtZVssIHZhbFssIG1zZ11dKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBoYXMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgYG5hbWVgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScpO1xuICAgKlxuICAgKiBXaGVuIGB2YWxgIGlzIHByb3ZpZGVkLCBgLnByb3BlcnR5YCBhbHNvIGFzc2VydHMgdGhhdCB0aGUgcHJvcGVydHkncyB2YWx1ZVxuICAgKiBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gYHZhbGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdhJywgMSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHN0cmljdCAoYD09PWApIGVxdWFsaXR5IGlzIHVzZWQuIEFkZCBgLmRlZXBgIGVhcmxpZXIgaW4gdGhlXG4gICAqIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5IGluc3RlYWQuIFNlZSB0aGUgYGRlZXAtZXFsYCBwcm9qZWN0IHBhZ2UgZm9yXG4gICAqIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGhhcyBwcm9wZXJ0eSBgeDoge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5oYXZlLmRlZXAucHJvcGVydHkoJ3gnLCB7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqXG4gICAqIFRoZSB0YXJnZXQncyBlbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgaW5jbHVkZWRcbiAgICogaW4gdGhlIHNlYXJjaC4gQnkgZGVmYXVsdCwgYm90aCBvd24gYW5kIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGFyZSBpbmNsdWRlZC5cbiAgICogQWRkIGAub3duYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBleGNsdWRlIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20gdGhlXG4gICAqIHNlYXJjaC5cbiAgICpcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLm93bi5wcm9wZXJ0eSgnYScpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd24ucHJvcGVydHkoJ2EnLCAxKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUucHJvcGVydHkoJ2InKS5idXQubm90Lm93bi5wcm9wZXJ0eSgnYicpOyBcbiAgICpcbiAgICogYC5kZWVwYCBhbmQgYC5vd25gIGNhbiBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqXG4gICAqIEFkZCBgLm5lc3RlZGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gZW5hYmxlIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gd2hlblxuICAgKiByZWZlcmVuY2luZyBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YToge2I6IFsneCcsICd5J119fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ2EuYlsxXScpO1xuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5oYXZlLm5lc3RlZC5wcm9wZXJ0eSgnYS5iWzFdJywgJ3knKTtcbiAgICpcbiAgICogSWYgYC5gIG9yIGBbXWAgYXJlIHBhcnQgb2YgYW4gYWN0dWFsIHByb3BlcnR5IG5hbWUsIHRoZXkgY2FuIGJlIGVzY2FwZWQgYnlcbiAgICogYWRkaW5nIHR3byBiYWNrc2xhc2hlcyBiZWZvcmUgdGhlbS5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7Jy5hJzogeydbYl0nOiAneCd9fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ1xcXFwuYS5cXFxcW2JcXFxcXScpO1xuICAgKlxuICAgKiBgLmRlZXBgIGFuZCBgLm5lc3RlZGAgY2FuIGJlIGNvbWJpbmVkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogW3tjOiAzfV19fSlcbiAgICogICAgICAgLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkoJ2EuYlswXScsIHtjOiAzfSk7XG4gICAqXG4gICAqIGAub3duYCBhbmQgYC5uZXN0ZWRgIGNhbm5vdCBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5wcm9wZXJ0eWAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKiBcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAucHJvcGVydHlgIHdoZW4gcHJvdmlkaW5nIGB2YWxgLiBUaGVcbiAgICogcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9ucyBieSBhc3NlcnRpbmcgdGhhdCB0aGVcbiAgICogdGFyZ2V0IGVpdGhlciBkb2Vzbid0IGhhdmUgYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgYG5hbWVgLCBvciB0aGF0IGl0XG4gICAqIGRvZXMgaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBgbmFtZWAgYnV0IGl0cyB2YWx1ZSBpc24ndCBlcXVhbCB0b1xuICAgKiB0aGUgZ2l2ZW4gYHZhbGAuIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQnc1xuICAgKiBleHBlY3RlZCwgYW5kIHRoZW4gd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXNuJ3QgZXhwZWN0ZWQgdG8gaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleVxuICAgKiBgbmFtZWAsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHtiOiAyfSkudG8ubm90LmhhdmUucHJvcGVydHkoJ2EnKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YjogMn0pLnRvLm5vdC5oYXZlLnByb3BlcnR5KCdhJywgMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBgbmFtZWAsXG4gICAqIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgcHJvcGVydHkgaGFzIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyXG4gICAqIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAzfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScsIDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAzfSkudG8ubm90LmhhdmUucHJvcGVydHkoJ2EnLCAxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAucHJvcGVydHlgIGNoYW5nZXMgdGhlIHRhcmdldCBvZiBhbnkgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW5cbiAgICogdG8gYmUgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBvcmlnaW5hbCB0YXJnZXQgb2JqZWN0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScpLnRoYXQuaXMuYSgnbnVtYmVyJyk7XG4gICAqXG4gICAqIGAucHJvcGVydHlgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nIGB2YWxgLCBvbmx5IHVzZSB0aGVcbiAgICogc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScsIDIsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLnByb3BlcnR5KCdhJywgMik7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdiJywgdW5kZWZpbmVkLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqIFxuICAgKiBUaGUgYWJvdmUgYXNzZXJ0aW9uIGlzbid0IHRoZSBzYW1lIHRoaW5nIGFzIG5vdCBwcm92aWRpbmcgYHZhbGAuIEluc3RlYWQsXG4gICAqIGl0J3MgYXNzZXJ0aW5nIHRoYXQgdGhlIHRhcmdldCBvYmplY3QgaGFzIGEgYGJgIHByb3BlcnR5IHRoYXQncyBlcXVhbCB0b1xuICAgKiBgdW5kZWZpbmVkYC5cbiAgICpcbiAgICogVGhlIGFzc2VydGlvbnMgYC5vd25Qcm9wZXJ0eWAgYW5kIGAuaGF2ZU93blByb3BlcnR5YCBjYW4gYmUgdXNlZFxuICAgKiBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLm93bi5wcm9wZXJ0eWAuXG4gICAqXG4gICAqIEBuYW1lIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbCAob3B0aW9uYWwpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAcmV0dXJucyB2YWx1ZSBvZiBwcm9wZXJ0eSBmb3IgY2hhaW5pbmdcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0UHJvcGVydHkgKG5hbWUsIHZhbCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG5cbiAgICB2YXIgaXNOZXN0ZWQgPSBmbGFnKHRoaXMsICduZXN0ZWQnKVxuICAgICAgLCBpc093biA9IGZsYWcodGhpcywgJ293bicpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcblxuICAgIGlmIChpc05lc3RlZCAmJiBpc093bikge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgJ1RoZSBcIm5lc3RlZFwiIGFuZCBcIm93blwiIGZsYWdzIGNhbm5vdCBiZSBjb21iaW5lZC4nLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgJ1RhcmdldCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBpc0RlZXAgPSBmbGFnKHRoaXMsICdkZWVwJylcbiAgICAgICwgbmVnYXRlID0gZmxhZyh0aGlzLCAnbmVnYXRlJylcbiAgICAgICwgcGF0aEluZm8gPSBpc05lc3RlZCA/IF8uZ2V0UGF0aEluZm8ob2JqLCBuYW1lKSA6IG51bGxcbiAgICAgICwgdmFsdWUgPSBpc05lc3RlZCA/IHBhdGhJbmZvLnZhbHVlIDogb2JqW25hbWVdO1xuXG4gICAgdmFyIGRlc2NyaXB0b3IgPSAnJztcbiAgICBpZiAoaXNEZWVwKSBkZXNjcmlwdG9yICs9ICdkZWVwICc7XG4gICAgaWYgKGlzT3duKSBkZXNjcmlwdG9yICs9ICdvd24gJztcbiAgICBpZiAoaXNOZXN0ZWQpIGRlc2NyaXB0b3IgKz0gJ25lc3RlZCAnO1xuICAgIGRlc2NyaXB0b3IgKz0gJ3Byb3BlcnR5ICc7XG5cbiAgICB2YXIgaGFzUHJvcGVydHk7XG4gICAgaWYgKGlzT3duKSBoYXNQcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIG5hbWUpO1xuICAgIGVsc2UgaWYgKGlzTmVzdGVkKSBoYXNQcm9wZXJ0eSA9IHBhdGhJbmZvLmV4aXN0cztcbiAgICBlbHNlIGhhc1Byb3BlcnR5ID0gXy5oYXNQcm9wZXJ0eShvYmosIG5hbWUpO1xuXG4gICAgLy8gV2hlbiBwZXJmb3JtaW5nIGEgbmVnYXRlZCBhc3NlcnRpb24gZm9yIGJvdGggbmFtZSBhbmQgdmFsLCBtZXJlbHkgaGF2aW5nXG4gICAgLy8gYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzbid0IGVub3VnaCB0byBjYXVzZSB0aGUgYXNzZXJ0aW9uIHRvXG4gICAgLy8gZmFpbC4gSXQgbXVzdCBib3RoIGhhdmUgYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhbmQgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhhdCBwcm9wZXJ0eSBtdXN0IGVxdWFsIHRoZSBnaXZlbiB2YWwuIFRoZXJlZm9yZSwgc2tpcCB0aGlzIGFzc2VydGlvbiBpblxuICAgIC8vIGZhdm9yIG9mIHRoZSBuZXh0LlxuICAgIGlmICghbmVnYXRlIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGhhc1Byb3BlcnR5XG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSAnICsgZGVzY3JpcHRvciArIF8uaW5zcGVjdChuYW1lKVxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlICcgKyBkZXNjcmlwdG9yICsgXy5pbnNwZWN0KG5hbWUpKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGhhc1Byb3BlcnR5ICYmIChpc0RlZXAgPyBfLmVxbCh2YWwsIHZhbHVlKSA6IHZhbCA9PT0gdmFsdWUpXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSAnICsgZGVzY3JpcHRvciArIF8uaW5zcGVjdChuYW1lKSArICcgb2YgI3tleHB9LCBidXQgZ290ICN7YWN0fSdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSAnICsgZGVzY3JpcHRvciArIF8uaW5zcGVjdChuYW1lKSArICcgb2YgI3thY3R9J1xuICAgICAgICAsIHZhbFxuICAgICAgICAsIHZhbHVlXG4gICAgICApO1xuICAgIH1cblxuICAgIGZsYWcodGhpcywgJ29iamVjdCcsIHZhbHVlKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3Byb3BlcnR5JywgYXNzZXJ0UHJvcGVydHkpO1xuXG4gIGZ1bmN0aW9uIGFzc2VydE93blByb3BlcnR5IChuYW1lLCB2YWx1ZSwgbXNnKSB7XG4gICAgZmxhZyh0aGlzLCAnb3duJywgdHJ1ZSk7XG4gICAgYXNzZXJ0UHJvcGVydHkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ293blByb3BlcnR5JywgYXNzZXJ0T3duUHJvcGVydHkpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdoYXZlT3duUHJvcGVydHknLCBhc3NlcnRPd25Qcm9wZXJ0eSk7XG5cbiAgLyoqXG4gICAqICMjIyAub3duUHJvcGVydHlEZXNjcmlwdG9yKG5hbWVbLCBkZXNjcmlwdG9yWywgbXNnXV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGhhcyBpdHMgb3duIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4ga2V5XG4gICAqIGBuYW1lYC4gRW51bWVyYWJsZSBhbmQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgaW5jbHVkZWQgaW4gdGhlXG4gICAqIHNlYXJjaC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJyk7XG4gICAqXG4gICAqIFdoZW4gYGRlc2NyaXB0b3JgIGlzIHByb3ZpZGVkLCBgLm93blByb3BlcnR5RGVzY3JpcHRvcmAgYWxzbyBhc3NlcnRzIHRoYXRcbiAgICogdGhlIHByb3BlcnR5J3MgZGVzY3JpcHRvciBpcyBkZWVwbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGBkZXNjcmlwdG9yYC4gU2VlXG4gICAqIHRoZSBgZGVlcC1lcWxgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcCBlcXVhbGl0eSBhbGdvcml0aG06XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScsIHtcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICogICAgICAgdmFsdWU6IDEsXG4gICAqICAgICB9KTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5vd25Qcm9wZXJ0eURlc2NyaXB0b3JgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdiJyk7XG4gICAqIFxuICAgKiBIb3dldmVyLCBpdCdzIGRhbmdlcm91cyB0byBuZWdhdGUgYC5vd25Qcm9wZXJ0eURlc2NyaXB0b3JgIHdoZW4gcHJvdmlkaW5nXG4gICAqIGEgYGRlc2NyaXB0b3JgLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9ucyBieVxuICAgKiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0IGVpdGhlciBkb2Vzbid0IGhhdmUgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGhcbiAgICogdGhlIGdpdmVuIGtleSBgbmFtZWAsIG9yIHRoYXQgaXQgZG9lcyBoYXZlIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZVxuICAgKiBnaXZlbiBrZXkgYG5hbWVgIGJ1dCBpdHMgbm90IGRlZXBseSBlcXVhbCB0byB0aGUgZ2l2ZW4gYGRlc2NyaXB0b3JgLiBJdCdzXG4gICAqIG9mdGVuIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuXG4gICAqIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzbid0IGV4cGVjdGVkIHRvIGhhdmUgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuXG4gICAqIGtleSBgbmFtZWAsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YjogMn0pLnRvLm5vdC5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5ub3QuaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAxLFxuICAgKiAgICAgfSk7XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBoYXZlIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlblxuICAgKiBrZXkgYG5hbWVgLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHByb3BlcnR5IGhhcyBpdHMgZXhwZWN0ZWRcbiAgICogZGVzY3JpcHRvciwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55XG4gICAqIHVuZXhwZWN0ZWQgZGVzY3JpcHRvcnMuXG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAzfSkudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAzLFxuICAgKiAgICAgfSk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogM30pLnRvLm5vdC5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScsIHtcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICogICAgICAgdmFsdWU6IDEsXG4gICAqICAgICB9KTtcbiAgICpcbiAgICogYC5vd25Qcm9wZXJ0eURlc2NyaXB0b3JgIGNoYW5nZXMgdGhlIHRhcmdldCBvZiBhbnkgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvd1xuICAgKiBpbiB0aGUgY2hhaW4gdG8gYmUgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZyb20gdGhlIG9yaWdpbmFsXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScpXG4gICAqICAgICAgIC50aGF0Lmhhcy5wcm9wZXJ0eSgnZW51bWVyYWJsZScsIHRydWUpO1xuICAgKlxuICAgKiBgLm93blByb3BlcnR5RGVzY3JpcHRvcmAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhXG4gICAqIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzb1xuICAgKiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmdcbiAgICogYGRlc2NyaXB0b3JgLCBvbmx5IHVzZSB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAyLFxuICAgKiAgICAgfSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScsIHtcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICogICAgICAgdmFsdWU6IDIsXG4gICAqICAgICB9KTtcbiAgICogXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0pXG4gICAqICAgICAgIC50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYicsIHVuZGVmaW5lZCwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiBUaGUgYWJvdmUgYXNzZXJ0aW9uIGlzbid0IHRoZSBzYW1lIHRoaW5nIGFzIG5vdCBwcm92aWRpbmcgYGRlc2NyaXB0b3JgLlxuICAgKiBJbnN0ZWFkLCBpdCdzIGFzc2VydGluZyB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IGhhcyBhIGBiYCBwcm9wZXJ0eVxuICAgKiBkZXNjcmlwdG9yIHRoYXQncyBkZWVwbHkgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYC5cbiAgICpcbiAgICogQG5hbWUgb3duUHJvcGVydHlEZXNjcmlwdG9yXG4gICAqIEBhbGlhcyBoYXZlT3duUHJvcGVydHlEZXNjcmlwdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZXNjcmlwdG9yIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydE93blByb3BlcnR5RGVzY3JpcHRvciAobmFtZSwgZGVzY3JpcHRvciwgbXNnKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgbXNnID0gZGVzY3JpcHRvcjtcbiAgICAgIGRlc2NyaXB0b3IgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgdmFyIGFjdHVhbERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdChvYmopLCBuYW1lKTtcbiAgICBpZiAoYWN0dWFsRGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBfLmVxbChkZXNjcmlwdG9yLCBhY3R1YWxEZXNjcmlwdG9yKVxuICAgICAgICAsICdleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yICcgKyBfLmluc3BlY3QobmFtZSkgKyAnIG9uICN7dGhpc30gdG8gbWF0Y2ggJyArIF8uaW5zcGVjdChkZXNjcmlwdG9yKSArICcsIGdvdCAnICsgXy5pbnNwZWN0KGFjdHVhbERlc2NyaXB0b3IpXG4gICAgICAgICwgJ2V4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgJyArIF8uaW5zcGVjdChuYW1lKSArICcgb24gI3t0aGlzfSB0byBub3QgbWF0Y2ggJyArIF8uaW5zcGVjdChkZXNjcmlwdG9yKVxuICAgICAgICAsIGRlc2NyaXB0b3JcbiAgICAgICAgLCBhY3R1YWxEZXNjcmlwdG9yXG4gICAgICAgICwgdHJ1ZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgYWN0dWFsRGVzY3JpcHRvclxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yICcgKyBfLmluc3BlY3QobmFtZSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhbiBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgJyArIF8uaW5zcGVjdChuYW1lKVxuICAgICAgKTtcbiAgICB9XG4gICAgZmxhZyh0aGlzLCAnb2JqZWN0JywgYWN0dWFsRGVzY3JpcHRvcik7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdvd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdoYXZlT3duUHJvcGVydHlEZXNjcmlwdG9yJywgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcblxuICAvKipcbiAgICogIyMjIC5sZW5ndGhPZihuWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQncyBgbGVuZ3RoYCBwcm9wZXJ0eSBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAqIGBuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7XG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubGVuZ3RoT2ZgLiBIb3dldmVyLCBpdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZFxuICAgKiB2YWx1ZSwgcmF0aGVyIHRoYW4gbm90IGVxdWFsIHRvIG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuaGF2ZS5sZW5ndGhPZig0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubGVuZ3RoT2ZgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUubGVuZ3RoT2YoMik7XG4gICAqXG4gICAqIGAubGVuZ3RoT2ZgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBsYW5ndWFnZSBjaGFpbiwgY2F1c2luZyBhbGwgYC5hYm92ZWAsXG4gICAqIGAuYmVsb3dgLCBgLmxlYXN0YCwgYC5tb3N0YCwgYW5kIGAud2l0aGluYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZVxuICAgKiBjaGFpbiB0byB1c2UgdGhlIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGFzIHRoZSB0YXJnZXQuIEhvd2V2ZXIsIGl0J3NcbiAgICogb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0J3MgYGxlbmd0aGAgcHJvcGVydHkgaXMgZXF1YWwgdG8gaXRzXG4gICAqIGV4cGVjdGVkIGxlbmd0aCwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXRzIGBsZW5ndGhgIHByb3BlcnR5IGZhbGxzXG4gICAqIHdpdGhpbiBzb21lIHJhbmdlIG9mIHZhbHVlcy5cbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmFib3ZlKDIpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi5iZWxvdyg0KTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYXQubGVhc3QoMyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmF0Lm1vc3QoMyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLndpdGhpbigyLDQpO1xuICAgKlxuICAgKiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCB0aGUgYWxpYXMgYC5sZW5ndGhgIGNhbid0IGJlIGNoYWluZWQgZGlyZWN0bHlcbiAgICogb2ZmIG9mIGFuIHVuaW52b2tlZCBtZXRob2Qgc3VjaCBhcyBgLmFgLiBUaGVyZWZvcmUsIGAubGVuZ3RoYCBjYW4ndCBiZSB1c2VkXG4gICAqIGludGVyY2hhbmdlYWJseSB3aXRoIGAubGVuZ3RoT2ZgIGluIGV2ZXJ5IHNpdHVhdGlvbi4gSXQncyByZWNvbW1lbmRlZCB0b1xuICAgKiBhbHdheXMgdXNlIGAubGVuZ3RoT2ZgIGluc3RlYWQgb2YgYC5sZW5ndGhgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5hLmxlbmd0aCgzKTsgLy8gaW5jb21wYXRpYmxlOyB0aHJvd3MgZXJyb3JcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUuYS5sZW5ndGhPZigzKTsgIC8vIHBhc3NlcyBhcyBleHBlY3RlZFxuICAgKlxuICAgKiBAbmFtZSBsZW5ndGhPZlxuICAgKiBAYWxpYXMgbGVuZ3RoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRMZW5ndGhDaGFpbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnZG9MZW5ndGgnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydExlbmd0aCAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgdmFyIGxlbiA9IG9iai5sZW5ndGg7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbGVuID09IG5cbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIGxlbmd0aCBvZiAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgbGVuZ3RoIG9mICN7YWN0fSdcbiAgICAgICwgblxuICAgICAgLCBsZW5cbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnbGVuZ3RoJywgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2xlbmd0aE9mJywgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5cbiAgLyoqXG4gICAqICMjIyAubWF0Y2gocmVbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBtYXRjaGVzIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gYHJlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8ubWF0Y2goL15mb28vKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5tYXRjaGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLm5vdC5tYXRjaCgvdGFjby8pO1xuICAgKlxuICAgKiBgLm1hdGNoYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLm1hdGNoKC90YWNvLywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KCdmb29iYXInLCAnbm9vbyB3aHkgZmFpbD8/JykudG8ubWF0Y2goL3RhY28vKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAubWF0Y2hlc2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5tYXRjaGAuXG4gICAqXG4gICAqIEBuYW1lIG1hdGNoXG4gICAqIEBhbGlhcyBtYXRjaGVzXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIGZ1bmN0aW9uIGFzc2VydE1hdGNoKHJlLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIHJlLmV4ZWMob2JqKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBtYXRjaCAnICsgcmVcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIG1hdGNoICcgKyByZVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdtYXRjaCcsIGFzc2VydE1hdGNoKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbWF0Y2hlcycsIGFzc2VydE1hdGNoKTtcblxuICAvKipcbiAgICogIyMjIC5zdHJpbmcoc3RyWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgc3RyaW5nIGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcgYHN0cmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLmhhdmUuc3RyaW5nKCdiYXInKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5zdHJpbmdgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5ub3QuaGF2ZS5zdHJpbmcoJ3RhY28nKTtcbiAgICpcbiAgICogYC5zdHJpbmdgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8uaGF2ZS5zdHJpbmcoL3RhY28vLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicsICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLnN0cmluZygvdGFjby8pO1xuICAgKlxuICAgKiBAbmFtZSBzdHJpbmdcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnc3RyaW5nJywgZnVuY3Rpb24gKHN0ciwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnc3RyaW5nJyk7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgfm9iai5pbmRleE9mKHN0cilcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiAnICsgXy5pbnNwZWN0KHN0cilcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGNvbnRhaW4gJyArIF8uaW5zcGVjdChzdHIpXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAua2V5cyhrZXkxWywga2V5MlssIC4uLl1dKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBvYmplY3QsIGFycmF5LCBtYXAsIG9yIHNldCBoYXMgdGhlIGdpdmVuIGtleXMuIE9ubHlcbiAgICogdGhlIHRhcmdldCdzIG93biBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaC4gXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhbiBvYmplY3Qgb3IgYXJyYXksIGtleXMgY2FuIGJlIHByb3ZpZGVkIGFzIG9uZSBvciBtb3JlXG4gICAqIHN0cmluZyBhcmd1bWVudHMsIGEgc2luZ2xlIGFycmF5IGFyZ3VtZW50LCBvciBhIHNpbmdsZSBvYmplY3QgYXJndW1lbnQuIEluXG4gICAqIHRoZSBsYXR0ZXIgY2FzZSwgb25seSB0aGUga2V5cyBpbiB0aGUgZ2l2ZW4gb2JqZWN0IG1hdHRlcjsgdGhlIHZhbHVlcyBhcmVcbiAgICogaWdub3JlZC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KFsneCcsICd5J10pLnRvLmhhdmUuYWxsLmtleXMoMCwgMSk7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmFsbC5rZXlzKFsnYScsICdiJ10pO1xuICAgKiAgICAgZXhwZWN0KFsneCcsICd5J10pLnRvLmhhdmUuYWxsLmtleXMoWzAsIDFdKTtcbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoe2E6IDQsIGI6IDV9KTsgLy8gaWdub3JlIDQgYW5kIDVcbiAgICogICAgIGV4cGVjdChbJ3gnLCAneSddKS50by5oYXZlLmFsbC5rZXlzKHswOiA0LCAxOiA1fSk7IC8vIGlnbm9yZSA0IGFuZCA1XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIG1hcCBvciBzZXQsIGVhY2gga2V5IG11c3QgYmUgcHJvdmlkZWQgYXMgYSBzZXBhcmF0ZVxuICAgKiBhcmd1bWVudC5cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl1dKSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3QobmV3IFNldChbJ2EnLCAnYiddKSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEJlY2F1c2UgYC5rZXlzYCBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIHRhcmdldCdzIHR5cGUsIGl0J3NcbiAgICogaW1wb3J0YW50IHRvIGNoZWNrIHRoZSB0YXJnZXQncyB0eXBlIGJlZm9yZSB1c2luZyBgLmtleXNgLiBTZWUgdGhlIGAuYWAgZG9jXG4gICAqIGZvciBpbmZvIG9uIHRlc3RpbmcgYSB0YXJnZXQncyB0eXBlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uYmUuYW4oJ29iamVjdCcpLnRoYXQuaGFzLmFsbC5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgc3RyaWN0IChgPT09YCkgZXF1YWxpdHkgaXMgdXNlZCB0byBjb21wYXJlIGtleXMgb2YgbWFwcyBhbmRcbiAgICogc2V0cy4gQWRkIGAuZGVlcGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gdXNlIGRlZXAgZXF1YWxpdHkgaW5zdGVhZC4gU2VlXG4gICAqIHRoZSBgZGVlcC1lcWxgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcCBlcXVhbGl0eSBhbGdvcml0aG06XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgc2V0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIGtleSBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5oYXZlLmFsbC5kZWVwLmtleXMoW3thOiAxfV0pO1xuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5ub3QuaGF2ZS5hbGwua2V5cyhbe2E6IDF9XSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSB0YXJnZXQgbXVzdCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cyBhbmQgbm8gbW9yZS4gQWRkXG4gICAqIGAuYW55YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBvbmx5IHJlcXVpcmUgdGhhdCB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3RcbiAgICogb25lIG9mIHRoZSBnaXZlbiBrZXlzLiBBbHNvLCBhZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZVxuICAgKiBgLmtleXNgLiBJdCdzIG9mdGVuIGJlc3QgdG8gYWRkIGAuYW55YCB3aGVuIG5lZ2F0aW5nIGAua2V5c2AsIGFuZCB0byB1c2VcbiAgICogYC5hbGxgIHdoZW4gYXNzZXJ0aW5nIGAua2V5c2Agd2l0aG91dCBuZWdhdGlvbi5cbiAgICpcbiAgICogV2hlbiBuZWdhdGluZyBgLmtleXNgLCBgLmFueWAgaXMgcHJlZmVycmVkIGJlY2F1c2UgYC5ub3QuYW55LmtleXNgIGFzc2VydHNcbiAgICogZXhhY3RseSB3aGF0J3MgZXhwZWN0ZWQgb2YgdGhlIG91dHB1dCwgd2hlcmVhcyBgLm5vdC5hbGwua2V5c2AgY3JlYXRlc1xuICAgKiB1bmNlcnRhaW4gZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgZG9lc24ndCBoYXZlIGFueSBvZiB0aGUgZ2l2ZW4ga2V5c1xuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8ubm90LmhhdmUuYW55LmtleXMoJ2MnLCAnZCcpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkOyBhc3NlcnRzIHRoYXQgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBhbGwgb2YgdGhlIGdpdmVuXG4gICAqICAgICAvLyBrZXlzIGJ1dCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNvbWUgb2YgdGhlbVxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8ubm90LmhhdmUuYWxsLmtleXMoJ2MnLCAnZCcpO1xuICAgKlxuICAgKiBXaGVuIGFzc2VydGluZyBgLmtleXNgIHdpdGhvdXQgbmVnYXRpb24sIGAuYWxsYCBpcyBwcmVmZXJyZWQgYmVjYXVzZVxuICAgKiBgLmFsbC5rZXlzYCBhc3NlcnRzIGV4YWN0bHkgd2hhdCdzIGV4cGVjdGVkIG9mIHRoZSBvdXRwdXQsIHdoZXJlYXNcbiAgICogYC5hbnkua2V5c2AgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgaGFzIGFsbCB0aGUgZ2l2ZW4ga2V5c1xuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW5cbiAgICogICAgIC8vIGtleXMgYnV0IG1heSBvciBtYXkgbm90IGhhdmUgbW9yZSBvZiB0aGVtXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmFueS5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGAuYWxsYCBpcyB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBuZWl0aGVyIGAuYWxsYCBub3IgYC5hbnlgIGFwcGVhclxuICAgKiBlYXJsaWVyIGluIHRoZSBjaGFpbi4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFkZCBgLmFsbGAgYW55d2F5IGJlY2F1c2VcbiAgICogaXQgaW1wcm92ZXMgcmVhZGFiaWxpdHkuXG4gICAqXG4gICAqICAgICAvLyBCb3RoIGFzc2VydGlvbnMgYXJlIGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmtleXMoJ2EnLCAnYicpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAuaW5jbHVkZWAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gcmVxdWlyZSB0aGF0IHRoZSB0YXJnZXQncyBrZXlzIGJlIGFcbiAgICogc3VwZXJzZXQgb2YgdGhlIGV4cGVjdGVkIGtleXMsIHJhdGhlciB0aGFuIGlkZW50aWNhbCBzZXRzLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCdzIGtleXMgYXJlIGEgc3VwZXJzZXQgb2YgWydhJywgJ2InXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyLCBjOiAzfSkudG8uaW5jbHVkZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDIsIGM6IDN9KS50by5ub3QuaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEhvd2V2ZXIsIGlmIGAuYW55YCBhbmQgYC5pbmNsdWRlYCBhcmUgY29tYmluZWQsIG9ubHkgdGhlIGAuYW55YCB0YWtlc1xuICAgKiBlZmZlY3QuIFRoZSBgLmluY2x1ZGVgIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLlxuICAgKlxuICAgKiAgICAgLy8gQm90aCBhc3NlcnRpb25zIGFyZSBpZGVudGljYWxcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUuYW55LmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZS5hbnkua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5rZXkoJ2InKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAua2V5YCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmtleXNgLlxuICAgKlxuICAgKiBAbmFtZSBrZXlzXG4gICAqIEBhbGlhcyBrZXlcbiAgICogQHBhcmFtIHsuLi5TdHJpbmd8QXJyYXl8T2JqZWN0fSBrZXlzXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEtleXMgKGtleXMpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopXG4gICAgICAsIGtleXNUeXBlID0gXy50eXBlKGtleXMpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgaXNEZWVwID0gZmxhZyh0aGlzLCAnZGVlcCcpXG4gICAgICAsIHN0clxuICAgICAgLCBkZWVwU3RyID0gJydcbiAgICAgICwgb2sgPSB0cnVlXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJyk7XG5cbiAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG4gICAgdmFyIG1peGVkQXJnc01zZyA9IGZsYWdNc2cgKyAnd2hlbiB0ZXN0aW5nIGtleXMgYWdhaW5zdCBhbiBvYmplY3Qgb3IgYW4gYXJyYXkgeW91IG11c3QgZ2l2ZSBhIHNpbmdsZSBBcnJheXxPYmplY3R8U3RyaW5nIGFyZ3VtZW50IG9yIG11bHRpcGxlIFN0cmluZyBhcmd1bWVudHMnO1xuXG4gICAgaWYgKG9ialR5cGUgPT09ICdNYXAnIHx8IG9ialR5cGUgPT09ICdTZXQnKSB7XG4gICAgICBkZWVwU3RyID0gaXNEZWVwID8gJ2RlZXBseSAnIDogJyc7XG4gICAgICBhY3R1YWwgPSBbXTtcblxuICAgICAgLy8gTWFwIGFuZCBTZXQgJy5rZXlzJyBhcmVuJ3Qgc3VwcG9ydGVkIGluIElFIDExLiBUaGVyZWZvcmUsIHVzZSAuZm9yRWFjaC5cbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uICh2YWwsIGtleSkgeyBhY3R1YWwucHVzaChrZXkpIH0pO1xuXG4gICAgICBpZiAoa2V5c1R5cGUgIT09ICdBcnJheScpIHtcbiAgICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsID0gXy5nZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyhvYmopO1xuXG4gICAgICBzd2l0Y2ggKGtleXNUeXBlKSB7XG4gICAgICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHVuZGVmaW5lZCwgc3NmaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdPYmplY3QnOlxuICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1peGVkQXJnc01zZywgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHN0cmluZ2lmeSBub24tU3ltYm9scyBiZWNhdXNlIFN5bWJvbHMgd291bGQgYmVjb21lIFwiU3ltYm9sKClcIlxuICAgICAga2V5cyA9IGtleXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzeW1ib2wnID8gdmFsIDogU3RyaW5nKHZhbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmxhZ01zZyArICdrZXlzIHJlcXVpcmVkJywgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICB9XG5cbiAgICB2YXIgbGVuID0ga2V5cy5sZW5ndGhcbiAgICAgICwgYW55ID0gZmxhZyh0aGlzLCAnYW55JylcbiAgICAgICwgYWxsID0gZmxhZyh0aGlzLCAnYWxsJylcbiAgICAgICwgZXhwZWN0ZWQgPSBrZXlzXG4gICAgICAsIGFjdHVhbDtcblxuICAgIGlmICghYW55ICYmICFhbGwpIHtcbiAgICAgIGFsbCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSGFzIGFueVxuICAgIGlmIChhbnkpIHtcbiAgICAgIG9rID0gZXhwZWN0ZWQuc29tZShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oYWN0dWFsS2V5KSB7XG4gICAgICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICAgICAgcmV0dXJuIF8uZXFsKGV4cGVjdGVkS2V5LCBhY3R1YWxLZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWRLZXkgPT09IGFjdHVhbEtleTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFzIGFsbFxuICAgIGlmIChhbGwpIHtcbiAgICAgIG9rID0gZXhwZWN0ZWQuZXZlcnkoZnVuY3Rpb24oZXhwZWN0ZWRLZXkpIHtcbiAgICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBfLmVxbChleHBlY3RlZEtleSwgYWN0dWFsS2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkS2V5ID09PSBhY3R1YWxLZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWZsYWcodGhpcywgJ2NvbnRhaW5zJykpIHtcbiAgICAgICAgb2sgPSBvayAmJiBrZXlzLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEtleSBzdHJpbmdcbiAgICBpZiAobGVuID4gMSkge1xuICAgICAga2V5cyA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gXy5pbnNwZWN0KGtleSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBsYXN0ID0ga2V5cy5wb3AoKTtcbiAgICAgIGlmIChhbGwpIHtcbiAgICAgICAgc3RyID0ga2V5cy5qb2luKCcsICcpICsgJywgYW5kICcgKyBsYXN0O1xuICAgICAgfVxuICAgICAgaWYgKGFueSkge1xuICAgICAgICBzdHIgPSBrZXlzLmpvaW4oJywgJykgKyAnLCBvciAnICsgbGFzdDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gXy5pbnNwZWN0KGtleXNbMF0pO1xuICAgIH1cblxuICAgIC8vIEZvcm1cbiAgICBzdHIgPSAobGVuID4gMSA/ICdrZXlzICcgOiAna2V5ICcpICsgc3RyO1xuXG4gICAgLy8gSGF2ZSAvIGluY2x1ZGVcbiAgICBzdHIgPSAoZmxhZyh0aGlzLCAnY29udGFpbnMnKSA/ICdjb250YWluICcgOiAnaGF2ZSAnKSArIHN0cjtcblxuICAgIC8vIEFzc2VydGlvblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBva1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byAnICsgZGVlcFN0ciArIHN0clxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgJyArIGRlZXBTdHIgKyBzdHJcbiAgICAgICwgZXhwZWN0ZWQuc2xpY2UoMCkuc29ydChfLmNvbXBhcmVCeUluc3BlY3QpXG4gICAgICAsIGFjdHVhbC5zb3J0KF8uY29tcGFyZUJ5SW5zcGVjdClcbiAgICAgICwgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdrZXlzJywgYXNzZXJ0S2V5cyk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2tleScsIGFzc2VydEtleXMpO1xuXG4gIC8qKlxuICAgKiAjIyMgLnRocm93KFtlcnJvckxpa2VdLCBbZXJyTXNnTWF0Y2hlcl0sIFttc2ddKVxuICAgKlxuICAgKiBXaGVuIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIGAudGhyb3dgIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBhbmRcbiAgICogYXNzZXJ0cyB0aGF0IGFuIGVycm9yIGlzIHRocm93bi5cbiAgICogXG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgc2FsbW9uIScpOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdygpO1xuICAgKlxuICAgKiBXaGVuIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgYW5kIGl0J3MgYW4gZXJyb3IgY29uc3RydWN0b3IsIGAudGhyb3dgXG4gICAqIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBhbmQgYXNzZXJ0cyB0aGF0IGFuIGVycm9yIGlzIHRocm93biB0aGF0J3MgYW5cbiAgICogaW5zdGFuY2Ugb2YgdGhhdCBlcnJvciBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBhbmQgaXQncyBhbiBlcnJvciBpbnN0YW5jZSwgYC50aHJvd2AgaW52b2tlc1xuICAgKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGFuZCBhc3NlcnRzIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duIHRoYXQncyBzdHJpY3RseVxuICAgKiAoYD09PWApIGVxdWFsIHRvIHRoYXQgZXJyb3IgaW5zdGFuY2UuXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7XG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IGVycjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coZXJyKTtcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGFuZCBpdCdzIGEgc3RyaW5nLCBgLnRocm93YCBpbnZva2VzIHRoZVxuICAgKiB0YXJnZXQgZnVuY3Rpb24gYW5kIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24gd2l0aCBhIG1lc3NhZ2UgdGhhdFxuICAgKiBjb250YWlucyB0aGF0IHN0cmluZy5cbiAgICpcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KCdzYWxtb24nKTtcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGFuZCBpdCdzIGEgcmVndWxhciBleHByZXNzaW9uLCBgLnRocm93YFxuICAgKiBpbnZva2VzIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24gd2l0aCBhXG4gICAqIG1lc3NhZ2UgdGhhdCBtYXRjaGVzIHRoYXQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiAgICAgdmFyIGJhZEZuID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIHNhbG1vbiEnKTsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coL3NhbG1vbi8pO1xuICAgKlxuICAgKiBXaGVuIHR3byBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBhbmQgdGhlIGZpcnN0IGlzIGFuIGVycm9yIGluc3RhbmNlIG9yXG4gICAqIGNvbnN0cnVjdG9yLCBhbmQgdGhlIHNlY29uZCBpcyBhIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24sIGAudGhyb3dgXG4gICAqIGludm9rZXMgdGhlIGZ1bmN0aW9uIGFuZCBhc3NlcnRzIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duIHRoYXQgZnVsZmlsbHMgYm90aFxuICAgKiBjb25kaXRpb25zIGFzIGRlc2NyaWJlZCBhYm92ZS5cbiAgICpcbiAgICogICAgIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIHNhbG1vbiEnKTtcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgZXJyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICdzYWxtb24nKTtcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coVHlwZUVycm9yLCAvc2FsbW9uLyk7XG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KGVyciwgJ3NhbG1vbicpO1xuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhlcnIsIC9zYWxtb24vKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC50aHJvd2AuXG4gICAqICAgICBcbiAgICogICAgIHZhciBnb29kRm4gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChnb29kRm4pLnRvLm5vdC50aHJvdygpO1xuICAgKiBcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAudGhyb3dgIHdoZW4gcHJvdmlkaW5nIGFueSBhcmd1bWVudHMuXG4gICAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zIGJ5IGFzc2VydGluZyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgZWl0aGVyIGRvZXNuJ3QgdGhyb3cgYW4gZXJyb3IsIG9yIHRoYXQgaXQgdGhyb3dzIGFuIGVycm9yIGJ1dCBvZiBhXG4gICAqIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhlIGdpdmVuIHR5cGUsIG9yIHRoYXQgaXQgdGhyb3dzIGFuIGVycm9yIG9mIHRoZSBnaXZlblxuICAgKiB0eXBlIGJ1dCB3aXRoIGEgbWVzc2FnZSB0aGF0IGRvZXNuJ3QgaW5jbHVkZSB0aGUgZ2l2ZW4gc3RyaW5nLiBJdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuXG4gICAqIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzbid0IGV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIHZhciBnb29kRm4gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChnb29kRm4pLnRvLm5vdC50aHJvdygpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGdvb2RGbikudG8ubm90LnRocm93KFJlZmVyZW5jZUVycm9yLCAneCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIHRoYXQgdGhlIGVycm9yIGlzIG9mIGl0cyBleHBlY3RlZCB0eXBlLCBhbmQgaGFzIGEgbWVzc2FnZSB0aGF0IGluY2x1ZGVzIGFuXG4gICAqIGV4cGVjdGVkIHN0cmluZywgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55XG4gICAqIHVuZXhwZWN0ZWQgdHlwZXMsIGFuZCBkb2Vzbid0IGhhdmUgYSBtZXNzYWdlIHRoYXQgaW5jbHVkZXMgc29tZSBzdHJpbmcuXG4gICAqXG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgc2FsbW9uIScpOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICdzYWxtb24nKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8ubm90LnRocm93KFJlZmVyZW5jZUVycm9yLCAneCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC50aHJvd2AgY2hhbmdlcyB0aGUgdGFyZ2V0IG9mIGFueSBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0b1xuICAgKiBiZSB0aGUgZXJyb3Igb2JqZWN0IHRoYXQncyB0aHJvd24uXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7XG4gICAqICAgICBlcnIuY29kZSA9IDQyO1xuICAgKiAgICAgdmFyIGJhZEZuID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBlcnI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KFR5cGVFcnJvcikud2l0aC5wcm9wZXJ0eSgnY29kZScsIDQyKTtcbiAgICpcbiAgICogYC50aHJvd2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzIHVzZVxuICAgKiB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgZ29vZEZuID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QoZ29vZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICd4JywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KGdvb2RGbiwgJ25vb28gd2h5IGZhaWw/PycpLnRvLnRocm93KCk7XG4gICAqXG4gICAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBFUzUsIGAudGhyb3dgIG1heSBub3QgYWx3YXlzIHdvcmsgYXMgZXhwZWN0ZWQgd2hlblxuICAgKiB1c2luZyBhIHRyYW5zcGlsZXIgc3VjaCBhcyBCYWJlbCBvciBUeXBlU2NyaXB0LiBJbiBwYXJ0aWN1bGFyLCBpdCBtYXlcbiAgICogcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiBzdWJjbGFzc2luZyB0aGUgYnVpbHQtaW4gYEVycm9yYCBvYmplY3QgYW5kXG4gICAqIHRoZW4gcGFzc2luZyB0aGUgc3ViY2xhc3NlZCBjb25zdHJ1Y3RvciB0byBgLnRocm93YC4gU2VlIHlvdXIgdHJhbnNwaWxlcidzXG4gICAqIGRvY3MgZm9yIGRldGFpbHM6XG4gICAqXG4gICAqIC0gKFtCYWJlbF0oaHR0cHM6Ly9iYWJlbGpzLmlvL2RvY3MvdXNhZ2UvY2F2ZWF0cy8jY2xhc3NlcykpXG4gICAqIC0gKFtUeXBlU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29yaykpXG4gICAqXG4gICAqIEJld2FyZSBvZiBzb21lIGNvbW1vbiBtaXN0YWtlcyB3aGVuIHVzaW5nIHRoZSBgdGhyb3dgIGFzc2VydGlvbi4gT25lIGNvbW1vblxuICAgKiBtaXN0YWtlIGlzIHRvIGFjY2lkZW50YWxseSBpbnZva2UgdGhlIGZ1bmN0aW9uIHlvdXJzZWxmIGluc3RlYWQgb2YgbGV0dGluZ1xuICAgKiB0aGUgYHRocm93YCBhc3NlcnRpb24gaW52b2tlIHRoZSBmdW5jdGlvbiBmb3IgeW91LiBGb3IgZXhhbXBsZSwgd2hlblxuICAgKiB0ZXN0aW5nIGlmIGEgZnVuY3Rpb24gbmFtZWQgYGZuYCB0aHJvd3MsIHByb3ZpZGUgYGZuYCBpbnN0ZWFkIG9mIGBmbigpYCBhc1xuICAgKiB0aGUgdGFyZ2V0IGZvciB0aGUgYXNzZXJ0aW9uLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZuKS50by50aHJvdygpOyAgICAgLy8gR29vZCEgVGVzdHMgYGZuYCBhcyBkZXNpcmVkXG4gICAqICAgICBleHBlY3QoZm4oKSkudG8udGhyb3coKTsgICAvLyBCYWQhIFRlc3RzIHJlc3VsdCBvZiBgZm4oKWAsIG5vdCBgZm5gXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIGFzc2VydCB0aGF0IHlvdXIgZnVuY3Rpb24gYGZuYCB0aHJvd3Mgd2hlbiBwYXNzZWQgY2VydGFpblxuICAgKiBhcmd1bWVudHMsIHRoZW4gd3JhcCBhIGNhbGwgdG8gYGZuYCBpbnNpZGUgb2YgYW5vdGhlciBmdW5jdGlvbi5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7IGZuKDQyKTsgfSkudG8udGhyb3coKTsgIC8vIEZ1bmN0aW9uIGV4cHJlc3Npb25cbiAgICogICAgIGV4cGVjdCgoKSA9PiBmbig0MikpLnRvLnRocm93KCk7ICAgICAgICAgICAgIC8vIEVTNiBhcnJvdyBmdW5jdGlvblxuICAgKlxuICAgKiBBbm90aGVyIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHByb3ZpZGUgYW4gb2JqZWN0IG1ldGhvZCAob3IgYW55IHN0YW5kLWFsb25lXG4gICAqIGZ1bmN0aW9uIHRoYXQgcmVsaWVzIG9uIGB0aGlzYCkgYXMgdGhlIHRhcmdldCBvZiB0aGUgYXNzZXJ0aW9uLiBEb2luZyBzbyBpc1xuICAgKiBwcm9ibGVtYXRpYyBiZWNhdXNlIHRoZSBgdGhpc2AgY29udGV4dCB3aWxsIGJlIGxvc3Qgd2hlbiB0aGUgZnVuY3Rpb24gaXNcbiAgICogaW52b2tlZCBieSBgLnRocm93YDsgdGhlcmUncyBubyB3YXkgZm9yIGl0IHRvIGtub3cgd2hhdCBgdGhpc2AgaXMgc3VwcG9zZWRcbiAgICogdG8gYmUuIFRoZXJlIGFyZSB0d28gd2F5cyBhcm91bmQgdGhpcyBwcm9ibGVtLiBPbmUgc29sdXRpb24gaXMgdG8gd3JhcCB0aGVcbiAgICogbWV0aG9kIG9yIGZ1bmN0aW9uIGNhbGwgaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24uIEFub3RoZXIgc29sdXRpb24gaXMgdG9cbiAgICogdXNlIGBiaW5kYC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7IGNhdC5tZW93KCk7IH0pLnRvLnRocm93KCk7ICAvLyBGdW5jdGlvbiBleHByZXNzaW9uXG4gICAqICAgICBleHBlY3QoKCkgPT4gY2F0Lm1lb3coKSkudG8udGhyb3coKTsgICAgICAgICAgICAgLy8gRVM2IGFycm93IGZ1bmN0aW9uXG4gICAqICAgICBleHBlY3QoY2F0Lm1lb3cuYmluZChjYXQpKS50by50aHJvdygpOyAgICAgICAgICAgLy8gQmluZFxuICAgKlxuICAgKiBGaW5hbGx5LCBpdCdzIHdvcnRoIG1lbnRpb25pbmcgdGhhdCBpdCdzIGEgYmVzdCBwcmFjdGljZSBpbiBKYXZhU2NyaXB0IHRvXG4gICAqIG9ubHkgdGhyb3cgYEVycm9yYCBhbmQgZGVyaXZhdGl2ZXMgb2YgYEVycm9yYCBzdWNoIGFzIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAqIGBUeXBlRXJyb3JgLCBhbmQgdXNlci1kZWZpbmVkIG9iamVjdHMgdGhhdCBleHRlbmQgYEVycm9yYC4gTm8gb3RoZXIgdHlwZSBvZlxuICAgKiB2YWx1ZSB3aWxsIGdlbmVyYXRlIGEgc3RhY2sgdHJhY2Ugd2hlbiBpbml0aWFsaXplZC4gV2l0aCB0aGF0IHNhaWQsIHRoZVxuICAgKiBgdGhyb3dgIGFzc2VydGlvbiBkb2VzIHRlY2huaWNhbGx5IHN1cHBvcnQgYW55IHR5cGUgb2YgdmFsdWUgYmVpbmcgdGhyb3duLFxuICAgKiBub3QganVzdCBgRXJyb3JgIGFuZCBpdHMgZGVyaXZhdGl2ZXMuXG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAudGhyb3dzYCBhbmQgYC5UaHJvd2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGhcbiAgICogYC50aHJvd2AuXG4gICAqXG4gICAqIEBuYW1lIHRocm93XG4gICAqIEBhbGlhcyB0aHJvd3NcbiAgICogQGFsaWFzIFRocm93XG4gICAqIEBwYXJhbSB7RXJyb3J8RXJyb3JDb25zdHJ1Y3Rvcn0gZXJyb3JMaWtlXG4gICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gZXJyTXNnTWF0Y2hlciBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0Vycm9yX3R5cGVzXG4gICAqIEByZXR1cm5zIGVycm9yIGZvciBjaGFpbmluZyAobnVsbCBpZiBubyBlcnJvcilcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0VGhyb3dzIChlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgbmVnYXRlID0gZmxhZyh0aGlzLCAnbmVnYXRlJykgfHwgZmFsc2U7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHR5cGVvZiBlcnJvckxpa2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY2F1Z2h0RXJyO1xuICAgIHRyeSB7XG4gICAgICBvYmooKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhdWdodEVyciA9IGVycjtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIHRoZSBuZWdhdGUgZmxhZyBlbmFibGVkIGFuZCBhdCBsZWFzdCBvbmUgdmFsaWQgYXJndW1lbnQgaXQgbWVhbnMgd2UgZG8gZXhwZWN0IGFuIGVycm9yXG4gICAgLy8gYnV0IHdlIHdhbnQgaXQgdG8gbWF0Y2ggYSBnaXZlbiBzZXQgb2YgY3JpdGVyaWFcbiAgICB2YXIgZXZlcnlBcmdJc1VuZGVmaW5lZCA9IGVycm9yTGlrZSA9PT0gdW5kZWZpbmVkICYmIGVyck1zZ01hdGNoZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHdlJ3ZlIGdvdCB0aGUgbmVnYXRlIGZsYWcgZW5hYmxlZCBhbmQgYm90aCBhcmdzLCB3ZSBzaG91bGQgb25seSBmYWlsIGlmIGJvdGggYXJlbid0IGNvbXBhdGlibGVcbiAgICAvLyBTZWUgSXNzdWUgIzU1MSBhbmQgUFIgIzY4M0BHaXRIdWJcbiAgICB2YXIgZXZlcnlBcmdJc0RlZmluZWQgPSBCb29sZWFuKGVycm9yTGlrZSAmJiBlcnJNc2dNYXRjaGVyKTtcbiAgICB2YXIgZXJyb3JMaWtlRmFpbCA9IGZhbHNlO1xuICAgIHZhciBlcnJNc2dNYXRjaGVyRmFpbCA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgZXJyb3Igd2FzIHRocm93blxuICAgIGlmIChldmVyeUFyZ0lzVW5kZWZpbmVkIHx8ICFldmVyeUFyZ0lzVW5kZWZpbmVkICYmICFuZWdhdGUpIHtcbiAgICAgIC8vIFdlIG5lZWQgdGhpcyB0byBkaXNwbGF5IHJlc3VsdHMgY29ycmVjdGx5IGFjY29yZGluZyB0byB0aGVpciB0eXBlc1xuICAgICAgdmFyIGVycm9yTGlrZVN0cmluZyA9ICdhbiBlcnJvcic7XG4gICAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgZXJyb3JMaWtlU3RyaW5nID0gJyN7ZXhwfSc7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yTGlrZSkge1xuICAgICAgICBlcnJvckxpa2VTdHJpbmcgPSBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGNhdWdodEVyclxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICcgKyBlcnJvckxpa2VTdHJpbmdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgYW4gZXJyb3IgYnV0ICN7YWN0fSB3YXMgdGhyb3duJ1xuICAgICAgICAsIGVycm9yTGlrZSAmJiBlcnJvckxpa2UudG9TdHJpbmcoKVxuICAgICAgICAsIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/XG4gICAgICAgICAgICBjYXVnaHRFcnIudG9TdHJpbmcoKSA6ICh0eXBlb2YgY2F1Z2h0RXJyID09PSAnc3RyaW5nJyA/IGNhdWdodEVyciA6IGNhdWdodEVyciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5jaGVja0Vycm9yLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yTGlrZSAmJiBjYXVnaHRFcnIpIHtcbiAgICAgIC8vIFdlIHNob3VsZCBjb21wYXJlIGluc3RhbmNlcyBvbmx5IGlmIGBlcnJvckxpa2VgIGlzIGFuIGluc3RhbmNlIG9mIGBFcnJvcmBcbiAgICAgIGlmIChlcnJvckxpa2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB2YXIgaXNDb21wYXRpYmxlSW5zdGFuY2UgPSBfLmNoZWNrRXJyb3IuY29tcGF0aWJsZUluc3RhbmNlKGNhdWdodEVyciwgZXJyb3JMaWtlKTtcblxuICAgICAgICBpZiAoaXNDb21wYXRpYmxlSW5zdGFuY2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICAgIC8vIFRoZXNlIGNoZWNrcyB3ZXJlIGNyZWF0ZWQgdG8gZW5zdXJlIHdlIHdvbid0IGZhaWwgdG9vIHNvb24gd2hlbiB3ZSd2ZSBnb3QgYm90aCBhcmdzIGFuZCBhIG5lZ2F0ZVxuICAgICAgICAgIC8vIFNlZSBJc3N1ZSAjNTUxIGFuZCBQUiAjNjgzQEdpdEh1YlxuICAgICAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgICAgIGVycm9yTGlrZUZhaWwgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyAje2V4cH0gYnV0ICN7YWN0fSB3YXMgdGhyb3duJ1xuICAgICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH0nICsgKGNhdWdodEVyciAmJiAhbmVnYXRlID8gJyBidXQgI3thY3R9IHdhcyB0aHJvd24nIDogJycpXG4gICAgICAgICAgICAgICwgZXJyb3JMaWtlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgLCBjYXVnaHRFcnIudG9TdHJpbmcoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGlzQ29tcGF0aWJsZUNvbnN0cnVjdG9yID0gXy5jaGVja0Vycm9yLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihjYXVnaHRFcnIsIGVycm9yTGlrZSk7XG4gICAgICBpZiAoaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgICBlcnJvckxpa2VGYWlsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgbmVnYXRlXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICN7ZXhwfSBidXQgI3thY3R9IHdhcyB0aHJvd24nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH0nICsgKGNhdWdodEVyciA/ICcgYnV0ICN7YWN0fSB3YXMgdGhyb3duJyA6ICcnKVxuICAgICAgICAgICAgLCAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkpXG4gICAgICAgICAgICAsIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVyci50b1N0cmluZygpIDogY2F1Z2h0RXJyICYmIF8uY2hlY2tFcnJvci5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNhdWdodEVyciAmJiBlcnJNc2dNYXRjaGVyICE9PSB1bmRlZmluZWQgJiYgZXJyTXNnTWF0Y2hlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSGVyZSB3ZSBjaGVjayBjb21wYXRpYmxlIG1lc3NhZ2VzXG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSAnaW5jbHVkaW5nJztcbiAgICAgIGlmIChlcnJNc2dNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyID0gJ21hdGNoaW5nJ1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNDb21wYXRpYmxlTWVzc2FnZSA9IF8uY2hlY2tFcnJvci5jb21wYXRpYmxlTWVzc2FnZShjYXVnaHRFcnIsIGVyck1zZ01hdGNoZXIpO1xuICAgICAgaWYgKGlzQ29tcGF0aWJsZU1lc3NhZ2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgICBlcnJNc2dNYXRjaGVyRmFpbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3IgJyArIHBsYWNlaG9sZGVyICsgJyAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IGVycm9yIG5vdCAnICsgcGxhY2Vob2xkZXIgKyAnICN7ZXhwfSdcbiAgICAgICAgICAgICwgIGVyck1zZ01hdGNoZXJcbiAgICAgICAgICAgICwgIF8uY2hlY2tFcnJvci5nZXRNZXNzYWdlKGNhdWdodEVycilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYm90aCBhc3NlcnRpb25zIGZhaWxlZCBhbmQgYm90aCBzaG91bGQndmUgbWF0Y2hlZCB3ZSB0aHJvdyBhbiBlcnJvclxuICAgIGlmIChlcnJvckxpa2VGYWlsICYmIGVyck1zZ01hdGNoZXJGYWlsKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbmVnYXRlXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93bidcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgI3tleHB9JyArIChjYXVnaHRFcnIgPyAnIGJ1dCAje2FjdH0gd2FzIHRocm93bicgOiAnJylcbiAgICAgICAgLCAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkpXG4gICAgICAgICwgKGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyLnRvU3RyaW5nKCkgOiBjYXVnaHRFcnIgJiYgXy5jaGVja0Vycm9yLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBjYXVnaHRFcnIpO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3Rocm93JywgYXNzZXJ0VGhyb3dzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgndGhyb3dzJywgYXNzZXJ0VGhyb3dzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnVGhyb3cnLCBhc3NlcnRUaHJvd3MpO1xuXG4gIC8qKlxuICAgKiAjIyMgLnJlc3BvbmRUbyhtZXRob2RbLCBtc2ddKVxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBgLnJlc3BvbmRUb2AgYXNzZXJ0cyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgaGFzIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgYG1ldGhvZGAuIFRoZSBtZXRob2QgY2FuIGJlIG93biBvclxuICAgKiBpbmhlcml0ZWQsIGFuZCBpdCBjYW4gYmUgZW51bWVyYWJsZSBvciBub24tZW51bWVyYWJsZS5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7fVxuICAgKiAgICAgQ2F0LnByb3RvdHlwZS5tZW93ID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IENhdCgpKS50by5yZXNwb25kVG8oJ21lb3cnKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgZnVuY3Rpb24sIGAucmVzcG9uZFRvYCBhc3NlcnRzIHRoYXQgdGhlIHRhcmdldCdzXG4gICAqIGBwcm90b3R5cGVgIHByb3BlcnR5IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGBtZXRob2RgLiBBZ2FpbiwgdGhlXG4gICAqIG1ldGhvZCBjYW4gYmUgb3duIG9yIGluaGVyaXRlZCwgYW5kIGl0IGNhbiBiZSBlbnVtZXJhYmxlIG9yIG5vbi1lbnVtZXJhYmxlLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gQ2F0ICgpIHt9XG4gICAqICAgICBDYXQucHJvdG90eXBlLm1lb3cgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLnRvLnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBBZGQgYC5pdHNlbGZgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGZvcmNlIGAucmVzcG9uZFRvYCB0byB0cmVhdCB0aGVcbiAgICogdGFyZ2V0IGFzIGEgbm9uLWZ1bmN0aW9uIG9iamVjdCwgZXZlbiBpZiBpdCdzIGEgZnVuY3Rpb24uIFRodXMsIGl0IGFzc2VydHNcbiAgICogdGhhdCB0aGUgdGFyZ2V0IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGBtZXRob2RgLCByYXRoZXIgdGhhblxuICAgKiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0J3MgYHByb3RvdHlwZWAgcHJvcGVydHkgaGFzIGEgbWV0aG9kIHdpdGggdGhlXG4gICAqIGdpdmVuIG5hbWUgYG1ldGhvZGAuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiBDYXQgKCkge31cbiAgICogICAgIENhdC5wcm90b3R5cGUubWVvdyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKiAgICAgQ2F0Lmhpc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLml0c2VsZi50by5yZXNwb25kVG8oJ2hpc3MnKS5idXQubm90LnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBXaGVuIG5vdCBhZGRpbmcgYC5pdHNlbGZgLCBpdCdzIGltcG9ydGFudCB0byBjaGVjayB0aGUgdGFyZ2V0J3MgdHlwZSBiZWZvcmVcbiAgICogdXNpbmcgYC5yZXNwb25kVG9gLiBTZWUgdGhlIGAuYWAgZG9jIGZvciBpbmZvIG9uIGNoZWNraW5nIGEgdGFyZ2V0J3MgdHlwZS5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7fVxuICAgKiAgICAgQ2F0LnByb3RvdHlwZS5tZW93ID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IENhdCgpKS50by5iZS5hbignb2JqZWN0JykudGhhdC5yZXNwb25kc1RvKCdtZW93Jyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAucmVzcG9uZFRvYC5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIERvZyAoKSB7fVxuICAgKiAgICAgRG9nLnByb3RvdHlwZS5iYXJrID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IERvZygpKS50by5ub3QucmVzcG9uZFRvKCdtZW93Jyk7XG4gICAqXG4gICAqIGAucmVzcG9uZFRvYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe30pLnRvLnJlc3BvbmRUbygnbWVvdycsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7fSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5yZXNwb25kc1RvYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLnJlc3BvbmRUb2AuXG4gICAqXG4gICAqIEBuYW1lIHJlc3BvbmRUb1xuICAgKiBAYWxpYXMgcmVzcG9uZHNUb1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiByZXNwb25kVG8gKG1ldGhvZCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGl0c2VsZiA9IGZsYWcodGhpcywgJ2l0c2VsZicpXG4gICAgICAsIGNvbnRleHQgPSAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iaiAmJiAhaXRzZWxmKVxuICAgICAgICA/IG9iai5wcm90b3R5cGVbbWV0aG9kXVxuICAgICAgICA6IG9ialttZXRob2RdO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBjb250ZXh0XG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHJlc3BvbmQgdG8gJyArIF8uaW5zcGVjdChtZXRob2QpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCByZXNwb25kIHRvICcgKyBfLmluc3BlY3QobWV0aG9kKVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdyZXNwb25kVG8nLCByZXNwb25kVG8pO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdyZXNwb25kc1RvJywgcmVzcG9uZFRvKTtcblxuICAvKipcbiAgICogIyMjIC5pdHNlbGZcbiAgICpcbiAgICogRm9yY2VzIGFsbCBgLnJlc3BvbmRUb2AgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gYmVoYXZlIGFzIGlmXG4gICAqIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBldmVuIGlmIGl0J3MgYSBmdW5jdGlvbi4gVGh1cywgaXRcbiAgICogY2F1c2VzIGAucmVzcG9uZFRvYCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlblxuICAgKiBuYW1lLCByYXRoZXIgdGhhbiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0J3MgYHByb3RvdHlwZWAgcHJvcGVydHkgaGFzIGFcbiAgICogbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiBDYXQgKCkge31cbiAgICogICAgIENhdC5wcm90b3R5cGUubWVvdyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKiAgICAgQ2F0Lmhpc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLml0c2VsZi50by5yZXNwb25kVG8oJ2hpc3MnKS5idXQubm90LnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBAbmFtZSBpdHNlbGZcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdpdHNlbGYnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnaXRzZWxmJywgdHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLnNhdGlzZnkobWF0Y2hlclssIG1zZ10pXG4gICAqXG4gICAqIEludm9rZXMgdGhlIGdpdmVuIGBtYXRjaGVyYCBmdW5jdGlvbiB3aXRoIHRoZSB0YXJnZXQgYmVpbmcgcGFzc2VkIGFzIHRoZVxuICAgKiBmaXJzdCBhcmd1bWVudCwgYW5kIGFzc2VydHMgdGhhdCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgdHJ1dGh5LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLnNhdGlzZnkoZnVuY3Rpb24obnVtKSB7XG4gICAqICAgICAgIHJldHVybiBudW0gPiAwOyBcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLnNhdGlzZnlgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5zYXRpc2Z5KGZ1bmN0aW9uKG51bSkge1xuICAgKiAgICAgICByZXR1cm4gbnVtID4gMjtcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBgLnNhdGlzZnlgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5zYXRpc2Z5KGZ1bmN0aW9uKG51bSkge1xuICAgKiAgICAgICByZXR1cm4gbnVtID4gMjtcbiAgICogICAgIH0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uc2F0aXNmeShmdW5jdGlvbihudW0pIHtcbiAgICogICAgICAgcmV0dXJuIG51bSA+IDI7XG4gICAqICAgICB9KTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuc2F0aXNmaWVzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLnNhdGlzZnlgLlxuICAgKlxuICAgKiBAbmFtZSBzYXRpc2Z5XG4gICAqIEBhbGlhcyBzYXRpc2ZpZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWF0Y2hlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gc2F0aXNmeSAobWF0Y2hlciwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuICAgIHZhciByZXN1bHQgPSBtYXRjaGVyKG9iaik7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIHJlc3VsdFxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBzYXRpc2Z5ICcgKyBfLm9iakRpc3BsYXkobWF0Y2hlcilcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IHNhdGlzZnknICsgXy5vYmpEaXNwbGF5KG1hdGNoZXIpXG4gICAgICAsIGZsYWcodGhpcywgJ25lZ2F0ZScpID8gZmFsc2UgOiB0cnVlXG4gICAgICAsIHJlc3VsdFxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdzYXRpc2Z5Jywgc2F0aXNmeSk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3NhdGlzZmllcycsIHNhdGlzZnkpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmNsb3NlVG8oZXhwZWN0ZWQsIGRlbHRhWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXIgdGhhdCdzIHdpdGhpbiBhIGdpdmVuICsvLSBgZGVsdGFgIHJhbmdlXG4gICAqIG9mIHRoZSBnaXZlbiBudW1iZXIgYGV4cGVjdGVkYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZVxuICAgKiB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmVxdWFsKDEuNSk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmJlLmNsb3NlVG8oMSwgMC41KTtcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmJlLmNsb3NlVG8oMiwgMC41KTtcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmJlLmNsb3NlVG8oMSwgMSk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuY2xvc2VUb2AuXG4gICAqXG4gICAqICAgICBleHBlY3QoMS41KS50by5lcXVhbCgxLjUpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEuNSkudG8ubm90LmJlLmNsb3NlVG8oMywgMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmNsb3NlVG9gIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmJlLmNsb3NlVG8oMywgMSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDEuNSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmNsb3NlVG8oMywgMSk7XG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmFwcHJveGltYXRlbHlgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuY2xvc2VUb2AuXG4gICAqXG4gICAqIEBuYW1lIGNsb3NlVG9cbiAgICogQGFsaWFzIGFwcHJveGltYXRlbHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gY2xvc2VUbyhleHBlY3RlZCwgZGVsdGEsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG5cbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnbnVtYmVyJyk7XG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIGRlbHRhICE9PSAnbnVtYmVyJykge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIGZsYWdNc2cgKyAndGhlIGFyZ3VtZW50cyB0byBjbG9zZVRvIG9yIGFwcHJveGltYXRlbHkgbXVzdCBiZSBudW1iZXJzJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgTWF0aC5hYnMob2JqIC0gZXhwZWN0ZWQpIDw9IGRlbHRhXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGNsb3NlIHRvICcgKyBleHBlY3RlZCArICcgKy8tICcgKyBkZWx0YVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSBub3QgdG8gYmUgY2xvc2UgdG8gJyArIGV4cGVjdGVkICsgJyArLy0gJyArIGRlbHRhXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2Nsb3NlVG8nLCBjbG9zZVRvKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnYXBwcm94aW1hdGVseScsIGNsb3NlVG8pO1xuXG4gIC8vIE5vdGU6IER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgaWYgdGVzdGluZyBmb3IgaW5jbHVzaW9uIGluc3RlYWQgb2Ygc2FtZW5lc3MuXG4gIGZ1bmN0aW9uIGlzU3Vic2V0T2Yoc3Vic2V0LCBzdXBlcnNldCwgY21wLCBjb250YWlucywgb3JkZXJlZCkge1xuICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgIGlmIChzdWJzZXQubGVuZ3RoICE9PSBzdXBlcnNldC5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIHN1cGVyc2V0ID0gc3VwZXJzZXQuc2xpY2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3Vic2V0LmV2ZXJ5KGZ1bmN0aW9uKGVsZW0sIGlkeCkge1xuICAgICAgaWYgKG9yZGVyZWQpIHJldHVybiBjbXAgPyBjbXAoZWxlbSwgc3VwZXJzZXRbaWR4XSkgOiBlbGVtID09PSBzdXBlcnNldFtpZHhdO1xuXG4gICAgICBpZiAoIWNtcCkge1xuICAgICAgICB2YXIgbWF0Y2hJZHggPSBzdXBlcnNldC5pbmRleE9mKGVsZW0pO1xuICAgICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVtb3ZlIG1hdGNoIGZyb20gc3VwZXJzZXQgc28gbm90IGNvdW50ZWQgdHdpY2UgaWYgZHVwbGljYXRlIGluIHN1YnNldC5cbiAgICAgICAgaWYgKCFjb250YWlucykgc3VwZXJzZXQuc3BsaWNlKG1hdGNoSWR4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdXBlcnNldC5zb21lKGZ1bmN0aW9uKGVsZW0yLCBtYXRjaElkeCkge1xuICAgICAgICBpZiAoIWNtcChlbGVtLCBlbGVtMikpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBSZW1vdmUgbWF0Y2ggZnJvbSBzdXBlcnNldCBzbyBub3QgY291bnRlZCB0d2ljZSBpZiBkdXBsaWNhdGUgaW4gc3Vic2V0LlxuICAgICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubWVtYmVycyhzZXRbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBhcnJheSBoYXMgdGhlIHNhbWUgbWVtYmVycyBhcyB0aGUgZ2l2ZW4gYXJyYXlcbiAgICogYHNldGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLm1lbWJlcnMoWzIsIDEsIDNdKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgMl0pLnRvLmhhdmUubWVtYmVycyhbMiwgMSwgMl0pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBtZW1iZXJzIGFyZSBjb21wYXJlZCB1c2luZyBzdHJpY3QgKGA9PT1gKSBlcXVhbGl0eS4gQWRkIGAuZGVlcGBcbiAgICogZWFybGllciBpbiB0aGUgY2hhaW4gdG8gdXNlIGRlZXAgZXF1YWxpdHkgaW5zdGVhZC4gU2VlIHRoZSBgZGVlcC1lcWxgXG4gICAqIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcCBlcXVhbGl0eSBhbGdvcml0aG06XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBoYXMgbWVtYmVyIGB7YTogMX1gXG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLmhhdmUuZGVlcC5tZW1iZXJzKFt7YTogMX1dKTtcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8ubm90LmhhdmUubWVtYmVycyhbe2E6IDF9XSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLiBBZGQgYC5vcmRlcmVkYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0b1xuICAgKiByZXF1aXJlIHRoYXQgbWVtYmVycyBhcHBlYXIgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLm9yZGVyZWQubWVtYmVycyhbMSwgMiwgM10pO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5tZW1iZXJzKFsyLCAxLCAzXSlcbiAgICogICAgICAgLmJ1dC5ub3Qub3JkZXJlZC5tZW1iZXJzKFsyLCAxLCAzXSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGJvdGggYXJyYXlzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZS4gQWRkIGAuaW5jbHVkZWAgZWFybGllciBpblxuICAgKiB0aGUgY2hhaW4gdG8gcmVxdWlyZSB0aGF0IHRoZSB0YXJnZXQncyBtZW1iZXJzIGJlIGEgc3VwZXJzZXQgb2YgdGhlXG4gICAqIGV4cGVjdGVkIG1lbWJlcnMuIE5vdGUgdGhhdCBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGluIHRoZSBzdWJzZXQgd2hlblxuICAgKiBgLmluY2x1ZGVgIGlzIGFkZGVkLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGlzIGEgc3VwZXJzZXQgb2YgWzEsIDJdIGJ1dCBub3QgaWRlbnRpY2FsXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlLm1lbWJlcnMoWzEsIDJdKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLm5vdC5oYXZlLm1lbWJlcnMoWzEsIDJdKTtcbiAgICpcbiAgICogICAgIC8vIER1cGxpY2F0ZXMgaW4gdGhlIHN1YnNldCBhcmUgaWdub3JlZFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaW5jbHVkZS5tZW1iZXJzKFsxLCAyLCAyLCAyXSk7XG4gICAqXG4gICAqIGAuZGVlcGAsIGAub3JkZXJlZGAsIGFuZCBgLmluY2x1ZGVgIGNhbiBhbGwgYmUgY29tYmluZWQuIEhvd2V2ZXIsIGlmXG4gICAqIGAuaW5jbHVkZWAgYW5kIGAub3JkZXJlZGAgYXJlIGNvbWJpbmVkLCB0aGUgb3JkZXJpbmcgYmVnaW5zIGF0IHRoZSBzdGFydCBvZlxuICAgKiBib3RoIGFycmF5cy5cbiAgICpcbiAgICogICAgIGV4cGVjdChbe2E6IDF9LCB7YjogMn0sIHtjOiAzfV0pXG4gICAqICAgICAgIC50by5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKFt7YTogMX0sIHtiOiAyfV0pXG4gICAqICAgICAgIC5idXQubm90LmluY2x1ZGUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoW3tiOiAyfSwge2M6IDN9XSk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubWVtYmVyc2AuIEhvd2V2ZXIsIGl0J3NcbiAgICogZGFuZ2Vyb3VzIHRvIGRvIHNvLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9uc1xuICAgKiBieSBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0IGFycmF5IGRvZXNuJ3QgaGF2ZSBhbGwgb2YgdGhlIHNhbWUgbWVtYmVycyBhc1xuICAgKiB0aGUgZ2l2ZW4gYXJyYXkgYHNldGAgYnV0IG1heSBvciBtYXkgbm90IGhhdmUgc29tZSBvZiB0aGVtLiBJdCdzIG9mdGVuIGJlc3RcbiAgICogdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuIGFzc2VydGlvblxuICAgKiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLm5vdC5pbmNsdWRlKDMpLmFuZC5ub3QuaW5jbHVkZSg0KTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLm5vdC5oYXZlLm1lbWJlcnMoWzMsIDRdKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubWVtYmVyc2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uaGF2ZS5tZW1iZXJzKFsxLCAyLCAzXSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyXSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUubWVtYmVycyhbMSwgMiwgM10pO1xuICAgKlxuICAgKiBAbmFtZSBtZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbWVtYmVycycsIGZ1bmN0aW9uIChzdWJzZXQsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG5cbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uYmUuYW4oJ2FycmF5Jyk7XG4gICAgbmV3IEFzc2VydGlvbihzdWJzZXQsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLmFuKCdhcnJheScpO1xuXG4gICAgdmFyIGNvbnRhaW5zID0gZmxhZyh0aGlzLCAnY29udGFpbnMnKTtcbiAgICB2YXIgb3JkZXJlZCA9IGZsYWcodGhpcywgJ29yZGVyZWQnKTtcblxuICAgIHZhciBzdWJqZWN0LCBmYWlsTXNnLCBmYWlsTmVnYXRlTXNnLCBsZW5ndGhDaGVjaztcblxuICAgIGlmIChjb250YWlucykge1xuICAgICAgc3ViamVjdCA9IG9yZGVyZWQgPyAnYW4gb3JkZXJlZCBzdXBlcnNldCcgOiAnYSBzdXBlcnNldCc7XG4gICAgICBmYWlsTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgJyArIHN1YmplY3QgKyAnIG9mICN7ZXhwfSc7XG4gICAgICBmYWlsTmVnYXRlTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlICcgKyBzdWJqZWN0ICsgJyBvZiAje2V4cH0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJqZWN0ID0gb3JkZXJlZCA/ICdvcmRlcmVkIG1lbWJlcnMnIDogJ21lbWJlcnMnO1xuICAgICAgZmFpbE1zZyA9ICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgdGhlIHNhbWUgJyArIHN1YmplY3QgKyAnIGFzICN7ZXhwfSc7XG4gICAgICBmYWlsTmVnYXRlTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgdGhlIHNhbWUgJyArIHN1YmplY3QgKyAnIGFzICN7ZXhwfSc7XG4gICAgfVxuXG4gICAgdmFyIGNtcCA9IGZsYWcodGhpcywgJ2RlZXAnKSA/IF8uZXFsIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGlzU3Vic2V0T2Yoc3Vic2V0LCBvYmosIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpXG4gICAgICAsIGZhaWxNc2dcbiAgICAgICwgZmFpbE5lZ2F0ZU1zZ1xuICAgICAgLCBzdWJzZXRcbiAgICAgICwgb2JqXG4gICAgICAsIHRydWVcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5vbmVPZihsaXN0WywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBtZW1iZXIgb2YgdGhlIGdpdmVuIGFycmF5IGBsaXN0YC4gSG93ZXZlcixcbiAgICogaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLm9uZU9mKFsxLCAyLCAzXSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBDb21wYXJpc29ucyBhcmUgcGVyZm9ybWVkIHVzaW5nIHN0cmljdCAoYD09PWApIGVxdWFsaXR5LlxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm9uZU9mYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUub25lT2YoWzIsIDMsIDRdKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAub25lT2ZgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlXG4gICAqIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5vbmVPZihbMiwgMywgNF0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUub25lT2YoWzIsIDMsIDRdKTtcbiAgICpcbiAgICogQG5hbWUgb25lT2ZcbiAgICogQHBhcmFtIHtBcnJheTwqPn0gbGlzdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gb25lT2YgKGxpc3QsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBleHBlY3RlZCA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICBuZXcgQXNzZXJ0aW9uKGxpc3QsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLmFuKCdhcnJheScpO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGxpc3QuaW5kZXhPZihleHBlY3RlZCkgPiAtMVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBvbmUgb2YgI3tleHB9J1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgb25lIG9mICN7ZXhwfSdcbiAgICAgICwgbGlzdFxuICAgICAgLCBleHBlY3RlZFxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdvbmVPZicsIG9uZU9mKTtcblxuXG4gIC8qKlxuICAgKiAjIyMgLmNoYW5nZShzdWJqZWN0WywgcHJvcFssIG1zZ11dKVxuICAgKlxuICAgKiBXaGVuIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgYC5jaGFuZ2VgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb25cbiAgICogYHN1YmplY3RgIHJldHVybnMgYSBkaWZmZXJlbnQgdmFsdWUgd2hlbiBpdCdzIGludm9rZWQgYmVmb3JlIHRoZSB0YXJnZXRcbiAgICogZnVuY3Rpb24gY29tcGFyZWQgdG8gd2hlbiBpdCdzIGludm9rZWQgYWZ0ZXJ3YXJkLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3RcbiAgICogdG8gYXNzZXJ0IHRoYXQgYHN1YmplY3RgIGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZCB2YWx1ZS5cbiAgICpcbiAgICogICAgIHZhciBkb3RzID0gJydcbiAgICogICAgICAgLCBhZGREb3QgPSBmdW5jdGlvbiAoKSB7IGRvdHMgKz0gJy4nOyB9XG4gICAqICAgICAgICwgZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvdHM7IH07XG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGdldERvdHMoKSkudG8uZXF1YWwoJycpO1xuICAgKiAgICAgYWRkRG90KCk7XG4gICAqICAgICBleHBlY3QoZ2V0RG90cygpKS50by5lcXVhbCgnLicpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkRG90KS50by5jaGFuZ2UoZ2V0RG90cyk7XG4gICAqXG4gICAqIFdoZW4gdHdvIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIGAuY2hhbmdlYCBhc3NlcnRzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZVxuICAgKiBnaXZlbiBvYmplY3QgYHN1YmplY3RgJ3MgYHByb3BgIHByb3BlcnR5IGlzIGRpZmZlcmVudCBiZWZvcmUgaW52b2tpbmcgdGhlXG4gICAqIHRhcmdldCBmdW5jdGlvbiBjb21wYXJlZCB0byBhZnRlcndhcmQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7ZG90czogJyd9XG4gICAqICAgICAgICwgYWRkRG90ID0gZnVuY3Rpb24gKCkgeyBteU9iai5kb3RzICs9ICcuJzsgfTtcbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QobXlPYmopLnRvLmhhdmUucHJvcGVydHkoJ2RvdHMnLCAnJyk7XG4gICAqICAgICBhZGREb3QoKTtcbiAgICogICAgIGV4cGVjdChteU9iaikudG8uaGF2ZS5wcm9wZXJ0eSgnZG90cycsICcuJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChhZGREb3QpLnRvLmNoYW5nZShteU9iaiwgJ2RvdHMnKTtcbiAgICpcbiAgICogU3RyaWN0IChgPT09YCkgZXF1YWxpdHkgaXMgdXNlZCB0byBjb21wYXJlIGJlZm9yZSBhbmQgYWZ0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmNoYW5nZWAuXG4gICAqXG4gICAqICAgICB2YXIgZG90cyA9ICcnXG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG4gICAqICAgICAgICwgZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvdHM7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8ubm90LmNoYW5nZShnZXREb3RzKTtcbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHtkb3RzOiAnJ31cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8ubm90LmNoYW5nZShteU9iaiwgJ2RvdHMnKTtcbiAgICpcbiAgICogYC5jaGFuZ2VgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nIHR3byBhcmd1bWVudHMsIGFsd2F5c1xuICAgKiB1c2UgdGhlIHNlY29uZCBmb3JtLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge2RvdHM6ICcnfVxuICAgKiAgICAgICAsIGFkZERvdCA9IGZ1bmN0aW9uICgpIHsgbXlPYmouZG90cyArPSAnLic7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkRG90KS50by5ub3QuY2hhbmdlKG15T2JqLCAnZG90cycsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIHZhciBkb3RzID0gJydcbiAgICogICAgICAgLCBhZGREb3QgPSBmdW5jdGlvbiAoKSB7IGRvdHMgKz0gJy4nOyB9XG4gICAqICAgICAgICwgZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvdHM7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkRG90LCAnbm9vbyB3aHkgZmFpbD8/JykudG8ubm90LmNoYW5nZShnZXREb3RzKTtcbiAgICpcbiAgICogYC5jaGFuZ2VgIGFsc28gY2F1c2VzIGFsbCBgLmJ5YCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0b1xuICAgKiBhc3NlcnQgaG93IG11Y2ggYSBudW1lcmljIHN1YmplY3Qgd2FzIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgYnkuIEhvd2V2ZXIsXG4gICAqIGl0J3MgZGFuZ2Vyb3VzIHRvIHVzZSBgLmNoYW5nZS5ieWAuIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlc1xuICAgKiB1bmNlcnRhaW4gZXhwZWN0YXRpb25zIGJ5IGFzc2VydGluZyB0aGF0IHRoZSBzdWJqZWN0IGVpdGhlciBpbmNyZWFzZXMgYnlcbiAgICogdGhlIGdpdmVuIGRlbHRhLCBvciB0aGF0IGl0IGRlY3JlYXNlcyBieSB0aGUgZ2l2ZW4gZGVsdGEuIEl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQncyBleHBlY3RlZCwgYW5kIHRoZW4gd3JpdGUgYW4gYXNzZXJ0aW9uXG4gICAqIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBhZGRUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCArPSAyOyB9XG4gICAqICAgICAgICwgc3VidHJhY3RUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCAtPSAyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmNoYW5nZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uZGVjcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uY2hhbmdlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5jaGFuZ2VzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmNoYW5nZWAuXG4gICAqXG4gICAqIEBuYW1lIGNoYW5nZVxuICAgKiBAYWxpYXMgY2hhbmdlc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydENoYW5nZXMgKHN1YmplY3QsIHByb3AsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBmbiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKCdmdW5jdGlvbicpO1xuXG4gICAgdmFyIGluaXRpYWw7XG4gICAgaWYgKCFwcm9wKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG4gICAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkocHJvcCk7XG4gICAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgICB9XG5cbiAgICBmbigpO1xuXG4gICAgdmFyIGZpbmFsID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBzdWJqZWN0KCkgOiBzdWJqZWN0W3Byb3BdO1xuICAgIHZhciBtc2dPYmogPSBwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcCA9PT0gbnVsbCA/IGluaXRpYWwgOiAnLicgKyBwcm9wO1xuXG4gICAgLy8gVGhpcyBnZXRzIGZsYWdnZWQgYmVjYXVzZSBvZiB0aGUgLmJ5KGRlbHRhKSBhc3NlcnRpb25cbiAgICBmbGFnKHRoaXMsICdkZWx0YU1zZ09iaicsIG1zZ09iaik7XG4gICAgZmxhZyh0aGlzLCAnaW5pdGlhbERlbHRhVmFsdWUnLCBpbml0aWFsKTtcbiAgICBmbGFnKHRoaXMsICdmaW5hbERlbHRhVmFsdWUnLCBmaW5hbCk7XG4gICAgZmxhZyh0aGlzLCAnZGVsdGFCZWhhdmlvcicsICdjaGFuZ2UnKTtcbiAgICBmbGFnKHRoaXMsICdyZWFsRGVsdGEnLCBmaW5hbCAhPT0gaW5pdGlhbCk7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGluaXRpYWwgIT09IGZpbmFsXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBjaGFuZ2UnXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBub3QgY2hhbmdlJ1xuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdjaGFuZ2UnLCBhc3NlcnRDaGFuZ2VzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnY2hhbmdlcycsIGFzc2VydENoYW5nZXMpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmluY3JlYXNlKHN1YmplY3RbLCBwcm9wWywgbXNnXV0pXG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBgLmluY3JlYXNlYCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gICAqIGBzdWJqZWN0YCByZXR1cm5zIGEgZ3JlYXRlciBudW1iZXIgd2hlbiBpdCdzIGludm9rZWQgYWZ0ZXIgaW52b2tpbmcgdGhlXG4gICAqIHRhcmdldCBmdW5jdGlvbiBjb21wYXJlZCB0byB3aGVuIGl0J3MgaW52b2tlZCBiZWZvcmVoYW5kLiBgLmluY3JlYXNlYCBhbHNvXG4gICAqIGNhdXNlcyBhbGwgYC5ieWAgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IGhvdyBtdWNoXG4gICAqIGdyZWF0ZXIgb2YgYSBudW1iZXIgaXMgcmV0dXJuZWQuIEl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgcmV0dXJuXG4gICAqIHZhbHVlIGluY3JlYXNlZCBieSB0aGUgZXhwZWN0ZWQgYW1vdW50LCByYXRoZXIgdGhhbiBhc3NlcnRpbmcgaXQgaW5jcmVhc2VkXG4gICAqIGJ5IGFueSBhbW91bnQuXG4gICAqXG4gICAqICAgICB2YXIgdmFsID0gMVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgdmFsICs9IDI7IH1cbiAgICogICAgICAgLCBnZXRWYWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWw7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShnZXRWYWwpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UoZ2V0VmFsKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdHdvIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIGAuaW5jcmVhc2VgIGFzc2VydHMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIGdpdmVuIG9iamVjdCBgc3ViamVjdGAncyBgcHJvcGAgcHJvcGVydHkgaXMgZ3JlYXRlciBhZnRlciBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIGJlZm9yZWhhbmQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuaW5jcmVhc2VgLiBIb3dldmVyLCBpdCdzXG4gICAqIGRhbmdlcm91cyB0byBkbyBzby4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnNcbiAgICogYnkgYXNzZXJ0aW5nIHRoYXQgdGhlIHN1YmplY3QgZWl0aGVyIGRlY3JlYXNlcywgb3IgdGhhdCBpdCBzdGF5cyB0aGUgc2FtZS5cbiAgICogSXQncyBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlblxuICAgKiB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHN1YmplY3QgaXMgZXhwZWN0ZWQgdG8gZGVjcmVhc2UsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCBpdFxuICAgKiBkZWNyZWFzZWQgYnkgdGhlIGV4cGVjdGVkIGFtb3VudC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgc3VidHJhY3RUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCAtPSAyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5ub3QuaW5jcmVhc2UobXlPYmosICd2YWwnKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqIFxuICAgKiBXaGVuIHRoZSBzdWJqZWN0IGlzIGV4cGVjdGVkIHRvIHN0YXkgdGhlIHNhbWUsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnRcbiAgICogZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8ubm90LmNoYW5nZShteU9iaiwgJ3ZhbCcpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KG5vb3ApLnRvLm5vdC5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5pbmNyZWFzZWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzXG4gICAqIHVzZSB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIHZhciB2YWwgPSAxXG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG4gICAqICAgICAgICwgZ2V0VmFsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vb3AsICdub29vIHdoeSBmYWlsPz8nKS50by5pbmNyZWFzZShnZXRWYWwpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5pbmNyZWFzZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuaW5jcmVhc2VgLlxuICAgKlxuICAgKiBAbmFtZSBpbmNyZWFzZVxuICAgKiBAYWxpYXMgaW5jcmVhc2VzXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzdWJqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0SW5jcmVhc2VzIChzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgZm4gPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG4gICAgbmV3IEFzc2VydGlvbihmbiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcblxuICAgIHZhciBpbml0aWFsO1xuICAgIGlmICghcHJvcCkge1xuICAgICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKCdmdW5jdGlvbicpO1xuICAgICAgaW5pdGlhbCA9IHN1YmplY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgICAgaW5pdGlhbCA9IHN1YmplY3RbcHJvcF07XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlclxuICAgIG5ldyBBc3NlcnRpb24oaW5pdGlhbCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnbnVtYmVyJyk7XG5cbiAgICBmbigpO1xuXG4gICAgdmFyIGZpbmFsID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBzdWJqZWN0KCkgOiBzdWJqZWN0W3Byb3BdO1xuICAgIHZhciBtc2dPYmogPSBwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcCA9PT0gbnVsbCA/IGluaXRpYWwgOiAnLicgKyBwcm9wO1xuXG4gICAgZmxhZyh0aGlzLCAnZGVsdGFNc2dPYmonLCBtc2dPYmopO1xuICAgIGZsYWcodGhpcywgJ2luaXRpYWxEZWx0YVZhbHVlJywgaW5pdGlhbCk7XG4gICAgZmxhZyh0aGlzLCAnZmluYWxEZWx0YVZhbHVlJywgZmluYWwpO1xuICAgIGZsYWcodGhpcywgJ2RlbHRhQmVoYXZpb3InLCAnaW5jcmVhc2UnKTtcbiAgICBmbGFnKHRoaXMsICdyZWFsRGVsdGEnLCBmaW5hbCAtIGluaXRpYWwpO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBmaW5hbCAtIGluaXRpYWwgPiAwXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBpbmNyZWFzZSdcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIG5vdCBpbmNyZWFzZSdcbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaW5jcmVhc2UnLCBhc3NlcnRJbmNyZWFzZXMpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdpbmNyZWFzZXMnLCBhc3NlcnRJbmNyZWFzZXMpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlY3JlYXNlKHN1YmplY3RbLCBwcm9wWywgbXNnXV0pXG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBgLmRlY3JlYXNlYCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gICAqIGBzdWJqZWN0YCByZXR1cm5zIGEgbGVzc2VyIG51bWJlciB3aGVuIGl0J3MgaW52b2tlZCBhZnRlciBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIHdoZW4gaXQncyBpbnZva2VkIGJlZm9yZWhhbmQuIGAuZGVjcmVhc2VgIGFsc29cbiAgICogY2F1c2VzIGFsbCBgLmJ5YCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byBhc3NlcnQgaG93IG11Y2hcbiAgICogbGVzc2VyIG9mIGEgbnVtYmVyIGlzIHJldHVybmVkLiBJdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHJldHVyblxuICAgKiB2YWx1ZSBkZWNyZWFzZWQgYnkgdGhlIGV4cGVjdGVkIGFtb3VudCwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIGl0IGRlY3JlYXNlZFxuICAgKiBieSBhbnkgYW1vdW50LlxuICAgKlxuICAgKiAgICAgdmFyIHZhbCA9IDFcbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgdmFsIC09IDI7IH1cbiAgICogICAgICAgLCBnZXRWYWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWw7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKGdldFZhbCkuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKGdldFZhbCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHR3byBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBgLmRlY3JlYXNlYCBhc3NlcnRzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZVxuICAgKiBnaXZlbiBvYmplY3QgYHN1YmplY3RgJ3MgYHByb3BgIHByb3BlcnR5IGlzIGxlc3NlciBhZnRlciBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIGJlZm9yZWhhbmQuIFxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmRlY3JlYXNlYC4gSG93ZXZlciwgaXQnc1xuICAgKiBkYW5nZXJvdXMgdG8gZG8gc28uIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zXG4gICAqIGJ5IGFzc2VydGluZyB0aGF0IHRoZSBzdWJqZWN0IGVpdGhlciBpbmNyZWFzZXMsIG9yIHRoYXQgaXQgc3RheXMgdGhlIHNhbWUuXG4gICAqIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQncyBleHBlY3RlZCwgYW5kIHRoZW5cbiAgICogd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiBXaGVuIHRoZSBzdWJqZWN0IGlzIGV4cGVjdGVkIHRvIGluY3JlYXNlLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgaXRcbiAgICogaW5jcmVhc2VkIGJ5IHRoZSBleHBlY3RlZCBhbW91bnQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8ubm90LmRlY3JlYXNlKG15T2JqLCAndmFsJyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiBcbiAgICogV2hlbiB0aGUgc3ViamVjdCBpcyBleHBlY3RlZCB0byBzdGF5IHRoZSBzYW1lLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vb3ApLnRvLm5vdC5jaGFuZ2UobXlPYmosICd2YWwnKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChub29wKS50by5ub3QuZGVjcmVhc2UobXlPYmosICd2YWwnKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuZGVjcmVhc2VgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nIHR3byBhcmd1bWVudHMsIGFsd2F5c1xuICAgKiB1c2UgdGhlIHNlY29uZCBmb3JtLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8uZGVjcmVhc2UobXlPYmosICd2YWwnLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqXG4gICAqICAgICB2YXIgdmFsID0gMVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxuICAgKiAgICAgICAsIGdldFZhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbDsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uZGVjcmVhc2UoZ2V0VmFsKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuZGVjcmVhc2VzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmRlY3JlYXNlYC5cbiAgICpcbiAgICogQG5hbWUgZGVjcmVhc2VcbiAgICogQGFsaWFzIGRlY3JlYXNlc1xuICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc3ViamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydERlY3JlYXNlcyAoc3ViamVjdCwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIGZuID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICB2YXIgaW5pdGlhbDtcbiAgICBpZiAoIXByb3ApIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXJcbiAgICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ251bWJlcicpO1xuXG4gICAgZm4oKTtcblxuICAgIHZhciBmaW5hbCA9IHByb3AgPT09IHVuZGVmaW5lZCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgICB2YXIgbXNnT2JqID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBpbml0aWFsIDogJy4nICsgcHJvcDtcblxuICAgIGZsYWcodGhpcywgJ2RlbHRhTXNnT2JqJywgbXNnT2JqKTtcbiAgICBmbGFnKHRoaXMsICdpbml0aWFsRGVsdGFWYWx1ZScsIGluaXRpYWwpO1xuICAgIGZsYWcodGhpcywgJ2ZpbmFsRGVsdGFWYWx1ZScsIGZpbmFsKTtcbiAgICBmbGFnKHRoaXMsICdkZWx0YUJlaGF2aW9yJywgJ2RlY3JlYXNlJyk7XG4gICAgZmxhZyh0aGlzLCAncmVhbERlbHRhJywgaW5pdGlhbCAtIGZpbmFsKTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZmluYWwgLSBpbml0aWFsIDwgMFxuICAgICAgLCAnZXhwZWN0ZWQgJyArIG1zZ09iaiArICcgdG8gZGVjcmVhc2UnXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBub3QgZGVjcmVhc2UnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2RlY3JlYXNlJywgYXNzZXJ0RGVjcmVhc2VzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZGVjcmVhc2VzJywgYXNzZXJ0RGVjcmVhc2VzKTtcblxuICAvKipcbiAgICogIyMjIC5ieShkZWx0YVssIG1zZ10pXG4gICAqXG4gICAqIFdoZW4gZm9sbG93aW5nIGFuIGAuaW5jcmVhc2VgIGFzc2VydGlvbiBpbiB0aGUgY2hhaW4sIGAuYnlgIGFzc2VydHMgdGhhdFxuICAgKiB0aGUgc3ViamVjdCBvZiB0aGUgYC5pbmNyZWFzZWAgYXNzZXJ0aW9uIGluY3JlYXNlZCBieSB0aGUgZ2l2ZW4gYGRlbHRhYC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgKz0gMjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmluY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7XG4gICAqXG4gICAqIFdoZW4gZm9sbG93aW5nIGEgYC5kZWNyZWFzZWAgYXNzZXJ0aW9uIGluIHRoZSBjaGFpbiwgYC5ieWAgYXNzZXJ0cyB0aGF0IHRoZVxuICAgKiBzdWJqZWN0IG9mIHRoZSBgLmRlY3JlYXNlYCBhc3NlcnRpb24gZGVjcmVhc2VkIGJ5IHRoZSBnaXZlbiBgZGVsdGFgLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7XG4gICAqXG4gICAqIFdoZW4gZm9sbG93aW5nIGEgYC5jaGFuZ2VgIGFzc2VydGlvbiBpbiB0aGUgY2hhaW4sIGAuYnlgIGFzc2VydHMgdGhhdCB0aGVcbiAgICogc3ViamVjdCBvZiB0aGUgYC5jaGFuZ2VgIGFzc2VydGlvbiBlaXRoZXIgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBieSB0aGVcbiAgICogZ2l2ZW4gYGRlbHRhYC4gSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gdXNlIGAuY2hhbmdlLmJ5YC4gVGhlIHByb2JsZW0gaXNcbiAgICogdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnMuIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGVcbiAgICogZXhhY3Qgb3V0cHV0IHRoYXQncyBleHBlY3RlZCwgYW5kIHRoZW4gd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzXG4gICAqIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBhZGRUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCArPSAyOyB9XG4gICAqICAgICAgICwgc3VidHJhY3RUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCAtPSAyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmNoYW5nZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uZGVjcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uY2hhbmdlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmJ5YC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSBzdWJqZWN0IGNoYW5nZWQgYnkgaXRzIGV4cGVjdGVkIGRlbHRhLCByYXRoZXIgdGhhblxuICAgKiBhc3NlcnRpbmcgdGhhdCBpdCBkaWRuJ3QgY2hhbmdlIGJ5IG9uZSBvZiBjb3VudGxlc3MgdW5leHBlY3RlZCBkZWx0YXMuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTtcbiAgICpcbiAgICogICAgIC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5idXQubm90LmJ5KDMpO1xuICAgKlxuICAgKiBgLmJ5YCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG9cbiAgICogc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmRcbiAgICogYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDMsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdChhZGRUd28sICdub29vIHdoeSBmYWlsPz8nKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDMpO1xuICAgKlxuICAgKiBAbmFtZSBieVxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydERlbHRhKGRlbHRhLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcblxuICAgIHZhciBtc2dPYmogPSBmbGFnKHRoaXMsICdkZWx0YU1zZ09iaicpO1xuICAgIHZhciBpbml0aWFsID0gZmxhZyh0aGlzLCAnaW5pdGlhbERlbHRhVmFsdWUnKTtcbiAgICB2YXIgZmluYWwgPSBmbGFnKHRoaXMsICdmaW5hbERlbHRhVmFsdWUnKTtcbiAgICB2YXIgYmVoYXZpb3IgPSBmbGFnKHRoaXMsICdkZWx0YUJlaGF2aW9yJyk7XG4gICAgdmFyIHJlYWxEZWx0YSA9IGZsYWcodGhpcywgJ3JlYWxEZWx0YScpO1xuXG4gICAgdmFyIGV4cHJlc3Npb247XG4gICAgaWYgKGJlaGF2aW9yID09PSAnY2hhbmdlJykge1xuICAgICAgZXhwcmVzc2lvbiA9IE1hdGguYWJzKGZpbmFsIC0gaW5pdGlhbCkgPT09IE1hdGguYWJzKGRlbHRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwcmVzc2lvbiA9IHJlYWxEZWx0YSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICAgIH1cblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZXhwcmVzc2lvblxuICAgICAgLCAnZXhwZWN0ZWQgJyArIG1zZ09iaiArICcgdG8gJyArIGJlaGF2aW9yICsgJyBieSAnICsgZGVsdGFcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIG5vdCAnICsgYmVoYXZpb3IgKyAnIGJ5ICcgKyBkZWx0YVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdieScsIGFzc2VydERlbHRhKTtcblxuICAvKipcbiAgICogIyMjIC5leHRlbnNpYmxlXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGV4dGVuc2libGUsIHdoaWNoIG1lYW5zIHRoYXQgbmV3IHByb3BlcnRpZXMgY2FuXG4gICAqIGJlIGFkZGVkIHRvIGl0LiBQcmltaXRpdmVzIGFyZSBuZXZlciBleHRlbnNpYmxlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uYmUuZXh0ZW5zaWJsZTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5leHRlbnNpYmxlYC5cbiAgICpcbiAgICogICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KVxuICAgKiAgICAgICAsIHNlYWxlZE9iamVjdCA9IE9iamVjdC5zZWFsKHt9KVxuICAgKiAgICAgICAsIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vbkV4dGVuc2libGVPYmplY3QpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xuICAgKiAgICAgZXhwZWN0KHNlYWxlZE9iamVjdCkudG8ubm90LmJlLmV4dGVuc2libGU7XG4gICAqICAgICBleHBlY3QoZnJvemVuT2JqZWN0KS50by5ub3QuYmUuZXh0ZW5zaWJsZTtcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUuZXh0ZW5zaWJsZTtcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZXh0ZW5zaWJsZTtcbiAgICpcbiAgICogQG5hbWUgZXh0ZW5zaWJsZVxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2V4dGVuc2libGUnLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG5cbiAgICAvLyBJbiBFUzUsIGlmIHRoZSBhcmd1bWVudCB0byB0aGlzIG1ldGhvZCBpcyBhIHByaW1pdGl2ZSwgdGhlbiBpdCB3aWxsIGNhdXNlIGEgVHlwZUVycm9yLlxuICAgIC8vIEluIEVTNiwgYSBub24tb2JqZWN0IGFyZ3VtZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3YXMgYSBub24tZXh0ZW5zaWJsZSBvcmRpbmFyeSBvYmplY3QsIHNpbXBseSByZXR1cm4gZmFsc2UuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzRXh0ZW5zaWJsZVxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvdmlkZXMgRVM2IGJlaGF2aW9yIGZvciBFUzUgZW52aXJvbm1lbnRzLlxuXG4gICAgdmFyIGlzRXh0ZW5zaWJsZSA9IG9iaiA9PT0gT2JqZWN0KG9iaikgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShvYmopO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpc0V4dGVuc2libGVcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgZXh0ZW5zaWJsZSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGV4dGVuc2libGUnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuc2VhbGVkXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHNlYWxlZCwgd2hpY2ggbWVhbnMgdGhhdCBuZXcgcHJvcGVydGllcyBjYW4ndCBiZVxuICAgKiBhZGRlZCB0byBpdCwgYW5kIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzIGNhbid0IGJlIHJlY29uZmlndXJlZCBvciBkZWxldGVkLlxuICAgKiBIb3dldmVyLCBpdCdzIHBvc3NpYmxlIHRoYXQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2FuIHN0aWxsIGJlIHJlYXNzaWduZWRcbiAgICogdG8gZGlmZmVyZW50IHZhbHVlcy4gUHJpbWl0aXZlcyBhcmUgYWx3YXlzIHNlYWxlZC5cbiAgICpcbiAgICogICAgIHZhciBzZWFsZWRPYmplY3QgPSBPYmplY3Quc2VhbCh7fSk7XG4gICAqICAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAqXG4gICAqICAgICBleHBlY3Qoc2VhbGVkT2JqZWN0KS50by5iZS5zZWFsZWQ7XG4gICAqICAgICBleHBlY3QoZnJvemVuT2JqZWN0KS50by5iZS5zZWFsZWQ7XG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuc2VhbGVkO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLnNlYWxlZGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuYmUuc2VhbGVkO1xuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLnNlYWxlZDtcbiAgICpcbiAgICogQG5hbWUgc2VhbGVkXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnc2VhbGVkJywgZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuXG4gICAgLy8gSW4gRVM1LCBpZiB0aGUgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QgaXMgYSBwcmltaXRpdmUsIHRoZW4gaXQgd2lsbCBjYXVzZSBhIFR5cGVFcnJvci5cbiAgICAvLyBJbiBFUzYsIGEgbm9uLW9iamVjdCBhcmd1bWVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2FzIGEgc2VhbGVkIG9yZGluYXJ5IG9iamVjdCwgc2ltcGx5IHJldHVybiB0cnVlLlxuICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNTZWFsZWRcbiAgICAvLyBUaGUgZm9sbG93aW5nIHByb3ZpZGVzIEVTNiBiZWhhdmlvciBmb3IgRVM1IGVudmlyb25tZW50cy5cblxuICAgIHZhciBpc1NlYWxlZCA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNTZWFsZWQob2JqKSA6IHRydWU7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGlzU2VhbGVkXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIHNlYWxlZCdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIHNlYWxlZCdcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5mcm96ZW5cbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgZnJvemVuLCB3aGljaCBtZWFucyB0aGF0IG5ldyBwcm9wZXJ0aWVzIGNhbid0IGJlXG4gICAqIGFkZGVkIHRvIGl0LCBhbmQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2FuJ3QgYmUgcmVhc3NpZ25lZCB0byBkaWZmZXJlbnRcbiAgICogdmFsdWVzLCByZWNvbmZpZ3VyZWQsIG9yIGRlbGV0ZWQuIFByaW1pdGl2ZXMgYXJlIGFsd2F5cyBmcm96ZW4uXG4gICAqXG4gICAqICAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAqXG4gICAqICAgICBleHBlY3QoZnJvemVuT2JqZWN0KS50by5iZS5mcm96ZW47XG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuZnJvemVuO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmZyb3plbmAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuYmUuZnJvemVuO1xuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmZyb3plbjtcbiAgICpcbiAgICogQG5hbWUgZnJvemVuXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZnJvemVuJywgZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuXG4gICAgLy8gSW4gRVM1LCBpZiB0aGUgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QgaXMgYSBwcmltaXRpdmUsIHRoZW4gaXQgd2lsbCBjYXVzZSBhIFR5cGVFcnJvci5cbiAgICAvLyBJbiBFUzYsIGEgbm9uLW9iamVjdCBhcmd1bWVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2FzIGEgZnJvemVuIG9yZGluYXJ5IG9iamVjdCwgc2ltcGx5IHJldHVybiB0cnVlLlxuICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNGcm96ZW5cbiAgICAvLyBUaGUgZm9sbG93aW5nIHByb3ZpZGVzIEVTNiBiZWhhdmlvciBmb3IgRVM1IGVudmlyb25tZW50cy5cblxuICAgIHZhciBpc0Zyb3plbiA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNGcm96ZW4ob2JqKSA6IHRydWU7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGlzRnJvemVuXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZyb3plbidcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGZyb3plbidcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5maW5pdGVcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXIsIGFuZCBpc24ndCBgTmFOYCBvciBwb3NpdGl2ZS9uZWdhdGl2ZVxuICAgKiBgSW5maW5pdHlgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmZpbml0ZTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5maW5pdGVgLiBIb3dldmVyLCBpdCdzXG4gICAqIGRhbmdlcm91cyB0byBkbyBzby4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnNcbiAgICogYnkgYXNzZXJ0aW5nIHRoYXQgdGhlIHN1YmplY3QgZWl0aGVyIGlzbid0IGEgbnVtYmVyLCBvciB0aGF0IGl0J3MgYE5hTmAsIG9yXG4gICAqIHRoYXQgaXQncyBwb3NpdGl2ZSBgSW5maW5pdHlgLCBvciB0aGF0IGl0J3MgbmVnYXRpdmUgYEluZmluaXR5YC4gSXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhblxuICAgKiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpc24ndCBleHBlY3RlZCB0byBiZSBhIG51bWJlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydFxuICAgKiB0aGF0IGl0J3MgdGhlIGV4cGVjdGVkIHR5cGUsIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IGl0IGlzbid0IG9uZSBvZlxuICAgKiBtYW55IHVuZXhwZWN0ZWQgdHlwZXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmJlLmEoJ3N0cmluZycpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuYmUuZmluaXRlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGV4cGVjdGVkIHRvIGJlIGBOYU5gLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IGV4YWN0bHlcbiAgICogdGhhdC5cbiAgICpcbiAgICogICAgIGV4cGVjdChOYU4pLnRvLmJlLk5hTjsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChOYU4pLnRvLm5vdC5iZS5maW5pdGU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUgaW5maW5pdHksIGl0J3Mgb2Z0ZW4gYmVzdCB0b1xuICAgKiBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KEluZmluaXR5KS50by5lcXVhbChJbmZpbml0eSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoSW5maW5pdHkpLnRvLm5vdC5iZS5maW5pdGU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gYmUgbmVnYXRpdmUgaW5maW5pdHksIGl0J3Mgb2Z0ZW4gYmVzdCB0b1xuICAgKiBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KC1JbmZpbml0eSkudG8uZXF1YWwoLUluZmluaXR5KTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgtSW5maW5pdHkpLnRvLm5vdC5iZS5maW5pdGU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZmluaXRlO1xuICAgKlxuICAgKiBAbmFtZSBmaW5pdGVcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdmaW5pdGUnLCBmdW5jdGlvbihtc2cpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdHlwZW9mIG9iaiA9PT0gXCJudW1iZXJcIiAmJiBpc0Zpbml0ZShvYmopXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGEgZmluaXRlIG51bWJlcidcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGEgZmluaXRlIG51bWJlcidcbiAgICApO1xuICB9KTtcbn07XG4iLCIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjaGFpLCB1dGlsKSB7XG4gIGNoYWkuZXhwZWN0ID0gZnVuY3Rpb24gKHZhbCwgbWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgY2hhaS5Bc3NlcnRpb24odmFsLCBtZXNzYWdlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5mYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSwgW29wZXJhdG9yXSlcbiAgICpcbiAgICogVGhyb3cgYSBmYWlsdXJlLlxuICAgKlxuICAgKiBAbmFtZSBmYWlsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3BlcmF0b3JcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgY2hhaS5leHBlY3QuZmFpbCA9IGZ1bmN0aW9uIChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdleHBlY3QuZmFpbCgpJztcbiAgICB0aHJvdyBuZXcgY2hhaS5Bc3NlcnRpb25FcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGFjdHVhbDogYWN0dWFsXG4gICAgICAsIGV4cGVjdGVkOiBleHBlY3RlZFxuICAgICAgLCBvcGVyYXRvcjogb3BlcmF0b3JcbiAgICB9LCBjaGFpLmV4cGVjdC5mYWlsKTtcbiAgfTtcbn07XG4iLCIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjaGFpLCB1dGlsKSB7XG4gIHZhciBBc3NlcnRpb24gPSBjaGFpLkFzc2VydGlvbjtcblxuICBmdW5jdGlvbiBsb2FkU2hvdWxkICgpIHtcbiAgICAvLyBleHBsaWNpdGx5IGRlZmluZSB0aGlzIG1ldGhvZCBhcyBmdW5jdGlvbiBhcyB0byBoYXZlIGl0J3MgbmFtZSB0byBpbmNsdWRlIGFzIGBzc2ZpYFxuICAgIGZ1bmN0aW9uIHNob3VsZEdldHRlcigpIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgU3RyaW5nXG4gICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIE51bWJlclxuICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBCb29sZWFuXG4gICAgICAgICAgfHwgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMudmFsdWVPZigpLCBudWxsLCBzaG91bGRHZXR0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odGhpcywgbnVsbCwgc2hvdWxkR2V0dGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2hvdWxkU2V0dGVyKHZhbHVlKSB7XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9jaGFpL2lzc3Vlcy84NjogdGhpcyBtYWtlc1xuICAgICAgLy8gYHdoYXRldmVyLnNob3VsZCA9IHNvbWVWYWx1ZWAgYWN0dWFsbHkgc2V0IGBzb21lVmFsdWVgLCB3aGljaCBpc1xuICAgICAgLy8gZXNwZWNpYWxseSB1c2VmdWwgZm9yIGBnbG9iYWwuc2hvdWxkID0gcmVxdWlyZSgnY2hhaScpLnNob3VsZCgpYC5cbiAgICAgIC8vXG4gICAgICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSB0byB1c2UgW1tEZWZpbmVQcm9wZXJ0eV1dIGluc3RlYWQgb2YgW1tQdXRdXVxuICAgICAgLy8gc2luY2Ugb3RoZXJ3aXNlIHdlIHdvdWxkIHRyaWdnZXIgdGhpcyB2ZXJ5IHNldHRlciFcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2hvdWxkJywge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBtb2RpZnkgT2JqZWN0LnByb3RvdHlwZSB0byBoYXZlIGBzaG91bGRgXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5wcm90b3R5cGUsICdzaG91bGQnLCB7XG4gICAgICBzZXQ6IHNob3VsZFNldHRlclxuICAgICAgLCBnZXQ6IHNob3VsZEdldHRlclxuICAgICAgLCBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcblxuICAgIHZhciBzaG91bGQgPSB7fTtcblxuICAgIC8qKlxuICAgICAqICMjIyAuZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0sIFtvcGVyYXRvcl0pXG4gICAgICpcbiAgICAgKiBUaHJvdyBhIGZhaWx1cmUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBmYWlsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcGVyYXRvclxuICAgICAqIEBuYW1lc3BhY2UgQkREXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5mYWlsID0gZnVuY3Rpb24gKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yKSB7XG4gICAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnc2hvdWxkLmZhaWwoKSc7XG4gICAgICB0aHJvdyBuZXcgY2hhaS5Bc3NlcnRpb25FcnJvcihtZXNzYWdlLCB7XG4gICAgICAgICAgYWN0dWFsOiBhY3R1YWxcbiAgICAgICAgLCBleHBlY3RlZDogZXhwZWN0ZWRcbiAgICAgICAgLCBvcGVyYXRvcjogb3BlcmF0b3JcbiAgICAgIH0sIHNob3VsZC5mYWlsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIyMjIC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAgICpcbiAgICAgKiBBc3NlcnRzIG5vbi1zdHJpY3QgZXF1YWxpdHkgKGA9PWApIG9mIGBhY3R1YWxgIGFuZCBgZXhwZWN0ZWRgLlxuICAgICAqXG4gICAgICogICAgIHNob3VsZC5lcXVhbCgzLCAnMycsICc9PSBjb2VyY2VzIHZhbHVlcyB0byBzdHJpbmdzJyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSBlcXVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQuZXF1YWwgPSBmdW5jdGlvbiAodmFsMSwgdmFsMiwgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHZhbDEsIG1zZykudG8uZXF1YWwodmFsMik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICMjIyAudGhyb3coZnVuY3Rpb24sIFtjb25zdHJ1Y3Rvci9zdHJpbmcvcmVnZXhwXSwgW3N0cmluZy9yZWdleHBdLCBbbWVzc2FnZV0pXG4gICAgICpcbiAgICAgKiBBc3NlcnRzIHRoYXQgYGZ1bmN0aW9uYCB3aWxsIHRocm93IGFuIGVycm9yIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2ZcbiAgICAgKiBgY29uc3RydWN0b3JgLCBvciBhbHRlcm5hdGVseSB0aGF0IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3Igd2l0aCBtZXNzYWdlXG4gICAgICogbWF0Y2hpbmcgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLnRocm93KGZuLCAnZnVuY3Rpb24gdGhyb3dzIGEgcmVmZXJlbmNlIGVycm9yJyk7XG4gICAgICogICAgIHNob3VsZC50aHJvdyhmbiwgL2Z1bmN0aW9uIHRocm93cyBhIHJlZmVyZW5jZSBlcnJvci8pO1xuICAgICAqICAgICBzaG91bGQudGhyb3coZm4sIFJlZmVyZW5jZUVycm9yKTtcbiAgICAgKiAgICAgc2hvdWxkLnRocm93KGZuLCBSZWZlcmVuY2VFcnJvciwgJ2Z1bmN0aW9uIHRocm93cyBhIHJlZmVyZW5jZSBlcnJvcicpO1xuICAgICAqICAgICBzaG91bGQudGhyb3coZm4sIFJlZmVyZW5jZUVycm9yLCAvZnVuY3Rpb24gdGhyb3dzIGEgcmVmZXJlbmNlIGVycm9yLyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSB0aHJvd1xuICAgICAqIEBhbGlhcyBUaHJvd1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjRXJyb3JfdHlwZXNcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQuVGhyb3cgPSBmdW5jdGlvbiAoZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgICAgbmV3IEFzc2VydGlvbihmbiwgbXNnKS50by5UaHJvdyhlcnJ0LCBlcnJzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIyMjIC5leGlzdFxuICAgICAqXG4gICAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogICAgIHZhciBmb28gPSAnaGknO1xuICAgICAqXG4gICAgICogICAgIHNob3VsZC5leGlzdChmb28sICdmb28gZXhpc3RzJyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSBleGlzdFxuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5leGlzdCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8uZXhpc3Q7XG4gICAgfVxuXG4gICAgLy8gbmVnYXRpb25cbiAgICBzaG91bGQubm90ID0ge31cblxuICAgIC8qKlxuICAgICAqICMjIyAubm90LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICAgKlxuICAgICAqIEFzc2VydHMgbm9uLXN0cmljdCBpbmVxdWFsaXR5IChgIT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICAgKlxuICAgICAqICAgICBzaG91bGQubm90LmVxdWFsKDMsIDQsICd0aGVzZSBudW1iZXJzIGFyZSBub3QgZXF1YWwnKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIG5vdC5lcXVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQubm90LmVxdWFsID0gZnVuY3Rpb24gKHZhbDEsIHZhbDIsIG1zZykge1xuICAgICAgbmV3IEFzc2VydGlvbih2YWwxLCBtc2cpLnRvLm5vdC5lcXVhbCh2YWwyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIyMjIC50aHJvdyhmdW5jdGlvbiwgW2NvbnN0cnVjdG9yL3JlZ2V4cF0sIFttZXNzYWdlXSlcbiAgICAgKlxuICAgICAqIEFzc2VydHMgdGhhdCBgZnVuY3Rpb25gIHdpbGwgX25vdF8gdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZlxuICAgICAqIGBjb25zdHJ1Y3RvcmAsIG9yIGFsdGVybmF0ZWx5IHRoYXQgaXQgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3Igd2l0aCBtZXNzYWdlXG4gICAgICogbWF0Y2hpbmcgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLm5vdC50aHJvdyhmbiwgRXJyb3IsICdmdW5jdGlvbiBkb2VzIG5vdCB0aHJvdycpO1xuICAgICAqXG4gICAgICogQG5hbWUgbm90LnRocm93XG4gICAgICogQGFsaWFzIG5vdC5UaHJvd1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjRXJyb3JfdHlwZXNcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQubm90LlRocm93ID0gZnVuY3Rpb24gKGZuLCBlcnJ0LCBlcnJzLCBtc2cpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8ubm90LlRocm93KGVycnQsIGVycnMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLm5vdC5leGlzdFxuICAgICAqXG4gICAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogICAgIHZhciBiYXIgPSBudWxsO1xuICAgICAqXG4gICAgICogICAgIHNob3VsZC5ub3QuZXhpc3QoYmFyLCAnYmFyIGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSBub3QuZXhpc3RcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQubm90LmV4aXN0ID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnKS50by5ub3QuZXhpc3Q7XG4gICAgfVxuXG4gICAgc2hvdWxkWyd0aHJvdyddID0gc2hvdWxkWydUaHJvdyddO1xuICAgIHNob3VsZC5ub3RbJ3Rocm93J10gPSBzaG91bGQubm90WydUaHJvdyddO1xuXG4gICAgcmV0dXJuIHNob3VsZDtcbiAgfTtcblxuICBjaGFpLnNob3VsZCA9IGxvYWRTaG91bGQ7XG4gIGNoYWkuU2hvdWxkID0gbG9hZFNob3VsZDtcbn07XG4iLCIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNoYWksIHV0aWwpIHtcblxuICAvKiFcbiAgICogQ2hhaSBkZXBlbmRlbmNpZXMuXG4gICAqL1xuXG4gIHZhciBBc3NlcnRpb24gPSBjaGFpLkFzc2VydGlvblxuICAgICwgZmxhZyA9IHV0aWwuZmxhZztcblxuICAvKiFcbiAgICogTW9kdWxlIGV4cG9ydC5cbiAgICovXG5cbiAgLyoqXG4gICAqICMjIyBhc3NlcnQoZXhwcmVzc2lvbiwgbWVzc2FnZSlcbiAgICpcbiAgICogV3JpdGUgeW91ciBvd24gdGVzdCBleHByZXNzaW9ucy5cbiAgICpcbiAgICogICAgIGFzc2VydCgnZm9vJyAhPT0gJ2JhcicsICdmb28gaXMgbm90IGJhcicpO1xuICAgKiAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoW10pLCAnZW1wdHkgYXJyYXlzIGFyZSBhcnJheXMnKTtcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwcmVzc2lvbiB0byB0ZXN0IGZvciB0cnV0aGluZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIHRvIGRpc3BsYXkgb24gZXJyb3JcbiAgICogQG5hbWUgYXNzZXJ0XG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZhciBhc3NlcnQgPSBjaGFpLmFzc2VydCA9IGZ1bmN0aW9uIChleHByZXNzLCBlcnJtc2cpIHtcbiAgICB2YXIgdGVzdCA9IG5ldyBBc3NlcnRpb24obnVsbCwgbnVsbCwgY2hhaS5hc3NlcnQsIHRydWUpO1xuICAgIHRlc3QuYXNzZXJ0KFxuICAgICAgICBleHByZXNzXG4gICAgICAsIGVycm1zZ1xuICAgICAgLCAnWyBuZWdhdGlvbiBtZXNzYWdlIHVuYXZhaWxhYmxlIF0nXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5mYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSwgW29wZXJhdG9yXSlcbiAgICpcbiAgICogVGhyb3cgYSBmYWlsdXJlLiBOb2RlLmpzIGBhc3NlcnRgIG1vZHVsZS1jb21wYXRpYmxlLlxuICAgKlxuICAgKiBAbmFtZSBmYWlsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3BlcmF0b3JcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmZhaWwgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnYXNzZXJ0LmZhaWwoKSc7XG4gICAgdGhyb3cgbmV3IGNoYWkuQXNzZXJ0aW9uRXJyb3IobWVzc2FnZSwge1xuICAgICAgICBhY3R1YWw6IGFjdHVhbFxuICAgICAgLCBleHBlY3RlZDogZXhwZWN0ZWRcbiAgICAgICwgb3BlcmF0b3I6IG9wZXJhdG9yXG4gICAgfSwgYXNzZXJ0LmZhaWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzT2sob2JqZWN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyB0cnV0aHkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNPaygnZXZlcnl0aGluZycsICdldmVyeXRoaW5nIGlzIG9rJyk7XG4gICAqICAgICBhc3NlcnQuaXNPayhmYWxzZSwgJ3RoaXMgd2lsbCBmYWlsJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzT2tcbiAgICogQGFsaWFzIG9rXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdCB0byB0ZXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc09rID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzT2ssIHRydWUpLmlzLm9rO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTm90T2sob2JqZWN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBmYWxzeS5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc05vdE9rKCdldmVyeXRoaW5nJywgJ3RoaXMgd2lsbCBmYWlsJyk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RPayhmYWxzZSwgJ3RoaXMgd2lsbCBwYXNzJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90T2tcbiAgICogQGFsaWFzIG5vdE9rXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdCB0byB0ZXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdE9rID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90T2ssIHRydWUpLmlzLm5vdC5vaztcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgbm9uLXN0cmljdCBlcXVhbGl0eSAoYD09YCkgb2YgYGFjdHVhbGAgYW5kIGBleHBlY3RlZGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZXF1YWwoMywgJzMnLCAnPT0gY29lcmNlcyB2YWx1ZXMgdG8gc3RyaW5ncycpO1xuICAgKlxuICAgKiBAbmFtZSBlcXVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBtc2cpIHtcbiAgICB2YXIgdGVzdCA9IG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5lcXVhbCwgdHJ1ZSk7XG5cbiAgICB0ZXN0LmFzc2VydChcbiAgICAgICAgZXhwID09IGZsYWcodGVzdCwgJ29iamVjdCcpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGVxdWFsICN7ZXhwfSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7YWN0fSdcbiAgICAgICwgZXhwXG4gICAgICAsIGFjdFxuICAgICAgLCB0cnVlXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgbm9uLXN0cmljdCBpbmVxdWFsaXR5IChgIT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RFcXVhbCgzLCA0LCAndGhlc2UgbnVtYmVycyBhcmUgbm90IGVxdWFsJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIHZhciB0ZXN0ID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdEVxdWFsLCB0cnVlKTtcblxuICAgIHRlc3QuYXNzZXJ0KFxuICAgICAgICBleHAgIT0gZmxhZyh0ZXN0LCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gZXF1YWwgI3thY3R9J1xuICAgICAgLCBleHBcbiAgICAgICwgYWN0XG4gICAgICAsIHRydWVcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBzdHJpY3QgZXF1YWxpdHkgKGA9PT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCB0cnVlLCAndGhlc2UgYm9vbGVhbnMgYXJlIHN0cmljdGx5IGVxdWFsJyk7XG4gICAqXG4gICAqIEBuYW1lIHN0cmljdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5zdHJpY3RFcXVhbCwgdHJ1ZSkudG8uZXF1YWwoZXhwKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgc3RyaWN0IGluZXF1YWxpdHkgKGAhPT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbCgzLCAnMycsICdubyBjb2VyY2lvbiBmb3Igc3RyaWN0IGVxdWFsaXR5Jyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFN0cmljdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RTdHJpY3RFcXVhbCwgdHJ1ZSkudG8ubm90LmVxdWFsKGV4cCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBhY3R1YWxgIGlzIGRlZXBseSBlcXVhbCB0byBgZXhwZWN0ZWRgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBFcXVhbCh7IHRlYTogJ2dyZWVuJyB9LCB7IHRlYTogJ2dyZWVuJyB9KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYWxpYXMgZGVlcFN0cmljdEVxdWFsXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWVwRXF1YWwgPSBhc3NlcnQuZGVlcFN0cmljdEVxdWFsID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZGVlcEVxdWFsLCB0cnVlKS50by5lcWwoZXhwKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnQgdGhhdCBgYWN0dWFsYCBpcyBub3QgZGVlcGx5IGVxdWFsIHRvIGBleHBlY3RlZGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcEVxdWFsKHsgdGVhOiAnZ3JlZW4nIH0sIHsgdGVhOiAnamFzbWluZScgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBFcXVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIChhY3QsIGV4cCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdERlZXBFcXVhbCwgdHJ1ZSkudG8ubm90LmVxbChleHApO1xuICB9O1xuXG4gICAvKipcbiAgICogIyMjIC5pc0Fib3ZlKHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQWJvdmUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gKD4pIGB2YWx1ZVRvQmVBYm92ZWAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBYm92ZSg1LCAyLCAnNSBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gMicpO1xuICAgKlxuICAgKiBAbmFtZSBpc0Fib3ZlXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVBYm92ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNBYm92ZSA9IGZ1bmN0aW9uICh2YWwsIGFidiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQWJvdmUsIHRydWUpLnRvLmJlLmFib3ZlKGFidik7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLmlzQXRMZWFzdCh2YWx1ZVRvQ2hlY2ssIHZhbHVlVG9CZUF0TGVhc3QsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKD49KSBgdmFsdWVUb0JlQXRMZWFzdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBdExlYXN0KDUsIDIsICc1IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMicpO1xuICAgKiAgICAgYXNzZXJ0LmlzQXRMZWFzdCgzLCAzLCAnMyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDMnKTtcbiAgICpcbiAgICogQG5hbWUgaXNBdExlYXN0XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVBdExlYXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0F0TGVhc3QgPSBmdW5jdGlvbiAodmFsLCBhdGxzdCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXRMZWFzdCwgdHJ1ZSkudG8uYmUubGVhc3QoYXRsc3QpO1xuICB9O1xuXG4gICAvKipcbiAgICogIyMjIC5pc0JlbG93KHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQmVsb3csIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBzdHJpY3RseSBsZXNzIHRoYW4gKDwpIGB2YWx1ZVRvQmVCZWxvd2AuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNCZWxvdygzLCA2LCAnMyBpcyBzdHJpY3RseSBsZXNzIHRoYW4gNicpO1xuICAgKlxuICAgKiBAbmFtZSBpc0JlbG93XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVCZWxvd1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNCZWxvdyA9IGZ1bmN0aW9uICh2YWwsIGJsdywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQmVsb3csIHRydWUpLnRvLmJlLmJlbG93KGJsdyk7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLmlzQXRNb3N0KHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQXRNb3N0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgYHZhbHVlVG9DaGVja2AgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICg8PSkgYHZhbHVlVG9CZUF0TW9zdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBdE1vc3QoMywgNiwgJzMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDYnKTtcbiAgICogICAgIGFzc2VydC5pc0F0TW9zdCg0LCA0LCAnNCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCcpO1xuICAgKlxuICAgKiBAbmFtZSBpc0F0TW9zdFxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQ2hlY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVUb0JlQXRNb3N0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0F0TW9zdCA9IGZ1bmN0aW9uICh2YWwsIGF0bXN0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdE1vc3QsIHRydWUpLnRvLmJlLm1vc3QoYXRtc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzVHJ1ZSh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyB0cnVlLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYVNlcnZlZCA9IHRydWU7XG4gICAqICAgICBhc3NlcnQuaXNUcnVlKHRlYVNlcnZlZCwgJ3RoZSB0ZWEgaGFzIGJlZW4gc2VydmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzVHJ1ZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNUcnVlID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzVHJ1ZSwgdHJ1ZSkuaXNbJ3RydWUnXTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFRydWUodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IHRydWUuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90VHJ1ZSh0ZWEsICdncmVhdCwgdGltZSBmb3IgdGVhIScpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdFRydWVcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90VHJ1ZSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFRydWUsIHRydWUpLnRvLm5vdC5lcXVhbCh0cnVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0ZhbHNlKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIGZhbHNlLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYVNlcnZlZCA9IGZhbHNlO1xuICAgKiAgICAgYXNzZXJ0LmlzRmFsc2UodGVhU2VydmVkLCAnbm8gdGVhIHlldD8gaG1tLi4uJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRmFsc2VcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRmFsc2UgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGYWxzZSwgdHJ1ZSkuaXNbJ2ZhbHNlJ107XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RGYWxzZSh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBub3QgZmFsc2UuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RmFsc2UodGVhLCAnZ3JlYXQsIHRpbWUgZm9yIHRlYSEnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RGYWxzZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RGYWxzZSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEZhbHNlLCB0cnVlKS50by5ub3QuZXF1YWwoZmFsc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTnVsbCh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBudWxsLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTnVsbChlcnIsICd0aGVyZSB3YXMgbm8gZXJyb3InKTtcbiAgICpcbiAgICogQG5hbWUgaXNOdWxsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc051bGwgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOdWxsLCB0cnVlKS50by5lcXVhbChudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdE51bGwodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IG51bGwuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90TnVsbCh0ZWEsICdncmVhdCwgdGltZSBmb3IgdGVhIScpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE51bGxcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90TnVsbCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bGwsIHRydWUpLnRvLm5vdC5lcXVhbChudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05hTlxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgTmFOLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTmFOKE5hTiwgJ05hTiBpcyBOYU4nKTtcbiAgICpcbiAgICogQG5hbWUgaXNOYU5cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTmFOID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTmFOLCB0cnVlKS50by5iZS5OYU47XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3ROYU5cbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIG5vdCBOYU4uXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3ROYU4oNCwgJzQgaXMgbm90IE5hTicpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE5hTlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgYXNzZXJ0LmlzTm90TmFOID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90TmFOLCB0cnVlKS5ub3QudG8uYmUuTmFOO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmV4aXN0c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICB2YXIgZm9vID0gJ2hpJztcbiAgICpcbiAgICogICAgIGFzc2VydC5leGlzdHMoZm9vLCAnZm9vIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYCcpO1xuICAgKlxuICAgKiBAbmFtZSBleGlzdHNcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmV4aXN0cyA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5leGlzdHMsIHRydWUpLnRvLmV4aXN0O1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEV4aXN0c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBlaXRoZXIgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiAgICAgdmFyIGJhciA9IG51bGxcbiAgICogICAgICAgLCBiYXo7XG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RXhpc3RzKGJhcik7XG4gICAqICAgICBhc3NlcnQubm90RXhpc3RzKGJheiwgJ2JheiBpcyBlaXRoZXIgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICpcbiAgICogQG5hbWUgbm90RXhpc3RzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RFeGlzdHMgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90RXhpc3RzLCB0cnVlKS50by5ub3QuZXhpc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNVbmRlZmluZWQodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICB2YXIgdGVhO1xuICAgKiAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHRlYSwgJ25vIHRlYSBkZWZpbmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzVW5kZWZpbmVkXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1VuZGVmaW5lZCwgdHJ1ZSkudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0RlZmluZWQodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYSA9ICdjdXAgb2YgY2hhaSc7XG4gICAqICAgICBhc3NlcnQuaXNEZWZpbmVkKHRlYSwgJ3RlYSBoYXMgYmVlbiBkZWZpbmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNEZWZpbmVkID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRGVmaW5lZCwgdHJ1ZSkudG8ubm90LmVxdWFsKHVuZGVmaW5lZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNGdW5jdGlvbih2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gc2VydmVUZWEoKSB7IHJldHVybiAnY3VwIG9mIHRlYSc7IH07XG4gICAqICAgICBhc3NlcnQuaXNGdW5jdGlvbihzZXJ2ZVRlYSwgJ2dyZWF0LCB3ZSBjYW4gaGF2ZSB0ZWEgbm93Jyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRnVuY3Rpb25cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGdW5jdGlvbiwgdHJ1ZSkudG8uYmUuYSgnZnVuY3Rpb24nKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEZ1bmN0aW9uKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqICAgICB2YXIgc2VydmVUZWEgPSBbICdoZWF0JywgJ3BvdXInLCAnc2lwJyBdO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RnVuY3Rpb24oc2VydmVUZWEsICdncmVhdCwgd2UgaGF2ZSBsaXN0ZWQgdGhlIHN0ZXBzJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90RnVuY3Rpb25cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90RnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RGdW5jdGlvbiwgdHJ1ZSkudG8ubm90LmJlLmEoJ2Z1bmN0aW9uJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNPYmplY3QodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gb2JqZWN0IG9mIHR5cGUgJ09iamVjdCcgKGFzIHJldmVhbGVkIGJ5IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCkuXG4gICAqIF9UaGUgYXNzZXJ0aW9uIGRvZXMgbm90IG1hdGNoIHN1YmNsYXNzZWQgb2JqZWN0cy5fXG4gICAqXG4gICAqICAgICB2YXIgc2VsZWN0aW9uID0geyBuYW1lOiAnQ2hhaScsIHNlcnZlOiAnd2l0aCBzcGljZXMnIH07XG4gICAqICAgICBhc3NlcnQuaXNPYmplY3Qoc2VsZWN0aW9uLCAndGVhIHNlbGVjdGlvbiBpcyBhbiBvYmplY3QnKTtcbiAgICpcbiAgICogQG5hbWUgaXNPYmplY3RcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzT2JqZWN0ID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzT2JqZWN0LCB0cnVlKS50by5iZS5hKCdvYmplY3QnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdE9iamVjdCh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBfbm90XyBhbiBvYmplY3Qgb2YgdHlwZSAnT2JqZWN0JyAoYXMgcmV2ZWFsZWQgYnkgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgKS5cbiAgICpcbiAgICogICAgIHZhciBzZWxlY3Rpb24gPSAnY2hhaSdcbiAgICogICAgIGFzc2VydC5pc05vdE9iamVjdChzZWxlY3Rpb24sICd0ZWEgc2VsZWN0aW9uIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICogICAgIGFzc2VydC5pc05vdE9iamVjdChudWxsLCAnbnVsbCBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90T2JqZWN0XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdE9iamVjdCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE9iamVjdCwgdHJ1ZSkudG8ubm90LmJlLmEoJ29iamVjdCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzQXJyYXkodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gYXJyYXkuXG4gICAqXG4gICAqICAgICB2YXIgbWVudSA9IFsgJ2dyZWVuJywgJ2NoYWknLCAnb29sb25nJyBdO1xuICAgKiAgICAgYXNzZXJ0LmlzQXJyYXkobWVudSwgJ3doYXQga2luZCBvZiB0ZWEgZG8gd2Ugd2FudD8nKTtcbiAgICpcbiAgICogQG5hbWUgaXNBcnJheVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNBcnJheSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0FycmF5LCB0cnVlKS50by5iZS5hbignYXJyYXknKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEFycmF5KHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGFuIGFycmF5LlxuICAgKlxuICAgKiAgICAgdmFyIG1lbnUgPSAnZ3JlZW58Y2hhaXxvb2xvbmcnO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90QXJyYXkobWVudSwgJ3doYXQga2luZCBvZiB0ZWEgZG8gd2Ugd2FudD8nKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RBcnJheVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RBcnJheSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEFycmF5LCB0cnVlKS50by5ub3QuYmUuYW4oJ2FycmF5Jyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNTdHJpbmcodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBzdHJpbmcuXG4gICAqXG4gICAqICAgICB2YXIgdGVhT3JkZXIgPSAnY2hhaSc7XG4gICAqICAgICBhc3NlcnQuaXNTdHJpbmcodGVhT3JkZXIsICdvcmRlciBwbGFjZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNTdHJpbmdcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzU3RyaW5nID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzU3RyaW5nLCB0cnVlKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFN0cmluZyh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBfbm90XyBhIHN0cmluZy5cbiAgICpcbiAgICogICAgIHZhciB0ZWFPcmRlciA9IDQ7XG4gICAqICAgICBhc3NlcnQuaXNOb3RTdHJpbmcodGVhT3JkZXIsICdvcmRlciBwbGFjZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RTdHJpbmdcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90U3RyaW5nID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90U3RyaW5nLCB0cnVlKS50by5ub3QuYmUuYSgnc3RyaW5nJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOdW1iZXIodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBudW1iZXIuXG4gICAqXG4gICAqICAgICB2YXIgY3VwcyA9IDI7XG4gICAqICAgICBhc3NlcnQuaXNOdW1iZXIoY3VwcywgJ2hvdyBtYW55IGN1cHMnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOdW1iZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc051bWJlciA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWJlciwgdHJ1ZSkudG8uYmUuYSgnbnVtYmVyJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3ROdW1iZXIodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgX25vdF8gYSBudW1iZXIuXG4gICAqXG4gICAqICAgICB2YXIgY3VwcyA9ICcyIGN1cHMgcGxlYXNlJztcbiAgICogICAgIGFzc2VydC5pc05vdE51bWJlcihjdXBzLCAnaG93IG1hbnkgY3VwcycpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE51bWJlclxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3ROdW1iZXIgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdW1iZXIsIHRydWUpLnRvLm5vdC5iZS5hKCdudW1iZXInKTtcbiAgfTtcblxuICAgLyoqXG4gICAqICMjIyAuaXNGaW5pdGUodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLiBVbmxpa2UgYC5pc051bWJlcmAsIHRoaXMgd2lsbCBmYWlsIGZvciBgTmFOYCBhbmQgYEluZmluaXR5YC5cbiAgICpcbiAgICogICAgIHZhciBjdXBzID0gMjtcbiAgICogICAgIGFzc2VydC5pc0Zpbml0ZShjdXBzLCAnaG93IG1hbnkgY3VwcycpO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzRmluaXRlKE5hTik7IC8vIHRocm93c1xuICAgKlxuICAgKiBAbmFtZSBpc0Zpbml0ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRmluaXRlID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRmluaXRlLCB0cnVlKS50by5iZS5maW5pdGU7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNCb29sZWFuKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIGEgYm9vbGVhbi5cbiAgICpcbiAgICogICAgIHZhciB0ZWFSZWFkeSA9IHRydWVcbiAgICogICAgICAgLCB0ZWFTZXJ2ZWQgPSBmYWxzZTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pc0Jvb2xlYW4odGVhUmVhZHksICdpcyB0aGUgdGVhIHJlYWR5Jyk7XG4gICAqICAgICBhc3NlcnQuaXNCb29sZWFuKHRlYVNlcnZlZCwgJ2hhcyB0ZWEgYmVlbiBzZXJ2ZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNCb29sZWFuXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0Jvb2xlYW4gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCb29sZWFuLCB0cnVlKS50by5iZS5hKCdib29sZWFuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RCb29sZWFuKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGEgYm9vbGVhbi5cbiAgICpcbiAgICogICAgIHZhciB0ZWFSZWFkeSA9ICd5ZXAnXG4gICAqICAgICAgICwgdGVhU2VydmVkID0gJ25vcGUnO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTm90Qm9vbGVhbih0ZWFSZWFkeSwgJ2lzIHRoZSB0ZWEgcmVhZHknKTtcbiAgICogICAgIGFzc2VydC5pc05vdEJvb2xlYW4odGVhU2VydmVkLCAnaGFzIHRlYSBiZWVuIHNlcnZlZCcpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdEJvb2xlYW5cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90Qm9vbGVhbiA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEJvb2xlYW4sIHRydWUpLnRvLm5vdC5iZS5hKCdib29sZWFuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAudHlwZU9mKHZhbHVlLCBuYW1lLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgJ3MgdHlwZSBpcyBgbmFtZWAsIGFzIGRldGVybWluZWQgYnlcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnR5cGVPZih7IHRlYTogJ2NoYWknIH0sICdvYmplY3QnLCAnd2UgaGF2ZSBhbiBvYmplY3QnKTtcbiAgICogICAgIGFzc2VydC50eXBlT2YoWydjaGFpJywgJ2phc21pbmUnXSwgJ2FycmF5JywgJ3dlIGhhdmUgYW4gYXJyYXknKTtcbiAgICogICAgIGFzc2VydC50eXBlT2YoJ3RlYScsICdzdHJpbmcnLCAnd2UgaGF2ZSBhIHN0cmluZycpO1xuICAgKiAgICAgYXNzZXJ0LnR5cGVPZigvdGVhLywgJ3JlZ2V4cCcsICd3ZSBoYXZlIGEgcmVndWxhciBleHByZXNzaW9uJyk7XG4gICAqICAgICBhc3NlcnQudHlwZU9mKG51bGwsICdudWxsJywgJ3dlIGhhdmUgYSBudWxsJyk7XG4gICAqICAgICBhc3NlcnQudHlwZU9mKHVuZGVmaW5lZCwgJ3VuZGVmaW5lZCcsICd3ZSBoYXZlIGFuIHVuZGVmaW5lZCcpO1xuICAgKlxuICAgKiBAbmFtZSB0eXBlT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnR5cGVPZiA9IGZ1bmN0aW9uICh2YWwsIHR5cGUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC50eXBlT2YsIHRydWUpLnRvLmJlLmEodHlwZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90VHlwZU9mKHZhbHVlLCBuYW1lLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgJ3MgdHlwZSBpcyBfbm90XyBgbmFtZWAsIGFzIGRldGVybWluZWQgYnlcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFR5cGVPZigndGVhJywgJ251bWJlcicsICdzdHJpbmdzIGFyZSBub3QgbnVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RUeXBlT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVvZiBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RUeXBlT2YgPSBmdW5jdGlvbiAodmFsLCB0eXBlLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90VHlwZU9mLCB0cnVlKS50by5ub3QuYmUuYSh0eXBlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pbnN0YW5jZU9mKG9iamVjdCwgY29uc3RydWN0b3IsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYGNvbnN0cnVjdG9yYC5cbiAgICpcbiAgICogICAgIHZhciBUZWEgPSBmdW5jdGlvbiAobmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9XG4gICAqICAgICAgICwgY2hhaSA9IG5ldyBUZWEoJ2NoYWknKTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pbnN0YW5jZU9mKGNoYWksIFRlYSwgJ2NoYWkgaXMgYW4gaW5zdGFuY2Ugb2YgdGVhJyk7XG4gICAqXG4gICAqIEBuYW1lIGluc3RhbmNlT2ZcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5zdGFuY2VPZiA9IGZ1bmN0aW9uICh2YWwsIHR5cGUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pbnN0YW5jZU9mLCB0cnVlKS50by5iZS5pbnN0YW5jZU9mKHR5cGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluc3RhbmNlT2Yob2JqZWN0LCBjb25zdHJ1Y3RvciwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIGB2YWx1ZWAgaXMgbm90IGFuIGluc3RhbmNlIG9mIGBjb25zdHJ1Y3RvcmAuXG4gICAqXG4gICAqICAgICB2YXIgVGVhID0gZnVuY3Rpb24gKG5hbWUpIHsgdGhpcy5uYW1lID0gbmFtZTsgfVxuICAgKiAgICAgICAsIGNoYWkgPSBuZXcgU3RyaW5nKCdjaGFpJyk7XG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5zdGFuY2VPZihjaGFpLCBUZWEsICdjaGFpIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0ZWEnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5zdGFuY2VPZlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RJbnN0YW5jZU9mID0gZnVuY3Rpb24gKHZhbCwgdHlwZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lm5vdEluc3RhbmNlT2YsIHRydWUpXG4gICAgICAudG8ubm90LmJlLmluc3RhbmNlT2YodHlwZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgaGF5c3RhY2tgIGluY2x1ZGVzIGBuZWVkbGVgLiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlXG4gICAqIGluY2x1c2lvbiBvZiBhIHZhbHVlIGluIGFuIGFycmF5LCBhIHN1YnN0cmluZyBpbiBhIHN0cmluZywgb3IgYSBzdWJzZXQgb2ZcbiAgICogcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZShbMSwyLDNdLCAyLCAnYXJyYXkgY29udGFpbnMgdmFsdWUnKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKCdmb29iYXInLCAnZm9vJywgJ3N0cmluZyBjb250YWlucyBzdWJzdHJpbmcnKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKHsgZm9vOiAnYmFyJywgaGVsbG86ICd1bml2ZXJzZScgfSwgeyBmb286ICdiYXInIH0sICdvYmplY3QgY29udGFpbnMgcHJvcGVydHknKTtcbiAgICpcbiAgICogU3RyaWN0IGVxdWFsaXR5ICg9PT0pIGlzIHVzZWQuIFdoZW4gYXNzZXJ0aW5nIHRoZSBpbmNsdXNpb24gb2YgYSB2YWx1ZSBpblxuICAgKiBhbiBhcnJheSwgdGhlIGFycmF5IGlzIHNlYXJjaGVkIGZvciBhbiBlbGVtZW50IHRoYXQncyBzdHJpY3RseSBlcXVhbCB0byB0aGVcbiAgICogZ2l2ZW4gdmFsdWUuIFdoZW4gYXNzZXJ0aW5nIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LCB0aGUgb2JqZWN0XG4gICAqIGlzIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkga2V5cywgY2hlY2tpbmcgdGhhdCBlYWNoIG9uZSBpcyBwcmVzZW50XG4gICAqIGFuZCBzdHJpY3R5IGVxdWFsIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4gRm9yIGluc3RhbmNlOlxuICAgKlxuICAgKiAgICAgdmFyIG9iajEgPSB7YTogMX1cbiAgICogICAgICAgLCBvYmoyID0ge2I6IDJ9O1xuICAgKiAgICAgYXNzZXJ0LmluY2x1ZGUoW29iajEsIG9iajJdLCBvYmoxKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IG9iajF9KTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IG9iajEsIGJhcjogb2JqMn0pO1xuICAgKlxuICAgKiBAbmFtZSBpbmNsdWRlXG4gICAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge01peGVkfSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGUgPSBmdW5jdGlvbiAoZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5pbmNsdWRlLCB0cnVlKS5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90SW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgaGF5c3RhY2tgIGRvZXMgbm90IGluY2x1ZGUgYG5lZWRsZWAuIENhbiBiZSB1c2VkIHRvIGFzc2VydFxuICAgKiB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIGFuIGFycmF5LCBhIHN1YnN0cmluZyBpbiBhIHN0cmluZywgb3IgYSBzdWJzZXQgb2ZcbiAgICogcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZShbMSwyLDNdLCA0LCAnYXJyYXkgZG9lc24ndCBjb250YWluIHZhbHVlJyk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSgnZm9vYmFyJywgJ2JheicsICdzdHJpbmcgZG9lc24ndCBjb250YWluIHN1YnN0cmluZycpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGUoeyBmb286ICdiYXInLCBoZWxsbzogJ3VuaXZlcnNlJyB9LCB7IGZvbzogJ2JheicgfSwgJ29iamVjdCBkb2Vzbid0IGNvbnRhaW4gcHJvcGVydHknKTtcbiAgICpcbiAgICogU3RyaWN0IGVxdWFsaXR5ICg9PT0pIGlzIHVzZWQuIFdoZW4gYXNzZXJ0aW5nIHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gYW5cbiAgICogYXJyYXksIHRoZSBhcnJheSBpcyBzZWFyY2hlZCB0byBjb25maXJtIHRoZSBhYnNlbmNlIG9mIGFuIGVsZW1lbnQgdGhhdCdzXG4gICAqIHN0cmljdGx5IGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4gV2hlbiBhc3NlcnRpbmcgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpblxuICAgKiBhbiBvYmplY3QsIHRoZSBvYmplY3QgaXMgc2VhcmNoZWQgdG8gY29uZmlybSB0aGF0IGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW5cbiAgICogcHJvcGVydHkga2V5cyBpcyBlaXRoZXIgbm90IHByZXNlbnQgb3Igbm90IHN0cmljdGx5IGVxdWFsIHRvIHRoZSBnaXZlblxuICAgKiBwcm9wZXJ0eSB2YWx1ZS4gRm9yIGluc3RhbmNlOlxuICAgKlxuICAgKiAgICAgdmFyIG9iajEgPSB7YTogMX1cbiAgICogICAgICAgLCBvYmoyID0ge2I6IDJ9O1xuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGUoW29iajEsIG9iajJdLCB7YTogMX0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDF9fSk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiBvYmoxLCBiYXI6IHtiOiAyfX0pO1xuICAgKlxuICAgKiBAbmFtZSBub3RJbmNsdWRlXG4gICAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge01peGVkfSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGUgPSBmdW5jdGlvbiAoZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3RJbmNsdWRlLCB0cnVlKS5ub3QuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlZXBJbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBoYXlzdGFja2AgaW5jbHVkZXMgYG5lZWRsZWAuIENhbiBiZSB1c2VkIHRvIGFzc2VydCB0aGVcbiAgICogaW5jbHVzaW9uIG9mIGEgdmFsdWUgaW4gYW4gYXJyYXkgb3IgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqIERlZXAgZXF1YWxpdHkgaXMgdXNlZC5cbiAgICpcbiAgICogICAgIHZhciBvYmoxID0ge2E6IDF9XG4gICAqICAgICAgICwgb2JqMiA9IHtiOiAyfTtcbiAgICogICAgIGFzc2VydC5kZWVwSW5jbHVkZShbb2JqMSwgb2JqMl0sIHthOiAxfSk7XG4gICAqICAgICBhc3NlcnQuZGVlcEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDF9fSk7XG4gICAqICAgICBhc3NlcnQuZGVlcEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDF9LCBiYXI6IHtiOiAyfX0pO1xuICAgKlxuICAgKiBAbmFtZSBkZWVwSW5jbHVkZVxuICAgKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWVwSW5jbHVkZSA9IGZ1bmN0aW9uIChleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0LmRlZXBJbmNsdWRlLCB0cnVlKS5kZWVwLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwSW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgaGF5c3RhY2tgIGRvZXMgbm90IGluY2x1ZGUgYG5lZWRsZWAuIENhbiBiZSB1c2VkIHRvIGFzc2VydFxuICAgKiB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIGFuIGFycmF5IG9yIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LlxuICAgKiBEZWVwIGVxdWFsaXR5IGlzIHVzZWQuXG4gICAqXG4gICAqICAgICB2YXIgb2JqMSA9IHthOiAxfVxuICAgKiAgICAgICAsIG9iajIgPSB7YjogMn07XG4gICAqICAgICBhc3NlcnQubm90RGVlcEluY2x1ZGUoW29iajEsIG9iajJdLCB7YTogOX0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBJbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IHthOiA5fX0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBJbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IHthOiAxfSwgYmFyOiB7YjogOX19KTtcbiAgICpcbiAgICogQG5hbWUgbm90RGVlcEluY2x1ZGVcbiAgICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RGVlcEluY2x1ZGUgPSBmdW5jdGlvbiAoZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3REZWVwSW5jbHVkZSwgdHJ1ZSkubm90LmRlZXAuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5lc3RlZEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKiBcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgaW5jbHVkZXMgJ25lZWRsZScuIFxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGluY2x1c2lvbiBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuIFxuICAgKiBvYmplY3QuXG4gICAqIEVuYWJsZXMgdGhlIHVzZSBvZiBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGZvciByZWZlcmVuY2luZyBuZXN0ZWQgXG4gICAqIHByb3BlcnRpZXMuXG4gICAqICdbXScgYW5kICcuJyBpbiBwcm9wZXJ0eSBuYW1lcyBjYW4gYmUgZXNjYXBlZCB1c2luZyBkb3VibGUgYmFja3NsYXNoZXMuXG4gICAqIFxuICAgKiAgICAgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUoeycuYSc6IHsnYic6ICd4J319LCB7J1xcXFwuYS5bYl0nOiAneCd9KTtcbiAgICogICAgIGFzc2VydC5uZXN0ZWRJbmNsdWRlKHsnYSc6IHsnW2JdJzogJ3gnfX0sIHsnYS5cXFxcW2JcXFxcXSc6ICd4J30pO1xuICAgKiBcbiAgICogQG5hbWUgbmVzdGVkSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpYyBcbiAgICovIFxuXG4gIGFzc2VydC5uZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubmVzdGVkSW5jbHVkZSwgdHJ1ZSkubmVzdGVkLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3ROZXN0ZWRJbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICogXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGRvZXMgbm90IGluY2x1ZGUgJ25lZWRsZScuIFxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGFic2VuY2Ugb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBcbiAgICogb2JqZWN0LlxuICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgcmVmZXJlbmNpbmcgbmVzdGVkIFxuICAgKiBwcm9wZXJ0aWVzLiBcbiAgICogJ1tdJyBhbmQgJy4nIGluIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBlc2NhcGVkIHVzaW5nIGRvdWJsZSBiYWNrc2xhc2hlcy5cbiAgICogXG4gICAqICAgICBhc3NlcnQubm90TmVzdGVkSW5jbHVkZSh7Jy5hJzogeydiJzogJ3gnfX0sIHsnXFxcXC5hLmInOiAneSd9KTtcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlKHsnYSc6IHsnW2JdJzogJ3gnfX0sIHsnYS5cXFxcW2JcXFxcXSc6ICd5J30pO1xuICAgKiBcbiAgICogQG5hbWUgbm90TmVzdGVkSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpYyBcbiAgICovIFxuXG4gIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90TmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5ub3QubmVzdGVkLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5kZWVwTmVzdGVkSW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqIFxuICAgKiBBc3NlcnRzIHRoYXQgJ2hheXN0YWNrJyBpbmNsdWRlcyAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBpbmNsdXNpb24gb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBcbiAgICogb2JqZWN0IHdoaWxlIGNoZWNraW5nIGZvciBkZWVwIGVxdWFsaXR5LlxuICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgcmVmZXJlbmNpbmcgbmVzdGVkIFxuICAgKiBwcm9wZXJ0aWVzLlxuICAgKiAnW10nIGFuZCAnLicgaW4gcHJvcGVydHkgbmFtZXMgY2FuIGJlIGVzY2FwZWQgdXNpbmcgZG91YmxlIGJhY2tzbGFzaGVzLlxuICAgKiBcbiAgICogICAgIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSh7YToge2I6IFt7eDogMX1dfX0sIHsnYS5iWzBdJzoge3g6IDF9fSk7XG4gICAqICAgICBhc3NlcnQuZGVlcE5lc3RlZEluY2x1ZGUoeycuYSc6IHsnW2JdJzoge3g6IDF9fX0sIHsnXFxcXC5hLlxcXFxbYlxcXFxdJzoge3g6IDF9fSk7XG4gICAqICAgIFxuICAgKiBAbmFtZSBkZWVwTmVzdGVkSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpYyBcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5kZWVwLm5lc3RlZC5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90RGVlcE5lc3RlZEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKiBcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgZG9lcyBub3QgaW5jbHVkZSAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBhYnNlbmNlIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gXG4gICAqIG9iamVjdCB3aGlsZSBjaGVja2luZyBmb3IgZGVlcCBlcXVhbGl0eS5cbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIHJlZmVyZW5jaW5nIG5lc3RlZCBcbiAgICogcHJvcGVydGllcy5cbiAgICogJ1tdJyBhbmQgJy4nIGluIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBlc2NhcGVkIHVzaW5nIGRvdWJsZSBiYWNrc2xhc2hlcy5cbiAgICogXG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZEluY2x1ZGUoe2E6IHtiOiBbe3g6IDF9XX19LCB7J2EuYlswXSc6IHt5OiAxfX0pXG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZEluY2x1ZGUoeycuYSc6IHsnW2JdJzoge3g6IDF9fX0sIHsnXFxcXC5hLlxcXFxbYlxcXFxdJzoge3k6IDJ9fSk7XG4gICAqICAgIFxuICAgKiBAbmFtZSBub3REZWVwTmVzdGVkSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpYyBcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm93bkluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKiBcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgaW5jbHVkZXMgJ25lZWRsZScuXG4gICAqIENhbiBiZSB1c2VkIHRvIGFzc2VydCB0aGUgaW5jbHVzaW9uIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gXG4gICAqIG9iamVjdCB3aGlsZSBpZ25vcmluZyBpbmhlcml0ZWQgcHJvcGVydGllcy5cbiAgICogXG4gICAqICAgICBhc3NlcnQub3duSW5jbHVkZSh7IGE6IDEgfSwgeyBhOiAxIH0pO1xuICAgKiBcbiAgICogQG5hbWUgb3duSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQub3duSW5jbHVkZSwgdHJ1ZSkub3duLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICogXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGFic2VuY2Ugb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBcbiAgICogb2JqZWN0IHdoaWxlIGlnbm9yaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzLlxuICAgKiBcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqIFxuICAgKiAgICAgYXNzZXJ0Lm5vdE93bkluY2x1ZGUoeyBhOiAxIH0sIHsgYjogMiB9KTtcbiAgICogXG4gICAqIEBuYW1lIG5vdE93bkluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdE93bkluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlZXBPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICogXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGluY2x1c2lvbiBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuIFxuICAgKiBvYmplY3Qgd2hpbGUgaWdub3JpbmcgaW5oZXJpdGVkIHByb3BlcnRpZXMgYW5kIGNoZWNraW5nIGZvciBkZWVwIGVxdWFsaXR5LlxuICAgKiBcbiAgICogICAgICBhc3NlcnQuZGVlcE93bkluY2x1ZGUoe2E6IHtiOiAyfX0sIHthOiB7YjogMn19KTtcbiAgICogICAgICBcbiAgICogQG5hbWUgZGVlcE93bkluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwT3duSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLm5vdERlZXBPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICogXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGFic2VuY2Ugb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBcbiAgICogb2JqZWN0IHdoaWxlIGlnbm9yaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGFuZCBjaGVja2luZyBmb3IgZGVlcCBlcXVhbGl0eS5cbiAgICogXG4gICAqICAgICAgYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlKHthOiB7YjogMn19LCB7YToge2M6IDN9fSk7XG4gICAqICAgICAgXG4gICAqIEBuYW1lIG5vdERlZXBPd25JbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3REZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpXG4gICAgICAubm90LmRlZXAub3duLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5tYXRjaCh2YWx1ZSwgcmVnZXhwLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBgcmVnZXhwYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5tYXRjaCgnZm9vYmFyJywgL15mb28vLCAncmVnZXhwIG1hdGNoZXMnKTtcbiAgICpcbiAgICogQG5hbWUgbWF0Y2hcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubWF0Y2ggPSBmdW5jdGlvbiAoZXhwLCByZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm1hdGNoLCB0cnVlKS50by5tYXRjaChyZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TWF0Y2godmFsdWUsIHJlZ2V4cCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uIGByZWdleHBgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdE1hdGNoKCdmb29iYXInLCAvXmZvby8sICdyZWdleHAgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICpcbiAgICogQG5hbWUgbm90TWF0Y2hcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90TWF0Y2ggPSBmdW5jdGlvbiAoZXhwLCByZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE1hdGNoLCB0cnVlKS50by5ub3QubWF0Y2gocmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YC5cbiAgICpcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEnKTtcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0b1N0cmluZycpO1xuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQucHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQucHJvcGVydHksIHRydWUpLnRvLmhhdmUucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lZFxuICAgKiBieSBgcHJvcGVydHlgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFByb3BlcnR5KHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ2NvZmZlZScpO1xuICAgKlxuICAgKiBAbmFtZSBub3RQcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90UHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHksIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAucHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YCB3aXRoIGEgdmFsdWUgZ2l2ZW4gYnkgYHZhbHVlYC4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVja1xuICAgKiAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eVZhbCh7IHRlYTogJ2lzIGdvb2QnIH0sICd0ZWEnLCAnaXMgZ29vZCcpO1xuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQucHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5wcm9wZXJ0eVZhbCwgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90UHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWRcbiAgICogYnkgYHByb3BlcnR5YCB3aXRoIHZhbHVlIGdpdmVuIGJ5IGB2YWx1ZWAuIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHkgY2hlY2tcbiAgICogKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90UHJvcGVydHlWYWwoeyB0ZWE6ICdpcyBnb29kJyB9LCAndGVhJywgJ2lzIGJhZCcpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdFByb3BlcnR5VmFsKHsgdGVhOiAnaXMgZ29vZCcgfSwgJ2NvZmZlZScsICdpcyBnb29kJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFByb3BlcnR5VmFsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcFByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVkIGJ5XG4gICAqIGBwcm9wZXJ0eWAgd2l0aCBhIHZhbHVlIGdpdmVuIGJ5IGB2YWx1ZWAuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuZGVlcC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdERlZXBQcm9wZXJ0eVZhbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lZFxuICAgKiBieSBgcHJvcGVydHlgIHdpdGggdmFsdWUgZ2l2ZW4gYnkgYHZhbHVlYC4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9IH0sICd0ZWEnLCB7IGJsYWNrOiAnbWF0Y2hhJyB9KTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwUHJvcGVydHlWYWwoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH0gfSwgJ3RlYScsIHsgZ3JlZW46ICdvb2xvbmcnIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAnY29mZmVlJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5vd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YC4gSW5oZXJpdGVkXG4gICAqIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duUHJvcGVydHkoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH19LCAndGVhJyk7XG4gICAqXG4gICAqIEBuYW1lIG93blByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5vd25Qcm9wZXJ0eSwgdHJ1ZSlcbiAgICAgIC50by5oYXZlLm93bi5wcm9wZXJ0eShwcm9wKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIF9ub3RfIGhhdmUgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YC4gSW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHkoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH19LCAnY29mZmVlJyk7XG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHkoe30sICd0b1N0cmluZycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RPd25Qcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90T3duUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90T3duUHJvcGVydHksIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUub3duLnByb3BlcnR5KHByb3ApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCBhbmQgYSB2YWx1ZVxuICAgKiBlcXVhbCB0byB0aGUgcHJvdmlkZWQgYHZhbHVlYC4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICogSW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duUHJvcGVydHlWYWwoeyBjb2ZmZWU6ICdpcyBnb29kJ30sICdjb2ZmZWUnLCAnaXMgZ29vZCcpO1xuICAgKlxuICAgKiBAbmFtZSBvd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25Qcm9wZXJ0eVZhbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWBcbiAgICogd2l0aCBhIHZhbHVlIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBgdmFsdWVgLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrXG4gICAqICg9PT0pLiBJbmhlcml0ZWQgcHJvcGVydGllcyBhcmVuJ3QgY2hlY2tlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RPd25Qcm9wZXJ0eVZhbCh7IHRlYTogJ2lzIGJldHRlcid9LCAndGVhJywgJ2lzIHdvcnNlJyk7XG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwoe30sICd0b1N0cmluZycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuICAgKlxuICAgKiBAbmFtZSBub3RPd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcE93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCBhbmQgYSB2YWx1ZVxuICAgKiBlcXVhbCB0byB0aGUgcHJvdmlkZWQgYHZhbHVlYC4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suIEluaGVyaXRlZFxuICAgKiBwcm9wZXJ0aWVzIGFyZW4ndCBjaGVja2VkLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBPd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kZWVwT3duUHJvcGVydHlWYWwsIHRydWUpXG4gICAgICAudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90RGVlcE93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIF9ub3RfIGhhdmUgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YFxuICAgKiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIGB2YWx1ZWAuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKiBJbmhlcml0ZWQgcHJvcGVydGllcyBhcmVuJ3QgY2hlY2tlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH0gfSwgJ3RlYScsIHsgYmxhY2s6ICdtYXRjaGEnIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ29vbG9uZycgfSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcE93blByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9IH0sICdjb2ZmZWUnLCB7IGdyZWVuOiAnbWF0Y2hhJyB9KTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwoe30sICd0b1N0cmluZycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwT3duUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcE93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmRlZXAub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5uZXN0ZWRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVkIGJ5XG4gICAqIGBwcm9wZXJ0eWAsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyB1c2luZyBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGZvclxuICAgKiBuZXN0ZWQgcmVmZXJlbmNlLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5lc3RlZFByb3BlcnR5KHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ3RlYS5ncmVlbicpO1xuICAgKlxuICAgKiBAbmFtZSBuZXN0ZWRQcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubmVzdGVkUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubmVzdGVkUHJvcGVydHksIHRydWUpXG4gICAgICAudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TmVzdGVkUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCwgd2hpY2hcbiAgICogY2FuIGJlIGEgc3RyaW5nIHVzaW5nIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIG5lc3RlZCByZWZlcmVuY2UuIFRoZVxuICAgKiBwcm9wZXJ0eSBjYW5ub3QgZXhpc3Qgb24gdGhlIG9iamVjdCBub3IgYW55d2hlcmUgaW4gaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEub29sb25nJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdE5lc3RlZFByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aCB2YWx1ZSBnaXZlblxuICAgKiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgbmVzdGVkXG4gICAqIHJlZmVyZW5jZS4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEuZ3JlZW4nLCAnbWF0Y2hhJyk7XG4gICAqXG4gICAqIEBuYW1lIG5lc3RlZFByb3BlcnR5VmFsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aFxuICAgKiB2YWx1ZSBnaXZlbiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3JcbiAgICogbmVzdGVkIHJlZmVyZW5jZS4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEuZ3JlZW4nLCAna29uYWNoYScpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ2NvZmZlZS5ncmVlbicsICdtYXRjaGEnKTtcbiAgICpcbiAgICogQG5hbWUgbm90TmVzdGVkUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90TmVzdGVkUHJvcGVydHlWYWwsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcE5lc3RlZFByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBwcm9wZXJ0eSBuYW1lZCBieSBgcHJvcGVydHlgIHdpdGggYSB2YWx1ZSBnaXZlblxuICAgKiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgbmVzdGVkXG4gICAqIHJlZmVyZW5jZS4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG1hdGNoYTogJ3l1bScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBOZXN0ZWRQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwTmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aFxuICAgKiB2YWx1ZSBnaXZlbiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3JcbiAgICogbmVzdGVkIHJlZmVyZW5jZS4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG9vbG9uZzogJ3l1bScgfSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG1hdGNoYTogJ3l1Y2snIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogeyBtYXRjaGE6ICd5dW0nIH0gfSB9LCAndGVhLmJsYWNrJywgeyBtYXRjaGE6ICd5dW0nIH0pO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwTmVzdGVkUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubGVuZ3RoT2Yob2JqZWN0LCBsZW5ndGgsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGBsZW5ndGhgIHByb3BlcnR5IHdpdGggdGhlIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lmxlbmd0aE9mKFsxLDIsM10sIDMsICdhcnJheSBoYXMgbGVuZ3RoIG9mIDMnKTtcbiAgICogICAgIGFzc2VydC5sZW5ndGhPZignZm9vYmFyJywgNiwgJ3N0cmluZyBoYXMgbGVuZ3RoIG9mIDYnKTtcbiAgICpcbiAgICogQG5hbWUgbGVuZ3RoT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lmxlbmd0aE9mID0gZnVuY3Rpb24gKGV4cCwgbGVuLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubGVuZ3RoT2YsIHRydWUpLnRvLmhhdmUubGVuZ3RoT2YobGVuKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5oYXNBbnlLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBga2V5c2AgcHJvdmlkZWQuXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lmhhc0FueUtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ2ZvbycsICdpRG9udEV4aXN0JywgJ2JheiddKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwge2ZvbzogMzAsIGlEb250RXhpc3Q6IDk5LCBiYXo6IDEzMzd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7Zm9vOiAxfSwgJ2tleSddKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSksIFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10pO1xuICAgKlxuICAgKiBAbmFtZSBoYXNBbnlLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQW55S2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbnlLZXlzLCB0cnVlKS50by5oYXZlLmFueS5rZXlzKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaGFzQWxsS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGFsbCBhbmQgb25seSBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaGFzQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIFsnZm9vJywgJ2JhcicsICdiYXonXSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtmb286IDMwLCBiYXI6IDk5LCBiYXo6IDEzMzddKTtcbiAgICogICAgIGFzc2VydC5oYXNBbGxLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7Zm9vOiAxfSwgJ2tleSddKTtcbiAgICogICAgIGFzc2VydC5oYXNBbGxLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSwgW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSk7XG4gICAqXG4gICAqIEBuYW1lIGhhc0FsbEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nW119IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lmhhc0FsbEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQWxsS2V5cywgdHJ1ZSkudG8uaGF2ZS5hbGwua2V5cyhrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmNvbnRhaW5zQWxsS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGFsbCBvZiB0aGUgYGtleXNgIHByb3ZpZGVkIGJ1dCBtYXkgaGF2ZSBtb3JlIGtleXMgbm90IGxpc3RlZC5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwgWydmb28nLCAnYmF6J10pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIFsnZm9vJywgJ2JhcicsICdiYXonXSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwge2ZvbzogMzAsIGJhejogMTMzN30pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtmb286IDMwLCBiYXI6IDk5LCBiYXo6IDEzMzd9KTtcbiAgICogICAgIGFzc2VydC5jb250YWluc0FsbEtleXMobmV3IE1hcChbW3tmb286IDF9LCAnYmFyJ10sIFsna2V5JywgJ3ZhbHVlJ11dKSwgW3tmb286IDF9XSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7Zm9vOiAxfSwgJ2tleSddKTtcbiAgICogICAgIGFzc2VydC5jb250YWluc0FsbEtleXMobmV3IFNldChbe2ZvbzogJ2Jhcid9LCAnYW5vdGhlcktleSddLCBbe2ZvbzogJ2Jhcid9XSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSwgW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSk7XG4gICAqXG4gICAqIEBuYW1lIGNvbnRhaW5zQWxsS2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmdbXX0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuY29udGFpbnNBbGxLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cywgdHJ1ZSlcbiAgICAgIC50by5jb250YWluLmFsbC5rZXlzKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdEhhdmVBbnlLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgbm9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ29uZScsICd0d28nLCAnZXhhbXBsZSddKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCB7b25lOiAxLCB0d286IDIsIGV4YW1wbGU6ICdmb28nfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7b25lOiAndHdvJ30sICdleGFtcGxlJ10pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10sIFt7b25lOiAndHdvJ30sICdleGFtcGxlJ10pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SGF2ZUFueUtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nW119IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUuYW55LmtleXMoa2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFsbEtleXMob2JqZWN0LCBba2V5c10sIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgbm90IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBga2V5c2AgcHJvdmlkZWQuXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIFsnb25lJywgJ3R3bycsICdleGFtcGxlJ10pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtvbmU6IDEsIHR3bzogMiwgZXhhbXBsZTogJ2Zvbyd9KTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMobmV3IE1hcChbW3tmb286IDF9LCAnYmFyJ10sIFsna2V5JywgJ3ZhbHVlJ11dKSwgW3tvbmU6ICd0d28nfSwgJ2V4YW1wbGUnXSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSwgW3tvbmU6ICd0d28nfSwgJ2V4YW1wbGUnXSk7XG4gICAqXG4gICAqIEBuYW1lIGRvZXNOb3RIYXZlQWxsS2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmdbXX0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5hbGwua2V5cyhrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmhhc0FueURlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBga2V5c2AgcHJvdmlkZWQuXG4gICAqIFNpbmNlIFNldHMgYW5kIE1hcHMgY2FuIGhhdmUgb2JqZWN0cyBhcyBrZXlzIHlvdSBjYW4gdXNlIHRoaXMgYXNzZXJ0aW9uIHRvIHBlcmZvcm1cbiAgICogYSBkZWVwIGNvbXBhcmlzb24uXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lmhhc0FueURlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge29uZTogJ29uZSd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgWzEsIDJdXSksIFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pO1xuICAgKiAgICAgYXNzZXJ0Lmhhc0FueURlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbe3R3bzogJ3R3byd9LCAndmFsdWVUd28nXV0pLCBbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7b25lOiAnb25lJ30pO1xuICAgKiAgICAgYXNzZXJ0Lmhhc0FueURlZXBLZXlzKG5ldyBTZXQoW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSksIFt7b25lOiAnb25lJ30sIHt0aHJlZTogJ3RocmVlJ31dKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCBbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdEhhdmVBbGxLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQW55RGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55RGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5oYXNBbGxEZWVwS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGFsbCBhbmQgb25seSBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogU2luY2UgU2V0cyBhbmQgTWFwcyBjYW4gaGF2ZSBvYmplY3RzIGFzIGtleXMgeW91IGNhbiB1c2UgdGhpcyBhc3NlcnRpb24gdG8gcGVyZm9ybVxuICAgKiBhIGRlZXAgY29tcGFyaXNvbi5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IE1hcChbW3tvbmU6ICdvbmUnfSwgJ3ZhbHVlT25lJ11dKSwge29uZTogJ29uZSd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9XSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGhhc0FsbERlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQWxsRGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQWxsRGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5hbGwuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5jb250YWluc0FsbERlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBjb250YWlucyBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogU2luY2UgU2V0cyBhbmQgTWFwcyBjYW4gaGF2ZSBvYmplY3RzIGFzIGtleXMgeW91IGNhbiB1c2UgdGhpcyBhc3NlcnRpb24gdG8gcGVyZm9ybVxuICAgKiBhIGRlZXAgY29tcGFyaXNvbi5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgWzEsIDJdXSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7b25lOiAnb25lJ30pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGNvbnRhaW5zQWxsRGVlcEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBrZXlzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jb250YWluc0FsbERlZXBLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgbm9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge3RoaXNEb2VzTm90OiAnZXhpc3QnfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3t0d2VudHk6ICd0d2VudHknfSwge2ZpZnR5OiAnZmlmdHknfV0pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwge3R3ZW50eTogJ3R3ZW50eSd9KTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG5ldyBTZXQoW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSksIFt7dHdlbnR5OiAndHdlbnR5J30sIHtmaWZ0eTogJ2ZpZnR5J31dKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdEhhdmVBbnlEZWVwS2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbnlEZWVwS2V5cywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge3RoaXNEb2VzTm90OiAnZXhpc3QnfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3t0d2VudHk6ICd0d2VudHknfSwge29uZTogJ29uZSd9XSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7dHdlbnR5OiAndHdlbnR5J30pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge2ZpZnR5OiAnZmlmdHknfV0pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SGF2ZUFsbERlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmFsbC5kZWVwLmtleXMoa2V5cyk7XG4gIH1cblxuIC8qKlxuICAgKiAjIyMgLnRocm93cyhmbiwgW2Vycm9yTGlrZS9zdHJpbmcvcmVnZXhwXSwgW3N0cmluZy9yZWdleHBdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIElmIGBlcnJvckxpa2VgIGlzIGFuIGBFcnJvcmAgY29uc3RydWN0b3IsIGFzc2VydHMgdGhhdCBgZm5gIHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhblxuICAgKiBpbnN0YW5jZSBvZiBgZXJyb3JMaWtlYC5cbiAgICogSWYgYGVycm9yTGlrZWAgaXMgYW4gYEVycm9yYCBpbnN0YW5jZSwgYXNzZXJ0cyB0aGF0IHRoZSBlcnJvciB0aHJvd24gaXMgdGhlIHNhbWVcbiAgICogaW5zdGFuY2UgYXMgYGVycm9yTGlrZWAuXG4gICAqIElmIGBlcnJNc2dNYXRjaGVyYCBpcyBwcm92aWRlZCwgaXQgYWxzbyBhc3NlcnRzIHRoYXQgdGhlIGVycm9yIHRocm93biB3aWxsIGhhdmUgYVxuICAgKiBtZXNzYWdlIG1hdGNoaW5nIGBlcnJNc2dNYXRjaGVyYC5cbiAgICpcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sICdmdW5jdGlvbiB0aHJvd3MgYSByZWZlcmVuY2UgZXJyb3InKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIC9mdW5jdGlvbiB0aHJvd3MgYSByZWZlcmVuY2UgZXJyb3IvKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIFJlZmVyZW5jZUVycm9yKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIGVycm9ySW5zdGFuY2UpO1xuICAgKiAgICAgYXNzZXJ0LnRocm93cyhmbiwgUmVmZXJlbmNlRXJyb3IsICdFcnJvciB0aHJvd24gbXVzdCBiZSBhIFJlZmVyZW5jZUVycm9yIGFuZCBoYXZlIHRoaXMgbXNnJyk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCBlcnJvckluc3RhbmNlLCAnRXJyb3IgdGhyb3duIG11c3QgYmUgdGhlIHNhbWUgZXJyb3JJbnN0YW5jZSBhbmQgaGF2ZSB0aGlzIG1zZycpO1xuICAgKiAgICAgYXNzZXJ0LnRocm93cyhmbiwgUmVmZXJlbmNlRXJyb3IsIC9FcnJvciB0aHJvd24gbXVzdCBiZSBhIFJlZmVyZW5jZUVycm9yIGFuZCBtYXRjaCB0aGlzLyk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCBlcnJvckluc3RhbmNlLCAvRXJyb3IgdGhyb3duIG11c3QgYmUgdGhlIHNhbWUgZXJyb3JJbnN0YW5jZSBhbmQgbWF0Y2ggdGhpcy8pO1xuICAgKlxuICAgKiBAbmFtZSB0aHJvd3NcbiAgICogQGFsaWFzIHRocm93XG4gICAqIEBhbGlhcyBUaHJvd1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J8RXJyb3J9IGVycm9yTGlrZVxuICAgKiBAcGFyYW0ge1JlZ0V4cHxTdHJpbmd9IGVyck1zZ01hdGNoZXJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvciNFcnJvcl90eXBlc1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQudGhyb3dzID0gZnVuY3Rpb24gKGZuLCBlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGVycm9yTGlrZSB8fCBlcnJvckxpa2UgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIGVyck1zZ01hdGNoZXIgPSBlcnJvckxpa2U7XG4gICAgICBlcnJvckxpa2UgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBhc3NlcnRFcnIgPSBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC50aHJvd3MsIHRydWUpXG4gICAgICAudG8udGhyb3coZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyKTtcbiAgICByZXR1cm4gZmxhZyhhc3NlcnRFcnIsICdvYmplY3QnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90VGhyb3coZm4sIFtlcnJvckxpa2Uvc3RyaW5nL3JlZ2V4cF0sIFtzdHJpbmcvcmVnZXhwXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBJZiBgZXJyb3JMaWtlYCBpcyBhbiBgRXJyb3JgIGNvbnN0cnVjdG9yLCBhc3NlcnRzIHRoYXQgYGZuYCB3aWxsIF9ub3RfIHRocm93IGFuIGVycm9yIHRoYXQgaXMgYW5cbiAgICogaW5zdGFuY2Ugb2YgYGVycm9yTGlrZWAuXG4gICAqIElmIGBlcnJvckxpa2VgIGlzIGFuIGBFcnJvcmAgaW5zdGFuY2UsIGFzc2VydHMgdGhhdCB0aGUgZXJyb3IgdGhyb3duIGlzIF9ub3RfIHRoZSBzYW1lXG4gICAqIGluc3RhbmNlIGFzIGBlcnJvckxpa2VgLlxuICAgKiBJZiBgZXJyTXNnTWF0Y2hlcmAgaXMgcHJvdmlkZWQsIGl0IGFsc28gYXNzZXJ0cyB0aGF0IHRoZSBlcnJvciB0aHJvd24gd2lsbCBfbm90XyBoYXZlIGFcbiAgICogbWVzc2FnZSBtYXRjaGluZyBgZXJyTXNnTWF0Y2hlcmAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCAnQW55IEVycm9yIHRocm93biBtdXN0IG5vdCBoYXZlIHRoaXMgbWVzc2FnZScpO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgL0FueSBFcnJvciB0aHJvd24gbXVzdCBub3QgbWF0Y2ggdGhpcy8pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgRXJyb3IpO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgZXJyb3JJbnN0YW5jZSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBFcnJvciwgJ0Vycm9yIG11c3Qgbm90IGhhdmUgdGhpcyBtZXNzYWdlJyk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBlcnJvckluc3RhbmNlLCAnRXJyb3IgbXVzdCBub3QgaGF2ZSB0aGlzIG1lc3NhZ2UnKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90VGhyb3coZm4sIEVycm9yLCAvRXJyb3IgbXVzdCBub3QgbWF0Y2ggdGhpcy8pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgZXJyb3JJbnN0YW5jZSwgL0Vycm9yIG11c3Qgbm90IG1hdGNoIHRoaXMvKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdFRocm93XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gZXJyb3JMaWtlXG4gICAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gZXJyTXNnTWF0Y2hlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0Vycm9yX3R5cGVzXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbiAoZm4sIGVycm9yTGlrZSwgZXJyTXNnTWF0Y2hlciwgbXNnKSB7XG4gICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgZXJyb3JMaWtlIHx8IGVycm9yTGlrZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICAgIGVycm9yTGlrZSA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdFRocm93LCB0cnVlKVxuICAgICAgLnRvLm5vdC50aHJvdyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm9wZXJhdG9yKHZhbDEsIG9wZXJhdG9yLCB2YWwyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIENvbXBhcmVzIHR3byB2YWx1ZXMgdXNpbmcgYG9wZXJhdG9yYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5vcGVyYXRvcigxLCAnPCcsIDIsICdldmVyeXRoaW5nIGlzIG9rJyk7XG4gICAqICAgICBhc3NlcnQub3BlcmF0b3IoMSwgJz4nLCAyLCAndGhpcyB3aWxsIGZhaWwnKTtcbiAgICpcbiAgICogQG5hbWUgb3BlcmF0b3JcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsMVxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3BlcmF0b3JcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsMlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub3BlcmF0b3IgPSBmdW5jdGlvbiAodmFsLCBvcGVyYXRvciwgdmFsMiwgbXNnKSB7XG4gICAgdmFyIG9rO1xuICAgIHN3aXRjaChvcGVyYXRvcikge1xuICAgICAgY2FzZSAnPT0nOlxuICAgICAgICBvayA9IHZhbCA9PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgIG9rID0gdmFsID09PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJz4nOlxuICAgICAgICBvayA9IHZhbCA+IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPj0nOlxuICAgICAgICBvayA9IHZhbCA+PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzwnOlxuICAgICAgICBvayA9IHZhbCA8IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPD0nOlxuICAgICAgICBvayA9IHZhbCA8PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyE9JzpcbiAgICAgICAgb2sgPSB2YWwgIT0gdmFsMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICchPT0nOlxuICAgICAgICBvayA9IHZhbCAhPT0gdmFsMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBtc2cgPSBtc2cgPyBtc2cgKyAnOiAnIDogbXNnO1xuICAgICAgICB0aHJvdyBuZXcgY2hhaS5Bc3NlcnRpb25FcnJvcihcbiAgICAgICAgICBtc2cgKyAnSW52YWxpZCBvcGVyYXRvciBcIicgKyBvcGVyYXRvciArICdcIicsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGFzc2VydC5vcGVyYXRvclxuICAgICAgICApO1xuICAgIH1cbiAgICB2YXIgdGVzdCA9IG5ldyBBc3NlcnRpb24ob2ssIG1zZywgYXNzZXJ0Lm9wZXJhdG9yLCB0cnVlKTtcbiAgICB0ZXN0LmFzc2VydChcbiAgICAgICAgdHJ1ZSA9PT0gZmxhZyh0ZXN0LCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICcgKyB1dGlsLmluc3BlY3QodmFsKSArICcgdG8gYmUgJyArIG9wZXJhdG9yICsgJyAnICsgdXRpbC5pbnNwZWN0KHZhbDIpXG4gICAgICAsICdleHBlY3RlZCAnICsgdXRpbC5pbnNwZWN0KHZhbCkgKyAnIHRvIG5vdCBiZSAnICsgb3BlcmF0b3IgKyAnICcgKyB1dGlsLmluc3BlY3QodmFsMikgKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5jbG9zZVRvKGFjdHVhbCwgZXhwZWN0ZWQsIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIGBleHBlY3RlZGAsIHRvIHdpdGhpbiBhICsvLSBgZGVsdGFgIHJhbmdlLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmNsb3NlVG8oMS41LCAxLCAwLjUsICdudW1iZXJzIGFyZSBjbG9zZScpO1xuICAgKlxuICAgKiBAbmFtZSBjbG9zZVRvXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhY3R1YWxcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuY2xvc2VUbyA9IGZ1bmN0aW9uIChhY3QsIGV4cCwgZGVsdGEsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5jbG9zZVRvLCB0cnVlKS50by5iZS5jbG9zZVRvKGV4cCwgZGVsdGEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmFwcHJveGltYXRlbHkoYWN0dWFsLCBleHBlY3RlZCwgZGVsdGEsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgYGV4cGVjdGVkYCwgdG8gd2l0aGluIGEgKy8tIGBkZWx0YWAgcmFuZ2UuXG4gICAqXG4gICAqICAgICBhc3NlcnQuYXBwcm94aW1hdGVseSgxLjUsIDEsIDAuNSwgJ251bWJlcnMgYXJlIGNsb3NlJyk7XG4gICAqXG4gICAqIEBuYW1lIGFwcHJveGltYXRlbHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjdHVhbFxuICAgKiBAcGFyYW0ge051bWJlcn0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5hcHByb3hpbWF0ZWx5ID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmFwcHJveGltYXRlbHksIHRydWUpXG4gICAgICAudG8uYmUuYXBwcm94aW1hdGVseShleHAsIGRlbHRhKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5zYW1lTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gYW55IG9yZGVyLiBVc2VzIGFcbiAgICogc3RyaWN0IGVxdWFsaXR5IGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnNhbWVNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDIsIDEsIDMgXSwgJ3NhbWUgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBzYW1lTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnNhbWVNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZU1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5zYW1lLm1lbWJlcnMoc2V0Mik7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RTYW1lTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBkb24ndCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gYW55IG9yZGVyLlxuICAgKiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFNhbWVNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDUsIDEsIDMgXSwgJ25vdCBzYW1lIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90U2FtZU1lbWJlcnNcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MVxuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RTYW1lTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnNhbWUubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLnNhbWVEZWVwTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gYW55IG9yZGVyLiBVc2VzIGFcbiAgICogZGVlcCBlcXVhbGl0eSBjaGVjay5cbiAgICpcbiAgICogICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFt7IGI6IDIgfSwgeyBhOiAxIH0sIHsgYzogMyB9XSwgJ3NhbWUgZGVlcCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIHNhbWVEZWVwTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnNhbWUuZGVlcC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90U2FtZURlZXBNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGRvbid0IGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiBhbnkgb3JkZXIuXG4gICAqIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFNhbWVEZWVwTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgW3sgYjogMiB9LCB7IGE6IDEgfSwgeyBmOiA1IH1dLCAnbm90IHNhbWUgZGVlcCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFNhbWVEZWVwTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdFNhbWVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVEZWVwTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5zYW1lLmRlZXAubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLnNhbWVPcmRlcmVkTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDEsIDIsIDMgXSwgJ3NhbWUgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIHNhbWVPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnNhbWUub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90U2FtZU9yZGVyZWRNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGRvbid0IGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiB0aGUgc2FtZVxuICAgKiBvcmRlci4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RTYW1lT3JkZXJlZE1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMiwgMSwgMyBdLCAnbm90IHNhbWUgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFNhbWVPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5zYW1lLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMoc2V0MSwgc2V0MiwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHNldDFgIGFuZCBgc2V0MmAgaGF2ZSB0aGUgc2FtZSBtZW1iZXJzIGluIHRoZSBzYW1lIG9yZGVyLlxuICAgKiBVc2VzIGEgZGVlcCBlcXVhbGl0eSBjaGVjay5cbiAgICpcbiAgICogYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCAnc2FtZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBzYW1lRGVlcE9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBkb24ndCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gdGhlIHNhbWVcbiAgICogb3JkZXIuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiBhc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgejogNSB9IF0sICdub3Qgc2FtZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKiBhc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGI6IDIgfSwgeyBhOiAxIH0sIHsgYzogMyB9IF0sICdub3Qgc2FtZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUuc2FtZS5kZWVwLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY2x1ZGVNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzIGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gYW55IG9yZGVyLiBVc2VzIGFcbiAgICogc3RyaWN0IGVxdWFsaXR5IGNoZWNrICg9PT0pLiBEdXBsaWNhdGVzIGFyZSBpZ25vcmVkLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDIsIDEsIDIgXSwgJ2luY2x1ZGUgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBpbmNsdWRlTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmluY2x1ZGUubWVtYmVycyhzdWJzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90SW5jbHVkZU1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXNuJ3QgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiBhbnkgb3JkZXIuIFVzZXMgYVxuICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuIER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZU1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgNSwgMSBdLCAnbm90IGluY2x1ZGUgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RJbmNsdWRlTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5pbmNsdWRlLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY2x1ZGVEZWVwTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpcyBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIGFueSBvcmRlci4gVXNlcyBhIGRlZXBcbiAgICogZXF1YWxpdHkgY2hlY2suIER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGE6IDEgfSwgeyBiOiAyIH0gXSwgJ2luY2x1ZGUgZGVlcCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIGluY2x1ZGVEZWVwTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluY2x1ZGVEZWVwTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpc24ndCBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIGFueSBvcmRlci4gVXNlcyBhXG4gICAqIGRlZXAgZXF1YWxpdHkgY2hlY2suIER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGY6IDUgfSBdLCAnbm90IGluY2x1ZGUgZGVlcCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVEZWVwTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5ub3RJbmNsdWRlRGVlcE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmluY2x1ZGUuZGVlcC5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXMgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiB0aGUgc2FtZSBvcmRlclxuICAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBpbiBgc3VwZXJzZXRgLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyhbIDEsIDIsIDMgXSwgWyAxLCAyIF0sICdpbmNsdWRlIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBpbmNsdWRlT3JkZXJlZE1lbWJlcnNcbiAgICogQHBhcmFtIHtBcnJheX0gc3VwZXJzZXRcbiAgICogQHBhcmFtIHtBcnJheX0gc3Vic2V0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQuaW5jbHVkZU9yZGVyZWRNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXNuJ3QgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiB0aGUgc2FtZSBvcmRlclxuICAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBpbiBgc3VwZXJzZXRgLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyhbIDEsIDIsIDMgXSwgWyAyLCAxIF0sICdub3QgaW5jbHVkZSBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMiwgMyBdLCAnbm90IGluY2x1ZGUgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzIGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gdGhlIHNhbWUgb3JkZXJcbiAgICogYmVnaW5uaW5nIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgaW4gYHN1cGVyc2V0YC4gVXNlcyBhIGRlZXAgZXF1YWxpdHlcbiAgICogY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGE6IDEgfSwgeyBiOiAyIH0gXSwgJ2luY2x1ZGUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQuaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzbid0IGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gdGhlIHNhbWUgb3JkZXJcbiAgICogYmVnaW5uaW5nIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgaW4gYHN1cGVyc2V0YC4gVXNlcyBhIGRlZXAgZXF1YWxpdHlcbiAgICogY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGE6IDEgfSwgeyBmOiA1IH0gXSwgJ25vdCBpbmNsdWRlIGRlZXAgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGI6IDIgfSwgeyBhOiAxIH0gXSwgJ25vdCBpbmNsdWRlIGRlZXAgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgJ25vdCBpbmNsdWRlIGRlZXAgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnNcbiAgICogQHBhcmFtIHtBcnJheX0gc3VwZXJzZXRcbiAgICogQHBhcmFtIHtBcnJheX0gc3Vic2V0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmluY2x1ZGUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm9uZU9mKGluTGlzdCwgbGlzdCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgbm9uLW9iamVjdCwgbm9uLWFycmF5IHZhbHVlIGBpbkxpc3RgIGFwcGVhcnMgaW4gdGhlIGZsYXQgYXJyYXkgYGxpc3RgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm9uZU9mKDEsIFsgMiwgMSBdLCAnTm90IGZvdW5kIGluIGxpc3QnKTtcbiAgICpcbiAgICogQG5hbWUgb25lT2ZcbiAgICogQHBhcmFtIHsqfSBpbkxpc3RcbiAgICogQHBhcmFtIHtBcnJheTwqPn0gbGlzdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub25lT2YgPSBmdW5jdGlvbiAoaW5MaXN0LCBsaXN0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGluTGlzdCwgbXNnLCBhc3NlcnQub25lT2YsIHRydWUpLnRvLmJlLm9uZU9mKGxpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuY2hhbmdlcyhmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgPSAyMiB9O1xuICAgKiAgICAgYXNzZXJ0LmNoYW5nZXMoZm4sIG9iaiwgJ3ZhbCcpO1xuICAgKlxuICAgKiBAbmFtZSBjaGFuZ2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuY2hhbmdlcyA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlcywgdHJ1ZSkudG8uY2hhbmdlKG9iaiwgcHJvcCk7XG4gIH1cblxuICAgLyoqXG4gICAqICMjIyAuY2hhbmdlc0J5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGJ5IGFuIGFtb3VudCAoZGVsdGEpLlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgKz0gMiB9O1xuICAgKiAgICAgYXNzZXJ0LmNoYW5nZXNCeShmbiwgb2JqLCAndmFsJywgMik7XG4gICAqXG4gICAqIEBuYW1lIGNoYW5nZXNCeVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjaGFuZ2UgYW1vdW50IChkZWx0YSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuY2hhbmdlc0J5ID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdG1wTXNnID0gZGVsdGE7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBtc2cgPSB0bXBNc2c7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5jaGFuZ2VzQnksIHRydWUpXG4gICAgICAudG8uY2hhbmdlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xuICB9XG5cbiAgIC8qKlxuICAgKiAjIyMgLmRvZXNOb3RDaGFuZ2UoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdmb28nKTsgfTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90Q2hhbmdlKGZuLCBvYmosICd2YWwnKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdENoYW5nZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RDaGFuZ2UgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbXNnID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90Q2hhbmdlLCB0cnVlKVxuICAgICAgLnRvLm5vdC5jaGFuZ2Uob2JqLCBwcm9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmNoYW5nZXNCdXROb3RCeShmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgZGVsdGEsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9yIG9mIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsICs9IDEwIH07XG4gICAqICAgICBhc3NlcnQuY2hhbmdlc0J1dE5vdEJ5KGZuLCBvYmosICd2YWwnLCA1KTtcbiAgICpcbiAgICogQG5hbWUgY2hhbmdlc0J1dE5vdEJ5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jaGFuZ2VzQnV0Tm90QnkgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0bXBNc2cgPSBkZWx0YTtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIG1zZyA9IHRtcE1zZztcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmNoYW5nZXNCdXROb3RCeSwgdHJ1ZSlcbiAgICAgIC50by5jaGFuZ2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY3JlYXNlcyhmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBpbmNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eS5cbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gMTMgfTtcbiAgICogICAgIGFzc2VydC5pbmNyZWFzZXMoZm4sIG9iaiwgJ3ZhbCcpO1xuICAgKlxuICAgKiBAbmFtZSBpbmNyZWFzZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNyZWFzZXMgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbXNnID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5pbmNyZWFzZXMsIHRydWUpXG4gICAgICAudG8uaW5jcmVhc2Uob2JqLCBwcm9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY3JlYXNlc0J5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBpbmNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eSBvciBhIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGJ5IGFuIGFtb3VudCAoZGVsdGEpLlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgKz0gMTAgfTtcbiAgICogICAgIGFzc2VydC5pbmNyZWFzZXNCeShmbiwgb2JqLCAndmFsJywgMTApO1xuICAgKlxuICAgKiBAbmFtZSBpbmNyZWFzZXNCeVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjaGFuZ2UgYW1vdW50IChkZWx0YSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5jcmVhc2VzQnkgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0bXBNc2cgPSBkZWx0YTtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIG1zZyA9IHRtcE1zZztcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmluY3JlYXNlc0J5LCB0cnVlKVxuICAgICAgLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdEluY3JlYXNlKGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRvZXMgbm90IGluY3JlYXNlIGEgbnVtZXJpYyBvYmplY3QgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDggfTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SW5jcmVhc2UoZm4sIG9iaiwgJ3ZhbCcpO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SW5jcmVhc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kb2VzTm90SW5jcmVhc2UgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbXNnID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90SW5jcmVhc2UsIHRydWUpXG4gICAgICAudG8ubm90LmluY3JlYXNlKG9iaiwgcHJvcCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5pbmNyZWFzZXNCdXROb3RCeShmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBpbmNyZWFzZSBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGJ5IGFuIGFtb3VudCAoZGVsdGEpLlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgPSAxNSB9O1xuICAgKiAgICAgYXNzZXJ0LmluY3JlYXNlc0J1dE5vdEJ5KGZuLCBvYmosICd2YWwnLCAxMCk7XG4gICAqXG4gICAqIEBuYW1lIGluY3JlYXNlc0J1dE5vdEJ5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnksIHRydWUpXG4gICAgICAudG8uaW5jcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmRlY3JlYXNlcyhmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkZWNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eS5cbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRlY3JlYXNlcyhmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlY3JlYXNlcyA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlcywgdHJ1ZSlcbiAgICAgIC50by5kZWNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZGVjcmVhc2VzQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsIC09IDUgfTtcbiAgICogICAgIGFzc2VydC5kZWNyZWFzZXNCeShmbiwgb2JqLCAndmFsJywgNSk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc0J5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWNyZWFzZXNCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZGVjcmVhc2VzQnksIHRydWUpXG4gICAgICAudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90RGVjcmVhc2UoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgZGVjcmVhc2VzIGEgbnVtZXJpYyBvYmplY3QgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDE1IH07XG4gICAqICAgICBhc3NlcnQuZG9lc05vdERlY3JlYXNlKGZuLCBvYmosICd2YWwnKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdERlY3JlYXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdERlY3JlYXNlID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1zZyA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdERlY3JlYXNlLCB0cnVlKVxuICAgICAgLnRvLm5vdC5kZWNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdERlY3JlYXNlQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRvZXMgbm90IGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5KGZuLCBvYmosICd2YWwnLCAxKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdERlY3JlYXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kb2VzTm90RGVjcmVhc2VCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5LCB0cnVlKVxuICAgICAgLnRvLm5vdC5kZWNyZWFzZShvYmosIHByb3ApLmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmRlY3JlYXNlc0J1dE5vdEJ5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBkZWNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eSBvciBhIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGJ5IGFuIGFtb3VudCAoZGVsdGEpXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDUgfTtcbiAgICogICAgIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeShmbiwgb2JqLCAndmFsJywgMSk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc0J1dE5vdEJ5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZGVjcmVhc2VzQnV0Tm90QnksIHRydWUpXG4gICAgICAudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qIVxuICAgKiAjIyMgLmlmRXJyb3Iob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIGlmIHZhbHVlIGlzIG5vdCBhIGZhbHNlIHZhbHVlLCBhbmQgdGhyb3dzIGlmIGl0IGlzIGEgdHJ1ZSB2YWx1ZS5cbiAgICogVGhpcyBpcyBhZGRlZCB0byBhbGxvdyBmb3IgY2hhaSB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIE5vZGUnc1xuICAgKiBhc3NlcnQgY2xhc3MuXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdJIGFtIGEgY3VzdG9tIGVycm9yJyk7XG4gICAqICAgICBhc3NlcnQuaWZFcnJvcihlcnIpOyAvLyBSZXRocm93cyBlcnIhXG4gICAqXG4gICAqIEBuYW1lIGlmRXJyb3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICB0aHJvdyh2YWwpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0V4dGVuc2libGUob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgZXh0ZW5zaWJsZSAoY2FuIGhhdmUgbmV3IHByb3BlcnRpZXMgYWRkZWQgdG8gaXQpLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzRXh0ZW5zaWJsZSh7fSk7XG4gICAqXG4gICAqIEBuYW1lIGlzRXh0ZW5zaWJsZVxuICAgKiBAYWxpYXMgZXh0ZW5zaWJsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIChvYmosIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc0V4dGVuc2libGUsIHRydWUpLnRvLmJlLmV4dGVuc2libGU7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RFeHRlbnNpYmxlKG9iamVjdClcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGlzIF9ub3RfIGV4dGVuc2libGUuXG4gICAqXG4gICAqICAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAqICAgICB2YXIgc2VhbGVkT2JqZWN0ID0gT2JqZWN0LnNlYWwoe30pO1xuICAgKiAgICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZShub25FeHRlbnNpYmxlT2JqZWN0KTtcbiAgICogICAgIGFzc2VydC5pc05vdEV4dGVuc2libGUoc2VhbGVkT2JqZWN0KTtcbiAgICogICAgIGFzc2VydC5pc05vdEV4dGVuc2libGUoZnJvemVuT2JqZWN0KTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RFeHRlbnNpYmxlXG4gICAqIEBhbGlhcyBub3RFeHRlbnNpYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RFeHRlbnNpYmxlID0gZnVuY3Rpb24gKG9iaiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZSwgdHJ1ZSkudG8ubm90LmJlLmV4dGVuc2libGU7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNTZWFsZWQob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgc2VhbGVkIChjYW5ub3QgaGF2ZSBuZXcgcHJvcGVydGllcyBhZGRlZCB0byBpdFxuICAgKiBhbmQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2Fubm90IGJlIHJlbW92ZWQpLlxuICAgKlxuICAgKiAgICAgdmFyIHNlYWxlZE9iamVjdCA9IE9iamVjdC5zZWFsKHt9KTtcbiAgICogICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3Quc2VhbCh7fSk7XG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNTZWFsZWQoc2VhbGVkT2JqZWN0KTtcbiAgICogICAgIGFzc2VydC5pc1NlYWxlZChmcm96ZW5PYmplY3QpO1xuICAgKlxuICAgKiBAbmFtZSBpc1NlYWxlZFxuICAgKiBAYWxpYXMgc2VhbGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNTZWFsZWQgPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNTZWFsZWQsIHRydWUpLnRvLmJlLnNlYWxlZDtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFNlYWxlZChvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBfbm90XyBzZWFsZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3RTZWFsZWQoe30pO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdFNlYWxlZFxuICAgKiBAYWxpYXMgbm90U2VhbGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RTZWFsZWQgPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RTZWFsZWQsIHRydWUpLnRvLm5vdC5iZS5zZWFsZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNGcm96ZW4ob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgZnJvemVuIChjYW5ub3QgaGF2ZSBuZXcgcHJvcGVydGllcyBhZGRlZCB0byBpdFxuICAgKiBhbmQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2Fubm90IGJlIG1vZGlmaWVkKS5cbiAgICpcbiAgICogICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICogICAgIGFzc2VydC5mcm96ZW4oZnJvemVuT2JqZWN0KTtcbiAgICpcbiAgICogQG5hbWUgaXNGcm96ZW5cbiAgICogQGFsaWFzIGZyb3plblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRnJvemVuID0gZnVuY3Rpb24gKG9iaiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzRnJvemVuLCB0cnVlKS50by5iZS5mcm96ZW47XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RGcm96ZW4ob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgX25vdF8gZnJvemVuLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTm90RnJvemVuKHt9KTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RGcm96ZW5cbiAgICogQGFsaWFzIG5vdEZyb3plblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90RnJvemVuID0gZnVuY3Rpb24gKG9iaiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzTm90RnJvemVuLCB0cnVlKS50by5ub3QuYmUuZnJvemVuO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzRW1wdHkodGFyZ2V0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBkb2VzIG5vdCBjb250YWluIGFueSB2YWx1ZXMuXG4gICAqIEZvciBhcnJheXMgYW5kIHN0cmluZ3MsIGl0IGNoZWNrcyB0aGUgYGxlbmd0aGAgcHJvcGVydHkuXG4gICAqIEZvciBgTWFwYCBhbmQgYFNldGAgaW5zdGFuY2VzLCBpdCBjaGVja3MgdGhlIGBzaXplYCBwcm9wZXJ0eS5cbiAgICogRm9yIG5vbi1mdW5jdGlvbiBvYmplY3RzLCBpdCBnZXRzIHRoZSBjb3VudCBvZiBvd25cbiAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc0VtcHR5KFtdKTtcbiAgICogICAgIGFzc2VydC5pc0VtcHR5KCcnKTtcbiAgICogICAgIGFzc2VydC5pc0VtcHR5KG5ldyBNYXApO1xuICAgKiAgICAgYXNzZXJ0LmlzRW1wdHkoe30pO1xuICAgKlxuICAgKiBAbmFtZSBpc0VtcHR5XG4gICAqIEBhbGlhcyBlbXB0eVxuICAgKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd8TWFwfFNldH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0VtcHR5LCB0cnVlKS50by5iZS5lbXB0eTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEVtcHR5KHRhcmdldClcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgY29udGFpbnMgdmFsdWVzLlxuICAgKiBGb3IgYXJyYXlzIGFuZCBzdHJpbmdzLCBpdCBjaGVja3MgdGhlIGBsZW5ndGhgIHByb3BlcnR5LlxuICAgKiBGb3IgYE1hcGAgYW5kIGBTZXRgIGluc3RhbmNlcywgaXQgY2hlY2tzIHRoZSBgc2l6ZWAgcHJvcGVydHkuXG4gICAqIEZvciBub24tZnVuY3Rpb24gb2JqZWN0cywgaXQgZ2V0cyB0aGUgY291bnQgb2Ygb3duXG4gICAqIGVudW1lcmFibGUgc3RyaW5nIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3RFbXB0eShbMSwgMl0pO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RW1wdHkoJzM0Jyk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RFbXB0eShuZXcgU2V0KFs1LCA2XSkpO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RW1wdHkoeyBrZXk6IDcgfSk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90RW1wdHlcbiAgICogQGFsaWFzIG5vdEVtcHR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ3xNYXB8U2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RFbXB0eSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90RW1wdHksIHRydWUpLnRvLm5vdC5iZS5lbXB0eTtcbiAgfTtcblxuICAvKiFcbiAgICogQWxpYXNlcy5cbiAgICovXG5cbiAgKGZ1bmN0aW9uIGFsaWFzKG5hbWUsIGFzKXtcbiAgICBhc3NlcnRbYXNdID0gYXNzZXJ0W25hbWVdO1xuICAgIHJldHVybiBhbGlhcztcbiAgfSlcbiAgKCdpc09rJywgJ29rJylcbiAgKCdpc05vdE9rJywgJ25vdE9rJylcbiAgKCd0aHJvd3MnLCAndGhyb3cnKVxuICAoJ3Rocm93cycsICdUaHJvdycpXG4gICgnaXNFeHRlbnNpYmxlJywgJ2V4dGVuc2libGUnKVxuICAoJ2lzTm90RXh0ZW5zaWJsZScsICdub3RFeHRlbnNpYmxlJylcbiAgKCdpc1NlYWxlZCcsICdzZWFsZWQnKVxuICAoJ2lzTm90U2VhbGVkJywgJ25vdFNlYWxlZCcpXG4gICgnaXNGcm96ZW4nLCAnZnJvemVuJylcbiAgKCdpc05vdEZyb3plbicsICdub3RGcm96ZW4nKVxuICAoJ2lzRW1wdHknLCAnZW1wdHknKVxuICAoJ2lzTm90RW1wdHknLCAnbm90RW1wdHknKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIENoYWkgLSBwYXRodmFsIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpY2FscGFyYWRveC9maWx0clxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmhhc1Byb3BlcnR5KG9iamVjdCwgbmFtZSlcbiAqXG4gKiBUaGlzIGFsbG93cyBjaGVja2luZyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgb3duXG4gKiBvciBpbmhlcml0ZWQgZnJvbSBwcm90b3R5cGUgY2hhaW4gbmFtZWQgcHJvcGVydHkuXG4gKlxuICogQmFzaWNhbGx5IGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGBpbmBcbiAqIG9wZXJhdG9yIGJ1dCB3b3JrcyBwcm9wZXJseSB3aXRoIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICogYW5kIG90aGVyIHByaW1pdGl2ZXMuXG4gKlxuICogICAgIHZhciBvYmogPSB7XG4gKiAgICAgICAgIGFycjogWydhJywgJ2InLCAnYyddXG4gKiAgICAgICAsIHN0cjogJ0hlbGxvJ1xuICogICAgIH1cbiAqXG4gKiBUaGUgZm9sbG93aW5nIHdvdWxkIGJlIHRoZSByZXN1bHRzLlxuICpcbiAqICAgICBoYXNQcm9wZXJ0eShvYmosICdzdHInKTsgIC8vIHRydWVcbiAqICAgICBoYXNQcm9wZXJ0eShvYmosICdjb25zdHJ1Y3RvcicpOyAgLy8gdHJ1ZVxuICogICAgIGhhc1Byb3BlcnR5KG9iaiwgJ2JhcicpOyAgLy8gZmFsc2VcbiAqXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgJ2xlbmd0aCcpOyAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgMSk7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgNSk7ICAvLyBmYWxzZVxuICpcbiAqICAgICBoYXNQcm9wZXJ0eShvYmouYXJyLCAnbGVuZ3RoJyk7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLmFyciwgMik7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLmFyciwgMyk7ICAvLyBmYWxzZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfFN5bWJvbH0gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgaXQgZXhpc3RzXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBoYXNQcm9wZXJ0eVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmosIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRoZSBgaW5gIG9wZXJhdG9yIGRvZXMgbm90IHdvcmsgd2l0aCBwcmltaXRpdmVzLlxuICByZXR1cm4gbmFtZSBpbiBPYmplY3Qob2JqKTtcbn1cblxuLyogIVxuICogIyMgcGFyc2VQYXRoKHBhdGgpXG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gcGFyc2Ugc3RyaW5nIG9iamVjdFxuICogcGF0aHMuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIGBpbnRlcm5hbEdldFBhdGhWYWx1ZWAuXG4gKlxuICogICAgICB2YXIgcGFyc2VkID0gcGFyc2VQYXRoKCdteW9iamVjdC5wcm9wZXJ0eS5zdWJwcm9wJyk7XG4gKlxuICogIyMjIFBhdGhzOlxuICpcbiAqICogQ2FuIGJlIGluZmluaXRlbHkgZGVlcCBhbmQgbmVzdGVkLlxuICogKiBBcnJheXMgYXJlIGFsc28gdmFsaWQgdXNpbmcgdGhlIGZvcm1hbCBgbXlvYmplY3QuZG9jdW1lbnRbM10ucHJvcGVydHlgLlxuICogKiBMaXRlcmFsIGRvdHMgYW5kIGJyYWNrZXRzIChub3QgZGVsaW1pdGVyKSBtdXN0IGJlIGJhY2tzbGFzaC1lc2NhcGVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBwYXJzZWRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIHZhciBzdHIgPSBwYXRoLnJlcGxhY2UoLyhbXlxcXFxdKVxcWy9nLCAnJDEuWycpO1xuICB2YXIgcGFydHMgPSBzdHIubWF0Y2goLyhcXFxcXFwufFteLl0rPykrL2cpO1xuICByZXR1cm4gcGFydHMubWFwKGZ1bmN0aW9uIG1hcE1hdGNoZXModmFsdWUpIHtcbiAgICB2YXIgcmVnZXhwID0gL15cXFsoXFxkKylcXF0kLztcbiAgICB2YXIgbUFyciA9IHJlZ2V4cC5leGVjKHZhbHVlKTtcbiAgICB2YXIgcGFyc2VkID0gbnVsbDtcbiAgICBpZiAobUFycikge1xuICAgICAgcGFyc2VkID0geyBpOiBwYXJzZUZsb2F0KG1BcnJbMV0pIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZCA9IHsgcDogdmFsdWUucmVwbGFjZSgvXFxcXChbLlxcW1xcXV0pL2csICckMScpIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59XG5cbi8qICFcbiAqICMjIGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkWywgcGF0aERlcHRoXSlcbiAqXG4gKiBIZWxwZXIgY29tcGFuaW9uIGZ1bmN0aW9uIGZvciBgLnBhcnNlUGF0aGAgdGhhdCByZXR1cm5zXG4gKiB0aGUgdmFsdWUgbG9jYXRlZCBhdCB0aGUgcGFyc2VkIGFkZHJlc3MuXG4gKlxuICogICAgICB2YXIgdmFsdWUgPSBnZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdG8gc2VhcmNoIGFnYWluc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWQgZGVmaW5pdGlvbiBmcm9tIGBwYXJzZVBhdGhgLlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlcHRoIChuZXN0aW5nIGxldmVsKSBvZiB0aGUgcHJvcGVydHkgd2Ugd2FudCB0byByZXRyaWV2ZVxuICogQHJldHVybnMge09iamVjdHxVbmRlZmluZWR9IHZhbHVlXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCwgcGF0aERlcHRoKSB7XG4gIHZhciB0ZW1wb3JhcnlWYWx1ZSA9IG9iajtcbiAgdmFyIHJlcyA9IG51bGw7XG4gIHBhdGhEZXB0aCA9ICh0eXBlb2YgcGF0aERlcHRoID09PSAndW5kZWZpbmVkJyA/IHBhcnNlZC5sZW5ndGggOiBwYXRoRGVwdGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICB2YXIgcGFydCA9IHBhcnNlZFtpXTtcbiAgICBpZiAodGVtcG9yYXJ5VmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydC5wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRlbXBvcmFyeVZhbHVlW3BhcnQuaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRlbXBvcmFyeVZhbHVlW3BhcnQucF07XG4gICAgICB9XG5cbiAgICAgIGlmIChpID09PSAocGF0aERlcHRoIC0gMSkpIHtcbiAgICAgICAgcmVzID0gdGVtcG9yYXJ5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuLyogIVxuICogIyMgaW50ZXJuYWxTZXRQYXRoVmFsdWUob2JqLCB2YWx1ZSwgcGFyc2VkKVxuICpcbiAqIENvbXBhbmlvbiBmdW5jdGlvbiBmb3IgYHBhcnNlUGF0aGAgdGhhdCBzZXRzXG4gKiB0aGUgdmFsdWUgbG9jYXRlZCBhdCBhIHBhcnNlZCBhZGRyZXNzLlxuICpcbiAqICBpbnRlcm5hbFNldFBhdGhWYWx1ZShvYmosICd2YWx1ZScsIHBhcnNlZCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0byBzZWFyY2ggYW5kIGRlZmluZSBvblxuICogQHBhcmFtIHsqfSB2YWx1ZSB0byB1c2UgdXBvbiBzZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWQgZGVmaW5pdGlvbiBmcm9tIGBwYXJzZVBhdGhgXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpbnRlcm5hbFNldFBhdGhWYWx1ZShvYmosIHZhbCwgcGFyc2VkKSB7XG4gIHZhciB0ZW1wT2JqID0gb2JqO1xuICB2YXIgcGF0aERlcHRoID0gcGFyc2VkLmxlbmd0aDtcbiAgdmFyIHBhcnQgPSBudWxsO1xuICAvLyBIZXJlIHdlIGl0ZXJhdGUgdGhyb3VnaCBldmVyeSBwYXJ0IG9mIHRoZSBwYXRoXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICB2YXIgcHJvcE5hbWUgPSBudWxsO1xuICAgIHZhciBwcm9wVmFsID0gbnVsbDtcbiAgICBwYXJ0ID0gcGFyc2VkW2ldO1xuXG4gICAgLy8gSWYgaXQncyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBwYXRoLCB3ZSBzZXQgdGhlICdwcm9wTmFtZScgdmFsdWUgd2l0aCB0aGUgcHJvcGVydHkgbmFtZVxuICAgIGlmIChpID09PSAocGF0aERlcHRoIC0gMSkpIHtcbiAgICAgIHByb3BOYW1lID0gdHlwZW9mIHBhcnQucCA9PT0gJ3VuZGVmaW5lZCcgPyBwYXJ0LmkgOiBwYXJ0LnA7XG4gICAgICAvLyBOb3cgd2Ugc2V0IHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBuYW1lIGhlbGQgYnkgJ3Byb3BOYW1lJyBvbiBvYmplY3Qgd2l0aCB0aGUgZGVzaXJlZCB2YWxcbiAgICAgIHRlbXBPYmpbcHJvcE5hbWVdID0gdmFsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcnQucCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGVtcE9ialtwYXJ0LnBdKSB7XG4gICAgICB0ZW1wT2JqID0gdGVtcE9ialtwYXJ0LnBdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcnQuaSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGVtcE9ialtwYXJ0LmldKSB7XG4gICAgICB0ZW1wT2JqID0gdGVtcE9ialtwYXJ0LmldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgb2JqIGRvZXNuJ3QgaGF2ZSB0aGUgcHJvcGVydHkgd2UgY3JlYXRlIG9uZSB3aXRoIHRoYXQgbmFtZSB0byBkZWZpbmUgaXRcbiAgICAgIHZhciBuZXh0ID0gcGFyc2VkW2kgKyAxXTtcbiAgICAgIC8vIEhlcmUgd2Ugc2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aGljaCB3aWxsIGJlIGRlZmluZWRcbiAgICAgIHByb3BOYW1lID0gdHlwZW9mIHBhcnQucCA9PT0gJ3VuZGVmaW5lZCcgPyBwYXJ0LmkgOiBwYXJ0LnA7XG4gICAgICAvLyBIZXJlIHdlIGRlY2lkZSBpZiB0aGlzIHByb3BlcnR5IHdpbGwgYmUgYW4gYXJyYXkgb3IgYSBuZXcgb2JqZWN0XG4gICAgICBwcm9wVmFsID0gdHlwZW9mIG5leHQucCA9PT0gJ3VuZGVmaW5lZCcgPyBbXSA6IHt9O1xuICAgICAgdGVtcE9ialtwcm9wTmFtZV0gPSBwcm9wVmFsO1xuICAgICAgdGVtcE9iaiA9IHRlbXBPYmpbcHJvcE5hbWVdO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqICMjIyAuZ2V0UGF0aEluZm8ob2JqZWN0LCBwYXRoKVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgcHJvcGVydHkgaW5mbyBpbiBhblxuICogb2JqZWN0IGdpdmVuIGEgc3RyaW5nIHBhdGguXG4gKlxuICogVGhlIHBhdGggaW5mbyBjb25zaXN0cyBvZiBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICogcGFyZW50IC0gVGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgYnkgYHBhdGhgXG4gKiAqIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmluYWwgcHJvcGVydHksIGEgbnVtYmVyIGlmIGl0IHdhcyBhbiBhcnJheSBpbmRleGVyXG4gKiAqIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYHVuZGVmaW5lZGBcbiAqICogZXhpc3RzIC0gV2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RzIG9yIG5vdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBpbmZvXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBnZXRQYXRoSW5mb1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBnZXRQYXRoSW5mbyhvYmosIHBhdGgpIHtcbiAgdmFyIHBhcnNlZCA9IHBhcnNlUGF0aChwYXRoKTtcbiAgdmFyIGxhc3QgPSBwYXJzZWRbcGFyc2VkLmxlbmd0aCAtIDFdO1xuICB2YXIgaW5mbyA9IHtcbiAgICBwYXJlbnQ6IHBhcnNlZC5sZW5ndGggPiAxID8gaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQsIHBhcnNlZC5sZW5ndGggLSAxKSA6IG9iaixcbiAgICBuYW1lOiBsYXN0LnAgfHwgbGFzdC5pLFxuICAgIHZhbHVlOiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCksXG4gIH07XG4gIGluZm8uZXhpc3RzID0gaGFzUHJvcGVydHkoaW5mby5wYXJlbnQsIGluZm8ubmFtZSk7XG5cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogIyMjIC5nZXRQYXRoVmFsdWUob2JqZWN0LCBwYXRoKVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgdmFsdWVzIGluIGFuXG4gKiBvYmplY3QgZ2l2ZW4gYSBzdHJpbmcgcGF0aC5cbiAqXG4gKiAgICAgdmFyIG9iaiA9IHtcbiAqICAgICAgICAgcHJvcDE6IHtcbiAqICAgICAgICAgICAgIGFycjogWydhJywgJ2InLCAnYyddXG4gKiAgICAgICAgICAgLCBzdHI6ICdIZWxsbydcbiAqICAgICAgICAgfVxuICogICAgICAgLCBwcm9wMjoge1xuICogICAgICAgICAgICAgYXJyOiBbIHsgbmVzdGVkOiAnVW5pdmVyc2UnIH0gXVxuICogICAgICAgICAgICwgc3RyOiAnSGVsbG8gYWdhaW4hJ1xuICogICAgICAgICB9XG4gKiAgICAgfVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgd291bGQgYmUgdGhlIHJlc3VsdHMuXG4gKlxuICogICAgIGdldFBhdGhWYWx1ZShvYmosICdwcm9wMS5zdHInKTsgLy8gSGVsbG9cbiAqICAgICBnZXRQYXRoVmFsdWUob2JqLCAncHJvcDEuYXR0WzJdJyk7IC8vIGJcbiAqICAgICBnZXRQYXRoVmFsdWUob2JqLCAncHJvcDIuYXJyWzBdLm5lc3RlZCcpOyAvLyBVbml2ZXJzZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB2YWx1ZSBvciBgdW5kZWZpbmVkYFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0UGF0aFZhbHVlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGdldFBhdGhWYWx1ZShvYmosIHBhdGgpIHtcbiAgdmFyIGluZm8gPSBnZXRQYXRoSW5mbyhvYmosIHBhdGgpO1xuICByZXR1cm4gaW5mby52YWx1ZTtcbn1cblxuLyoqXG4gKiAjIyMgLnNldFBhdGhWYWx1ZShvYmplY3QsIHBhdGgsIHZhbHVlKVxuICpcbiAqIERlZmluZSB0aGUgdmFsdWUgaW4gYW4gb2JqZWN0IGF0IGEgZ2l2ZW4gc3RyaW5nIHBhdGguXG4gKlxuICogYGBganNcbiAqIHZhciBvYmogPSB7XG4gKiAgICAgcHJvcDE6IHtcbiAqICAgICAgICAgYXJyOiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgICwgc3RyOiAnSGVsbG8nXG4gKiAgICAgfVxuICogICAsIHByb3AyOiB7XG4gKiAgICAgICAgIGFycjogWyB7IG5lc3RlZDogJ1VuaXZlcnNlJyB9IF1cbiAqICAgICAgICwgc3RyOiAnSGVsbG8gYWdhaW4hJ1xuICogICAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIHdvdWxkIGJlIGFjY2VwdGFibGUuXG4gKlxuICogYGBganNcbiAqIHZhciBwcm9wZXJ0aWVzID0gcmVxdWlyZSgndGVhLXByb3BlcnRpZXMnKTtcbiAqIHByb3BlcnRpZXMuc2V0KG9iaiwgJ3Byb3AxLnN0cicsICdIZWxsbyBVbml2ZXJzZSEnKTtcbiAqIHByb3BlcnRpZXMuc2V0KG9iaiwgJ3Byb3AxLmFyclsyXScsICdCJyk7XG4gKiBwcm9wZXJ0aWVzLnNldChvYmosICdwcm9wMi5hcnJbMF0ubmVzdGVkLnZhbHVlJywgeyBoZWxsbzogJ3VuaXZlcnNlJyB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2V0UGF0aFZhbHVlKG9iaiwgcGF0aCwgdmFsKSB7XG4gIHZhciBwYXJzZWQgPSBwYXJzZVBhdGgocGF0aCk7XG4gIGludGVybmFsU2V0UGF0aFZhbHVlKG9iaiwgdmFsLCBwYXJzZWQpO1xuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaGFzUHJvcGVydHk6IGhhc1Byb3BlcnR5LFxuICBnZXRQYXRoSW5mbzogZ2V0UGF0aEluZm8sXG4gIGdldFBhdGhWYWx1ZTogZ2V0UGF0aFZhbHVlLFxuICBzZXRQYXRoVmFsdWU6IHNldFBhdGhWYWx1ZSxcbn07XG4iLCIvKiFcbiAqIENoYWkgLSB0ZXN0IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKiFcbiAqIE1vZHVsZSBkZXBlbmRhbmNpZXNcbiAqL1xuXG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xuXG4vKipcbiAqICMjIyAudGVzdChvYmplY3QsIGV4cHJlc3Npb24pXG4gKlxuICogVGVzdCBhbmQgb2JqZWN0IGZvciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgKGNvbnN0cnVjdGVkIEFzc2VydGlvbilcbiAqIEBwYXJhbSB7QXJndW1lbnRzfSBjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUuYXNzZXJ0IGFyZ3VtZW50c1xuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgdGVzdFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdGVzdChvYmosIGFyZ3MpIHtcbiAgdmFyIG5lZ2F0ZSA9IGZsYWcob2JqLCAnbmVnYXRlJylcbiAgICAsIGV4cHIgPSBhcmdzWzBdO1xuICByZXR1cm4gbmVnYXRlID8gIWV4cHIgOiBleHByO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogIVxuICogdHlwZS1kZXRlY3RcbiAqIENvcHlyaWdodChjKSAyMDEzIGpha2UgbHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbnZhciBwcm9taXNlRXhpc3RzID0gdHlwZW9mIFByb21pc2UgPT09ICdmdW5jdGlvbic7XG52YXIgZ2xvYmFsT2JqZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHNlbGY7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbnZhciBpc0RvbSA9ICdsb2NhdGlvbicgaW4gZ2xvYmFsT2JqZWN0ICYmICdkb2N1bWVudCcgaW4gZ2xvYmFsT2JqZWN0O1xudmFyIHN5bWJvbEV4aXN0cyA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnO1xudmFyIG1hcEV4aXN0cyA9IHR5cGVvZiBNYXAgIT09ICd1bmRlZmluZWQnO1xudmFyIHNldEV4aXN0cyA9IHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnO1xudmFyIHdlYWtNYXBFeGlzdHMgPSB0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgd2Vha1NldEV4aXN0cyA9IHR5cGVvZiBXZWFrU2V0ICE9PSAndW5kZWZpbmVkJztcbnZhciBkYXRhVmlld0V4aXN0cyA9IHR5cGVvZiBEYXRhVmlldyAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgc3ltYm9sSXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xFeGlzdHMgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgPSBzeW1ib2xFeGlzdHMgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgc2V0RW50cmllc0V4aXN0cyA9IHNldEV4aXN0cyAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSAnZnVuY3Rpb24nO1xudmFyIG1hcEVudHJpZXNFeGlzdHMgPSBtYXBFeGlzdHMgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbnZhciBzZXRJdGVyYXRvclByb3RvdHlwZSA9IHNldEVudHJpZXNFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBTZXQoKS5lbnRyaWVzKCkpO1xudmFyIG1hcEl0ZXJhdG9yUHJvdG90eXBlID0gbWFwRW50cmllc0V4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IE1hcCgpLmVudHJpZXMoKSk7XG52YXIgYXJyYXlJdGVyYXRvckV4aXN0cyA9IHN5bWJvbEl0ZXJhdG9yRXhpc3RzICYmIHR5cGVvZiBBcnJheS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbnZhciBhcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gYXJyYXlJdGVyYXRvckV4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoW11bU3ltYm9sLml0ZXJhdG9yXSgpKTtcbnZhciBzdHJpbmdJdGVyYXRvckV4aXN0cyA9IHN5bWJvbEl0ZXJhdG9yRXhpc3RzICYmIHR5cGVvZiBTdHJpbmcucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG52YXIgc3RyaW5nSXRlcmF0b3JQcm90b3R5cGUgPSBzdHJpbmdJdGVyYXRvckV4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoJydbU3ltYm9sLml0ZXJhdG9yXSgpKTtcbnZhciB0b1N0cmluZ0xlZnRTbGljZUxlbmd0aCA9IDg7XG52YXIgdG9TdHJpbmdSaWdodFNsaWNlTGVuZ3RoID0gLTE7XG4vKipcbiAqICMjIyB0eXBlT2YgKG9iailcbiAqXG4gKiBVc2VzIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4gb2JqZWN0LFxuICogbm9ybWFsaXNpbmcgYmVoYXZpb3VyIGFjcm9zcyBlbmdpbmUgdmVyc2lvbnMgJiB3ZWxsIG9wdGltaXNlZC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAqIEByZXR1cm4ge1N0cmluZ30gb2JqZWN0IHR5cGVcbiAqIEBhcGkgcHVibGljXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHlwZURldGVjdChvYmopIHtcbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgICogUHJlOlxuICAgKiAgIHN0cmluZyBsaXRlcmFsICAgICB4IDMsMDM5LDAzNSBvcHMvc2VjIMKxMS42MiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAxLDQyNCwxMzggb3BzL3NlYyDCsTQuNTQlICg3NSBydW5zIHNhbXBsZWQpXG4gICAqICAgbnVtYmVyIGxpdGVyYWwgICAgIHggMSw2NTMsMTUzIG9wcy9zZWMgwrExLjkxJSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiAgIHVuZGVmaW5lZCAgICAgICAgICB4IDksOTc4LDY2MCBvcHMvc2VjIMKxMS45MiUgKDc1IHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAyLDU1Niw3Njkgb3BzL3NlYyDCsTEuNzMlICg3NyBydW5zIHNhbXBsZWQpXG4gICAqIFBvc3Q6XG4gICAqICAgc3RyaW5nIGxpdGVyYWwgICAgIHggMzgsNTY0LDc5NiBvcHMvc2VjIMKxMS4xNSUgKDc5IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAzMSwxNDgsOTQwIG9wcy9zZWMgwrExLjEwJSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDMyLDY3OSwzMzAgb3BzL3NlYyDCsTEuOTAlICg3OCBydW5zIHNhbXBsZWQpXG4gICAqICAgdW5kZWZpbmVkICAgICAgICAgIHggMzIsMzYzLDM2OCBvcHMvc2VjIMKxMS4wNyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAzMSwyOTYsODcwIG9wcy9zZWMgwrEwLjk2JSAoODMgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgdmFyIHR5cGVvZk9iaiA9IHR5cGVvZiBvYmo7XG4gIGlmICh0eXBlb2ZPYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHR5cGVvZk9iajtcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAyOCw2NDUsNzY1IG9wcy9zZWMgwrExLjE3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIG51bGwgICAgICAgICAgICAgICB4IDM2LDQyOCw5NjIgb3BzL3NlYyDCsTEuMzclICg4NCBydW5zIHNhbXBsZWQpXG4gICAqL1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdylgYFxuICAgKiAgLSBOb2RlID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IGdsb2JhbF1cIlxuICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIFBoYW50b21KUyA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBTYWZhcmkgPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gSUUgMTEgPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gSUUgRWRnZSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMpYGBcbiAgICogIC0gQ2hyb21lIFdvcmtlciA9PT0gXCJbb2JqZWN0IGdsb2JhbF1cIlxuICAgKiAgLSBGaXJlZm94IFdvcmtlciA9PT0gXCJbb2JqZWN0IERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIFNhZmFyaSBXb3JrZXIgPT09IFwiW29iamVjdCBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZV1cIlxuICAgKiAgLSBJRSAxMSBXb3JrZXIgPT09IFwiW29iamVjdCBXb3JrZXJHbG9iYWxTY29wZV1cIlxuICAgKiAgLSBJRSBFZGdlIFdvcmtlciA9PT0gXCJbb2JqZWN0IFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqL1xuICBpZiAob2JqID09PSBnbG9iYWxPYmplY3QpIHtcbiAgICByZXR1cm4gJ2dsb2JhbCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAgKiBQcmU6XG4gICAqICAgYXJyYXkgbGl0ZXJhbCAgICAgIHggMiw4ODgsMzUyIG9wcy9zZWMgwrEwLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIGFycmF5IGxpdGVyYWwgICAgICB4IDIyLDQ3OSw2NTAgb3BzL3NlYyDCsTAuOTYlICg4MSBydW5zIHNhbXBsZWQpXG4gICAqL1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShvYmopICYmXG4gICAgKHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID09PSBmYWxzZSB8fCAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBvYmopKVxuICApIHtcbiAgICByZXR1cm4gJ0FycmF5JztcbiAgfVxuXG4gIGlmIChpc0RvbSkge1xuICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2xvY2F0aW9uKVxuICAgICAqIFdoYXRXRyBIVE1MJDcuNy4zIC0gVGhlIGBMb2NhdGlvbmAgaW50ZXJmYWNlXG4gICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cubG9jYXRpb24pYGBcbiAgICAgKiAgLSBJRSA8PTExID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAgICogIC0gSUUgRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAgICovXG4gICAgaWYgKG9iaiA9PT0gZ2xvYmFsT2JqZWN0LmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gJ0xvY2F0aW9uJztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG9jdW1lbnQpXG4gICAgICogV2hhdFdHIEhUTUwkMy4xLjEgLSBUaGUgYERvY3VtZW50YCBvYmplY3RcbiAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTI2ODA5MjY4KVxuICAgICAqICAgICAgIHdoaWNoIHN1Z2dlc3RzIHRoYXQgYnJvd3NlcnMgc2hvdWxkIHVzZSBIVE1MVGFibGVDZWxsRWxlbWVudCBmb3JcbiAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgKiAgICAgICBXaGF0V0cgSFRNTCBzdGF0ZXM6XG4gICAgICogICAgICAgICA+IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIFdpbmRvdyBvYmplY3RzIG11c3QgYWxzbyBoYXZlIGFcbiAgICAgKiAgICAgICAgID4gd3JpdGFibGUsIGNvbmZpZ3VyYWJsZSwgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgbmFtZWRcbiAgICAgKiAgICAgICAgID4gSFRNTERvY3VtZW50IHdob3NlIHZhbHVlIGlzIHRoZSBEb2N1bWVudCBpbnRlcmZhY2Ugb2JqZWN0LlxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQpYGBcbiAgICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgMTEgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBJRSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKi9cbiAgICBpZiAob2JqID09PSBnbG9iYWxPYmplY3QuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiAnRG9jdW1lbnQnO1xuICAgIH1cblxuICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjbWltZXR5cGVhcnJheSlcbiAgICAgKiBXaGF0V0cgSFRNTCQ4LjYuMS41IC0gUGx1Z2lucyAtIEludGVyZmFjZSBNaW1lVHlwZUFycmF5XG4gICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuYXZpZ2F0b3IubWltZVR5cGVzKWBgXG4gICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IE1TTWltZVR5cGVzQ29sbGVjdGlvbl1cIlxuICAgICAqL1xuICAgIGlmIChvYmogPT09IChnbG9iYWxPYmplY3QubmF2aWdhdG9yIHx8IHt9KS5taW1lVHlwZXMpIHtcbiAgICAgIHJldHVybiAnTWltZVR5cGVBcnJheSc7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNwbHVnaW5hcnJheSlcbiAgICAgKiBXaGF0V0cgSFRNTCQ4LjYuMS41IC0gUGx1Z2lucyAtIEludGVyZmFjZSBQbHVnaW5BcnJheVxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLnBsdWdpbnMpYGBcbiAgICAgKiAgLSBJRSA8PTEwID09PSBcIltvYmplY3QgTVNQbHVnaW5zQ29sbGVjdGlvbl1cIlxuICAgICAqL1xuICAgIGlmIChvYmogPT09IChnbG9iYWxPYmplY3QubmF2aWdhdG9yIHx8IHt9KS5wbHVnaW5zKSB7XG4gICAgICByZXR1cm4gJ1BsdWdpbkFycmF5JztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3BsdWdpbmFycmF5KVxuICAgICAqIFdoYXRXRyBIVE1MJDQuNC40IC0gVGhlIGBibG9ja3F1b3RlYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MUXVvdGVFbGVtZW50YFxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYmxvY2txdW90ZScpKWBgXG4gICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IEhUTUxCbG9ja0VsZW1lbnRdXCJcbiAgICAgKi9cbiAgICBpZiAob2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgb2JqLnRhZ05hbWUgPT09ICdCTE9DS1FVT1RFJykge1xuICAgICAgcmV0dXJuICdIVE1MUXVvdGVFbGVtZW50JztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlZGF0YWNlbGxlbGVtZW50KVxuICAgICAqIFdoYXRXRyBIVE1MJDQuOS45IC0gVGhlIGB0ZGAgZWxlbWVudCAtIEludGVyZmFjZSBgSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50YFxuICAgICAqIE5vdGU6IE1vc3QgYnJvd3NlcnMgY3VycmVudGx5IGFkaGVyIHRvIHRoZSBXM0MgRE9NIExldmVsIDIgc3BlY1xuICAgICAqICAgICAgIChodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItSFRNTC9odG1sLmh0bWwjSUQtODI5MTUwNzUpXG4gICAgICogICAgICAgd2hpY2ggc3VnZ2VzdHMgdGhhdCBicm93c2VycyBzaG91bGQgdXNlIEhUTUxUYWJsZUNlbGxFbGVtZW50IGZvclxuICAgICAqICAgICAgIGJvdGggVEQgYW5kIFRIIGVsZW1lbnRzLiBXaGF0V0cgc2VwYXJhdGVzIHRoZXNlLlxuICAgICAqIFRlc3Q6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpKVxuICAgICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgKi9cbiAgICBpZiAob2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgb2JqLnRhZ05hbWUgPT09ICdURCcpIHtcbiAgICAgIHJldHVybiAnSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50JztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlaGVhZGVyY2VsbGVsZW1lbnQpXG4gICAgICogV2hhdFdHIEhUTUwkNC45LjkgLSBUaGUgYHRkYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudGBcbiAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTgyOTE1MDc1KVxuICAgICAqICAgICAgIHdoaWNoIHN1Z2dlc3RzIHRoYXQgYnJvd3NlcnMgc2hvdWxkIHVzZSBIVE1MVGFibGVDZWxsRWxlbWVudCBmb3JcbiAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgKiBUZXN0OiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKSlcbiAgICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICovXG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIG9iai50YWdOYW1lID09PSAnVEgnKSB7XG4gICAgICByZXR1cm4gJ0hUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50JztcbiAgICB9XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDYyNSw2NDQgb3BzL3NlYyDCsTEuNTglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBGbG9hdDMyQXJyYXkgICAgICAgeCAxLDI3OSw4NTIgb3BzL3NlYyDCsTIuOTElICg3NyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MzJBcnJheSAgICAgICAgeCAxLDE3OCwxODUgb3BzL3NlYyDCsTEuOTUlICg4MyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCAxLDAwOCwzODAgb3BzL3NlYyDCsTIuMjUlICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBVaW50OEFycmF5ICAgICAgICAgeCAxLDEyOCwwNDAgb3BzL3NlYyDCsTIuMTElICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQzMkFycmF5ICAgICAgICAgeCAxLDE3MCwxMTkgb3BzL3NlYyDCsTIuODglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCAxLDE3NiwzNDggb3BzL3NlYyDCsTUuNzklICg4NiBydW5zIHNhbXBsZWQpXG4gICogICBJbnQ4QXJyYXkgICAgICAgICAgeCAxLDA1OCw3MDcgb3BzL3NlYyDCsTQuOTQlICg3NyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50OENsYW1wZWRBcnJheSAgeCAxLDExMCw2MzMgb3BzL3NlYyDCsTQuMjAlICg4MCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDcsMTA1LDY3MSBvcHMvc2VjIMKxMTMuNDclICg2NCBydW5zIHNhbXBsZWQpXG4gICogICBGbG9hdDMyQXJyYXkgICAgICAgeCA1LDg4Nyw5MTIgb3BzL3NlYyDCsTEuNDYlICg4MiBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MzJBcnJheSAgICAgICAgeCA2LDQ5MSw2NjEgb3BzL3NlYyDCsTEuNzYlICg3OSBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCA2LDU1OSw3OTUgb3BzL3NlYyDCsTEuNjclICg4MiBydW5zIHNhbXBsZWQpXG4gICogICBVaW50OEFycmF5ICAgICAgICAgeCA2LDQ2Myw5NjYgb3BzL3NlYyDCsTEuNDMlICg4NSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQzMkFycmF5ICAgICAgICAgeCA1LDY0MSw4NDEgb3BzL3NlYyDCsTMuNDklICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCA2LDU4Myw1MTEgb3BzL3NlYyDCsTEuOTglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBJbnQ4QXJyYXkgICAgICAgICAgeCA2LDYwNiwwNzggb3BzL3NlYyDCsTEuNzQlICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBVaW50OENsYW1wZWRBcnJheSAgeCA2LDYwMiwyMjQgb3BzL3NlYyDCsTEuNzclICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIHZhciBzdHJpbmdUYWcgPSAoc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgJiYgb2JqW1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICBpZiAodHlwZW9mIHN0cmluZ1RhZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG5cbiAgdmFyIG9ialByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHJlZ2V4IGxpdGVyYWwgICAgICB4IDEsNzcyLDM4NSBvcHMvc2VjIMKxMS44NSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIHJlZ2V4IGNvbnN0cnVjdG9yICB4IDIsMTQzLDYzNCBvcHMvc2VjIMKxMi40NiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgcmVnZXggbGl0ZXJhbCAgICAgIHggMyw5MjgsMDA5IG9wcy9zZWMgwrEwLjY1JSAoNzggcnVucyBzYW1wbGVkKVxuICAqICAgcmVnZXggY29uc3RydWN0b3IgIHggMyw5MzEsMTA4IG9wcy9zZWMgwrEwLjU4JSAoODQgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAob2JqUHJvdG90eXBlID09PSBSZWdFeHAucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdSZWdFeHAnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBkYXRlICAgICAgICAgICAgICAgeCAyLDEzMCwwNzQgb3BzL3NlYyDCsTQuNDIlICg2OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIGRhdGUgICAgICAgICAgICAgICB4IDMsOTUzLDc3OSBvcHMvc2VjIMKxMS4zNSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gRGF0ZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGUnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLXByb21pc2UucHJvdG90eXBlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyNS40LjUuNCAtIFByb21pc2UucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlByb21pc2VcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQcm9taXNlLnJlc29sdmUoKSlgYFxuICAgKiAgLSBDaHJvbWUgPD00NyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKiAgLSBFZGdlIDw9MjAgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICogIC0gRmlyZWZveCAyOS1MYXRlc3QgPT09IFwiW29iamVjdCBQcm9taXNlXVwiXG4gICAqICAtIFNhZmFyaSA3LjEtTGF0ZXN0ID09PSBcIltvYmplY3QgUHJvbWlzZV1cIlxuICAgKi9cbiAgaWYgKHByb21pc2VFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBQcm9taXNlLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUHJvbWlzZSc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDIsMjIyLDE4NiBvcHMvc2VjIMKxMS4zMSUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgc2V0ICAgICAgICAgICAgICAgIHggNCw1NDUsODc5IG9wcy9zZWMgwrExLjEzJSAoODMgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAoc2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gU2V0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnU2V0JztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgbWFwICAgICAgICAgICAgICAgIHggMiwzOTYsODQyIG9wcy9zZWMgwrExLjU5JSAoODEgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCA0LDE4Myw5NDUgb3BzL3NlYyDCsTYuNTklICg4MiBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChtYXBFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBNYXAucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdNYXAnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICB3ZWFrc2V0ICAgICAgICAgICAgeCAxLDMyMywyMjAgb3BzL3NlYyDCsTIuMTclICg3NiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHdlYWtzZXQgICAgICAgICAgICB4IDQsMjM3LDUxMCBvcHMvc2VjIMKxMi4wMSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHdlYWtTZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBXZWFrU2V0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnV2Vha1NldCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDEsNTAwLDI2MCBvcHMvc2VjIMKxMi4wMiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgd2Vha21hcCAgICAgICAgICAgIHggMyw4ODEsMzg0IG9wcy9zZWMgwrExLjQ1JSAoODIgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAod2Vha01hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IFdlYWtNYXAucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdXZWFrTWFwJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1kYXRhdmlldy5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDI0LjIuNC4yMSAtIERhdGFWaWV3LnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJEYXRhVmlld1wiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKGRhdGFWaWV3RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gRGF0YVZpZXcucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdEYXRhVmlldyc7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJW1hcGl0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjMuMS41LjIuMiAtICVNYXBJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiTWFwIEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3IE1hcCgpLmVudHJpZXMoKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChtYXBFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBtYXBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgIHJldHVybiAnTWFwIEl0ZXJhdG9yJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lc2V0aXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMy4yLjUuMi4yIC0gJVNldEl0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJTZXQgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgU2V0KCkuZW50cmllcygpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKHNldEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IHNldEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdTZXQgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjIuMS41LjIuMiAtICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJBcnJheSBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChhcnJheUl0ZXJhdG9yRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gYXJyYXlJdGVyYXRvclByb3RvdHlwZSkge1xuICAgIHJldHVybiAnQXJyYXkgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIxLjEuNS4yLjIgLSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlN0cmluZyBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChzdHJpbmdJdGVyYXRvckV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IHN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdTdHJpbmcgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBvYmplY3QgZnJvbSBudWxsICAgeCAyLDQyNCwzMjAgb3BzL3NlYyDCsTEuNjclICg3NiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDUsODM4LDAwMCBvcHMvc2VjIMKxMC45OSUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxuXG4gIHJldHVybiBPYmplY3RcbiAgICAucHJvdG90eXBlXG4gICAgLnRvU3RyaW5nXG4gICAgLmNhbGwob2JqKVxuICAgIC5zbGljZSh0b1N0cmluZ0xlZnRTbGljZUxlbmd0aCwgdG9TdHJpbmdSaWdodFNsaWNlTGVuZ3RoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLnR5cGVEZXRlY3QgPSBtb2R1bGUuZXhwb3J0cztcbiIsIi8qIVxuICogQ2hhaSAtIGV4cGVjdFR5cGVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZXhwZWN0VHlwZXMob2JqLCB0eXBlcylcbiAqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQgYWdhaW5zdCBpcyBvZiBhIHZhbGlkIHR5cGUuXG4gKlxuICogICAgIHV0aWxzLmV4cGVjdFR5cGVzKHRoaXMsIFsnYXJyYXknLCAnb2JqZWN0JywgJ3N0cmluZyddKTtcbiAqXG4gKiBAcGFyYW0ge01peGVkfSBvYmogY29uc3RydWN0ZWQgQXNzZXJ0aW9uXG4gKiBAcGFyYW0ge0FycmF5fSB0eXBlIEEgbGlzdCBvZiBhbGxvd2VkIHR5cGVzIGZvciB0aGlzIGFzc2VydGlvblxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZXhwZWN0VHlwZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIEFzc2VydGlvbkVycm9yID0gcmVxdWlyZSgnYXNzZXJ0aW9uLWVycm9yJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIHR5cGUgPSByZXF1aXJlKCd0eXBlLWRldGVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4cGVjdFR5cGVzKG9iaiwgdHlwZXMpIHtcbiAgdmFyIGZsYWdNc2cgPSBmbGFnKG9iaiwgJ21lc3NhZ2UnKTtcbiAgdmFyIHNzZmkgPSBmbGFnKG9iaiwgJ3NzZmknKTtcblxuICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG5cbiAgb2JqID0gZmxhZyhvYmosICdvYmplY3QnKTtcbiAgdHlwZXMgPSB0eXBlcy5tYXAoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTsgfSk7XG4gIHR5cGVzLnNvcnQoKTtcblxuICAvLyBUcmFuc2Zvcm1zIFsnbG9yZW0nLCAnaXBzdW0nXSBpbnRvICdhIGxvcmVtLCBvciBhbiBpcHN1bSdcbiAgdmFyIHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbiAodCwgaW5kZXgpIHtcbiAgICB2YXIgYXJ0ID0gflsgJ2EnLCAnZScsICdpJywgJ28nLCAndScgXS5pbmRleE9mKHQuY2hhckF0KDApKSA/ICdhbicgOiAnYSc7XG4gICAgdmFyIG9yID0gdHlwZXMubGVuZ3RoID4gMSAmJiBpbmRleCA9PT0gdHlwZXMubGVuZ3RoIC0gMSA/ICdvciAnIDogJyc7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgJyAnICsgdDtcbiAgfSkuam9pbignLCAnKTtcblxuICB2YXIgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbiAoZXhwZWN0ZWQpIHsgcmV0dXJuIG9ialR5cGUgPT09IGV4cGVjdGVkOyB9KSkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIGZsYWdNc2cgKyAnb2JqZWN0IHRlc3RlZCBtdXN0IGJlICcgKyBzdHIgKyAnLCBidXQgJyArIG9ialR5cGUgKyAnIGdpdmVuJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gbWVzc2FnZSBjb21wb3NpdGlvbiB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kYW5jaWVzXG4gKi9cblxudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKVxuICAsIGdldEFjdHVhbCA9IHJlcXVpcmUoJy4vZ2V0QWN0dWFsJylcbiAgLCBpbnNwZWN0ID0gcmVxdWlyZSgnLi9pbnNwZWN0JylcbiAgLCBvYmpEaXNwbGF5ID0gcmVxdWlyZSgnLi9vYmpEaXNwbGF5Jyk7XG5cbi8qKlxuICogIyMjIC5nZXRNZXNzYWdlKG9iamVjdCwgbWVzc2FnZSwgbmVnYXRlTWVzc2FnZSlcbiAqXG4gKiBDb25zdHJ1Y3QgdGhlIGVycm9yIG1lc3NhZ2UgYmFzZWQgb24gZmxhZ3NcbiAqIGFuZCB0ZW1wbGF0ZSB0YWdzLiBUZW1wbGF0ZSB0YWdzIHdpbGwgcmV0dXJuXG4gKiBhIHN0cmluZ2lmaWVkIGluc3BlY3Rpb24gb2YgdGhlIG9iamVjdCByZWZlcmVuY2VkLlxuICpcbiAqIE1lc3NhZ2UgdGVtcGxhdGUgdGFnczpcbiAqIC0gYCN7dGhpc31gIGN1cnJlbnQgYXNzZXJ0ZWQgb2JqZWN0XG4gKiAtIGAje2FjdH1gIGFjdHVhbCB2YWx1ZVxuICogLSBgI3tleHB9YCBleHBlY3RlZCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgKGNvbnN0cnVjdGVkIEFzc2VydGlvbilcbiAqIEBwYXJhbSB7QXJndW1lbnRzfSBjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUuYXNzZXJ0IGFyZ3VtZW50c1xuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0TWVzc2FnZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE1lc3NhZ2Uob2JqLCBhcmdzKSB7XG4gIHZhciBuZWdhdGUgPSBmbGFnKG9iaiwgJ25lZ2F0ZScpXG4gICAgLCB2YWwgPSBmbGFnKG9iaiwgJ29iamVjdCcpXG4gICAgLCBleHBlY3RlZCA9IGFyZ3NbM11cbiAgICAsIGFjdHVhbCA9IGdldEFjdHVhbChvYmosIGFyZ3MpXG4gICAgLCBtc2cgPSBuZWdhdGUgPyBhcmdzWzJdIDogYXJnc1sxXVxuICAgICwgZmxhZ01zZyA9IGZsYWcob2JqLCAnbWVzc2FnZScpO1xuXG4gIGlmKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIikgbXNnID0gbXNnKCk7XG4gIG1zZyA9IG1zZyB8fCAnJztcbiAgbXNnID0gbXNnXG4gICAgLnJlcGxhY2UoLyNcXHt0aGlzXFx9L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9iakRpc3BsYXkodmFsKTsgfSlcbiAgICAucmVwbGFjZSgvI1xce2FjdFxcfS9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBvYmpEaXNwbGF5KGFjdHVhbCk7IH0pXG4gICAgLnJlcGxhY2UoLyNcXHtleHBcXH0vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JqRGlzcGxheShleHBlY3RlZCk7IH0pO1xuXG4gIHJldHVybiBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgKyBtc2cgOiBtc2c7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gZ2V0QWN0dWFsIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZ2V0QWN0dWFsKG9iamVjdCwgW2FjdHVhbF0pXG4gKlxuICogUmV0dXJucyB0aGUgYGFjdHVhbGAgdmFsdWUgZm9yIGFuIEFzc2VydGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IChjb25zdHJ1Y3RlZCBBc3NlcnRpb24pXG4gKiBAcGFyYW0ge0FyZ3VtZW50c30gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmFzc2VydCBhcmd1bWVudHNcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldEFjdHVhbFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0QWN0dWFsKG9iaiwgYXJncykge1xuICByZXR1cm4gYXJncy5sZW5ndGggPiA0ID8gYXJnc1s0XSA6IG9iai5fb2JqO1xufTtcbiIsIi8vIFRoaXMgaXMgKGFsbW9zdCkgZGlyZWN0bHkgZnJvbSBOb2RlLmpzIHV0aWxzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvYmxvYi9mOGMzMzVkMGNhZjQ3ZjE2ZDMxNDEzZjg5YWEyOGVkYTM4NzhlM2FhL2xpYi91dGlsLmpzXG5cbnZhciBnZXROYW1lID0gcmVxdWlyZSgnZ2V0LWZ1bmMtbmFtZScpO1xudmFyIGdldFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2dldFByb3BlcnRpZXMnKTtcbnZhciBnZXRFbnVtZXJhYmxlUHJvcGVydGllcyA9IHJlcXVpcmUoJy4vZ2V0RW51bWVyYWJsZVByb3BlcnRpZXMnKTtcbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnNwZWN0O1xuXG4vKipcbiAqICMjIyAuaW5zcGVjdChvYmosIFtzaG93SGlkZGVuXSwgW2RlcHRoXSwgW2NvbG9yc10pXG4gKlxuICogRWNob2VzIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcmllcyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtCb29sZWFufSBzaG93SGlkZGVuIEZsYWcgdGhhdCBzaG93cyBoaWRkZW4gKG5vdCBlbnVtZXJhYmxlKVxuICogICAgcHJvcGVydGllcyBvZiBvYmplY3RzLiBEZWZhdWx0IGlzIGZhbHNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlcHRoIERlcHRoIGluIHdoaWNoIHRvIGRlc2NlbmQgaW4gb2JqZWN0LiBEZWZhdWx0IGlzIDIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGNvbG9ycyBGbGFnIHRvIHR1cm4gb24gQU5TSSBlc2NhcGUgY29kZXMgdG8gY29sb3IgdGhlXG4gKiAgICBvdXRwdXQuIERlZmF1bHQgaXMgZmFsc2UgKG5vIGNvbG9yaW5nKS5cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGluc3BlY3RcbiAqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMpIHtcbiAgdmFyIGN0eCA9IHtcbiAgICBzaG93SGlkZGVuOiBzaG93SGlkZGVuLFxuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0cjsgfVxuICB9O1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosICh0eXBlb2YgZGVwdGggPT09ICd1bmRlZmluZWQnID8gMiA6IGRlcHRoKSk7XG59XG5cbi8vIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYSBET00gZWxlbWVudC5cbnZhciBpc0RPTUVsZW1lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmplY3QgJiZcbiAgICAgIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgICAnbm9kZVR5cGUnIGluIG9iamVjdCAmJlxuICAgICAgb2JqZWN0Lm5vZGVUeXBlID09PSAxICYmXG4gICAgICB0eXBlb2Ygb2JqZWN0Lm5vZGVOYW1lID09PSAnc3RyaW5nJztcbiAgfVxufTtcblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAodHlwZW9mIHJldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBJZiB0aGlzIGlzIGEgRE9NIGVsZW1lbnQsIHRyeSB0byBnZXQgdGhlIG91dGVyIEhUTUwuXG4gIGlmIChpc0RPTUVsZW1lbnQodmFsdWUpKSB7XG4gICAgaWYgKCdvdXRlckhUTUwnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUub3V0ZXJIVE1MO1xuICAgICAgLy8gVGhpcyB2YWx1ZSBkb2VzIG5vdCBoYXZlIGFuIG91dGVySFRNTCBhdHRyaWJ1dGUsXG4gICAgICAvLyAgIGl0IGNvdWxkIHN0aWxsIGJlIGFuIFhNTCBlbGVtZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gc2VyaWFsaXplIGl0XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZG9jdW1lbnQueG1sVmVyc2lvbikge1xuICAgICAgICAgIHZhciB4bWxTZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcbiAgICAgICAgICByZXR1cm4geG1sU2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmlyZWZveCAxMS0gZG8gbm90IHN1cHBvcnQgb3V0ZXJIVE1MXG4gICAgICAgICAgLy8gICBJdCBkb2VzLCBob3dldmVyLCBzdXBwb3J0IGlubmVySFRNTFxuICAgICAgICAgIC8vICAgVXNlIHRoZSBmb2xsb3dpbmcgdG8gcmVuZGVyIHRoZSBlbGVtZW50XG4gICAgICAgICAgdmFyIG5zID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhucywgJ18nKTtcblxuICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpKTtcbiAgICAgICAgICB2YXIgaHRtbCA9IGNvbnRhaW5lci5pbm5lckhUTUxcbiAgICAgICAgICAgIC5yZXBsYWNlKCc+PCcsICc+JyArIHZhbHVlLmlubmVySFRNTCArICc8Jyk7XG4gICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhIG5vbi1uYXRpdmUgRE9NIGltcGxlbWVudGF0aW9uLFxuICAgICAgICAvLyAgIGNvbnRpbnVlIHdpdGggdGhlIG5vcm1hbCBmbG93OlxuICAgICAgICAvLyAgIHByaW50aW5nIHRoZSBlbGVtZW50IGFzIGlmIGl0IGlzIGFuIG9iamVjdC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciB2aXNpYmxlS2V5cyA9IGdldEVudW1lcmFibGVQcm9wZXJ0aWVzKHZhbHVlKTtcbiAgdmFyIGtleXMgPSBjdHguc2hvd0hpZGRlbiA/IGdldFByb3BlcnRpZXModmFsdWUpIDogdmlzaWJsZUtleXM7XG5cbiAgdmFyIG5hbWUsIG5hbWVTdWZmaXg7XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICAvLyBJbiBJRSwgZXJyb3JzIGhhdmUgYSBzaW5nbGUgYHN0YWNrYCBwcm9wZXJ0eSwgb3IgaWYgdGhleSBhcmUgdmFuaWxsYSBgRXJyb3JgLFxuICAvLyBhIGBzdGFja2AgcGx1cyBgZGVzY3JpcHRpb25gIHByb3BlcnR5OyBpZ25vcmUgdGhvc2UgZm9yIGNvbnNpc3RlbmN5LlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgfHwgKGlzRXJyb3IodmFsdWUpICYmIChcbiAgICAgIChrZXlzLmxlbmd0aCA9PT0gMSAmJiBrZXlzWzBdID09PSAnc3RhY2snKSB8fFxuICAgICAgKGtleXMubGVuZ3RoID09PSAyICYmIGtleXNbMF0gPT09ICdkZXNjcmlwdGlvbicgJiYga2V5c1sxXSA9PT0gJ3N0YWNrJylcbiAgICAgKSkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBuYW1lID0gZ2V0TmFtZSh2YWx1ZSk7XG4gICAgICBuYW1lU3VmZml4ID0gbmFtZSA/ICc6ICcgKyBuYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lU3VmZml4ICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJ1xuICAgICwgYXJyYXkgPSBmYWxzZVxuICAgICwgdHlwZWRBcnJheSA9IGZhbHNlXG4gICAgLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIGlmIChpc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgdHlwZWRBcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG5hbWUgPSBnZXROYW1lKHZhbHVlKTtcbiAgICBuYW1lU3VmZml4ID0gbmFtZSA/ICc6ICcgKyBuYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG5hbWVTdWZmaXggKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSBpZiAodHlwZWRBcnJheSkge1xuICAgIHJldHVybiBmb3JtYXRUeXBlZEFycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG5cbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiAoMS92YWx1ZSkgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gY3R4LnN0eWxpemUoJy0wJywgJ251bWJlcicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG5cbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKHZhbHVlLnRvU3RyaW5nKCksICdzeW1ib2wnKTtcbiAgfVxuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cblxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFR5cGVkQXJyYXkodmFsdWUpIHtcbiAgdmFyIHN0ciA9ICdbICc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgIGlmIChzdHIubGVuZ3RoID49IGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCAtIDcpIHtcbiAgICAgIHN0ciArPSAnLi4uJztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzdHIgKz0gdmFsdWVbaV0gKyAnLCAnO1xuICB9XG4gIHN0ciArPSAnIF0nO1xuXG4gIC8vIFJlbW92aW5nIHRyYWlsaW5nIGAsIGAgaWYgdGhlIGFycmF5IHdhcyBub3QgdHJ1bmNhdGVkXG4gIGlmIChzdHIuaW5kZXhPZignLCAgXScpICE9PSAtMSkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKCcsICBdJywgJyBdJyk7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lO1xuICB2YXIgcHJvcERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpO1xuICB2YXIgc3RyO1xuXG4gIGlmIChwcm9wRGVzY3JpcHRvcikge1xuICAgIGlmIChwcm9wRGVzY3JpcHRvci5nZXQpIHtcbiAgICAgIGlmIChwcm9wRGVzY3JpcHRvci5zZXQpIHtcbiAgICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcERlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh2aXNpYmxlS2V5cy5pbmRleE9mKGtleSkgPCAwKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKHZhbHVlW2tleV0pIDwgMCkge1xuICAgICAgaWYgKHJlY3Vyc2VUaW1lcyA9PT0gbnVsbCkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlW2tleV0sIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZVtrZXldLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkoYXIpIHtcbiAgLy8gVW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vIHdheSB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgYSBUeXBlZEFycmF5XG4gIC8vIFdlIGhhdmUgdG8gY2hlY2sgaWYgaXQncyBvbmUgb2YgdGhlc2UgdHlwZXNcbiAgcmV0dXJuICh0eXBlb2YgYXIgPT09ICdvYmplY3QnICYmIC9cXHcrQXJyYXldJC8udGVzdChvYmplY3RUb1N0cmluZyhhcikpKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcikgfHxcbiAgICAgICAgICh0eXBlb2YgYXIgPT09ICdvYmplY3QnICYmIG9iamVjdFRvU3RyaW5nKGFyKSA9PT0gJ1tvYmplY3QgQXJyYXldJyk7XG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiB0eXBlb2YgcmUgPT09ICdvYmplY3QnICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiB0eXBlb2YgZCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgb2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXSc7XG59XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsIi8qIVxuICogQ2hhaSAtIGZsYWcgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qIVxuICogTW9kdWxlIGRlcGVuZGFuY2llc1xuICovXG5cbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnLi9pbnNwZWN0Jyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cbi8qKlxuICogIyMjIC5vYmpEaXNwbGF5KG9iamVjdClcbiAqXG4gKiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBvciBhbiBhcnJheSBtYXRjaGVzXG4gKiBjcml0ZXJpYSB0byBiZSBpbnNwZWN0ZWQgaW4tbGluZSBmb3IgZXJyb3JcbiAqIG1lc3NhZ2VzIG9yIHNob3VsZCBiZSB0cnVuY2F0ZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gamF2YXNjcmlwdCBvYmplY3QgdG8gaW5zcGVjdFxuICogQG5hbWUgb2JqRGlzcGxheVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9iakRpc3BsYXkob2JqKSB7XG4gIHZhciBzdHIgPSBpbnNwZWN0KG9iailcbiAgICAsIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcblxuICBpZiAoY29uZmlnLnRydW5jYXRlVGhyZXNob2xkICYmIHN0ci5sZW5ndGggPj0gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkKSB7XG4gICAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScpIHtcbiAgICAgIHJldHVybiAhb2JqLm5hbWUgfHwgb2JqLm5hbWUgPT09ICcnXG4gICAgICAgID8gJ1tGdW5jdGlvbl0nXG4gICAgICAgIDogJ1tGdW5jdGlvbjogJyArIG9iai5uYW1lICsgJ10nO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgcmV0dXJuICdbIEFycmF5KCcgKyBvYmoubGVuZ3RoICsgJykgXSc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICwga3N0ciA9IGtleXMubGVuZ3RoID4gMlxuICAgICAgICAgID8ga2V5cy5zcGxpY2UoMCwgMikuam9pbignLCAnKSArICcsIC4uLidcbiAgICAgICAgICA6IGtleXMuam9pbignLCAnKTtcbiAgICAgIHJldHVybiAneyBPYmplY3QgKCcgKyBrc3RyICsgJykgfSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn07XG4iLCIvKiFcbiAqIENoYWkgLSBmbGFnIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZmxhZyhvYmplY3QsIGtleSwgW3ZhbHVlXSlcbiAqXG4gKiBHZXQgb3Igc2V0IGEgZmxhZyB2YWx1ZSBvbiBhbiBvYmplY3QuIElmIGFcbiAqIHZhbHVlIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgc2V0LCBlbHNlIGl0IHdpbGxcbiAqIHJldHVybiB0aGUgY3VycmVudGx5IHNldCB2YWx1ZSBvciBgdW5kZWZpbmVkYCBpZlxuICogdGhlIHZhbHVlIGlzIG5vdCBzZXQuXG4gKlxuICogICAgIHV0aWxzLmZsYWcodGhpcywgJ2ZvbycsICdiYXInKTsgLy8gc2V0dGVyXG4gKiAgICAgdXRpbHMuZmxhZyh0aGlzLCAnZm9vJyk7IC8vIGdldHRlciwgcmV0dXJucyBgYmFyYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgY29uc3RydWN0ZWQgQXNzZXJ0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZSAob3B0aW9uYWwpXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBmbGFnXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZsYWcob2JqLCBrZXksIHZhbHVlKSB7XG4gIHZhciBmbGFncyA9IG9iai5fX2ZsYWdzIHx8IChvYmouX19mbGFncyA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGZsYWdzW2tleV0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmxhZ3Nba2V5XTtcbiAgfVxufTtcbiIsIi8qIVxuICogQ2hhaSAtIHRyYW5zZmVyRmxhZ3MgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC50cmFuc2ZlckZsYWdzKGFzc2VydGlvbiwgb2JqZWN0LCBpbmNsdWRlQWxsID0gdHJ1ZSlcbiAqXG4gKiBUcmFuc2ZlciBhbGwgdGhlIGZsYWdzIGZvciBgYXNzZXJ0aW9uYCB0byBgb2JqZWN0YC4gSWZcbiAqIGBpbmNsdWRlQWxsYCBpcyBzZXQgdG8gYGZhbHNlYCwgdGhlbiB0aGUgYmFzZSBDaGFpXG4gKiBhc3NlcnRpb24gZmxhZ3MgKG5hbWVseSBgb2JqZWN0YCwgYHNzZmlgLCBgbG9ja1NzZmlgLFxuICogYW5kIGBtZXNzYWdlYCkgd2lsbCBub3QgYmUgdHJhbnNmZXJyZWQuXG4gKlxuICpcbiAqICAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICogICAgIHV0aWxzLnRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBuZXdBc3NlcnRpb24pO1xuICpcbiAqICAgICB2YXIgYW5vdGhlckFzc2VyaXRvbiA9IG5ldyBBc3NlcnRpb24obXlPYmopO1xuICogICAgIHV0aWxzLnRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBhbm90aGVyQXNzZXJ0aW9uLCBmYWxzZSk7XG4gKlxuICogQHBhcmFtIHtBc3NlcnRpb259IGFzc2VydGlvbiB0aGUgYXNzZXJ0aW9uIHRvIHRyYW5zZmVyIHRoZSBmbGFncyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRoZSBvYmplY3QgdG8gdHJhbnNmZXIgdGhlIGZsYWdzIHRvOyB1c3VhbGx5IGEgbmV3IGFzc2VydGlvblxuICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlQWxsXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSB0cmFuc2ZlckZsYWdzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBvYmplY3QsIGluY2x1ZGVBbGwpIHtcbiAgdmFyIGZsYWdzID0gYXNzZXJ0aW9uLl9fZmxhZ3MgfHwgKGFzc2VydGlvbi5fX2ZsYWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbiAgaWYgKCFvYmplY3QuX19mbGFncykge1xuICAgIG9iamVjdC5fX2ZsYWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIGluY2x1ZGVBbGwgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gaW5jbHVkZUFsbCA6IHRydWU7XG5cbiAgZm9yICh2YXIgZmxhZyBpbiBmbGFncykge1xuICAgIGlmIChpbmNsdWRlQWxsIHx8XG4gICAgICAgIChmbGFnICE9PSAnb2JqZWN0JyAmJiBmbGFnICE9PSAnc3NmaScgJiYgZmxhZyAhPT0gJ2xvY2tTc2ZpJyAmJiBmbGFnICE9ICdtZXNzYWdlJykpIHtcbiAgICAgIG9iamVjdC5fX2ZsYWdzW2ZsYWddID0gZmxhZ3NbZmxhZ107XG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZ2xvYmFscyBTeW1ib2w6IGZhbHNlLCBVaW50OEFycmF5OiBmYWxzZSwgV2Vha01hcDogZmFsc2UgKi9cbi8qIVxuICogZGVlcC1lcWxcbiAqIENvcHlyaWdodChjKSAyMDEzIEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIHR5cGUgPSByZXF1aXJlKCd0eXBlLWRldGVjdCcpO1xuZnVuY3Rpb24gRmFrZU1hcCgpIHtcbiAgdGhpcy5fa2V5ID0gJ2NoYWkvZGVlcC1lcWxfXycgKyBNYXRoLnJhbmRvbSgpICsgRGF0ZS5ub3coKTtcbn1cblxuRmFrZU1hcC5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gZ2V0TWFwKGtleSkge1xuICAgIHJldHVybiBrZXlbdGhpcy5fa2V5XTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXRNYXAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGtleSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX2tleSwge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbn07XG5cbnZhciBNZW1vaXplTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogRmFrZU1hcDtcbi8qIVxuICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBNZW1vaXplTWFwIGhhcyByZWNvcmRlZCBhIHJlc3VsdCBvZiB0aGUgdHdvIG9wZXJhbmRzXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01lbW9pemVNYXB9IG1lbW9pemVNYXBcbiAqIEByZXR1cm5zIHtCb29sZWFufG51bGx9IHJlc3VsdFxuKi9cbmZ1bmN0aW9uIG1lbW9pemVDb21wYXJlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCkge1xuICAvLyBUZWNobmljYWxseSwgV2Vha01hcCBrZXlzIGNhbiAqb25seSogYmUgb2JqZWN0cywgbm90IHByaW1pdGl2ZXMuXG4gIGlmICghbWVtb2l6ZU1hcCB8fCBpc1ByaW1pdGl2ZShsZWZ0SGFuZE9wZXJhbmQpIHx8IGlzUHJpbWl0aXZlKHJpZ2h0SGFuZE9wZXJhbmQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGxlZnRIYW5kTWFwID0gbWVtb2l6ZU1hcC5nZXQobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kTWFwKSB7XG4gICAgdmFyIHJlc3VsdCA9IGxlZnRIYW5kTWFwLmdldChyaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyohXG4gKiBTZXQgdGhlIHJlc3VsdCBvZiB0aGUgZXF1YWxpdHkgaW50byB0aGUgTWVtb2l6ZU1hcFxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNZW1vaXplTWFwfSBtZW1vaXplTWFwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlc3VsdFxuKi9cbmZ1bmN0aW9uIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBtZW1vaXplTWFwLCByZXN1bHQpIHtcbiAgLy8gVGVjaG5pY2FsbHksIFdlYWtNYXAga2V5cyBjYW4gKm9ubHkqIGJlIG9iamVjdHMsIG5vdCBwcmltaXRpdmVzLlxuICBpZiAoIW1lbW9pemVNYXAgfHwgaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbGVmdEhhbmRNYXAgPSBtZW1vaXplTWFwLmdldChsZWZ0SGFuZE9wZXJhbmQpO1xuICBpZiAobGVmdEhhbmRNYXApIHtcbiAgICBsZWZ0SGFuZE1hcC5zZXQocmlnaHRIYW5kT3BlcmFuZCwgcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBsZWZ0SGFuZE1hcCA9IG5ldyBNZW1vaXplTWFwKCk7XG4gICAgbGVmdEhhbmRNYXAuc2V0KHJpZ2h0SGFuZE9wZXJhbmQsIHJlc3VsdCk7XG4gICAgbWVtb2l6ZU1hcC5zZXQobGVmdEhhbmRPcGVyYW5kLCBsZWZ0SGFuZE1hcCk7XG4gIH1cbn1cblxuLyohXG4gKiBQcmltYXJ5IEV4cG9ydFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcEVxdWFsO1xubW9kdWxlLmV4cG9ydHMuTWVtb2l6ZU1hcCA9IE1lbW9pemVNYXA7XG5cbi8qKlxuICogQXNzZXJ0IGRlZXBseSBuZXN0ZWQgc2FtZVZhbHVlIGVxdWFsaXR5IGJldHdlZW4gdHdvIG9iamVjdHMgb2YgYW55IHR5cGUuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChvcHRpb25hbCkgQWRkaXRpb25hbCBvcHRpb25zXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5jb21wYXJhdG9yXSAob3B0aW9uYWwpIE92ZXJyaWRlIGRlZmF1bHQgYWxnb3JpdGhtLCBkZXRlcm1pbmluZyBjdXN0b20gZXF1YWxpdHkuXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5tZW1vaXplXSAob3B0aW9uYWwpIFByb3ZpZGUgYSBjdXN0b20gbWVtb2l6YXRpb24gb2JqZWN0IHdoaWNoIHdpbGwgY2FjaGUgdGhlIHJlc3VsdHMgb2ZcbiAgICBjb21wbGV4IG9iamVjdHMgZm9yIGEgc3BlZWQgYm9vc3QuIEJ5IHBhc3NpbmcgYGZhbHNlYCB5b3UgY2FuIGRpc2FibGUgbWVtb2l6YXRpb24sIGJ1dCB0aGlzIHdpbGwgY2F1c2UgY2lyY3VsYXJcbiAgICByZWZlcmVuY2VzIHRvIGJsb3cgdGhlIHN0YWNrLlxuICogQHJldHVybiB7Qm9vbGVhbn0gZXF1YWwgbWF0Y2hcbiAqL1xuZnVuY3Rpb24gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICAvLyBJZiB3ZSBoYXZlIGEgY29tcGFyYXRvciwgd2UgY2FuJ3QgYXNzdW1lIGFueXRoaW5nOyBzbyBiYWlsIHRvIGl0cyBjaGVjayBmaXJzdC5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgdmFyIHNpbXBsZVJlc3VsdCA9IHNpbXBsZUVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gIGlmIChzaW1wbGVSZXN1bHQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICB9XG5cbiAgLy8gRGVlcGVyIGNvbXBhcmlzb25zIGFyZSBwdXNoZWQgdGhyb3VnaCB0byBhIGxhcmdlciBmdW5jdGlvblxuICByZXR1cm4gZXh0ZW5zaXZlRGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogTWFueSBjb21wYXJpc29ucyBjYW4gYmUgY2FuY2VsZWQgb3V0IGVhcmx5IHZpYSBzaW1wbGUgZXF1YWxpdHkgb3IgcHJpbWl0aXZlIGNoZWNrcy5cbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHJldHVybiB7Qm9vbGVhbnxudWxsfSBlcXVhbCBtYXRjaFxuICovXG5mdW5jdGlvbiBzaW1wbGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgLy8gRXF1YWwgcmVmZXJlbmNlcyAoZXhjZXB0IGZvciBOdW1iZXJzKSBjYW4gYmUgcmV0dXJuZWQgZWFybHlcbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCA9PT0gcmlnaHRIYW5kT3BlcmFuZCkge1xuICAgIC8vIEhhbmRsZSArLTAgY2FzZXNcbiAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kICE9PSAwIHx8IDEgLyBsZWZ0SGFuZE9wZXJhbmQgPT09IDEgLyByaWdodEhhbmRPcGVyYW5kO1xuICB9XG5cbiAgLy8gaGFuZGxlIE5hTiBjYXNlc1xuICBpZiAoXG4gICAgbGVmdEhhbmRPcGVyYW5kICE9PSBsZWZ0SGFuZE9wZXJhbmQgJiYgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByaWdodEhhbmRPcGVyYW5kICE9PSByaWdodEhhbmRPcGVyYW5kIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQW55dGhpbmcgdGhhdCBpcyBub3QgYW4gJ29iamVjdCcsIGkuZS4gc3ltYm9scywgZnVuY3Rpb25zLCBib29sZWFucywgbnVtYmVycyxcbiAgLy8gc3RyaW5ncywgYW5kIHVuZGVmaW5lZCwgY2FuIGJlIGNvbXBhcmVkIGJ5IHJlZmVyZW5jZS5cbiAgaWYgKGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICAvLyBFYXN5IG91dCBiL2MgaXQgd291bGQgaGF2ZSBwYXNzZWQgdGhlIGZpcnN0IGVxdWFsaXR5IGNoZWNrXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiFcbiAqIFRoZSBtYWluIGxvZ2ljIG9mIHRoZSBgZGVlcEVxdWFsYCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWl4ZWR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKG9wdGlvbmFsKSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLmNvbXBhcmF0b3JdIChvcHRpb25hbCkgT3ZlcnJpZGUgZGVmYXVsdCBhbGdvcml0aG0sIGRldGVybWluaW5nIGN1c3RvbSBlcXVhbGl0eS5cbiAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLm1lbW9pemVdIChvcHRpb25hbCkgUHJvdmlkZSBhIGN1c3RvbSBtZW1vaXphdGlvbiBvYmplY3Qgd2hpY2ggd2lsbCBjYWNoZSB0aGUgcmVzdWx0cyBvZlxuICAgIGNvbXBsZXggb2JqZWN0cyBmb3IgYSBzcGVlZCBib29zdC4gQnkgcGFzc2luZyBgZmFsc2VgIHlvdSBjYW4gZGlzYWJsZSBtZW1vaXphdGlvbiwgYnV0IHRoaXMgd2lsbCBjYXVzZSBjaXJjdWxhclxuICAgIHJlZmVyZW5jZXMgdG8gYmxvdyB0aGUgc3RhY2suXG4gKiBAcmV0dXJuIHtCb29sZWFufSBlcXVhbCBtYXRjaFxuKi9cbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMubWVtb2l6ZSA9IG9wdGlvbnMubWVtb2l6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IG9wdGlvbnMubWVtb2l6ZSB8fCBuZXcgTWVtb2l6ZU1hcCgpO1xuICB2YXIgY29tcGFyYXRvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb21wYXJhdG9yO1xuXG4gIC8vIENoZWNrIGlmIGEgbWVtb2l6ZWQgcmVzdWx0IGV4aXN0cy5cbiAgdmFyIG1lbW9pemVSZXN1bHRMZWZ0ID0gbWVtb2l6ZUNvbXBhcmUobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUpO1xuICBpZiAobWVtb2l6ZVJlc3VsdExlZnQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVtb2l6ZVJlc3VsdExlZnQ7XG4gIH1cbiAgdmFyIG1lbW9pemVSZXN1bHRSaWdodCA9IG1lbW9pemVDb21wYXJlKHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplKTtcbiAgaWYgKG1lbW9pemVSZXN1bHRSaWdodCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBtZW1vaXplUmVzdWx0UmlnaHQ7XG4gIH1cblxuICAvLyBJZiBhIGNvbXBhcmF0b3IgaXMgcHJlc2VudCwgdXNlIGl0LlxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIHZhciBjb21wYXJhdG9yUmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpO1xuICAgIC8vIENvbXBhcmF0b3JzIG1heSByZXR1cm4gbnVsbCwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGdvIGJhY2sgdG8gZGVmYXVsdCBiZWhhdmlvci5cbiAgICBpZiAoY29tcGFyYXRvclJlc3VsdCA9PT0gZmFsc2UgfHwgY29tcGFyYXRvclJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgY29tcGFyYXRvclJlc3VsdCk7XG4gICAgICByZXR1cm4gY29tcGFyYXRvclJlc3VsdDtcbiAgICB9XG4gICAgLy8gVG8gYWxsb3cgY29tcGFyYXRvcnMgdG8gb3ZlcnJpZGUgKmFueSogYmVoYXZpb3IsIHdlIHJhbiB0aGVtIGZpcnN0LiBTaW5jZSBpdCBkaWRuJ3QgZGVjaWRlXG4gICAgLy8gd2hhdCB0byBkbywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdG8gcmV0dXJuIHRoZSBiYXNpYyB0ZXN0cyBmaXJzdCBiZWZvcmUgd2UgbW92ZSBvbi5cbiAgICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAoc2ltcGxlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAvLyBEb24ndCBtZW1vaXplIHRoaXMsIGl0IHRha2VzIGxvbmdlciB0byBzZXQvcmV0cmlldmUgdGhhbiB0byBqdXN0IGNvbXBhcmUuXG4gICAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBsZWZ0SGFuZFR5cGUgPSB0eXBlKGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZFR5cGUgIT09IHR5cGUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGVtcG9yYXJpbHkgc2V0IHRoZSBvcGVyYW5kcyBpbiB0aGUgbWVtb2l6ZSBvYmplY3QgdG8gcHJldmVudCBibG93aW5nIHRoZSBzdGFja1xuICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCB0cnVlKTtcblxuICB2YXIgcmVzdWx0ID0gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKTtcbiAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobGVmdEhhbmRUeXBlKSB7XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICBjYXNlICdOdW1iZXInOlxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgLy8gSWYgdGhlc2UgdHlwZXMgYXJlIHRoZWlyIGluc3RhbmNlIHR5cGVzIChlLmcuIGBuZXcgTnVtYmVyYCkgdGhlbiByZS1kZWVwRXF1YWwgYWdhaW5zdCB0aGVpciB2YWx1ZXNcbiAgICAgIHJldHVybiBkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLnZhbHVlT2YoKSwgcmlnaHRIYW5kT3BlcmFuZC52YWx1ZU9mKCkpO1xuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1N5bWJvbCc6XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQgPT09IHJpZ2h0SGFuZE9wZXJhbmQ7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQ2NEFycmF5JzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICByZXR1cm4gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBjYXNlICdHZW5lcmF0b3InOlxuICAgICAgcmV0dXJuIGdlbmVyYXRvckVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSAnRGF0YVZpZXcnOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobmV3IFVpbnQ4QXJyYXkobGVmdEhhbmRPcGVyYW5kLmJ1ZmZlciksIG5ldyBVaW50OEFycmF5KHJpZ2h0SGFuZE9wZXJhbmQuYnVmZmVyKSwgb3B0aW9ucyk7XG4gICAgY2FzZSAnQXJyYXlCdWZmZXInOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobmV3IFVpbnQ4QXJyYXkobGVmdEhhbmRPcGVyYW5kKSwgbmV3IFVpbnQ4QXJyYXkocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIHJldHVybiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyohXG4gKiBDb21wYXJlIHR3byBSZWd1bGFyIEV4cHJlc3Npb25zIGZvciBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0ge1JlZ0V4cH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cblxuZnVuY3Rpb24gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKSB7XG4gIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQudG9TdHJpbmcoKSA9PT0gcmlnaHRIYW5kT3BlcmFuZC50b1N0cmluZygpO1xufVxuXG4vKiFcbiAqIENvbXBhcmUgdHdvIFNldHMvTWFwcyBmb3IgZXF1YWxpdHkuIEZhc3RlciB0aGFuIG90aGVyIGVxdWFsaXR5IGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1NldH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge1NldH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAqL1xuXG5mdW5jdGlvbiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFNldCNlbnRyaWVzIG9yIFNldCNAQGl0ZXJhdG9yLCBzbyB3ZSBuZWVkIG1hbnVhbGx5IHBvcHVsYXRlIHVzaW5nIFNldCNmb3JFYWNoXG4gIGlmIChsZWZ0SGFuZE9wZXJhbmQuc2l6ZSAhPT0gcmlnaHRIYW5kT3BlcmFuZC5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsZWZ0SGFuZE9wZXJhbmQuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBsZWZ0SGFuZEl0ZW1zID0gW107XG4gIHZhciByaWdodEhhbmRJdGVtcyA9IFtdO1xuICBsZWZ0SGFuZE9wZXJhbmQuZm9yRWFjaChmdW5jdGlvbiBnYXRoZXJFbnRyaWVzKGtleSwgdmFsdWUpIHtcbiAgICBsZWZ0SGFuZEl0ZW1zLnB1c2goWyBrZXksIHZhbHVlIF0pO1xuICB9KTtcbiAgcmlnaHRIYW5kT3BlcmFuZC5mb3JFYWNoKGZ1bmN0aW9uIGdhdGhlckVudHJpZXMoa2V5LCB2YWx1ZSkge1xuICAgIHJpZ2h0SGFuZEl0ZW1zLnB1c2goWyBrZXksIHZhbHVlIF0pO1xuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRJdGVtcy5zb3J0KCksIHJpZ2h0SGFuZEl0ZW1zLnNvcnQoKSwgb3B0aW9ucyk7XG59XG5cbi8qIVxuICogU2ltcGxlIGVxdWFsaXR5IGZvciBmbGF0IGl0ZXJhYmxlIG9iamVjdHMgc3VjaCBhcyBBcnJheXMsIFR5cGVkQXJyYXlzIG9yIE5vZGUuanMgYnVmZmVycy5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7SXRlcmFibGV9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKE9wdGlvbmFsKVxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cblxuZnVuY3Rpb24gaXRlcmFibGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGxlZnRIYW5kT3BlcmFuZC5sZW5ndGg7XG4gIGlmIChsZW5ndGggIT09IHJpZ2h0SGFuZE9wZXJhbmQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtpbmRleF0sIHJpZ2h0SGFuZE9wZXJhbmRbaW5kZXhdLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qIVxuICogU2ltcGxlIGVxdWFsaXR5IGZvciBnZW5lcmF0b3Igb2JqZWN0cyBzdWNoIGFzIHRob3NlIHJldHVybmVkIGJ5IGdlbmVyYXRvciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZX0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChPcHRpb25hbClcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5cbmZ1bmN0aW9uIGdlbmVyYXRvckVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICByZXR1cm4gaXRlcmFibGVFcXVhbChnZXRHZW5lcmF0b3JFbnRyaWVzKGxlZnRIYW5kT3BlcmFuZCksIGdldEdlbmVyYXRvckVudHJpZXMocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xufVxuXG4vKiFcbiAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBhbiBAQGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb2JqZWN0IGhhcyBhbiBAQGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBoYXNJdGVyYXRvckZ1bmN0aW9uKHRhcmdldCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKiFcbiAqIEdldHMgYWxsIGl0ZXJhdG9yIGVudHJpZXMgZnJvbSB0aGUgZ2l2ZW4gT2JqZWN0LiBJZiB0aGUgT2JqZWN0IGhhcyBubyBAQGl0ZXJhdG9yIGZ1bmN0aW9uLCByZXR1cm5zIGFuIGVtcHR5IGFycmF5LlxuICogVGhpcyB3aWxsIGNvbnN1bWUgdGhlIGl0ZXJhdG9yIC0gd2hpY2ggY291bGQgaGF2ZSBzaWRlIGVmZmVjdHMgZGVwZW5kaW5nIG9uIHRoZSBAQGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtBcnJheX0gYW4gYXJyYXkgb2YgZW50cmllcyBmcm9tIHRoZSBAQGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRW50cmllcyh0YXJnZXQpIHtcbiAgaWYgKGhhc0l0ZXJhdG9yRnVuY3Rpb24odGFyZ2V0KSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZ2V0R2VuZXJhdG9yRW50cmllcyh0YXJnZXRbU3ltYm9sLml0ZXJhdG9yXSgpKTtcbiAgICB9IGNhdGNoIChpdGVyYXRvckVycm9yKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyohXG4gKiBHZXRzIGFsbCBlbnRyaWVzIGZyb20gYSBHZW5lcmF0b3IuIFRoaXMgd2lsbCBjb25zdW1lIHRoZSBnZW5lcmF0b3IgLSB3aGljaCBjb3VsZCBoYXZlIHNpZGUgZWZmZWN0cy5cbiAqXG4gKiBAcGFyYW0ge0dlbmVyYXRvcn0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIGVudHJpZXMgZnJvbSB0aGUgR2VuZXJhdG9yLlxuICovXG5mdW5jdGlvbiBnZXRHZW5lcmF0b3JFbnRyaWVzKGdlbmVyYXRvcikge1xuICB2YXIgZ2VuZXJhdG9yUmVzdWx0ID0gZ2VuZXJhdG9yLm5leHQoKTtcbiAgdmFyIGFjY3VtdWxhdG9yID0gWyBnZW5lcmF0b3JSZXN1bHQudmFsdWUgXTtcbiAgd2hpbGUgKGdlbmVyYXRvclJlc3VsdC5kb25lID09PSBmYWxzZSkge1xuICAgIGdlbmVyYXRvclJlc3VsdCA9IGdlbmVyYXRvci5uZXh0KCk7XG4gICAgYWNjdW11bGF0b3IucHVzaChnZW5lcmF0b3JSZXN1bHQudmFsdWUpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuLyohXG4gKiBHZXRzIGFsbCBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIGtleXMgZnJvbSBhIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUga2V5cyBmcm9tIHRoZSB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIGdldEVudW1lcmFibGVLZXlzKHRhcmdldCkge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gdGFyZ2V0KSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5cbi8qIVxuICogRGV0ZXJtaW5lcyBpZiB0d28gb2JqZWN0cyBoYXZlIG1hdGNoaW5nIHZhbHVlcywgZ2l2ZW4gYSBzZXQgb2Yga2V5cy4gRGVmZXJzIHRvIGRlZXBFcXVhbCBmb3IgdGhlIGVxdWFsaXR5IGNoZWNrIG9mXG4gKiBlYWNoIGtleS4gSWYgYW55IHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgaXMgbm90IGVxdWFsLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgKGVhcmx5KS5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWl4ZWR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7QXJyYXl9IGtleXMgQW4gYXJyYXkgb2Yga2V5cyB0byBjb21wYXJlIHRoZSB2YWx1ZXMgb2YgbGVmdEhhbmRPcGVyYW5kIGFuZCByaWdodEhhbmRPcGVyYW5kIGFnYWluc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKE9wdGlvbmFsKVxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGtleXMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kW2tleXNbaV1dLCByaWdodEhhbmRPcGVyYW5kW2tleXNbaV1dLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qIVxuICogUmVjdXJzaXZlbHkgY2hlY2sgdGhlIGVxdWFsaXR5IG9mIHR3byBPYmplY3RzLiBPbmNlIGJhc2ljIHNhbWVuZXNzIGhhcyBiZWVuIGVzdGFibGlzaGVkIGl0IHdpbGwgZGVmZXIgdG8gYGRlZXBFcXVhbGBcbiAqIGZvciBlYWNoIGVudW1lcmFibGUga2V5IGluIHRoZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChPcHRpb25hbClcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5cbmZ1bmN0aW9uIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICB2YXIgbGVmdEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEtleXMgPSBnZXRFbnVtZXJhYmxlS2V5cyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggJiYgbGVmdEhhbmRLZXlzLmxlbmd0aCA9PT0gcmlnaHRIYW5kS2V5cy5sZW5ndGgpIHtcbiAgICBsZWZ0SGFuZEtleXMuc29ydCgpO1xuICAgIHJpZ2h0SGFuZEtleXMuc29ydCgpO1xuICAgIGlmIChpdGVyYWJsZUVxdWFsKGxlZnRIYW5kS2V5cywgcmlnaHRIYW5kS2V5cykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBrZXlzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBsZWZ0SGFuZEtleXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgdmFyIGxlZnRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhsZWZ0SGFuZE9wZXJhbmQpO1xuICB2YXIgcmlnaHRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kRW50cmllcy5sZW5ndGggJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gcmlnaHRIYW5kRW50cmllcy5sZW5ndGgpIHtcbiAgICBsZWZ0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJpZ2h0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kRW50cmllcywgcmlnaHRIYW5kRW50cmllcywgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAobGVmdEhhbmRLZXlzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgcmlnaHRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHJpZ2h0SGFuZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qIVxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIHByaW1pdGl2ZS5cbiAqXG4gKiBUaGlzIGludGVudGlvbmFsbHkgcmV0dXJucyB0cnVlIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNhbiBiZSBjb21wYXJlZCBieSByZWZlcmVuY2UsXG4gKiBpbmNsdWRpbmcgZnVuY3Rpb25zIGFuZCBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAqL1xuZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIENoYWkgLSBnZXRGdW5jTmFtZSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmdldEZ1bmNOYW1lKGNvbnN0cnVjdG9yRm4pXG4gKlxuICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uLlxuICogV2hlbiBhIG5vbi1mdW5jdGlvbiBpbnN0YW5jZSBpcyBwYXNzZWQsIHJldHVybnMgYG51bGxgLlxuICogVGhpcyBhbHNvIGluY2x1ZGVzIGEgcG9seWZpbGwgZnVuY3Rpb24gaWYgYGFGdW5jLm5hbWVgIGlzIG5vdCBkZWZpbmVkLlxuICpcbiAqIEBuYW1lIGdldEZ1bmNOYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG52YXIgdG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25OYW1lTWF0Y2ggPSAvXFxzKmZ1bmN0aW9uKD86XFxzfFxccypcXC9cXCpbXig/OipcXC8pXStcXCpcXC9cXHMqKSooW15cXHNcXChcXC9dKykvO1xuZnVuY3Rpb24gZ2V0RnVuY05hbWUoYUZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBhRnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG5hbWUgPSAnJztcbiAgaWYgKHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGUubmFtZSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFGdW5jLm5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gSGVyZSB3ZSBydW4gYSBwb2x5ZmlsbCBpZiBGdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgbmFtZWAgcHJvcGVydHkgYW5kIGlmIGFGdW5jLm5hbWUgaXMgbm90IGRlZmluZWRcbiAgICB2YXIgbWF0Y2ggPSB0b1N0cmluZy5jYWxsKGFGdW5jKS5tYXRjaChmdW5jdGlvbk5hbWVNYXRjaCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIHdlJ3ZlIGdvdCBhIGBuYW1lYCBwcm9wZXJ0eSB3ZSBqdXN0IHVzZSBpdFxuICAgIG5hbWUgPSBhRnVuYy5uYW1lO1xuICB9XG5cbiAgcmV0dXJuIG5hbWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RnVuY05hbWU7XG4iLCIvKiFcbiAqIENoYWkgLSBhZGRQcm9wZXJ0eSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIGNoYWkgPSByZXF1aXJlKCcuLi8uLi9jaGFpJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIGlzUHJveHlFbmFibGVkID0gcmVxdWlyZSgnLi9pc1Byb3h5RW5hYmxlZCcpO1xudmFyIHRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyoqXG4gKiAjIyMgLmFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKVxuICpcbiAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC5cbiAqXG4gKiAgICAgdXRpbHMuYWRkUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZm9vJywgZnVuY3Rpb24gKCkge1xuICogICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iaikudG8uYmUuaW5zdGFuY2VvZihGb28pO1xuICogICAgIH0pO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24uYWRkUHJvcGVydHkoJ2ZvbycsIGZuKTtcbiAqXG4gKiBUaGVuIGNhbiBiZSB1c2VkIGFzIGFueSBvdGhlciBhc3NlcnRpb24uXG4gKlxuICogICAgIGV4cGVjdChteUZvbykudG8uYmUuZm9vO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhZGRlZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgcHJvcGVydHkgdG8gYWRkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkUHJvcGVydHlcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICBnZXR0ZXIgPSBnZXR0ZXIgPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uICgpIHt9IDogZ2V0dGVyO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uIHByb3BlcnR5R2V0dGVyKCkge1xuICAgICAgICAvLyBTZXR0aW5nIHRoZSBgc3NmaWAgZmxhZyB0byBgcHJvcGVydHlHZXR0ZXJgIGNhdXNlcyB0aGlzIGZ1bmN0aW9uIHRvXG4gICAgICAgIC8vIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb20gdGhlXG4gICAgICAgIC8vIHN0YWNrIHRyYWNlIG9mIGEgZmFpbGVkIGFzc2VydGlvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZlxuICAgICAgICAvLyB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzbid0IHNldCBhbmQgcHJveHkgcHJvdGVjdGlvbiBpcyBkaXNhYmxlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgICAgIC8vIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXIgYXNzZXJ0aW9uLCBvciB0aGlzIGFzc2VydGlvbiBpcyBiZWluZyBpbnZva2VkXG4gICAgICAgIC8vIGZyb20gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGBzc2ZpYCBmbGFnXG4gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmRcbiAgICAgICAgLy8gY2FzZSwgdGhlIGBzc2ZpYCBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdXRlciBhc3NlcnRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHByb3h5IHByb3RlY3Rpb24gaXMgZW5hYmxlZCwgdGhlbiB0aGUgYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlblxuICAgICAgICAvLyBzZXQgYnkgdGhlIHByb3h5IGdldHRlci5cbiAgICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsICdsb2NrU3NmaScpKSB7XG4gICAgICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIHByb3BlcnR5R2V0dGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHQgPSBnZXR0ZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9XG4gICAgLCBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gYWRkTWV0aG9kIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgYWRkTGVuZ3RoR3VhcmQgPSByZXF1aXJlKCcuL2FkZExlbmd0aEd1YXJkJyk7XG52YXIgY2hhaSA9IHJlcXVpcmUoJy4uLy4uL2NoYWknKTtcbnZhciBmbGFnID0gcmVxdWlyZSgnLi9mbGFnJyk7XG52YXIgcHJveGlmeSA9IHJlcXVpcmUoJy4vcHJveGlmeScpO1xudmFyIHRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyoqXG4gKiAjIyMgLmFkZE1ldGhvZChjdHgsIG5hbWUsIG1ldGhvZClcbiAqXG4gKiBBZGRzIGEgbWV0aG9kIHRvIHRoZSBwcm90b3R5cGUgb2YgYW4gb2JqZWN0LlxuICpcbiAqICAgICB1dGlscy5hZGRNZXRob2QoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZm9vJywgZnVuY3Rpb24gKHN0cikge1xuICogICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iaikudG8uYmUuZXF1YWwoc3RyKTtcbiAqICAgICB9KTtcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZm9vJywgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KGZvb1N0cikudG8uYmUuZm9vKCdiYXInKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4IG9iamVjdCB0byB3aGljaCB0aGUgbWV0aG9kIGlzIGFkZGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiBtZXRob2QgdG8gYWRkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYWRkTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKSB7XG4gIHZhciBtZXRob2RXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFNldHRpbmcgdGhlIGBzc2ZpYCBmbGFnIHRvIGBtZXRob2RXcmFwcGVyYCBjYXVzZXMgdGhpcyBmdW5jdGlvbiB0byBiZSB0aGVcbiAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb20gdGhlIHN0YWNrIHRyYWNlIG9mXG4gICAgLy8gYSBmYWlsZWQgYXNzZXJ0aW9uLlxuICAgIC8vXG4gICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZiB0aGVcbiAgICAvLyBgbG9ja1NzZmlgIGZsYWcgaXNuJ3Qgc2V0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgLy8gb3ZlcndyaXR0ZW4gYnkgYW5vdGhlciBhc3NlcnRpb24sIG9yIHRoaXMgYXNzZXJ0aW9uIGlzIGJlaW5nIGludm9rZWQgZnJvbVxuICAgIC8vIGluc2lkZSBvZiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBgc3NmaWAgZmxhZyBoYXNcbiAgICAvLyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlXG4gICAgLy8gYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG91dGVyIGFzc2VydGlvbi5cbiAgICBpZiAoIWZsYWcodGhpcywgJ2xvY2tTc2ZpJykpIHtcbiAgICAgIGZsYWcodGhpcywgJ3NzZmknLCBtZXRob2RXcmFwcGVyKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgY2hhaS5Bc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfTtcblxuICBhZGRMZW5ndGhHdWFyZChtZXRob2RXcmFwcGVyLCBuYW1lLCBmYWxzZSk7XG4gIGN0eFtuYW1lXSA9IHByb3hpZnkobWV0aG9kV3JhcHBlciwgbmFtZSk7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlUHJvcGVydHkgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBpc1Byb3h5RW5hYmxlZCA9IHJlcXVpcmUoJy4vaXNQcm94eUVuYWJsZWQnKTtcbnZhciB0cmFuc2ZlckZsYWdzID0gcmVxdWlyZSgnLi90cmFuc2ZlckZsYWdzJyk7XG5cbi8qKlxuICogIyMjIC5vdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGZuKVxuICpcbiAqIE92ZXJ3aXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIHByb3BlcnR5IGdldHRlciBhbmQgcHJvdmlkZXNcbiAqIGFjY2VzcyB0byBwcmV2aW91cyB2YWx1ZS4gTXVzdCByZXR1cm4gZnVuY3Rpb24gdG8gdXNlIGFzIGdldHRlci5cbiAqXG4gKiAgICAgdXRpbHMub3ZlcndyaXRlUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnb2snLCBmdW5jdGlvbiAoX3N1cGVyKSB7XG4gKiAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICogICAgICAgICB2YXIgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gKiAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb28pIHtcbiAqICAgICAgICAgICBuZXcgY2hhaS5Bc3NlcnRpb24ob2JqLm5hbWUpLnRvLmVxdWFsKCdiYXInKTtcbiAqICAgICAgICAgfSBlbHNlIHtcbiAqICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAqICAgICAgICAgfVxuICogICAgICAgfVxuICogICAgIH0pO1xuICpcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZVByb3BlcnR5KCdmb28nLCBmbik7XG4gKlxuICogVGhlbiBjYW4gYmUgdXNlZCBhcyBhbnkgb3RoZXIgYXNzZXJ0aW9uLlxuICpcbiAqICAgICBleHBlY3QobXlGb28pLnRvLmJlLm9rO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiBwcm9wZXJ0eSB0byBvdmVyd3JpdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBnZXR0ZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlUHJvcGVydHlcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICB2YXIgX2dldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBuYW1lKVxuICAgICwgX3N1cGVyID0gZnVuY3Rpb24gKCkge307XG5cbiAgaWYgKF9nZXQgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIF9nZXQuZ2V0KVxuICAgIF9zdXBlciA9IF9nZXQuZ2V0XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgbmFtZSxcbiAgICB7IGdldDogZnVuY3Rpb24gb3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlcigpIHtcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgYHNzZmlgIGZsYWcgdG8gYG92ZXJ3cml0aW5nUHJvcGVydHlHZXR0ZXJgIGNhdXNlcyB0aGlzXG4gICAgICAgIC8vIGZ1bmN0aW9uIHRvIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzXG4gICAgICAgIC8vIGZyb20gdGhlIHN0YWNrIHRyYWNlIG9mIGEgZmFpbGVkIGFzc2VydGlvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZlxuICAgICAgICAvLyB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzbid0IHNldCBhbmQgcHJveHkgcHJvdGVjdGlvbiBpcyBkaXNhYmxlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgICAgIC8vIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXIgYXNzZXJ0aW9uLCBvciB0aGlzIGFzc2VydGlvbiBpcyBiZWluZyBpbnZva2VkXG4gICAgICAgIC8vIGZyb20gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGBzc2ZpYCBmbGFnXG4gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmRcbiAgICAgICAgLy8gY2FzZSwgdGhlIGBzc2ZpYCBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdXRlciBhc3NlcnRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHByb3h5IHByb3RlY3Rpb24gaXMgZW5hYmxlZCwgdGhlbiB0aGUgYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlblxuICAgICAgICAvLyBzZXQgYnkgdGhlIHByb3h5IGdldHRlci5cbiAgICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsICdsb2NrU3NmaScpKSB7XG4gICAgICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIG92ZXJ3cml0aW5nUHJvcGVydHlHZXR0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0dGluZyB0aGUgYGxvY2tTc2ZpYCBmbGFnIHRvIGB0cnVlYCBwcmV2ZW50cyB0aGUgb3ZlcndyaXR0ZW5cbiAgICAgICAgLy8gYXNzZXJ0aW9uIGZyb20gY2hhbmdpbmcgdGhlIGBzc2ZpYCBmbGFnLiBCeSB0aGlzIHBvaW50LCB0aGUgYHNzZmlgXG4gICAgICAgIC8vIGZsYWcgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIGNvcnJlY3Qgc3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMgYXNzZXJ0aW9uLlxuICAgICAgICB2YXIgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCAnbG9ja1NzZmknKTtcbiAgICAgICAgZmxhZyh0aGlzLCAnbG9ja1NzZmknLCB0cnVlKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGdldHRlcihfc3VwZXIpLmNhbGwodGhpcyk7XG4gICAgICAgIGZsYWcodGhpcywgJ2xvY2tTc2ZpJywgb3JpZ0xvY2tTc2ZpKTtcblxuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9XG4gICAgLCBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlTWV0aG9kIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgYWRkTGVuZ3RoR3VhcmQgPSByZXF1aXJlKCcuL2FkZExlbmd0aEd1YXJkJyk7XG52YXIgY2hhaSA9IHJlcXVpcmUoJy4uLy4uL2NoYWknKTtcbnZhciBmbGFnID0gcmVxdWlyZSgnLi9mbGFnJyk7XG52YXIgcHJveGlmeSA9IHJlcXVpcmUoJy4vcHJveGlmeScpO1xudmFyIHRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyoqXG4gKiAjIyMgLm92ZXJ3cml0ZU1ldGhvZChjdHgsIG5hbWUsIGZuKVxuICpcbiAqIE92ZXJ3aXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIG1ldGhvZCBhbmQgcHJvdmlkZXNcbiAqIGFjY2VzcyB0byBwcmV2aW91cyBmdW5jdGlvbi4gTXVzdCByZXR1cm4gZnVuY3Rpb25cbiAqIHRvIGJlIHVzZWQgZm9yIG5hbWUuXG4gKlxuICogICAgIHV0aWxzLm92ZXJ3cml0ZU1ldGhvZChjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUsICdlcXVhbCcsIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3RyKSB7XG4gKiAgICAgICAgIHZhciBvYmogPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKTtcbiAqICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvbykge1xuICogICAgICAgICAgIG5ldyBjaGFpLkFzc2VydGlvbihvYmoudmFsdWUpLnRvLmVxdWFsKHN0cik7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZU1ldGhvZCgnZm9vJywgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5lcXVhbCgnYmFyJyk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN0eCBvYmplY3Qgd2hvc2UgbWV0aG9kIGlzIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiBtZXRob2QgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKSB7XG4gIHZhciBfbWV0aG9kID0gY3R4W25hbWVdXG4gICAgLCBfc3VwZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9O1xuXG4gIGlmIChfbWV0aG9kICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBfbWV0aG9kKVxuICAgIF9zdXBlciA9IF9tZXRob2Q7XG5cbiAgdmFyIG92ZXJ3cml0aW5nTWV0aG9kV3JhcHBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTZXR0aW5nIHRoZSBgc3NmaWAgZmxhZyB0byBgb3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyYCBjYXVzZXMgdGhpc1xuICAgIC8vIGZ1bmN0aW9uIHRvIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb21cbiAgICAvLyB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLlxuICAgIC8vXG4gICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZiB0aGVcbiAgICAvLyBgbG9ja1NzZmlgIGZsYWcgaXNuJ3Qgc2V0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgLy8gb3ZlcndyaXR0ZW4gYnkgYW5vdGhlciBhc3NlcnRpb24sIG9yIHRoaXMgYXNzZXJ0aW9uIGlzIGJlaW5nIGludm9rZWQgZnJvbVxuICAgIC8vIGluc2lkZSBvZiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBgc3NmaWAgZmxhZyBoYXNcbiAgICAvLyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlXG4gICAgLy8gYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG91dGVyIGFzc2VydGlvbi5cbiAgICBpZiAoIWZsYWcodGhpcywgJ2xvY2tTc2ZpJykpIHtcbiAgICAgIGZsYWcodGhpcywgJ3NzZmknLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cblxuICAgIC8vIFNldHRpbmcgdGhlIGBsb2NrU3NmaWAgZmxhZyB0byBgdHJ1ZWAgcHJldmVudHMgdGhlIG92ZXJ3cml0dGVuIGFzc2VydGlvblxuICAgIC8vIGZyb20gY2hhbmdpbmcgdGhlIGBzc2ZpYCBmbGFnLiBCeSB0aGlzIHBvaW50LCB0aGUgYHNzZmlgIGZsYWcgaXMgYWxyZWFkeVxuICAgIC8vIHNldCB0byB0aGUgY29ycmVjdCBzdGFydGluZyBwb2ludCBmb3IgdGhpcyBhc3NlcnRpb24uXG4gICAgdmFyIG9yaWdMb2NrU3NmaSA9IGZsYWcodGhpcywgJ2xvY2tTc2ZpJyk7XG4gICAgZmxhZyh0aGlzLCAnbG9ja1NzZmknLCB0cnVlKTtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIG9yaWdMb2NrU3NmaSk7XG5cbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9XG5cbiAgYWRkTGVuZ3RoR3VhcmQob3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyLCBuYW1lLCBmYWxzZSk7XG4gIGN0eFtuYW1lXSA9IHByb3hpZnkob3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyLCBuYW1lKTtcbn07XG4iLCIvKiFcbiAqIENoYWkgLSBhZGRDaGFpbmluZ01ldGhvZCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGFkZExlbmd0aEd1YXJkID0gcmVxdWlyZSgnLi9hZGRMZW5ndGhHdWFyZCcpO1xudmFyIGNoYWkgPSByZXF1aXJlKCcuLi8uLi9jaGFpJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIHByb3hpZnkgPSByZXF1aXJlKCcuL3Byb3hpZnknKTtcbnZhciB0cmFuc2ZlckZsYWdzID0gcmVxdWlyZSgnLi90cmFuc2ZlckZsYWdzJyk7XG5cbi8qIVxuICogTW9kdWxlIHZhcmlhYmxlc1xuICovXG5cbi8vIENoZWNrIHdoZXRoZXIgYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgaXMgc3VwcG9ydGVkXG52YXIgY2FuU2V0UHJvdG90eXBlID0gdHlwZW9mIE9iamVjdC5zZXRQcm90b3R5cGVPZiA9PT0gJ2Z1bmN0aW9uJztcblxuLy8gV2l0aG91dCBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBzdXBwb3J0LCB0aGlzIG1vZHVsZSB3aWxsIG5lZWQgdG8gYWRkIHByb3BlcnRpZXMgdG8gYSBmdW5jdGlvbi5cbi8vIEhvd2V2ZXIsIHNvbWUgb2YgZnVuY3Rpb25zJyBvd24gcHJvcHMgYXJlIG5vdCBjb25maWd1cmFibGUgYW5kIHNob3VsZCBiZSBza2lwcGVkLlxudmFyIHRlc3RGbiA9IGZ1bmN0aW9uKCkge307XG52YXIgZXhjbHVkZU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdEZuKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRlc3RGbiwgbmFtZSk7XG5cbiAgLy8gTm90ZTogUGhhbnRvbUpTIDEueCBpbmNsdWRlcyBgY2FsbGVlYCBhcyBvbmUgb2YgYHRlc3RGbmAncyBvd24gcHJvcGVydGllcyxcbiAgLy8gYnV0IHRoZW4gcmV0dXJucyBgdW5kZWZpbmVkYCBhcyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYGNhbGxlZWAuIEFzIGFcbiAgLy8gd29ya2Fyb3VuZCwgd2UgcGVyZm9ybSBhbiBvdGhlcndpc2UgdW5uZWNlc3NhcnkgdHlwZS1jaGVjayBmb3IgYHByb3BEZXNjYCxcbiAgLy8gYW5kIHRoZW4gZmlsdGVyIGl0IG91dCBpZiBpdCdzIG5vdCBhbiBvYmplY3QgYXMgaXQgc2hvdWxkIGJlLlxuICBpZiAodHlwZW9mIHByb3BEZXNjICE9PSAnb2JqZWN0JylcbiAgICByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gIXByb3BEZXNjLmNvbmZpZ3VyYWJsZTtcbn0pO1xuXG4vLyBDYWNoZSBgRnVuY3Rpb25gIHByb3BlcnRpZXNcbnZhciBjYWxsICA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLFxuICAgIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vKipcbiAqICMjIyAuYWRkQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKVxuICpcbiAqIEFkZHMgYSBtZXRob2QgdG8gYW4gb2JqZWN0LCBzdWNoIHRoYXQgdGhlIG1ldGhvZCBjYW4gYWxzbyBiZSBjaGFpbmVkLlxuICpcbiAqICAgICB1dGlscy5hZGRDaGFpbmFibGVNZXRob2QoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZm9vJywgZnVuY3Rpb24gKHN0cikge1xuICogICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iaikudG8uYmUuZXF1YWwoc3RyKTtcbiAqICAgICB9KTtcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnZm9vJywgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICpcbiAqIFRoZSByZXN1bHQgY2FuIHRoZW4gYmUgdXNlZCBhcyBib3RoIGEgbWV0aG9kIGFzc2VydGlvbiwgZXhlY3V0aW5nIGJvdGggYG1ldGhvZGAgYW5kXG4gKiBgY2hhaW5pbmdCZWhhdmlvcmAsIG9yIGFzIGEgbGFuZ3VhZ2UgY2hhaW4sIHdoaWNoIG9ubHkgZXhlY3V0ZXMgYGNoYWluaW5nQmVoYXZpb3JgLlxuICpcbiAqICAgICBleHBlY3QoZm9vU3RyKS50by5iZS5mb28oJ2JhcicpO1xuICogICAgIGV4cGVjdChmb29TdHIpLnRvLmJlLmZvby5lcXVhbCgnZm9vJyk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN0eCBvYmplY3QgdG8gd2hpY2ggdGhlIG1ldGhvZCBpcyBhZGRlZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgbWV0aG9kIHRvIGFkZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGBuYW1lYCwgd2hlbiBjYWxsZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNoYWluaW5nQmVoYXZpb3IgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIHByb3BlcnR5IGlzIGFjY2Vzc2VkXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBhZGRDaGFpbmFibGVNZXRob2RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgaWYgKHR5cGVvZiBjaGFpbmluZ0JlaGF2aW9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hhaW5pbmdCZWhhdmlvciA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgfVxuXG4gIHZhciBjaGFpbmFibGVCZWhhdmlvciA9IHtcbiAgICAgIG1ldGhvZDogbWV0aG9kXG4gICAgLCBjaGFpbmluZ0JlaGF2aW9yOiBjaGFpbmluZ0JlaGF2aW9yXG4gIH07XG5cbiAgLy8gc2F2ZSB0aGUgbWV0aG9kcyBzbyB3ZSBjYW4gb3ZlcndyaXRlIHRoZW0gbGF0ZXIsIGlmIHdlIG5lZWQgdG8uXG4gIGlmICghY3R4Ll9fbWV0aG9kcykge1xuICAgIGN0eC5fX21ldGhvZHMgPSB7fTtcbiAgfVxuICBjdHguX19tZXRob2RzW25hbWVdID0gY2hhaW5hYmxlQmVoYXZpb3I7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgbmFtZSxcbiAgICB7IGdldDogZnVuY3Rpb24gY2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgICAgICBjaGFpbmFibGVCZWhhdmlvci5jaGFpbmluZ0JlaGF2aW9yLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgYHNzZmlgIGZsYWcgdG8gYGNoYWluYWJsZU1ldGhvZFdyYXBwZXJgIGNhdXNlcyB0aGlzXG4gICAgICAgICAgLy8gZnVuY3Rpb24gdG8gYmUgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciByZW1vdmluZyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgIC8vIGZyYW1lcyBmcm9tIHRoZSBzdGFjayB0cmFjZSBvZiBhIGZhaWxlZCBhc3NlcnRpb24uXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGlmXG4gICAgICAgICAgLy8gdGhlIGBsb2NrU3NmaWAgZmxhZyBpc24ndCBzZXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJZiB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzIHNldCwgdGhlbiB0aGlzIGFzc2VydGlvbiBpcyBiZWluZ1xuICAgICAgICAgIC8vIGludm9rZWQgZnJvbSBpbnNpZGUgb2YgYW5vdGhlciBhc3NlcnRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGBzc2ZpYFxuICAgICAgICAgIC8vIGZsYWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG91dGVyIGFzc2VydGlvbi5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIE5vdGUgdGhhdCBvdmVyd3JpdGluZyBhIGNoYWluYWJsZSBtZXRob2QgbWVyZWx5IHJlcGxhY2VzIHRoZSBzYXZlZFxuICAgICAgICAgIC8vIG1ldGhvZHMgaW4gYGN0eC5fX21ldGhvZHNgIGluc3RlYWQgb2YgY29tcGxldGVseSByZXBsYWNpbmcgdGhlXG4gICAgICAgICAgLy8gb3ZlcndyaXR0ZW4gYXNzZXJ0aW9uLiBUaGVyZWZvcmUsIGFuIG92ZXJ3cml0aW5nIGFzc2VydGlvbiB3b24ndFxuICAgICAgICAgIC8vIHNldCB0aGUgYHNzZmlgIG9yIGBsb2NrU3NmaWAgZmxhZ3MuXG4gICAgICAgICAgaWYgKCFmbGFnKHRoaXMsICdsb2NrU3NmaScpKSB7XG4gICAgICAgICAgICBmbGFnKHRoaXMsICdzc2ZpJywgY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IGNoYWkuQXNzZXJ0aW9uKCk7XG4gICAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICAgIH07XG5cbiAgICAgICAgYWRkTGVuZ3RoR3VhcmQoY2hhaW5hYmxlTWV0aG9kV3JhcHBlciwgbmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gVXNlIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoY2FuU2V0UHJvdG90eXBlKSB7XG4gICAgICAgICAgLy8gSW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBvYmplY3QgYnkgcmVwbGFjaW5nIHRoZSBgRnVuY3Rpb25gIHByb3RvdHlwZVxuICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGBjYWxsYCBhbmQgYGFwcGx5YCBtZXRob2RzIGZyb20gYEZ1bmN0aW9uYFxuICAgICAgICAgIHByb3RvdHlwZS5jYWxsID0gY2FsbDtcbiAgICAgICAgICBwcm90b3R5cGUuYXBwbHkgPSBhcHBseTtcbiAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhaW5hYmxlTWV0aG9kV3JhcHBlciwgcHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHJlZGVmaW5lIGFsbCBwcm9wZXJ0aWVzIChzbG93ISlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGFzc2VydGVyTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdHgpO1xuICAgICAgICAgIGFzc2VydGVyTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoYXNzZXJ0ZXJOYW1lKSB7XG4gICAgICAgICAgICBpZiAoZXhjbHVkZU5hbWVzLmluZGV4T2YoYXNzZXJ0ZXJOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN0eCwgYXNzZXJ0ZXJOYW1lKTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBhc3NlcnRlck5hbWUsIHBkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgICAgIHJldHVybiBwcm94aWZ5KGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgfVxuICAgICwgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufTtcbiIsIi8qIVxuICogQ2hhaSAtIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIGNoYWkgPSByZXF1aXJlKCcuLi8uLi9jaGFpJyk7XG52YXIgdHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKipcbiAqICMjIyAub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKVxuICpcbiAqIE92ZXJ3aXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIGNoYWluYWJsZSBtZXRob2RcbiAqIGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHByZXZpb3VzIGZ1bmN0aW9uIG9yXG4gKiBwcm9wZXJ0eS4gIE11c3QgcmV0dXJuIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGZvclxuICogbmFtZS5cbiAqXG4gKiAgICAgdXRpbHMub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2xlbmd0aE9mJyxcbiAqICAgICAgIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIH1cbiAqICAgICAsIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIH1cbiAqICAgICApO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKCdmb28nLCBmbiwgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICogICAgIGV4cGVjdChteUZvbykudG8uaGF2ZS5sZW5ndGhPZi5hYm92ZSgzKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4IG9iamVjdCB3aG9zZSBtZXRob2QgLyBwcm9wZXJ0eSBpcyB0byBiZSBvdmVyd3JpdHRlblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgbWV0aG9kIC8gcHJvcGVydHkgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBwcm9wZXJ0eVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gIHZhciBjaGFpbmFibGVCZWhhdmlvciA9IGN0eC5fX21ldGhvZHNbbmFtZV07XG5cbiAgdmFyIF9jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvcjtcbiAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvciA9IGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgIHZhciByZXN1bHQgPSBjaGFpbmluZ0JlaGF2aW9yKF9jaGFpbmluZ0JlaGF2aW9yKS5jYWxsKHRoaXMpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IGNoYWkuQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH07XG5cbiAgdmFyIF9tZXRob2QgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2Q7XG4gIGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZCA9IGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kV3JhcHBlcigpIHtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9tZXRob2QpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgY2hhaS5Bc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfTtcbn07XG4iLCIvKiFcbiAqIENoYWkgLSBjb21wYXJlQnlJbnNwZWN0IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTYgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKiFcbiAqIE1vZHVsZSBkZXBlbmRhbmNpZXNcbiAqL1xuXG52YXIgaW5zcGVjdCA9IHJlcXVpcmUoJy4vaW5zcGVjdCcpO1xuXG4vKipcbiAqICMjIyAuY29tcGFyZUJ5SW5zcGVjdChtaXhlZCwgbWl4ZWQpXG4gKlxuICogVG8gYmUgdXNlZCBhcyBhIGNvbXBhcmVGdW5jdGlvbiB3aXRoIEFycmF5LnByb3RvdHlwZS5zb3J0LiBDb21wYXJlcyBlbGVtZW50c1xuICogdXNpbmcgaW5zcGVjdCBpbnN0ZWFkIG9mIGRlZmF1bHQgYmVoYXZpb3Igb2YgdXNpbmcgdG9TdHJpbmcgc28gdGhhdCBTeW1ib2xzXG4gKiBhbmQgb2JqZWN0cyB3aXRoIGlycmVndWxhci9taXNzaW5nIHRvU3RyaW5nIGNhbiBzdGlsbCBiZSBzb3J0ZWQgd2l0aG91dCBhXG4gKiBUeXBlRXJyb3IuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gZmlyc3QgZWxlbWVudCB0byBjb21wYXJlXG4gKiBAcGFyYW0ge01peGVkfSBzZWNvbmQgZWxlbWVudCB0byBjb21wYXJlXG4gKiBAcmV0dXJucyB7TnVtYmVyfSAtMSBpZiAnYScgc2hvdWxkIGNvbWUgYmVmb3JlICdiJzsgb3RoZXJ3aXNlIDEgXG4gKiBAbmFtZSBjb21wYXJlQnlJbnNwZWN0XG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tcGFyZUJ5SW5zcGVjdChhLCBiKSB7XG4gIHJldHVybiBpbnNwZWN0KGEpIDwgaW5zcGVjdChiKSA/IC0xIDogMTtcbn07XG4iLCIvKiFcbiAqIENoYWkgLSBnZXRPd25FbnVtZXJhYmxlUHJvcGVydHlTeW1ib2xzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTYgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmplY3QpXG4gKlxuICogVGhpcyBhbGxvd3MgdGhlIHJldHJpZXZhbCBvZiBkaXJlY3RseS1vd25lZCBlbnVtZXJhYmxlIHByb3BlcnR5IHN5bWJvbHMgb2YgYW5cbiAqIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzXG4gKiByZXR1cm5zIGJvdGggZW51bWVyYWJsZSBhbmQgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBnZXRPd25FbnVtZXJhYmxlUHJvcGVydHlTeW1ib2xzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopIHtcbiAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKS5lbnVtZXJhYmxlO1xuICB9KTtcbn07XG4iLCIvKiFcbiAqIENoYWkgLSBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kYW5jaWVzXG4gKi9cblxudmFyIGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMgPSByZXF1aXJlKCcuL2dldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMnKTtcblxuLyoqXG4gKiAjIyMgLmdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iamVjdClcbiAqXG4gKiBUaGlzIGFsbG93cyB0aGUgcmV0cmlldmFsIG9mIGRpcmVjdGx5LW93bmVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGFuIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBPYmplY3Qua2V5cyBvbmx5XG4gKiByZXR1cm5zIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMsIG5vdCBlbnVtZXJhYmxlIHByb3BlcnR5IHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHJldHVybnMge0FycmF5fVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikuY29uY2F0KGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMob2JqKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiAhXG4gKiBDaGFpIC0gY2hlY2tFcnJvciB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmNoZWNrRXJyb3JcbiAqXG4gKiBDaGVja3MgdGhhdCBhbiBlcnJvciBjb25mb3JtcyB0byBhIGdpdmVuIHNldCBvZiBjcml0ZXJpYSBhbmQvb3IgcmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IGl0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuLyoqXG4gKiAjIyMgLmNvbXBhdGlibGVJbnN0YW5jZSh0aHJvd24sIGVycm9yTGlrZSlcbiAqXG4gKiBDaGVja3MgaWYgdHdvIGluc3RhbmNlcyBhcmUgY29tcGF0aWJsZSAoc3RyaWN0IGVxdWFsKS5cbiAqIFJldHVybnMgZmFsc2UgaWYgZXJyb3JMaWtlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBFcnJvciwgYmVjYXVzZSBpbnN0YW5jZXNcbiAqIGNhbiBvbmx5IGJlIGNvbXBhdGlibGUgaWYgdGhleSdyZSBib3RoIGVycm9yIGluc3RhbmNlcy5cbiAqXG4gKiBAbmFtZSBjb21wYXRpYmxlSW5zdGFuY2VcbiAqIEBwYXJhbSB7RXJyb3J9IHRocm93biBlcnJvclxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2Ugb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuXG4vKipcbiAqICMjIyAuY29tcGF0aWJsZUNvbnN0cnVjdG9yKHRocm93biwgZXJyb3JMaWtlKVxuICpcbiAqIENoZWNrcyBpZiB0d28gY29uc3RydWN0b3JzIGFyZSBjb21wYXRpYmxlLlxuICogVGhpcyBmdW5jdGlvbiBjYW4gcmVjZWl2ZSBlaXRoZXIgYW4gZXJyb3IgY29uc3RydWN0b3Igb3JcbiAqIGFuIGVycm9yIGluc3RhbmNlIGFzIHRoZSBgZXJyb3JMaWtlYCBhcmd1bWVudC5cbiAqIENvbnN0cnVjdG9ycyBhcmUgY29tcGF0aWJsZSBpZiB0aGV5J3JlIHRoZSBzYW1lIG9yIGlmIG9uZSBpc1xuICogYW4gaW5zdGFuY2Ugb2YgYW5vdGhlci5cbiAqXG4gKiBAbmFtZSBjb21wYXRpYmxlQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXJyb3J9IHRocm93biBlcnJvclxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2Ugb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgLy8gSWYgYGVycm9yTGlrZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYW55IGVycm9yIHdlIGNvbXBhcmUgdGhlaXIgY29uc3RydWN0b3JzXG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmIChlcnJvckxpa2UucHJvdG90eXBlIGluc3RhbmNlb2YgRXJyb3IgfHwgZXJyb3JMaWtlID09PSBFcnJvcikge1xuICAgIC8vIElmIGBlcnJvckxpa2VgIGlzIGEgY29uc3RydWN0b3IgdGhhdCBpbmhlcml0cyBmcm9tIEVycm9yLCB3ZSBjb21wYXJlIGB0aHJvd25gIHRvIGBlcnJvckxpa2VgIGRpcmVjdGx5XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiAjIyMgLmNvbXBhdGlibGVNZXNzYWdlKHRocm93biwgZXJyTWF0Y2hlcilcbiAqXG4gKiBDaGVja3MgaWYgYW4gZXJyb3IncyBtZXNzYWdlIGlzIGNvbXBhdGlibGUgd2l0aCBhIG1hdGNoZXIgKFN0cmluZyBvciBSZWdFeHApLlxuICogSWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIFN0cmluZyBvciBwYXNzZXMgdGhlIFJlZ0V4cCB0ZXN0LFxuICogaXQgaXMgY29uc2lkZXJlZCBjb21wYXRpYmxlLlxuICpcbiAqIEBuYW1lIGNvbXBhdGlibGVNZXNzYWdlXG4gKiBAcGFyYW0ge0Vycm9yfSB0aHJvd24gZXJyb3JcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gZXJyTWF0Y2hlciB0byBsb29rIGZvciBpbnRvIHRoZSBtZXNzYWdlXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNvbXBhdGlibGVNZXNzYWdlKHRocm93biwgZXJyTWF0Y2hlcikge1xuICB2YXIgY29tcGFyaXNvblN0cmluZyA9IHR5cGVvZiB0aHJvd24gPT09ICdzdHJpbmcnID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChlcnJNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIGVyck1hdGNoZXIudGVzdChjb21wYXJpc29uU3RyaW5nKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyTWF0Y2hlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogIyMjIC5nZXRGdW5jdGlvbk5hbWUoY29uc3RydWN0b3JGbilcbiAqXG4gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24uXG4gKiBUaGlzIGFsc28gaW5jbHVkZXMgYSBwb2x5ZmlsbCBmdW5jdGlvbiBpZiBgY29uc3RydWN0b3JGbi5uYW1lYCBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAbmFtZSBnZXRGdW5jdGlvbk5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yRm5cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciBmdW5jdGlvbk5hbWVNYXRjaCA9IC9cXHMqZnVuY3Rpb24oPzpcXHN8XFxzKlxcL1xcKlteKD86KlxcLyldK1xcKlxcL1xccyopKihbXlxcKFxcL10rKS87XG5mdW5jdGlvbiBnZXRGdW5jdGlvbk5hbWUoY29uc3RydWN0b3JGbikge1xuICB2YXIgbmFtZSA9ICcnO1xuICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yRm4ubmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBIZXJlIHdlIHJ1biBhIHBvbHlmaWxsIGlmIGNvbnN0cnVjdG9yRm4ubmFtZSBpcyBub3QgZGVmaW5lZFxuICAgIHZhciBtYXRjaCA9IFN0cmluZyhjb25zdHJ1Y3RvckZuKS5tYXRjaChmdW5jdGlvbk5hbWVNYXRjaCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5hbWUgPSBjb25zdHJ1Y3RvckZuLm5hbWU7XG4gIH1cblxuICByZXR1cm4gbmFtZTtcbn1cblxuLyoqXG4gKiAjIyMgLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpXG4gKlxuICogR2V0cyB0aGUgY29uc3RydWN0b3IgbmFtZSBmb3IgYW4gRXJyb3IgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IgaXRzZWxmLlxuICpcbiAqIEBuYW1lIGdldENvbnN0cnVjdG9yTmFtZVxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2VcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkge1xuICB2YXIgY29uc3RydWN0b3JOYW1lID0gZXJyb3JMaWtlO1xuICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBjb25zdHJ1Y3Rvck5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZXJyb3JMaWtlLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgYGVycmAgaXMgbm90IGFuIGluc3RhbmNlIG9mIEVycm9yIGl0IGlzIGFuIGVycm9yIGNvbnN0cnVjdG9yIGl0c2VsZiBvciBhbm90aGVyIGZ1bmN0aW9uLlxuICAgIC8vIElmIHdlJ3ZlIGdvdCBhIGNvbW1vbiBmdW5jdGlvbiB3ZSBnZXQgaXRzIG5hbWUsIG90aGVyd2lzZSB3ZSBtYXkgbmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2VcbiAgICAvLyBvZiB0aGUgZXJyb3IganVzdCBpbiBjYXNlIGl0J3MgYSBwb29ybHktY29uc3RydWN0ZWQgZXJyb3IuIFBsZWFzZSBzZWUgY2hhaWpzL2NoYWkvaXNzdWVzLzQ1IHRvIGtub3cgbW9yZS5cbiAgICBjb25zdHJ1Y3Rvck5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZXJyb3JMaWtlKS50cmltKCkgfHxcbiAgICAgICAgZ2V0RnVuY3Rpb25OYW1lKG5ldyBlcnJvckxpa2UoKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cblxuLyoqXG4gKiAjIyMgLmdldE1lc3NhZ2UoZXJyb3JMaWtlKVxuICpcbiAqIEdldHMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSBhbiBlcnJvci5cbiAqIElmIGBlcnJgIGlzIGEgU3RyaW5nIGl0c2VsZiwgd2UgcmV0dXJuIGl0LlxuICogSWYgdGhlIGVycm9yIGhhcyBubyBtZXNzYWdlLCB3ZSByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLlxuICpcbiAqIEBuYW1lIGdldE1lc3NhZ2VcbiAqIEBwYXJhbSB7RXJyb3J8U3RyaW5nfSBlcnJvckxpa2VcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgdmFyIG1zZyA9ICcnO1xuICBpZiAoZXJyb3JMaWtlICYmIGVycm9yTGlrZS5tZXNzYWdlKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yTGlrZSA9PT0gJ3N0cmluZycpIHtcbiAgICBtc2cgPSBlcnJvckxpa2U7XG4gIH1cblxuICByZXR1cm4gbXNnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGF0aWJsZUluc3RhbmNlOiBjb21wYXRpYmxlSW5zdGFuY2UsXG4gIGNvbXBhdGlibGVDb25zdHJ1Y3RvcjogY29tcGF0aWJsZUNvbnN0cnVjdG9yLFxuICBjb21wYXRpYmxlTWVzc2FnZTogY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldE1lc3NhZ2U6IGdldE1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogZ2V0Q29uc3RydWN0b3JOYW1lLFxufTtcbiIsInZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcbnZhciBmbGFnID0gcmVxdWlyZSgnLi9mbGFnJyk7XG52YXIgZ2V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4vZ2V0UHJvcGVydGllcycpO1xudmFyIGlzUHJveHlFbmFibGVkID0gcmVxdWlyZSgnLi9pc1Byb3h5RW5hYmxlZCcpO1xuXG4vKiFcbiAqIENoYWkgLSBwcm94aWZ5IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAucHJveGlmeShvYmplY3QpXG4gKlxuICogUmV0dXJuIGEgcHJveHkgb2YgZ2l2ZW4gb2JqZWN0IHRoYXQgdGhyb3dzIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnRcbiAqIHByb3BlcnR5IGlzIHJlYWQuIEJ5IGRlZmF1bHQsIHRoZSByb290IGNhdXNlIGlzIGFzc3VtZWQgdG8gYmUgYSBtaXNzcGVsbGVkXG4gKiBwcm9wZXJ0eSwgYW5kIHRodXMgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIG9mZmVyIGEgcmVhc29uYWJsZSBzdWdnZXN0aW9uIGZyb21cbiAqIHRoZSBsaXN0IG9mIGV4aXN0aW5nIHByb3BlcnRpZXMuIEhvd2V2ZXIsIGlmIGEgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSBpc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIHJvb3QgY2F1c2UgaXMgaW5zdGVhZCBhIGZhaWx1cmUgdG8gaW52b2tlIGEgbm9uLWNoYWluYWJsZVxuICogbWV0aG9kIHByaW9yIHRvIHJlYWRpbmcgdGhlIG5vbi1leGlzdGVudCBwcm9wZXJ0eS5cbiAqIFxuICogSWYgcHJveGllcyBhcmUgdW5zdXBwb3J0ZWQgb3IgZGlzYWJsZWQgdmlhIHRoZSB1c2VyJ3MgQ2hhaSBjb25maWcsIHRoZW5cbiAqIHJldHVybiBvYmplY3Qgd2l0aG91dCBtb2RpZmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IG5vbkNoYWluYWJsZU1ldGhvZE5hbWVcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIHByb3hpZnlcbiAqL1xuXG52YXIgYnVpbHRpbnMgPSBbJ19fZmxhZ3MnLCAnX19tZXRob2RzJywgJ19vYmonLCAnYXNzZXJ0J107XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHJveGlmeShvYmosIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUpIHtcbiAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpKSByZXR1cm4gb2JqO1xuXG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBwcm94eUdldHRlcih0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIGlzIGhlcmUgYmVjYXVzZSB3ZSBzaG91bGQgbm90IHRocm93IGVycm9ycyBvbiBTeW1ib2wgcHJvcGVydGllc1xuICAgICAgLy8gc3VjaCBhcyBgU3ltYm9sLnRvU3RyaW5nVGFnYC5cbiAgICAgIC8vIFRoZSB2YWx1ZXMgZm9yIHdoaWNoIGFuIGVycm9yIHNob3VsZCBiZSB0aHJvd24gY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmdcbiAgICAgIC8vIHRoZSBgY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzYCBzZXR0aW5nLlxuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmXG4gICAgICAgICAgIVJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHkpKSB7XG4gICAgICAgIC8vIFNwZWNpYWwgbWVzc2FnZSBmb3IgaW52YWxpZCBwcm9wZXJ0eSBhY2Nlc3Mgb2Ygbm9uLWNoYWluYWJsZSBtZXRob2RzLlxuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIENoYWkgcHJvcGVydHk6ICcgKyBub25DaGFpbmFibGVNZXRob2ROYW1lICsgJy4nICtcbiAgICAgICAgICAgIHByb3BlcnR5ICsgJy4gU2VlIGRvY3MgZm9yIHByb3BlciB1c2FnZSBvZiBcIicgK1xuICAgICAgICAgICAgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSArICdcIi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcmRlcmVkUHJvcGVydGllcyA9IGdldFByb3BlcnRpZXModGFyZ2V0KS5maWx0ZXIoZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgICByZXR1cm4gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmXG4gICAgICAgICAgICBidWlsdGlucy5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTE7XG4gICAgICAgIH0pLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHJldHVybiBzdHJpbmdEaXN0YW5jZShwcm9wZXJ0eSwgYSkgLSBzdHJpbmdEaXN0YW5jZShwcm9wZXJ0eSwgYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvcmRlcmVkUHJvcGVydGllcy5sZW5ndGggJiZcbiAgICAgICAgICAgIHN0cmluZ0Rpc3RhbmNlKG9yZGVyZWRQcm9wZXJ0aWVzWzBdLCBwcm9wZXJ0eSkgPCA0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGlzIHJlYXNvbmFibHkgY2xvc2UgdG8gYW4gZXhpc3RpbmcgQ2hhaSBwcm9wZXJ0eSxcbiAgICAgICAgICAvLyBzdWdnZXN0IHRoYXQgcHJvcGVydHkgdG8gdGhlIHVzZXIuXG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgQ2hhaSBwcm9wZXJ0eTogJyArIHByb3BlcnR5ICtcbiAgICAgICAgICAgICcuIERpZCB5b3UgbWVhbiBcIicgKyBvcmRlcmVkUHJvcGVydGllc1swXSArICdcIj8nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBDaGFpIHByb3BlcnR5OiAnICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB0aGlzIHByb3h5IGdldHRlciBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLiBGb3IgcHJvcGVydHlcbiAgICAgIC8vIGFzc2VydGlvbnMsIHRoaXMgcHJldmVudHMgdGhlIHByb3h5IGdldHRlciBmcm9tIHNob3dpbmcgdXAgaW4gdGhlIHN0YWNrXG4gICAgICAvLyB0cmFjZSBzaW5jZSBpdCdzIGludm9rZWQgYmVmb3JlIHRoZSBwcm9wZXJ0eSBnZXR0ZXIuIEZvciBtZXRob2QgYW5kXG4gICAgICAvLyBjaGFpbmFibGUgbWV0aG9kIGFzc2VydGlvbnMsIHRoaXMgZmxhZyB3aWxsIGVuZCB1cCBnZXR0aW5nIGNoYW5nZWQgdG9cbiAgICAgIC8vIHRoZSBtZXRob2Qgd3JhcHBlciwgd2hpY2ggaXMgZ29vZCBzaW5jZSB0aGlzIGZyYW1lIHdpbGwgbm8gbG9uZ2VyIGJlIGluXG4gICAgICAvLyB0aGUgc3RhY2sgb25jZSB0aGUgbWV0aG9kIGlzIGludm9rZWQuIE5vdGUgdGhhdCBDaGFpIGJ1aWx0aW4gYXNzZXJ0aW9uXG4gICAgICAvLyBwcm9wZXJ0aWVzIHN1Y2ggYXMgYF9fZmxhZ3NgIGFyZSBza2lwcGVkIHNpbmNlIHRoaXMgaXMgb25seSBtZWFudCB0b1xuICAgICAgLy8gY2FwdHVyZSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgYW4gYXNzZXJ0aW9uLiBUaGlzIHN0ZXAgaXMgYWxzbyBza2lwcGVkXG4gICAgICAvLyBpZiB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzIHNldCwgdGh1cyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBhc3NlcnRpb24gaXNcbiAgICAgIC8vIGJlaW5nIGNhbGxlZCBmcm9tIHdpdGhpbiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhhdCBjYXNlLCB0aGUgYHNzZmlgXG4gICAgICAvLyBmbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBvdXRlciBhc3NlcnRpb24ncyBzdGFydGluZyBwb2ludC5cbiAgICAgIGlmIChidWlsdGlucy5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTEgJiYgIWZsYWcodGFyZ2V0LCAnbG9ja1NzZmknKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgJ3NzZmknLCBwcm94eUdldHRlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiAjIHN0cmluZ0Rpc3RhbmNlKHN0ckEsIHN0ckIpXG4gKiBSZXR1cm4gdGhlIExldmVuc2h0ZWluIGRpc3RhbmNlIGJldHdlZW4gdHdvIHN0cmluZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyQVxuICogQHBhcmFtIHtzdHJpbmd9IHN0ckJcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIHN0cmluZyBkaXN0YW5jZSBiZXR3ZWVuIHN0ckEgYW5kIHN0ckJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlKHN0ckEsIHN0ckIsIG1lbW8pIHtcbiAgaWYgKCFtZW1vKSB7XG4gICAgLy8gYG1lbW9gIGlzIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgYSBjYWNoZSBvZiBkaXN0YW5jZXNcbiAgICAvLyBtZW1vW2ldW2pdIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHN0ckEuc2xpY2UoMCwgaSkgYW5kXG4gICAgLy8gc3RyQi5zbGljZSgwLCBqKS5cbiAgICBtZW1vID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RyQS5sZW5ndGg7IGkrKykge1xuICAgICAgbWVtb1tpXSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIGlmICghbWVtb1tzdHJBLmxlbmd0aF0gfHwgIW1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXSkge1xuICAgIGlmIChzdHJBLmxlbmd0aCA9PT0gMCB8fCBzdHJCLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWVtb1tzdHJBLmxlbmd0aF1bc3RyQi5sZW5ndGhdID0gTWF0aC5tYXgoc3RyQS5sZW5ndGgsIHN0ckIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVtb1tzdHJBLmxlbmd0aF1bc3RyQi5sZW5ndGhdID0gTWF0aC5taW4oXG4gICAgICAgIHN0cmluZ0Rpc3RhbmNlKHN0ckEuc2xpY2UoMCwgLTEpLCBzdHJCLCBtZW1vKSArIDEsXG4gICAgICAgIHN0cmluZ0Rpc3RhbmNlKHN0ckEsIHN0ckIuc2xpY2UoMCwgLTEpLCBtZW1vKSArIDEsXG4gICAgICAgIHN0cmluZ0Rpc3RhbmNlKHN0ckEuc2xpY2UoMCwgLTEpLCBzdHJCLnNsaWNlKDAsIC0xKSwgbWVtbykgK1xuICAgICAgICAgIChzdHJBLnNsaWNlKC0xKSA9PT0gc3RyQi5zbGljZSgtMSkgPyAwIDogMSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbiIsInZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxudmFyIGZuTGVuZ3RoRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge30sICdsZW5ndGgnKTtcblxuLyohXG4gKiBDaGFpIC0gYWRkTGVuZ3RoR3VhcmQgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5hZGRMZW5ndGhHdWFyZChmbiwgYXNzZXJ0aW9uTmFtZSwgaXNDaGFpbmFibGUpXG4gKlxuICogRGVmaW5lIGBsZW5ndGhgIGFzIGEgZ2V0dGVyIG9uIHRoZSBnaXZlbiB1bmludm9rZWQgbWV0aG9kIGFzc2VydGlvbi4gVGhlXG4gKiBnZXR0ZXIgYWN0cyBhcyBhIGd1YXJkIGFnYWluc3QgY2hhaW5pbmcgYGxlbmd0aGAgZGlyZWN0bHkgb2ZmIG9mIGFuIHVuaW52b2tlZFxuICogbWV0aG9kIGFzc2VydGlvbiwgd2hpY2ggaXMgYSBwcm9ibGVtIGJlY2F1c2UgaXQgcmVmZXJlbmNlcyBgZnVuY3Rpb25gJ3NcbiAqIGJ1aWx0LWluIGBsZW5ndGhgIHByb3BlcnR5IGluc3RlYWQgb2YgQ2hhaSdzIGBsZW5ndGhgIGFzc2VydGlvbi4gV2hlbiB0aGVcbiAqIGdldHRlciBjYXRjaGVzIHRoZSB1c2VyIG1ha2luZyB0aGlzIG1pc3Rha2UsIGl0IHRocm93cyBhbiBlcnJvciB3aXRoIGFcbiAqIGhlbHBmdWwgbWVzc2FnZS5cbiAqXG4gKiBUaGVyZSBhcmUgdHdvIHdheXMgaW4gd2hpY2ggdGhpcyBtaXN0YWtlIGNhbiBiZSBtYWRlLiBUaGUgZmlyc3Qgd2F5IGlzIGJ5XG4gKiBjaGFpbmluZyB0aGUgYGxlbmd0aGAgYXNzZXJ0aW9uIGRpcmVjdGx5IG9mZiBvZiBhbiB1bmludm9rZWQgY2hhaW5hYmxlXG4gKiBtZXRob2QuIEluIHRoaXMgY2FzZSwgQ2hhaSBzdWdnZXN0cyB0aGF0IHRoZSB1c2VyIHVzZSBgbGVuZ3RoT2ZgIGluc3RlYWQuIFRoZVxuICogc2Vjb25kIHdheSBpcyBieSBjaGFpbmluZyB0aGUgYGxlbmd0aGAgYXNzZXJ0aW9uIGRpcmVjdGx5IG9mZiBvZiBhbiB1bmludm9rZWRcbiAqIG5vbi1jaGFpbmFibGUgbWV0aG9kLiBOb24tY2hhaW5hYmxlIG1ldGhvZHMgbXVzdCBiZSBpbnZva2VkIHByaW9yIHRvXG4gKiBjaGFpbmluZy4gSW4gdGhpcyBjYXNlLCBDaGFpIHN1Z2dlc3RzIHRoYXQgdGhlIHVzZXIgY29uc3VsdCB0aGUgZG9jcyBmb3IgdGhlXG4gKiBnaXZlbiBhc3NlcnRpb24uXG4gKlxuICogSWYgdGhlIGBsZW5ndGhgIHByb3BlcnR5IG9mIGZ1bmN0aW9ucyBpcyB1bmNvbmZpZ3VyYWJsZSwgdGhlbiByZXR1cm4gYGZuYFxuICogd2l0aG91dCBtb2RpZmljYXRpb24uXG4gKlxuICogTm90ZSB0aGF0IGluIEVTNiwgdGhlIGZ1bmN0aW9uJ3MgYGxlbmd0aGAgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlLCBzbyBvbmNlXG4gKiBzdXBwb3J0IGZvciBsZWdhY3kgZW52aXJvbm1lbnRzIGlzIGRyb3BwZWQsIENoYWkncyBgbGVuZ3RoYCBwcm9wZXJ0eSBjYW5cbiAqIHJlcGxhY2UgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uJ3MgYGxlbmd0aGAgcHJvcGVydHksIGFuZCB0aGlzIGxlbmd0aCBndWFyZCB3aWxsXG4gKiBubyBsb25nZXIgYmUgbmVjZXNzYXJ5LiBJbiB0aGUgbWVhbiB0aW1lLCBtYWludGFpbmluZyBjb25zaXN0ZW5jeSBhY3Jvc3MgYWxsXG4gKiBlbnZpcm9ubWVudHMgaXMgdGhlIHByaW9yaXR5LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge1N0cmluZ30gYXNzZXJ0aW9uTmFtZVxuICogQHBhcmFtIHtCb29sZWFufSBpc0NoYWluYWJsZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkTGVuZ3RoR3VhcmRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFkZExlbmd0aEd1YXJkIChmbiwgYXNzZXJ0aW9uTmFtZSwgaXNDaGFpbmFibGUpIHtcbiAgaWYgKCFmbkxlbmd0aERlc2MuY29uZmlndXJhYmxlKSByZXR1cm4gZm47XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnbGVuZ3RoJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGlzQ2hhaW5hYmxlKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIENoYWkgcHJvcGVydHk6ICcgKyBhc3NlcnRpb25OYW1lICsgJy5sZW5ndGguIER1ZScgK1xuICAgICAgICAgICcgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCBcImxlbmd0aFwiIGNhbm5vdCBkaXJlY3RseSBmb2xsb3cgXCInICtcbiAgICAgICAgICBhc3NlcnRpb25OYW1lICsgJ1wiLiBVc2UgXCInICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoT2ZcIiBpbnN0ZWFkLicpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBDaGFpIHByb3BlcnR5OiAnICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBTZWUnICtcbiAgICAgICAgJyBkb2NzIGZvciBwcm9wZXIgdXNhZ2Ugb2YgXCInICsgYXNzZXJ0aW9uTmFtZSArICdcIi4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmbjtcbn07XG4iLCJ2YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cbi8qIVxuICogQ2hhaSAtIGlzUHJveHlFbmFibGVkIGhlbHBlclxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5pc1Byb3h5RW5hYmxlZCgpXG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIENoYWkncyBwcm94eSBwcm90ZWN0aW9uIGZlYXR1cmUgaXMgZW5hYmxlZC4gSWZcbiAqIHByb3hpZXMgYXJlIHVuc3VwcG9ydGVkIG9yIGRpc2FibGVkIHZpYSB0aGUgdXNlcidzIENoYWkgY29uZmlnLCB0aGVuIHJldHVyblxuICogZmFsc2UuIE90aGVyd2lzZSwgcmV0dXJuIHRydWUuXG4gKlxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgaXNQcm94eUVuYWJsZWRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUHJveHlFbmFibGVkKCkge1xuICByZXR1cm4gY29uZmlnLnVzZVByb3h5ICYmIFxuICAgIHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gaXNOYU4gdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNSBTYWt0aGlwcml5YW4gVmFpcmFtYW5pIDx0aGVjaGFyZ2luZ3ZvbGNhbm9AZ21haWwuY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmlzTmFOKHZhbHVlKVxuICpcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgTmFOIG9yIG5vdC5cbiAqXG4gKiAgICAgdXRpbHMuaXNOYU4oTmFOKTsgLy8gdHJ1ZVxuICpcbiAqIEBwYXJhbSB7VmFsdWV9IFRoZSB2YWx1ZSB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCBpZiBpdCBpcyBOYU5cbiAqIEBuYW1lIGlzTmFOXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAvLyBSZWZlciBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXNuYW4tbnVtYmVyXG4gIC8vIHNlY3Rpb24ncyBOT1RFLlxuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG4vLyBJZiBFQ01BU2NyaXB0IDYncyBOdW1iZXIuaXNOYU4gaXMgcHJlc2VudCwgcHJlZmVyIHRoYXQuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc05hTiB8fCBpc05hTjtcbiIsIi8qIVxuICogQ2hhaSAtIGdldFByb3BlcnRpZXMgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5nZXRQcm9wZXJ0aWVzKG9iamVjdClcbiAqXG4gKiBUaGlzIGFsbG93cyB0aGUgcmV0cmlldmFsIG9mIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdCwgZW51bWVyYWJsZSBvciBub3QsXG4gKiBpbmhlcml0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldFByb3BlcnRpZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcblxuICBmdW5jdGlvbiBhZGRQcm9wZXJ0eShwcm9wZXJ0eSkge1xuICAgIGlmIChyZXN1bHQuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xKSB7XG4gICAgICByZXN1bHQucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGFkZFByb3BlcnR5KTtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8qIVxuICogQ2hhaSAtIGdldEVudW1lcmFibGVQcm9wZXJ0aWVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZ2V0RW51bWVyYWJsZVByb3BlcnRpZXMob2JqZWN0KVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbiBvYmplY3QsXG4gKiBpbmhlcml0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldEVudW1lcmFibGVQcm9wZXJ0aWVzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0RW51bWVyYWJsZVByb3BlcnRpZXMob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIgbmFtZSBpbiBvYmplY3QpIHtcbiAgICByZXN1bHQucHVzaChuYW1lKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdfQ==
\No newline at end of file