1 | define('@glimmer/util', ['exports', '@glimmer/env'], function (exports, env) { 'use strict';
|
2 |
|
3 | var EMPTY_ARRAY = Object.freeze([]);
|
4 | function emptyArray() {
|
5 | return EMPTY_ARRAY;
|
6 | }
|
7 | var EMPTY_STRING_ARRAY = emptyArray();
|
8 | var EMPTY_NUMBER_ARRAY = emptyArray();
|
9 | /**
|
10 | * This function returns `true` if the input array is the special empty array sentinel,
|
11 | * which is sometimes used for optimizations.
|
12 | */
|
13 |
|
14 | function isEmptyArray(input) {
|
15 | return input === EMPTY_ARRAY;
|
16 | }
|
17 |
|
18 | // import Logger from './logger';
|
19 |
|
20 | function debugAssert(test, msg) {
|
21 | // if (!alreadyWarned) {
|
22 | // alreadyWarned = true;
|
23 | // Logger.warn("Don't leave debug assertions on in public builds");
|
24 | // }
|
25 | if (!test) {
|
26 | throw new Error(msg || 'assertion failure');
|
27 | }
|
28 | }
|
29 | function deprecate(desc) {
|
30 | LOCAL_LOGGER.warn("DEPRECATION: " + desc);
|
31 | }
|
32 |
|
33 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
34 |
|
35 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
36 |
|
37 | function dict() {
|
38 | return Object.create(null);
|
39 | }
|
40 | function isDict(u) {
|
41 | return u !== null && u !== undefined;
|
42 | }
|
43 | function isObject(u) {
|
44 | return typeof u === 'function' || typeof u === 'object' && u !== null;
|
45 | }
|
46 | var StackImpl = /*#__PURE__*/function () {
|
47 | function StackImpl(values) {
|
48 | if (values === void 0) {
|
49 | values = [];
|
50 | }
|
51 |
|
52 | this.current = null;
|
53 | this.stack = values;
|
54 | }
|
55 |
|
56 | var _proto = StackImpl.prototype;
|
57 |
|
58 | _proto.push = function push(item) {
|
59 | this.current = item;
|
60 | this.stack.push(item);
|
61 | };
|
62 |
|
63 | _proto.pop = function pop() {
|
64 | var item = this.stack.pop();
|
65 | var len = this.stack.length;
|
66 | this.current = len === 0 ? null : this.stack[len - 1];
|
67 | return item === undefined ? null : item;
|
68 | };
|
69 |
|
70 | _proto.nth = function nth(from) {
|
71 | var len = this.stack.length;
|
72 | return len < from ? null : this.stack[len - from];
|
73 | };
|
74 |
|
75 | _proto.isEmpty = function isEmpty() {
|
76 | return this.stack.length === 0;
|
77 | };
|
78 |
|
79 | _proto.toArray = function toArray() {
|
80 | return this.stack;
|
81 | };
|
82 |
|
83 | _createClass(StackImpl, [{
|
84 | key: "size",
|
85 | get: function get() {
|
86 | return this.stack.length;
|
87 | }
|
88 | }]);
|
89 |
|
90 | return StackImpl;
|
91 | }();
|
92 |
|
93 | function clearElement(parent) {
|
94 | var current = parent.firstChild;
|
95 |
|
96 | while (current) {
|
97 | var next = current.nextSibling;
|
98 | parent.removeChild(current);
|
99 | current = next;
|
100 | }
|
101 | }
|
102 |
|
103 | var SERIALIZATION_FIRST_NODE_STRING = '%+b:0%';
|
104 | function isSerializationFirstNode(node) {
|
105 | return node.nodeValue === SERIALIZATION_FIRST_NODE_STRING;
|
106 | }
|
107 |
|
108 | var _a;
|
109 |
|
110 | var objKeys = Object.keys;
|
111 |
|
112 | function assignFn(obj) {
|
113 | for (var i = 1; i < arguments.length; i++) {
|
114 | var assignment = arguments[i];
|
115 | if (assignment === null || typeof assignment !== 'object') continue;
|
116 | var keys = objKeys(assignment);
|
117 |
|
118 | for (var j = 0; j < keys.length; j++) {
|
119 | var key = keys[j];
|
120 | obj[key] = assignment[key];
|
121 | }
|
122 | }
|
123 |
|
124 | return obj;
|
125 | }
|
126 |
|
127 | var assign = (_a = Object.assign) !== null && _a !== void 0 ? _a : assignFn;
|
128 | function fillNulls(count) {
|
129 | var arr = new Array(count);
|
130 |
|
131 | for (var i = 0; i < count; i++) {
|
132 | arr[i] = null;
|
133 | }
|
134 |
|
135 | return arr;
|
136 | }
|
137 | function values(obj) {
|
138 | var vals = [];
|
139 |
|
140 | for (var key in obj) {
|
141 | vals.push(obj[key]);
|
142 | }
|
143 |
|
144 | return vals;
|
145 | }
|
146 |
|
147 | /**
|
148 | Strongly hint runtimes to intern the provided string.
|
149 |
|
150 | When do I need to use this function?
|
151 |
|
152 | For the most part, never. Pre-mature optimization is bad, and often the
|
153 | runtime does exactly what you need it to, and more often the trade-off isn't
|
154 | worth it.
|
155 |
|
156 | Why?
|
157 |
|
158 | Runtimes store strings in at least 2 different representations:
|
159 | Ropes and Symbols (interned strings). The Rope provides a memory efficient
|
160 | data-structure for strings created from concatenation or some other string
|
161 | manipulation like splitting.
|
162 |
|
163 | Unfortunately checking equality of different ropes can be quite costly as
|
164 | runtimes must resort to clever string comparison algorithms. These
|
165 | algorithms typically cost in proportion to the length of the string.
|
166 | Luckily, this is where the Symbols (interned strings) shine. As Symbols are
|
167 | unique by their string content, equality checks can be done by pointer
|
168 | comparison.
|
169 |
|
170 | How do I know if my string is a rope or symbol?
|
171 |
|
172 | Typically (warning general sweeping statement, but truthy in runtimes at
|
173 | present) static strings created as part of the JS source are interned.
|
174 | Strings often used for comparisons can be interned at runtime if some
|
175 | criteria are met. One of these criteria can be the size of the entire rope.
|
176 | For example, in chrome 38 a rope longer then 12 characters will not
|
177 | intern, nor will segments of that rope.
|
178 |
|
179 | Some numbers: http://jsperf.com/eval-vs-keys/8
|
180 |
|
181 | Known Trick™
|
182 |
|
183 | @private
|
184 | @return {String} interned version of the provided string
|
185 | */
|
186 | function intern(str) {
|
187 | var obj = {};
|
188 | obj[str] = 1;
|
189 |
|
190 | for (var key in obj) {
|
191 | if (key === str) {
|
192 | return key;
|
193 | }
|
194 | }
|
195 |
|
196 | return str;
|
197 | }
|
198 |
|
199 | var HAS_NATIVE_PROXY = typeof Proxy === 'function';
|
200 | var HAS_NATIVE_SYMBOL = function () {
|
201 | if (typeof Symbol !== 'function') {
|
202 | return false;
|
203 | } // eslint-disable-next-line symbol-description
|
204 |
|
205 |
|
206 | return typeof Symbol() === 'symbol';
|
207 | }();
|
208 | function keys(obj) {
|
209 | return Object.keys(obj);
|
210 | }
|
211 | function unwrap(val) {
|
212 | if (val === null || val === undefined) throw new Error("Expected value to be present");
|
213 | return val;
|
214 | }
|
215 | function expect(val, message) {
|
216 | if (val === null || val === undefined) throw new Error(message);
|
217 | return val;
|
218 | }
|
219 | function unreachable(message) {
|
220 | if (message === void 0) {
|
221 | message = 'unreachable';
|
222 | }
|
223 |
|
224 | return new Error(message);
|
225 | }
|
226 | function exhausted(value) {
|
227 | throw new Error("Exhausted " + value);
|
228 | }
|
229 | var tuple = function tuple() {
|
230 | for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
231 | args[_key] = arguments[_key];
|
232 | }
|
233 |
|
234 | return args;
|
235 | };
|
236 | function enumerableSymbol(key) {
|
237 | return intern("__" + key + Math.floor(Math.random() * Date.now()) + "__");
|
238 | }
|
239 | var symbol = HAS_NATIVE_SYMBOL ? Symbol : enumerableSymbol;
|
240 |
|
241 | function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); }
|
242 |
|
243 | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
244 |
|
245 | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
246 |
|
247 | function strip(strings) {
|
248 | var out = '';
|
249 |
|
250 | for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
251 | args[_key - 1] = arguments[_key];
|
252 | }
|
253 |
|
254 | for (var i = 0; i < strings.length; i++) {
|
255 | var string = strings[i];
|
256 | var dynamic = args[i] !== undefined ? String(args[i]) : '';
|
257 | out += "" + string + dynamic;
|
258 | }
|
259 |
|
260 | var lines = out.split('\n');
|
261 |
|
262 | while (lines.length && lines[0].match(/^\s*$/)) {
|
263 | lines.shift();
|
264 | }
|
265 |
|
266 | while (lines.length && lines[lines.length - 1].match(/^\s*$/)) {
|
267 | lines.pop();
|
268 | }
|
269 |
|
270 | var min = Infinity;
|
271 |
|
272 | for (var _iterator = _createForOfIteratorHelperLoose(lines), _step; !(_step = _iterator()).done;) {
|
273 | var line = _step.value;
|
274 | var leading = line.match(/^\s*/)[0].length;
|
275 | min = Math.min(min, leading);
|
276 | }
|
277 |
|
278 | var stripped = [];
|
279 |
|
280 | for (var _iterator2 = _createForOfIteratorHelperLoose(lines), _step2; !(_step2 = _iterator2()).done;) {
|
281 | var _line = _step2.value;
|
282 | stripped.push(_line.slice(min));
|
283 | }
|
284 |
|
285 | return stripped.join('\n');
|
286 | }
|
287 |
|
288 | function isHandle(value) {
|
289 | return value >= 0;
|
290 | }
|
291 | function isNonPrimitiveHandle(value) {
|
292 | return value > 3
|
293 | /* ENCODED_UNDEFINED_HANDLE */
|
294 | ;
|
295 | }
|
296 | function constants() {
|
297 | for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
|
298 | values[_key] = arguments[_key];
|
299 | }
|
300 |
|
301 | return [false, true, null, undefined].concat(values);
|
302 | }
|
303 | function isSmallInt(value) {
|
304 | return value % 1 === 0 && value <= 536870911
|
305 | /* MAX_INT */
|
306 | && value >= -536870912
|
307 | /* MIN_INT */
|
308 | ;
|
309 | }
|
310 | function encodeNegative(num) {
|
311 |
|
312 | return num & -536870913
|
313 | /* SIGN_BIT */
|
314 | ;
|
315 | }
|
316 | function decodeNegative(num) {
|
317 |
|
318 | return num | ~-536870913
|
319 | /* SIGN_BIT */
|
320 | ;
|
321 | }
|
322 | function encodePositive(num) {
|
323 |
|
324 | return ~num;
|
325 | }
|
326 | function decodePositive(num) {
|
327 |
|
328 | return ~num;
|
329 | }
|
330 | function encodeHandle(num) {
|
331 |
|
332 | return num;
|
333 | }
|
334 | function decodeHandle(num) {
|
335 |
|
336 | return num;
|
337 | }
|
338 | function encodeImmediate(num) {
|
339 | num |= 0;
|
340 | return num < 0 ? encodeNegative(num) : encodePositive(num);
|
341 | }
|
342 | function decodeImmediate(num) {
|
343 | num |= 0;
|
344 | return num > -536870913
|
345 | /* SIGN_BIT */
|
346 | ? decodePositive(num) : decodeNegative(num);
|
347 | } // Warm
|
348 | [1, -1].forEach(function (x) {
|
349 | return decodeImmediate(encodeImmediate(x));
|
350 | });
|
351 |
|
352 | function unwrapHandle(handle) {
|
353 | if (typeof handle === 'number') {
|
354 | return handle;
|
355 | } else {
|
356 | var error = handle.errors[0];
|
357 | throw new Error("Compile Error: " + error.problem + " @ " + error.span.start + ".." + error.span.end);
|
358 | }
|
359 | }
|
360 | function unwrapTemplate(template) {
|
361 | if (template.result === 'error') {
|
362 | throw new Error("Compile Error: " + template.problem + " @ " + template.span.start + ".." + template.span.end);
|
363 | }
|
364 |
|
365 | return template;
|
366 | }
|
367 | function extractHandle(handle) {
|
368 | if (typeof handle === 'number') {
|
369 | return handle;
|
370 | } else {
|
371 | return handle.handle;
|
372 | }
|
373 | }
|
374 | function isOkHandle(handle) {
|
375 | return typeof handle === 'number';
|
376 | }
|
377 | function isErrHandle(handle) {
|
378 | return typeof handle === 'number';
|
379 | }
|
380 |
|
381 | var weakSet = typeof WeakSet === 'function' ? WeakSet : /*#__PURE__*/function () {
|
382 | function WeakSetPolyFill() {
|
383 | this._map = new WeakMap();
|
384 | }
|
385 |
|
386 | var _proto = WeakSetPolyFill.prototype;
|
387 |
|
388 | _proto.add = function add(val) {
|
389 | this._map.set(val, true);
|
390 |
|
391 | return this;
|
392 | };
|
393 |
|
394 | _proto["delete"] = function _delete(val) {
|
395 | return this._map["delete"](val);
|
396 | };
|
397 |
|
398 | _proto.has = function has(val) {
|
399 | return this._map.has(val);
|
400 | };
|
401 |
|
402 | return WeakSetPolyFill;
|
403 | }();
|
404 |
|
405 | function castToSimple(node) {
|
406 | if (isDocument(node)) {
|
407 | return node;
|
408 | } else if (isElement(node)) {
|
409 | return node;
|
410 | } else {
|
411 | return node;
|
412 | }
|
413 | }
|
414 | function castToBrowser(node, sugaryCheck) {
|
415 | if (node === null || node === undefined) {
|
416 | return null;
|
417 | }
|
418 |
|
419 | if (typeof document === undefined) {
|
420 | throw new Error('Attempted to cast to a browser node in a non-browser context');
|
421 | }
|
422 |
|
423 | if (isDocument(node)) {
|
424 | return node;
|
425 | }
|
426 |
|
427 | if (node.ownerDocument !== document) {
|
428 | throw new Error('Attempted to cast to a browser node with a node that was not created from this document');
|
429 | }
|
430 |
|
431 | return checkNode(node, sugaryCheck);
|
432 | }
|
433 |
|
434 | function checkError(from, check) {
|
435 | return new Error("cannot cast a " + from + " into " + check);
|
436 | }
|
437 |
|
438 | function isDocument(node) {
|
439 | return node.nodeType === 9
|
440 | /* DOCUMENT_NODE */
|
441 | ;
|
442 | }
|
443 |
|
444 | function isElement(node) {
|
445 | return node.nodeType === 1
|
446 | /* ELEMENT_NODE */
|
447 | ;
|
448 | }
|
449 |
|
450 | function checkNode(node, check) {
|
451 | var isMatch = false;
|
452 |
|
453 | if (node !== null) {
|
454 | if (typeof check === 'string') {
|
455 | isMatch = stringCheckNode(node, check);
|
456 | } else if (Array.isArray(check)) {
|
457 | isMatch = check.some(function (c) {
|
458 | return stringCheckNode(node, c);
|
459 | });
|
460 | } else {
|
461 | throw unreachable();
|
462 | }
|
463 | }
|
464 |
|
465 | if (isMatch) {
|
466 | return node;
|
467 | } else {
|
468 | throw checkError("SimpleElement(" + node + ")", check);
|
469 | }
|
470 | }
|
471 |
|
472 | function stringCheckNode(node, check) {
|
473 | switch (check) {
|
474 | case 'NODE':
|
475 | return true;
|
476 |
|
477 | case 'HTML':
|
478 | return node instanceof HTMLElement;
|
479 |
|
480 | case 'SVG':
|
481 | return node instanceof SVGElement;
|
482 |
|
483 | case 'ELEMENT':
|
484 | return node instanceof Element;
|
485 |
|
486 | default:
|
487 | if (check.toUpperCase() === check) {
|
488 | throw new Error("BUG: this code is missing handling for a generic node type");
|
489 | }
|
490 |
|
491 | return node instanceof Element && node.tagName.toLowerCase() === check;
|
492 | }
|
493 | }
|
494 |
|
495 | function _createForOfIteratorHelperLoose$1(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); }
|
496 |
|
497 | function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); }
|
498 |
|
499 | function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
500 |
|
501 | function isPresent(list) {
|
502 | return list.length > 0;
|
503 | }
|
504 | function ifPresent(list, ifPresent, otherwise) {
|
505 | if (isPresent(list)) {
|
506 | return ifPresent(list);
|
507 | } else {
|
508 | return otherwise();
|
509 | }
|
510 | }
|
511 | function toPresentOption(list) {
|
512 | if (isPresent(list)) {
|
513 | return list;
|
514 | } else {
|
515 | return null;
|
516 | }
|
517 | }
|
518 | function assertPresent(list, message) {
|
519 | if (message === void 0) {
|
520 | message = "unexpected empty list";
|
521 | }
|
522 |
|
523 | if (!isPresent(list)) {
|
524 | throw new Error(message);
|
525 | }
|
526 | }
|
527 | function mapPresent(list, callback) {
|
528 | if (list === null) {
|
529 | return null;
|
530 | }
|
531 |
|
532 | var out = [];
|
533 |
|
534 | for (var _iterator = _createForOfIteratorHelperLoose$1(list), _step; !(_step = _iterator()).done;) {
|
535 | var item = _step.value;
|
536 | out.push(callback(item));
|
537 | }
|
538 |
|
539 | return out;
|
540 | }
|
541 |
|
542 | function buildUntouchableThis(source) {
|
543 | var context = null;
|
544 |
|
545 | if (env.DEBUG && HAS_NATIVE_PROXY) {
|
546 | var assertOnProperty = function assertOnProperty(property) {
|
547 | throw new Error("You accessed `this." + String(property) + "` from a function passed to the " + source + ", but the function itself was not bound to a valid `this` context. Consider updating to use a bound function (for instance, use an arrow function, `() => {}`).");
|
548 | };
|
549 |
|
550 | context = new Proxy({}, {
|
551 | get: function get(_target, property) {
|
552 | assertOnProperty(property);
|
553 | },
|
554 | set: function set(_target, property) {
|
555 | assertOnProperty(property);
|
556 | return false;
|
557 | },
|
558 | has: function has(_target, property) {
|
559 | assertOnProperty(property);
|
560 | return false;
|
561 | }
|
562 | });
|
563 | }
|
564 |
|
565 | return context;
|
566 | }
|
567 |
|
568 | var debugToString;
|
569 |
|
570 | if (env.DEBUG) {
|
571 | var getFunctionName = function getFunctionName(fn) {
|
572 | var functionName = fn.name;
|
573 |
|
574 | if (functionName === undefined) {
|
575 | var match = Function.prototype.toString.call(fn).match(/function (\w+)\s*\(/);
|
576 | functionName = match && match[1] || '';
|
577 | }
|
578 |
|
579 | return functionName.replace(/^bound /, '');
|
580 | };
|
581 |
|
582 | var getObjectName = function getObjectName(obj) {
|
583 | var name;
|
584 | var className;
|
585 |
|
586 | if (obj.constructor && typeof obj.constructor === 'function') {
|
587 | className = getFunctionName(obj.constructor);
|
588 | }
|
589 |
|
590 | if ('toString' in obj && obj.toString !== Object.prototype.toString && obj.toString !== Function.prototype.toString) {
|
591 | name = obj.toString();
|
592 | } // If the class has a decent looking name, and the `toString` is one of the
|
593 | // default Ember toStrings, replace the constructor portion of the toString
|
594 | // with the class name. We check the length of the class name to prevent doing
|
595 | // this when the value is minified.
|
596 |
|
597 |
|
598 | if (name && name.match(/<.*:ember\d+>/) && className && className[0] !== '_' && className.length > 2 && className !== 'Class') {
|
599 | return name.replace(/<.*:/, "<" + className + ":");
|
600 | }
|
601 |
|
602 | return name || className;
|
603 | };
|
604 |
|
605 | var getPrimitiveName = function getPrimitiveName(value) {
|
606 | return String(value);
|
607 | };
|
608 |
|
609 | debugToString = function debugToString(value) {
|
610 | if (typeof value === 'function') {
|
611 | return getFunctionName(value) || "(unknown function)";
|
612 | } else if (typeof value === 'object' && value !== null) {
|
613 | return getObjectName(value) || "(unknown object)";
|
614 | } else {
|
615 | return getPrimitiveName(value);
|
616 | }
|
617 | };
|
618 | }
|
619 |
|
620 | var debugToString$1 = debugToString;
|
621 |
|
622 | var beginTestSteps;
|
623 | var endTestSteps;
|
624 | var verifySteps;
|
625 | var logStep;
|
626 |
|
627 | /**
|
628 | * This constant exists to make it easier to differentiate normal logs from
|
629 | * errant console.logs. LOCAL_LOGGER should only be used inside a
|
630 | * LOCAL_SHOULD_LOG check.
|
631 | *
|
632 | * It does not alleviate the need to check LOCAL_SHOULD_LOG, which is used
|
633 | * for stripping.
|
634 | */
|
635 |
|
636 | var LOCAL_LOGGER = console;
|
637 | /**
|
638 | * This constant exists to make it easier to differentiate normal logs from
|
639 | * errant console.logs. LOGGER can be used outside of LOCAL_SHOULD_LOG checks,
|
640 | * and is meant to be used in the rare situation where a console.* call is
|
641 | * actually appropriate.
|
642 | */
|
643 |
|
644 | var LOGGER = console;
|
645 | function assertNever(value, desc) {
|
646 | if (desc === void 0) {
|
647 | desc = 'unexpected unreachable branch';
|
648 | }
|
649 |
|
650 | LOGGER.log('unreachable', value);
|
651 | LOGGER.log(desc + " :: " + JSON.stringify(value) + " (" + value + ")");
|
652 | throw new Error("code reached unreachable");
|
653 | }
|
654 |
|
655 | exports.EMPTY_ARRAY = EMPTY_ARRAY;
|
656 | exports.EMPTY_NUMBER_ARRAY = EMPTY_NUMBER_ARRAY;
|
657 | exports.EMPTY_STRING_ARRAY = EMPTY_STRING_ARRAY;
|
658 | exports.HAS_NATIVE_PROXY = HAS_NATIVE_PROXY;
|
659 | exports.HAS_NATIVE_SYMBOL = HAS_NATIVE_SYMBOL;
|
660 | exports.LOCAL_LOGGER = LOCAL_LOGGER;
|
661 | exports.LOGGER = LOGGER;
|
662 | exports.SERIALIZATION_FIRST_NODE_STRING = SERIALIZATION_FIRST_NODE_STRING;
|
663 | exports.Stack = StackImpl;
|
664 | exports._WeakSet = weakSet;
|
665 | exports.assert = debugAssert;
|
666 | exports.assertNever = assertNever;
|
667 | exports.assertPresent = assertPresent;
|
668 | exports.assign = assign;
|
669 | exports.beginTestSteps = beginTestSteps;
|
670 | exports.buildUntouchableThis = buildUntouchableThis;
|
671 | exports.castToBrowser = castToBrowser;
|
672 | exports.castToSimple = castToSimple;
|
673 | exports.checkNode = checkNode;
|
674 | exports.clearElement = clearElement;
|
675 | exports.constants = constants;
|
676 | exports.debugToString = debugToString$1;
|
677 | exports.decodeHandle = decodeHandle;
|
678 | exports.decodeImmediate = decodeImmediate;
|
679 | exports.decodeNegative = decodeNegative;
|
680 | exports.decodePositive = decodePositive;
|
681 | exports.deprecate = deprecate;
|
682 | exports.dict = dict;
|
683 | exports.emptyArray = emptyArray;
|
684 | exports.encodeHandle = encodeHandle;
|
685 | exports.encodeImmediate = encodeImmediate;
|
686 | exports.encodeNegative = encodeNegative;
|
687 | exports.encodePositive = encodePositive;
|
688 | exports.endTestSteps = endTestSteps;
|
689 | exports.enumerableSymbol = enumerableSymbol;
|
690 | exports.exhausted = exhausted;
|
691 | exports.expect = expect;
|
692 | exports.extractHandle = extractHandle;
|
693 | exports.fillNulls = fillNulls;
|
694 | exports.ifPresent = ifPresent;
|
695 | exports.intern = intern;
|
696 | exports.isDict = isDict;
|
697 | exports.isEmptyArray = isEmptyArray;
|
698 | exports.isErrHandle = isErrHandle;
|
699 | exports.isHandle = isHandle;
|
700 | exports.isNonPrimitiveHandle = isNonPrimitiveHandle;
|
701 | exports.isObject = isObject;
|
702 | exports.isOkHandle = isOkHandle;
|
703 | exports.isPresent = isPresent;
|
704 | exports.isSerializationFirstNode = isSerializationFirstNode;
|
705 | exports.isSmallInt = isSmallInt;
|
706 | exports.keys = keys;
|
707 | exports.logStep = logStep;
|
708 | exports.mapPresent = mapPresent;
|
709 | exports.strip = strip;
|
710 | exports.symbol = symbol;
|
711 | exports.toPresentOption = toPresentOption;
|
712 | exports.tuple = tuple;
|
713 | exports.unreachable = unreachable;
|
714 | exports.unwrap = unwrap;
|
715 | exports.unwrapHandle = unwrapHandle;
|
716 | exports.unwrapTemplate = unwrapTemplate;
|
717 | exports.values = values;
|
718 | exports.verifySteps = verifySteps;
|
719 |
|
720 | Object.defineProperty(exports, '__esModule', { value: true });
|
721 |
|
722 | });
|
723 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xpbW1lci11dGlsLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci91dGlsL2xpYi9hcnJheS11dGlscy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3V0aWwvbGliL2Fzc2VydC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3V0aWwvbGliL2NvbGxlY3Rpb25zLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvdXRpbC9saWIvZG9tLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvdXRpbC9saWIvaXMtc2VyaWFsaXphdGlvbi1maXJzdC1ub2RlLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvdXRpbC9saWIvb2JqZWN0LXV0aWxzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvdXRpbC9saWIvaW50ZXJuLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvdXRpbC9saWIvcGxhdGZvcm0tdXRpbHMudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci91dGlsL2xpYi9zdHJpbmcudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci91dGlsL2xpYi9pbW1lZGlhdGUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci91dGlsL2xpYi90ZW1wbGF0ZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3V0aWwvbGliL3dlYWstc2V0LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvdXRpbC9saWIvc2ltcGxlLWNhc3QudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci91dGlsL2xpYi9wcmVzZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvdXRpbC9saWIvdW50b3VjaGFibGUtdGhpcy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3V0aWwvbGliL2RlYnVnLXRvLXN0cmluZy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3V0aWwvbGliL2RlYnVnLXN0ZXBzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvdXRpbC9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgRU1QVFlfQVJSQVk6IHJlYWRvbmx5IHVua25vd25bXSA9IE9iamVjdC5mcmVlemUoW10pIGFzIHJlYWRvbmx5IHVua25vd25bXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5QXJyYXk8VCBleHRlbmRzIHVua25vd24+KCk6IFRbXSB7XG4gIHJldHVybiBFTVBUWV9BUlJBWSBhcyBUW107XG59XG5cbmV4cG9ydCBjb25zdCBFTVBUWV9TVFJJTkdfQVJSQVkgPSBlbXB0eUFycmF5PHN0cmluZz4oKTtcbmV4cG9ydCBjb25zdCBFTVBUWV9OVU1CRVJfQVJSQVkgPSBlbXB0eUFycmF5PG51bWJlcj4oKTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIGlmIHRoZSBpbnB1dCBhcnJheSBpcyB0aGUgc3BlY2lhbCBlbXB0eSBhcnJheSBzZW50aW5lbCxcbiAqIHdoaWNoIGlzIHNvbWV0aW1lcyB1c2VkIGZvciBvcHRpbWl6YXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eUFycmF5KGlucHV0OiB1bmtub3duW10gfCByZWFkb25seSB1bmtub3duW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlucHV0ID09PSBFTVBUWV9BUlJBWTtcbn1cbiIsIi8vIGltcG9ydCBMb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuXG5pbXBvcnQgeyBMT0NBTF9MT0dHRVIgfSBmcm9tICcuLi9pbmRleCc7XG5cbi8vIGxldCBhbHJlYWR5V2FybmVkID0gZmFsc2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0Fzc2VydCh0ZXN0OiBhbnksIG1zZzogc3RyaW5nKTogYXNzZXJ0cyB0ZXN0IHtcbiAgLy8gaWYgKCFhbHJlYWR5V2FybmVkKSB7XG4gIC8vICAgYWxyZWFkeVdhcm5lZCA9IHRydWU7XG4gIC8vICAgTG9nZ2VyLndhcm4oXCJEb24ndCBsZWF2ZSBkZWJ1ZyBhc3NlcnRpb25zIG9uIGluIHB1YmxpYyBidWlsZHNcIik7XG4gIC8vIH1cblxuICBpZiAoIXRlc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdhc3NlcnRpb24gZmFpbHVyZScpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kQXNzZXJ0KCkge31cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHJlY2F0ZShkZXNjOiBzdHJpbmcpIHtcbiAgTE9DQUxfTE9HR0VSLndhcm4oYERFUFJFQ0FUSU9OOiAke2Rlc2N9YCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlYnVnQXNzZXJ0O1xuIiwiaW1wb3J0IHsgRGljdCwgT3B0aW9uLCBTdGFjayB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGljdDxUID0gdW5rbm93bj4oKTogRGljdDxUPiB7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaWN0PFQ+KHU6IFQpOiB1IGlzIERpY3QgJiBUIHtcbiAgcmV0dXJuIHUgIT09IG51bGwgJiYgdSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3Q8VD4odTogVCk6IHUgaXMgb2JqZWN0ICYgVCB7XG4gIHJldHVybiB0eXBlb2YgdSA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIHUgPT09ICdvYmplY3QnICYmIHUgIT09IG51bGwpO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhY2tJbXBsPFQ+IGltcGxlbWVudHMgU3RhY2s8VD4ge1xuICBwcml2YXRlIHN0YWNrOiBUW107XG4gIHB1YmxpYyBjdXJyZW50OiBPcHRpb248VD4gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlczogVFtdID0gW10pIHtcbiAgICB0aGlzLnN0YWNrID0gdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnN0YWNrLmxlbmd0aDtcbiAgfVxuXG4gIHB1c2goaXRlbTogVCkge1xuICAgIHRoaXMuY3VycmVudCA9IGl0ZW07XG4gICAgdGhpcy5zdGFjay5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgcG9wKCk6IE9wdGlvbjxUPiB7XG4gICAgbGV0IGl0ZW0gPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgIGxldCBsZW4gPSB0aGlzLnN0YWNrLmxlbmd0aDtcbiAgICB0aGlzLmN1cnJlbnQgPSBsZW4gPT09IDAgPyBudWxsIDogdGhpcy5zdGFja1tsZW4gLSAxXTtcblxuICAgIHJldHVybiBpdGVtID09PSB1bmRlZmluZWQgPyBudWxsIDogaXRlbTtcbiAgfVxuXG4gIG50aChmcm9tOiBudW1iZXIpOiBPcHRpb248VD4ge1xuICAgIGxldCBsZW4gPSB0aGlzLnN0YWNrLmxlbmd0aDtcbiAgICByZXR1cm4gbGVuIDwgZnJvbSA/IG51bGwgOiB0aGlzLnN0YWNrW2xlbiAtIGZyb21dO1xuICB9XG5cbiAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGFjay5sZW5ndGggPT09IDA7XG4gIH1cblxuICB0b0FycmF5KCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2s7XG4gIH1cbn1cbiIsImltcG9ydCB7IE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgU2ltcGxlRWxlbWVudCwgU2ltcGxlTm9kZSB9IGZyb20gJ0BzaW1wbGUtZG9tL2ludGVyZmFjZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVsZW1lbnQocGFyZW50OiBTaW1wbGVFbGVtZW50KSB7XG4gIGxldCBjdXJyZW50OiBPcHRpb248U2ltcGxlTm9kZT4gPSBwYXJlbnQuZmlyc3RDaGlsZDtcblxuICB3aGlsZSAoY3VycmVudCkge1xuICAgIGxldCBuZXh0ID0gY3VycmVudC5uZXh0U2libGluZztcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoY3VycmVudCk7XG4gICAgY3VycmVudCA9IG5leHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNpbXBsZU5vZGUgfSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuXG5leHBvcnQgY29uc3QgU0VSSUFMSVpBVElPTl9GSVJTVF9OT0RFX1NUUklORyA9ICclK2I6MCUnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJpYWxpemF0aW9uRmlyc3ROb2RlKG5vZGU6IFNpbXBsZU5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGUubm9kZVZhbHVlID09PSBTRVJJQUxJWkFUSU9OX0ZJUlNUX05PREVfU1RSSU5HO1xufVxuIiwiY29uc3QgeyBrZXlzOiBvYmpLZXlzIH0gPSBPYmplY3Q7XG5cbmZ1bmN0aW9uIGFzc2lnbkZuPFQsIFU+KG9iajogVCwgYXNzaWdubWVudHM6IFUpOiBUICYgVTtcbmZ1bmN0aW9uIGFzc2lnbkZuPFQsIFUsIFY+KG9iajogVCwgYTogVSwgYjogVik6IFQgJiBVICYgVjtcbmZ1bmN0aW9uIGFzc2lnbkZuPFQsIFUsIFYsIFc+KG9iajogVCwgYTogVSwgYjogViwgYzogVyk6IFQgJiBVICYgViAmIFc7XG5mdW5jdGlvbiBhc3NpZ25GbjxULCBVLCBWLCBXLCBYPihvYmo6IFQsIGE6IFUsIGI6IFYsIGM6IFcsIGQ6IFgpOiBUICYgVSAmIFYgJiBXICYgWDtcbmZ1bmN0aW9uIGFzc2lnbkZuPFQsIFUsIFYsIFcsIFgsIFk+KG9iajogVCwgYTogVSwgYjogViwgYzogVywgZDogWCwgZTogWSk6IFQgJiBVICYgViAmIFcgJiBYICYgWTtcbmZ1bmN0aW9uIGFzc2lnbkZuPFQsIFUsIFYsIFcsIFgsIFksIFo+KFxuICBvYmo6IFQsXG4gIGE6IFUsXG4gIGI6IFYsXG4gIGM6IFcsXG4gIGQ6IFgsXG4gIGU6IFksXG4gIGY6IFpcbik6IFQgJiBVICYgViAmIFcgJiBYICYgWSAmIFo7XG5mdW5jdGlvbiBhc3NpZ25Gbih0YXJnZXQ6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnk7XG5mdW5jdGlvbiBhc3NpZ25GbihvYmo6IGFueSkge1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBhc3NpZ25tZW50ID0gYXJndW1lbnRzW2ldO1xuICAgIGlmIChhc3NpZ25tZW50ID09PSBudWxsIHx8IHR5cGVvZiBhc3NpZ25tZW50ICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgbGV0IGtleXMgPSBvYmpLZXlzKGFzc2lnbm1lbnQpO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGtleSA9IGtleXNbal07XG4gICAgICBvYmpba2V5XSA9IGFzc2lnbm1lbnRba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGxldCBhc3NpZ24gPSBPYmplY3QuYXNzaWduID8/IGFzc2lnbkZuO1xuXG5leHBvcnQgZnVuY3Rpb24gZmlsbE51bGxzPFQ+KGNvdW50OiBudW1iZXIpOiBUW10ge1xuICBsZXQgYXJyID0gbmV3IEFycmF5KGNvdW50KTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBhcnJbaV0gPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlczxUPihvYmo6IHsgW3M6IHN0cmluZ106IFQgfSk6IFRbXSB7XG4gIGNvbnN0IHZhbHMgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgdmFscy5wdXNoKG9ialtrZXldKTtcbiAgfVxuICByZXR1cm4gdmFscztcbn1cbiIsIi8qKlxuICBTdHJvbmdseSBoaW50IHJ1bnRpbWVzIHRvIGludGVybiB0aGUgcHJvdmlkZWQgc3RyaW5nLlxuXG4gIFdoZW4gZG8gSSBuZWVkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uP1xuXG4gIEZvciB0aGUgbW9zdCBwYXJ0LCBuZXZlci4gUHJlLW1hdHVyZSBvcHRpbWl6YXRpb24gaXMgYmFkLCBhbmQgb2Z0ZW4gdGhlXG4gIHJ1bnRpbWUgZG9lcyBleGFjdGx5IHdoYXQgeW91IG5lZWQgaXQgdG8sIGFuZCBtb3JlIG9mdGVuIHRoZSB0cmFkZS1vZmYgaXNuJ3RcbiAgd29ydGggaXQuXG5cbiAgV2h5P1xuXG4gIFJ1bnRpbWVzIHN0b3JlIHN0cmluZ3MgaW4gYXQgbGVhc3QgMiBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zOlxuICBSb3BlcyBhbmQgU3ltYm9scyAoaW50ZXJuZWQgc3RyaW5ncykuIFRoZSBSb3BlIHByb3ZpZGVzIGEgbWVtb3J5IGVmZmljaWVudFxuICBkYXRhLXN0cnVjdHVyZSBmb3Igc3RyaW5ncyBjcmVhdGVkIGZyb20gY29uY2F0ZW5hdGlvbiBvciBzb21lIG90aGVyIHN0cmluZ1xuICBtYW5pcHVsYXRpb24gbGlrZSBzcGxpdHRpbmcuXG5cbiAgVW5mb3J0dW5hdGVseSBjaGVja2luZyBlcXVhbGl0eSBvZiBkaWZmZXJlbnQgcm9wZXMgY2FuIGJlIHF1aXRlIGNvc3RseSBhc1xuICBydW50aW1lcyBtdXN0IHJlc29ydCB0byBjbGV2ZXIgc3RyaW5nIGNvbXBhcmlzb24gYWxnb3JpdGhtcy4gVGhlc2VcbiAgYWxnb3JpdGhtcyB0eXBpY2FsbHkgY29zdCBpbiBwcm9wb3J0aW9uIHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy5cbiAgTHVja2lseSwgdGhpcyBpcyB3aGVyZSB0aGUgU3ltYm9scyAoaW50ZXJuZWQgc3RyaW5ncykgc2hpbmUuIEFzIFN5bWJvbHMgYXJlXG4gIHVuaXF1ZSBieSB0aGVpciBzdHJpbmcgY29udGVudCwgZXF1YWxpdHkgY2hlY2tzIGNhbiBiZSBkb25lIGJ5IHBvaW50ZXJcbiAgY29tcGFyaXNvbi5cblxuICBIb3cgZG8gSSBrbm93IGlmIG15IHN0cmluZyBpcyBhIHJvcGUgb3Igc3ltYm9sP1xuXG4gIFR5cGljYWxseSAod2FybmluZyBnZW5lcmFsIHN3ZWVwaW5nIHN0YXRlbWVudCwgYnV0IHRydXRoeSBpbiBydW50aW1lcyBhdFxuICBwcmVzZW50KSBzdGF0aWMgc3RyaW5ncyBjcmVhdGVkIGFzIHBhcnQgb2YgdGhlIEpTIHNvdXJjZSBhcmUgaW50ZXJuZWQuXG4gIFN0cmluZ3Mgb2Z0ZW4gdXNlZCBmb3IgY29tcGFyaXNvbnMgY2FuIGJlIGludGVybmVkIGF0IHJ1bnRpbWUgaWYgc29tZVxuICBjcml0ZXJpYSBhcmUgbWV0LiAgT25lIG9mIHRoZXNlIGNyaXRlcmlhIGNhbiBiZSB0aGUgc2l6ZSBvZiB0aGUgZW50aXJlIHJvcGUuXG4gIEZvciBleGFtcGxlLCBpbiBjaHJvbWUgMzggYSByb3BlIGxvbmdlciB0aGVuIDEyIGNoYXJhY3RlcnMgd2lsbCBub3RcbiAgaW50ZXJuLCBub3Igd2lsbCBzZWdtZW50cyBvZiB0aGF0IHJvcGUuXG5cbiAgU29tZSBudW1iZXJzOiBodHRwOi8vanNwZXJmLmNvbS9ldmFsLXZzLWtleXMvOFxuXG4gIEtub3duIFRyaWNr4oSiXG5cbiAgQHByaXZhdGVcbiAgQHJldHVybiB7U3RyaW5nfSBpbnRlcm5lZCB2ZXJzaW9uIG9mIHRoZSBwcm92aWRlZCBzdHJpbmdcbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbnRlcm4oc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgb2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gIG9ialtzdHJdID0gMTtcbiAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgIGlmIChrZXkgPT09IHN0cikge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cbiIsImltcG9ydCB7IE1heWJlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgaW50ZXJuIGZyb20gJy4vaW50ZXJuJztcblxuZXhwb3J0IHR5cGUgRmFjdG9yeTxUPiA9IG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBUO1xuXG5leHBvcnQgY29uc3QgSEFTX05BVElWRV9QUk9YWSA9IHR5cGVvZiBQcm94eSA9PT0gJ2Z1bmN0aW9uJztcblxuZXhwb3J0IGNvbnN0IEhBU19OQVRJVkVfU1lNQk9MID0gKGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3ltYm9sLWRlc2NyaXB0aW9uXG4gIHJldHVybiB0eXBlb2YgU3ltYm9sKCkgPT09ICdzeW1ib2wnO1xufSkoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGtleXM8VD4ob2JqOiBUKTogQXJyYXk8a2V5b2YgVD4ge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKSBhcyBBcnJheTxrZXlvZiBUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcDxUPih2YWw6IE1heWJlPFQ+KTogVCB7XG4gIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdmFsdWUgdG8gYmUgcHJlc2VudGApO1xuICByZXR1cm4gdmFsIGFzIFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3Q8VD4odmFsOiBNYXliZTxUPiwgbWVzc2FnZTogc3RyaW5nKTogVCB7XG4gIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIHZhbCBhcyBUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5yZWFjaGFibGUobWVzc2FnZSA9ICd1bnJlYWNoYWJsZScpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGhhdXN0ZWQodmFsdWU6IG5ldmVyKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoYEV4aGF1c3RlZCAke3ZhbHVlfWApO1xufVxuXG5leHBvcnQgdHlwZSBMaXQgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCB8IHZvaWQgfCB7fTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlID0gPFQgZXh0ZW5kcyBMaXRbXT4oLi4uYXJnczogVCkgPT4gYXJncztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1lcmFibGVTeW1ib2woa2V5OiBzdHJpbmcpOiBhbnkge1xuICByZXR1cm4gaW50ZXJuKGBfXyR7a2V5fSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogRGF0ZS5ub3coKSl9X19gKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN5bWJvbCA9IEhBU19OQVRJVkVfU1lNQk9MID8gU3ltYm9sIDogZW51bWVyYWJsZVN5bWJvbDtcbiIsImV4cG9ydCBmdW5jdGlvbiBzdHJpcChzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gIGxldCBvdXQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IHN0cmluZyA9IHN0cmluZ3NbaV07XG4gICAgbGV0IGR5bmFtaWMgPSBhcmdzW2ldICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoYXJnc1tpXSkgOiAnJztcblxuICAgIG91dCArPSBgJHtzdHJpbmd9JHtkeW5hbWljfWA7XG4gIH1cblxuICBsZXQgbGluZXMgPSBvdXQuc3BsaXQoJ1xcbicpO1xuXG4gIHdoaWxlIChsaW5lcy5sZW5ndGggJiYgbGluZXNbMF0ubWF0Y2goL15cXHMqJC8pKSB7XG4gICAgbGluZXMuc2hpZnQoKTtcbiAgfVxuXG4gIHdoaWxlIChsaW5lcy5sZW5ndGggJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0ubWF0Y2goL15cXHMqJC8pKSB7XG4gICAgbGluZXMucG9wKCk7XG4gIH1cblxuICBsZXQgbWluID0gSW5maW5pdHk7XG5cbiAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykge1xuICAgIGxldCBsZWFkaW5nID0gbGluZS5tYXRjaCgvXlxccyovKSFbMF0ubGVuZ3RoO1xuXG4gICAgbWluID0gTWF0aC5taW4obWluLCBsZWFkaW5nKTtcbiAgfVxuXG4gIGxldCBzdHJpcHBlZCA9IFtdO1xuXG4gIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBzdHJpcHBlZC5wdXNoKGxpbmUuc2xpY2UobWluKSk7XG4gIH1cblxuICByZXR1cm4gc3RyaXBwZWQuam9pbignXFxuJyk7XG59XG4iLCJpbXBvcnQgeyBMT0NBTF9ERUJVRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IGRlYnVnQXNzZXJ0IGFzIGFzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcblxuLypcbiAgRW5jb2Rpbmcgbm90ZXNcblxuICBXZSB1c2UgMzAgYml0IGludGVnZXJzIGZvciBlbmNvZGluZywgc28gdGhhdCB3ZSBkb24ndCBldmVyIGVuY29kZSBhIG5vbi1TTUlcbiAgaW50ZWdlciB0byBwdXNoIG9uIHRoZSBzdGFjay5cblxuICBIYW5kbGVzIGFyZSA+PSAwXG4gIEltbWVkaWF0ZXMgYXJlIDwgMFxuXG4gIFRydWUsIEZhbHNlLCBVbmRlZmluZWQgYW5kIE51bGwgYXJlIHB1c2hlZCBhcyBoYW5kbGVzIGludG8gdGhlIHN5bWJvbCB0YWJsZSxcbiAgd2l0aCB3ZWxsIGtub3duIGhhbmRsZXMgKDAsIDEsIDIsIDMpXG5cbiAgVGhlIG5lZ2F0aXZlIHNwYWNlIGlzIGRpdmlkZWQgaW50byBwb3NpdGl2ZXMgYW5kIG5lZ2F0aXZlcy4gUG9zaXRpdmVzIGFyZVxuICBoaWdoZXIgbnVtYmVycyAoLTEsIC0yLCAtMywgZXRjKSwgbmVnYXRpdmVzIGFyZSBsb3dlci5cblxuICBXZSBvbmx5IGVuY29kZSBpbW1lZGlhdGVzIGZvciB0d28gcmVhc29uczpcblxuICAxLiBUbyB0cmFuc2ZlciBvdmVyIHRoZSB3aXJlLCBzbyB0aGV5J3JlIHNtYWxsZXIgaW4gZ2VuZXJhbFxuICAyLiBXaGVuIHB1c2hpbmcgdmFsdWVzIG9udG8gdGhlIHN0YWNrIGZyb20gdGhlIGxvdyBsZXZlbC9pbm5lciBWTSwgd2hpY2ggbWF5XG4gICAgIGJlIGNvbnZlcnRlZCBpbnRvIFdBU00gb25lIGRheS5cblxuICBUaGlzIGFsbG93cyB0aGUgbG93LWxldmVsIFZNIHRvIGFsd2F5cyB1c2UgU01JcywgYW5kIHRvIG1pbmltaXplIHVzaW5nIEpTXG4gIHZhbHVlcyB2aWEgaGFuZGxlcyBmb3IgdGhpbmdzIGxpa2UgdGhlIHN0YWNrIHBvaW50ZXIgYW5kIGZyYW1lIHBvaW50ZXIuXG4gIEV4dGVybmFsbHksIG1vc3QgY29kZSBwdXNoZXMgdmFsdWVzIGFzIEpTIHZhbHVlcywgZXhjZXB0IHdoZW4gYmVpbmcgcHVsbGVkXG4gIGZyb20gdGhlIGFwcGVuZCBieXRlIGNvZGUgd2hlcmUgaXQgd2FzIGFscmVhZHkgZW5jb2RlZC5cblxuICBMb2dpY2FsbHksIHRoaXMgaXMgYmVjYXVzZSB0aGUgbG93IGxldmVsIFZNIGRvZXNuJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlc2VcbiAgaGlnaGVyIGxldmVsIHZhbHVlcy4gRm9yIGluc3RhbmNlLCB0aGUgcmVzdWx0IG9mIGEgdXNlcmxhbmQgaGVscGVyIG1heSBiZSBhXG4gIG51bWJlciwgb3IgYSBib29sZWFuLCBvciB1bmRlZmluZWQvbnVsbCwgYnV0IGl0J3MgZXh0cmEgd29yayB0byBmaWd1cmUgdGhhdFxuICBvdXQgYW5kIHB1c2ggaXQgY29ycmVjdGx5LCB2cy4ganVzdCBwdXNoaW5nIHRoZSB2YWx1ZSBhcyBhIEpTIHZhbHVlIHdpdGggYVxuICBoYW5kbGUuXG5cbiAgTm90ZTogVGhlIGRldGFpbHMgY291bGQgY2hhbmdlIGhlcmUgaW4gdGhlIGZ1dHVyZSwgdGhpcyBpcyBqdXN0IHRoZSBjdXJyZW50XG4gIHN0cmF0ZWd5LlxuKi9cblxuZXhwb3J0IGNvbnN0IGVudW0gSW1tZWRpYXRlQ29uc3RhbnRzIHtcbiAgTUFYX1NNSSA9IDIgKiogMzAgLSAxLFxuICBNSU5fU01JID0gfk1BWF9TTUksXG4gIFNJR05fQklUID0gfigyICoqIDI5KSxcbiAgTUFYX0lOVCA9IH5TSUdOX0JJVCAtIDEsXG4gIE1JTl9JTlQgPSB+TUFYX0lOVCxcblxuICBGQUxTRV9IQU5ETEUgPSAwLFxuICBUUlVFX0hBTkRMRSA9IDEsXG4gIE5VTExfSEFORExFID0gMixcbiAgVU5ERUZJTkVEX0hBTkRMRSA9IDMsXG5cbiAgRU5DT0RFRF9GQUxTRV9IQU5ETEUgPSBGQUxTRV9IQU5ETEUsXG4gIEVOQ09ERURfVFJVRV9IQU5ETEUgPSBUUlVFX0hBTkRMRSxcbiAgRU5DT0RFRF9OVUxMX0hBTkRMRSA9IE5VTExfSEFORExFLFxuICBFTkNPREVEX1VOREVGSU5FRF9IQU5ETEUgPSBVTkRFRklORURfSEFORExFLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIYW5kbGUodmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gdmFsdWUgPj0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uUHJpbWl0aXZlSGFuZGxlKHZhbHVlOiBudW1iZXIpIHtcbiAgcmV0dXJuIHZhbHVlID4gSW1tZWRpYXRlQ29uc3RhbnRzLkVOQ09ERURfVU5ERUZJTkVEX0hBTkRMRTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0YW50cyguLi52YWx1ZXM6IHVua25vd25bXSk6IHVua25vd25bXSB7XG4gIHJldHVybiBbZmFsc2UsIHRydWUsIG51bGwsIHVuZGVmaW5lZCwgLi4udmFsdWVzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU21hbGxJbnQodmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICUgMSA9PT0gMCAmJiB2YWx1ZSA8PSBJbW1lZGlhdGVDb25zdGFudHMuTUFYX0lOVCAmJiB2YWx1ZSA+PSBJbW1lZGlhdGVDb25zdGFudHMuTUlOX0lOVFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlTmVnYXRpdmUobnVtOiBudW1iZXIpIHtcbiAgaWYgKExPQ0FMX0RFQlVHKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgbnVtICUgMSA9PT0gMCAmJiBudW0gPj0gSW1tZWRpYXRlQ29uc3RhbnRzLk1JTl9JTlQgJiYgbnVtIDwgMCxcbiAgICAgIGBDb3VsZCBub3QgZW5jb2RlIG5lZ2F0aXZlOiAke251bX1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBudW0gJiBJbW1lZGlhdGVDb25zdGFudHMuU0lHTl9CSVQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVOZWdhdGl2ZShudW06IG51bWJlcikge1xuICBpZiAoTE9DQUxfREVCVUcpIHtcbiAgICBhc3NlcnQoXG4gICAgICBudW0gJSAxID09PSAwICYmIG51bSA8IH5JbW1lZGlhdGVDb25zdGFudHMuTUFYX0lOVCAmJiBudW0gPj0gSW1tZWRpYXRlQ29uc3RhbnRzLk1JTl9TTUksXG4gICAgICBgQ291bGQgbm90IGRlY29kZSBuZWdhdGl2ZTogJHtudW19YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbnVtIHwgfkltbWVkaWF0ZUNvbnN0YW50cy5TSUdOX0JJVDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBvc2l0aXZlKG51bTogbnVtYmVyKSB7XG4gIGlmIChMT0NBTF9ERUJVRykge1xuICAgIGFzc2VydChcbiAgICAgIG51bSAlIDEgPT09IDAgJiYgbnVtID49IDAgJiYgbnVtIDw9IEltbWVkaWF0ZUNvbnN0YW50cy5NQVhfSU5ULFxuICAgICAgYENvdWxkIG5vdCBlbmNvZGUgcG9zaXRpdmU6ICR7bnVtfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIH5udW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQb3NpdGl2ZShudW06IG51bWJlcikge1xuICBpZiAoTE9DQUxfREVCVUcpIHtcbiAgICBhc3NlcnQoXG4gICAgICBudW0gJSAxID09PSAwICYmIG51bSA8PSAwICYmIG51bSA+PSB+SW1tZWRpYXRlQ29uc3RhbnRzLk1BWF9JTlQsXG4gICAgICBgQ291bGQgbm90IGRlY29kZSBwb3NpdGl2ZTogJHtudW19YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gfm51bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUhhbmRsZShudW06IG51bWJlcikge1xuICBpZiAoTE9DQUxfREVCVUcpIHtcbiAgICBhc3NlcnQoXG4gICAgICBudW0gJSAxID09PSAwICYmIG51bSA+PSAwICYmIG51bSA8PSBJbW1lZGlhdGVDb25zdGFudHMuTUFYX1NNSSxcbiAgICAgIGBDb3VsZCBub3QgZW5jb2RlIGhhbmRsZTogJHtudW19YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbnVtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlSGFuZGxlKG51bTogbnVtYmVyKSB7XG4gIGlmIChMT0NBTF9ERUJVRykge1xuICAgIGFzc2VydChcbiAgICAgIG51bSAlIDEgPT09IDAgJiYgbnVtIDw9IEltbWVkaWF0ZUNvbnN0YW50cy5NQVhfU01JICYmIG51bSA+PSAwLFxuICAgICAgYENvdWxkIG5vdCBkZWNvZGUgaGFuZGxlOiAke251bX1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBudW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVJbW1lZGlhdGUobnVtOiBudW1iZXIpIHtcbiAgbnVtIHw9IDA7XG4gIHJldHVybiBudW0gPCAwID8gZW5jb2RlTmVnYXRpdmUobnVtKSA6IGVuY29kZVBvc2l0aXZlKG51bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVJbW1lZGlhdGUobnVtOiBudW1iZXIpIHtcbiAgbnVtIHw9IDA7XG4gIHJldHVybiBudW0gPiBJbW1lZGlhdGVDb25zdGFudHMuU0lHTl9CSVQgPyBkZWNvZGVQb3NpdGl2ZShudW0pIDogZGVjb2RlTmVnYXRpdmUobnVtKTtcbn1cblxuLy8gV2FybVxuWzEsIDIsIDNdLmZvckVhY2goKHgpID0+IGRlY29kZUhhbmRsZShlbmNvZGVIYW5kbGUoeCkpKTtcblsxLCAtMV0uZm9yRWFjaCgoeCkgPT4gZGVjb2RlSW1tZWRpYXRlKGVuY29kZUltbWVkaWF0ZSh4KSkpO1xuIiwiaW1wb3J0IHsgSGFuZGxlUmVzdWx0LCBUZW1wbGF0ZSwgVGVtcGxhdGVPaywgT2tIYW5kbGUsIEVyckhhbmRsZSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwSGFuZGxlKGhhbmRsZTogSGFuZGxlUmVzdWx0KTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBoYW5kbGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgZXJyb3IgPSBoYW5kbGUuZXJyb3JzWzBdO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29tcGlsZSBFcnJvcjogJHtlcnJvci5wcm9ibGVtfSBAICR7ZXJyb3Iuc3Bhbi5zdGFydH0uLiR7ZXJyb3Iuc3Bhbi5lbmR9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZSk6IFRlbXBsYXRlT2sge1xuICBpZiAodGVtcGxhdGUucmVzdWx0ID09PSAnZXJyb3InKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvbXBpbGUgRXJyb3I6ICR7dGVtcGxhdGUucHJvYmxlbX0gQCAke3RlbXBsYXRlLnNwYW4uc3RhcnR9Li4ke3RlbXBsYXRlLnNwYW4uZW5kfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBsYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEhhbmRsZShoYW5kbGU6IEhhbmRsZVJlc3VsdCk6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgaGFuZGxlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBoYW5kbGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGhhbmRsZS5oYW5kbGU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2tIYW5kbGUoaGFuZGxlOiBIYW5kbGVSZXN1bHQpOiBoYW5kbGUgaXMgT2tIYW5kbGUge1xuICByZXR1cm4gdHlwZW9mIGhhbmRsZSA9PT0gJ251bWJlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyckhhbmRsZShoYW5kbGU6IEhhbmRsZVJlc3VsdCk6IGhhbmRsZSBpcyBFcnJIYW5kbGUge1xuICByZXR1cm4gdHlwZW9mIGhhbmRsZSA9PT0gJ251bWJlcic7XG59XG4iLCJleHBvcnQgZGVmYXVsdCAodHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbidcbiAgPyBXZWFrU2V0XG4gIDogY2xhc3MgV2Vha1NldFBvbHlGaWxsPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgICAgIHByaXZhdGUgX21hcCA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICAgIGFkZCh2YWw6IFQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbWFwLnNldCh2YWwsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgZGVsZXRlKHZhbDogVCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWwpO1xuICAgICAgfVxuXG4gICAgICBoYXModmFsOiBUKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbCk7XG4gICAgICB9XG4gICAgfSkgYXMgV2Vha1NldENvbnN0cnVjdG9yO1xuIiwiaW1wb3J0IHsgdW5yZWFjaGFibGUgfSBmcm9tICcuL3BsYXRmb3JtLXV0aWxzJztcbmltcG9ydCB7IE5vZGVUeXBlLCBTaW1wbGVEb2N1bWVudCwgU2ltcGxlRWxlbWVudCwgU2ltcGxlTm9kZSB9IGZyb20gJ0BzaW1wbGUtZG9tL2ludGVyZmFjZSc7XG5cbmludGVyZmFjZSBHZW5lcmljRWxlbWVudFRhZ3Mge1xuICBIVE1MOiBIVE1MRWxlbWVudDtcbiAgU1ZHOiBTVkdFbGVtZW50O1xuICBFTEVNRU5UOiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQ7XG59XG5cbmludGVyZmFjZSBHZW5lcmljTm9kZVRhZ3Mge1xuICBOT0RFOiBOb2RlO1xufVxuXG50eXBlIEdlbmVyaWNOb2RlVGFnID0ga2V5b2YgR2VuZXJpY05vZGVUYWdzO1xuXG5pbnRlcmZhY2UgQnJvd3NlckVsZW1lbnRUYWdzIGV4dGVuZHMgSFRNTEVsZW1lbnRUYWdOYW1lTWFwLCBHZW5lcmljRWxlbWVudFRhZ3Mge31cbnR5cGUgQnJvd3NlckVsZW1lbnRUYWcgPSBrZXlvZiBCcm93c2VyRWxlbWVudFRhZ3M7XG5cbmludGVyZmFjZSBCcm93c2VyVGFncyBleHRlbmRzIEJyb3dzZXJFbGVtZW50VGFncywgR2VuZXJpY05vZGVUYWdzIHt9XG50eXBlIEJyb3dzZXJUYWcgPSBrZXlvZiBCcm93c2VyVGFncztcblxudHlwZSBOb2RlQ2hlY2s8TiBleHRlbmRzIE5vZGU+ID0gKG5vZGU6IE5vZGUpID0+IG5vZGUgaXMgTjtcbnR5cGUgU3VnYXJ5Tm9kZUNoZWNrPEsgZXh0ZW5kcyBCcm93c2VyVGFnID0gQnJvd3NlclRhZz4gPSBOb2RlQ2hlY2s8QnJvd3NlclRhZ3NbS10+IHwgSyB8IEtbXTtcbnR5cGUgTm9kZUZvclN1Z2FyeUNoZWNrPFMgZXh0ZW5kcyBTdWdhcnlOb2RlQ2hlY2s8QnJvd3NlclRhZz4+ID0gUyBleHRlbmRzIE5vZGVDaGVjazxpbmZlciBOPlxuICA/IE5cbiAgOiBTIGV4dGVuZHMga2V5b2YgQnJvd3NlclRhZ3NcbiAgPyBCcm93c2VyVGFnc1tTXVxuICA6IFMgZXh0ZW5kcyAoa2V5b2YgQnJvd3NlclRhZ3MpW11cbiAgPyBCcm93c2VyVGFnc1tTW251bWJlcl1dXG4gIDogbmV2ZXI7XG5cbnR5cGUgQnJvd3Nlck5vZGUgPSBFbGVtZW50IHwgRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgVGV4dCB8IENvbW1lbnQgfCBOb2RlO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FzdFRvU2ltcGxlKGRvYzogRG9jdW1lbnQgfCBTaW1wbGVEb2N1bWVudCk6IFNpbXBsZURvY3VtZW50O1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3RUb1NpbXBsZShlbGVtOiBFbGVtZW50IHwgU2ltcGxlRWxlbWVudCk6IFNpbXBsZUVsZW1lbnQ7XG5leHBvcnQgZnVuY3Rpb24gY2FzdFRvU2ltcGxlKG5vZGU6IE5vZGUgfCBTaW1wbGVOb2RlKTogU2ltcGxlTm9kZTtcbmV4cG9ydCBmdW5jdGlvbiBjYXN0VG9TaW1wbGUoXG4gIG5vZGU6IERvY3VtZW50IHwgRWxlbWVudCB8IE5vZGUgfCBTaW1wbGVEb2N1bWVudCB8IFNpbXBsZUVsZW1lbnQgfCBTaW1wbGVOb2RlXG4pIHtcbiAgaWYgKGlzRG9jdW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZSBhcyBTaW1wbGVEb2N1bWVudDtcbiAgfSBlbHNlIGlmIChpc0VsZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZSBhcyBTaW1wbGVFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBub2RlIGFzIFNpbXBsZU5vZGU7XG4gIH1cbn1cblxuLy8gSWYgcGFzc2VkIGEgZG9jdW1lbnQsIHZlcmlmeSB3ZSdyZSBpbiB0aGUgYnJvd3NlciBhbmQgcmV0dXJuIGl0IGFzIGEgRG9jdW1lbnRcbmV4cG9ydCBmdW5jdGlvbiBjYXN0VG9Ccm93c2VyKGRvYzogRG9jdW1lbnQgfCBTaW1wbGVEb2N1bWVudCk6IERvY3VtZW50O1xuLy8gSWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMsIGJ1dCB0aGUgY2hlY2sgcmVxdWlyZXMgaXQgdG8gYmUgYW4gZWxlbWVudCxcbi8vIHRoZSBjYXN0IHdpbGwgbWFuZGF0ZSB0aGF0IGl0J3MgYSBicm93c2VyIGVsZW1lbnRcbmV4cG9ydCBmdW5jdGlvbiBjYXN0VG9Ccm93c2VyPFMgZXh0ZW5kcyBTdWdhcnlOb2RlQ2hlY2s8QnJvd3NlckVsZW1lbnRUYWc+PihcbiAgbm9kZTogQnJvd3Nlck5vZGUgfCBTaW1wbGVOb2RlLFxuICBjaGVjazogU1xuKTogTm9kZUZvclN1Z2FyeUNoZWNrPFM+O1xuLy8gRmluYWxseSwgaWYgaXQncyBhIG1vcmUgZ2VuZXJpYyBjaGVjaywgdGhlIGNhc3Qgd2lsbCBtYW5kYXRlIHRoYXQgaXQncyBhXG4vLyBicm93c2VyIG5vZGUgYW5kIHJldHVybiBhIEJyb3dzZXJOb2RlVXRpbHMgY29ycmVzcG9uZGluZyB0byB0aGUgY2hlY2tcbmV4cG9ydCBmdW5jdGlvbiBjYXN0VG9Ccm93c2VyPFMgZXh0ZW5kcyBTdWdhcnlOb2RlQ2hlY2s8R2VuZXJpY05vZGVUYWc+PihcbiAgZWxlbWVudDogQnJvd3Nlck5vZGUgfCBTaW1wbGVOb2RlLFxuICBjaGVjazogU1xuKTogTm9kZUZvclN1Z2FyeUNoZWNrPFM+O1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3RUb0Jyb3dzZXI8SyBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcD4oXG4gIGVsZW1lbnQ6IFNpbXBsZUVsZW1lbnQgfCBFbGVtZW50LFxuICBjaGVjazogS1xuKTogSFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tdO1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3RUb0Jyb3dzZXI8UyBleHRlbmRzIFN1Z2FyeU5vZGVDaGVjaz4oXG4gIG5vZGU6IFNpbXBsZU5vZGUgfCBCcm93c2VyTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHN1Z2FyeUNoZWNrPzogU1xuKTogRG9jdW1lbnQgfCBOb2RlRm9yU3VnYXJ5Q2hlY2s8Uz4gfCBudWxsIHtcbiAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBjYXN0IHRvIGEgYnJvd3NlciBub2RlIGluIGEgbm9uLWJyb3dzZXIgY29udGV4dCcpO1xuICB9XG5cbiAgaWYgKGlzRG9jdW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZSBhcyBEb2N1bWVudDtcbiAgfVxuXG4gIGlmIChub2RlLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0F0dGVtcHRlZCB0byBjYXN0IHRvIGEgYnJvd3NlciBub2RlIHdpdGggYSBub2RlIHRoYXQgd2FzIG5vdCBjcmVhdGVkIGZyb20gdGhpcyBkb2N1bWVudCdcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNoZWNrTm9kZTxTPihub2RlLCBzdWdhcnlDaGVjayEpO1xufVxuXG5mdW5jdGlvbiBjaGVja0Vycm9yKGZyb206IHN0cmluZywgY2hlY2s6IFN1Z2FyeU5vZGVDaGVjayk6IEVycm9yIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgY2Fubm90IGNhc3QgYSAke2Zyb219IGludG8gJHtjaGVja31gKTtcbn1cblxuZnVuY3Rpb24gaXNEb2N1bWVudChub2RlOiBOb2RlIHwgU2ltcGxlTm9kZSB8IFNpbXBsZURvY3VtZW50KTogbm9kZSBpcyBEb2N1bWVudCB8IFNpbXBsZURvY3VtZW50IHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IE5vZGVUeXBlLkRPQ1VNRU5UX05PREU7XG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlOiBOb2RlIHwgU2ltcGxlTm9kZSB8IFNpbXBsZUVsZW1lbnQpOiBub2RlIGlzIEVsZW1lbnQgfCBTaW1wbGVFbGVtZW50IHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IE5vZGVUeXBlLkVMRU1FTlRfTk9ERTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTm9kZTxTIGV4dGVuZHMgU3VnYXJ5Tm9kZUNoZWNrPihcbiAgbm9kZTogTm9kZSB8IG51bGwsXG4gIGNoZWNrOiBTXG4pOiBOb2RlRm9yU3VnYXJ5Q2hlY2s8Uz4ge1xuICBsZXQgaXNNYXRjaCA9IGZhbHNlO1xuXG4gIGlmIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBjaGVjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlzTWF0Y2ggPSBzdHJpbmdDaGVja05vZGUobm9kZSwgY2hlY2sgYXMgQnJvd3NlclRhZyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNoZWNrKSkge1xuICAgICAgaXNNYXRjaCA9IGNoZWNrLnNvbWUoKGMpID0+IHN0cmluZ0NoZWNrTm9kZShub2RlLCBjIGFzIEJyb3dzZXJUYWcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNNYXRjaCkge1xuICAgIHJldHVybiBub2RlIGFzIE5vZGVGb3JTdWdhcnlDaGVjazxTPjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBjaGVja0Vycm9yKGBTaW1wbGVFbGVtZW50KCR7bm9kZX0pYCwgY2hlY2spO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ0NoZWNrTm9kZTxTIGV4dGVuZHMgQnJvd3NlclRhZz4obm9kZTogTm9kZSwgY2hlY2s6IFMpOiBub2RlIGlzIEJyb3dzZXJUYWdzW1NdIHtcbiAgc3dpdGNoIChjaGVjaykge1xuICAgIGNhc2UgJ05PREUnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAnSFRNTCc6XG4gICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xuICAgIGNhc2UgJ1NWRyc6XG4gICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG4gICAgY2FzZSAnRUxFTUVOVCc6XG4gICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChjaGVjay50b1VwcGVyQ2FzZSgpID09PSBjaGVjaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJVRzogdGhpcyBjb2RlIGlzIG1pc3NpbmcgaGFuZGxpbmcgZm9yIGEgZ2VuZXJpYyBub2RlIHR5cGVgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gY2hlY2s7XG4gIH1cbn1cbiIsImltcG9ydCB7IE9wdGlvbiwgUHJlc2VudEFycmF5IH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZXNlbnQ8VD4obGlzdDogcmVhZG9ubHkgVFtdKTogbGlzdCBpcyBQcmVzZW50QXJyYXk8VD4ge1xuICByZXR1cm4gbGlzdC5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWZQcmVzZW50PFQsIFUsIFY+KFxuICBsaXN0OiBUW10sXG4gIGlmUHJlc2VudDogKGlucHV0OiBQcmVzZW50QXJyYXk8VD4pID0+IFUsXG4gIG90aGVyd2lzZTogKCkgPT4gVlxuKTogVSB8IFYge1xuICBpZiAoaXNQcmVzZW50KGxpc3QpKSB7XG4gICAgcmV0dXJuIGlmUHJlc2VudChsaXN0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb3RoZXJ3aXNlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUHJlc2VudE9wdGlvbjxUPihsaXN0OiBUW10pOiBPcHRpb248UHJlc2VudEFycmF5PFQ+PiB7XG4gIGlmIChpc1ByZXNlbnQobGlzdCkpIHtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHJlc2VudDxUPihcbiAgbGlzdDogVFtdLFxuICBtZXNzYWdlID0gYHVuZXhwZWN0ZWQgZW1wdHkgbGlzdGBcbik6IGFzc2VydHMgbGlzdCBpcyBQcmVzZW50QXJyYXk8VD4ge1xuICBpZiAoIWlzUHJlc2VudChsaXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwUHJlc2VudDxULCBVPihsaXN0OiBQcmVzZW50QXJyYXk8VD4sIGNhbGxiYWNrOiAoaW5wdXQ6IFQpID0+IFUpOiBQcmVzZW50QXJyYXk8VT47XG5leHBvcnQgZnVuY3Rpb24gbWFwUHJlc2VudDxULCBVPihcbiAgbGlzdDogUHJlc2VudEFycmF5PFQ+IHwgbnVsbCxcbiAgY2FsbGJhY2s6IChpbnB1dDogVCkgPT4gVVxuKTogUHJlc2VudEFycmF5PFU+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBtYXBQcmVzZW50PFQsIFU+KFxuICBsaXN0OiBQcmVzZW50QXJyYXk8VD4gfCBudWxsLFxuICBjYWxsYmFjazogKGlucHV0OiBUKSA9PiBVXG4pOiBQcmVzZW50QXJyYXk8VT4gfCBudWxsIHtcbiAgaWYgKGxpc3QgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsZXQgb3V0OiBVW10gPSBbXTtcblxuICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcbiAgICBvdXQucHVzaChjYWxsYmFjayhpdGVtKSk7XG4gIH1cblxuICByZXR1cm4gb3V0IGFzIFByZXNlbnRBcnJheTxVPjtcbn1cbiIsImltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCB7IEhBU19OQVRJVkVfUFJPWFkgfSBmcm9tICcuL3BsYXRmb3JtLXV0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRVbnRvdWNoYWJsZVRoaXMoc291cmNlOiBzdHJpbmcpOiBudWxsIHwgb2JqZWN0IHtcbiAgbGV0IGNvbnRleHQ6IG51bGwgfCBvYmplY3QgPSBudWxsO1xuICBpZiAoREVCVUcgJiYgSEFTX05BVElWRV9QUk9YWSkge1xuICAgIGxldCBhc3NlcnRPblByb3BlcnR5ID0gKHByb3BlcnR5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBhY2Nlc3NlZCBcXGB0aGlzLiR7U3RyaW5nKFxuICAgICAgICAgIHByb3BlcnR5XG4gICAgICAgICl9XFxgIGZyb20gYSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlICR7c291cmNlfSwgYnV0IHRoZSBmdW5jdGlvbiBpdHNlbGYgd2FzIG5vdCBib3VuZCB0byBhIHZhbGlkIFxcYHRoaXNcXGAgY29udGV4dC4gQ29uc2lkZXIgdXBkYXRpbmcgdG8gdXNlIGEgYm91bmQgZnVuY3Rpb24gKGZvciBpbnN0YW5jZSwgdXNlIGFuIGFycm93IGZ1bmN0aW9uLCBcXGAoKSA9PiB7fVxcYCkuYFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29udGV4dCA9IG5ldyBQcm94eShcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBnZXQoX3RhcmdldDoge30sIHByb3BlcnR5OiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgICAgICBhc3NlcnRPblByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQoX3RhcmdldDoge30sIHByb3BlcnR5OiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgICAgICBhc3NlcnRPblByb3BlcnR5KHByb3BlcnR5KTtcblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBoYXMoX3RhcmdldDoge30sIHByb3BlcnR5OiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgICAgICBhc3NlcnRPblByb3BlcnR5KHByb3BlcnR5KTtcblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG4iLCJpbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5cbmxldCBkZWJ1Z1RvU3RyaW5nOiB1bmRlZmluZWQgfCAoKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcpO1xuXG5pZiAoREVCVUcpIHtcbiAgbGV0IGdldEZ1bmN0aW9uTmFtZSA9IChmbjogRnVuY3Rpb24pID0+IHtcbiAgICBsZXQgZnVuY3Rpb25OYW1lID0gZm4ubmFtZTtcblxuICAgIGlmIChmdW5jdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IG1hdGNoID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZm4pLm1hdGNoKC9mdW5jdGlvbiAoXFx3KylcXHMqXFwoLyk7XG5cbiAgICAgIGZ1bmN0aW9uTmFtZSA9IChtYXRjaCAmJiBtYXRjaFsxXSkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uTmFtZS5yZXBsYWNlKC9eYm91bmQgLywgJycpO1xuICB9O1xuXG4gIGxldCBnZXRPYmplY3ROYW1lID0gKG9iajogb2JqZWN0KSA9PiB7XG4gICAgbGV0IG5hbWU7XG4gICAgbGV0IGNsYXNzTmFtZTtcblxuICAgIGlmIChvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2xhc3NOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKG9iai5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgJ3RvU3RyaW5nJyBpbiBvYmogJiZcbiAgICAgIG9iai50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAmJlxuICAgICAgb2JqLnRvU3RyaW5nICE9PSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmdcbiAgICApIHtcbiAgICAgIG5hbWUgPSBvYmoudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY2xhc3MgaGFzIGEgZGVjZW50IGxvb2tpbmcgbmFtZSwgYW5kIHRoZSBgdG9TdHJpbmdgIGlzIG9uZSBvZiB0aGVcbiAgICAvLyBkZWZhdWx0IEVtYmVyIHRvU3RyaW5ncywgcmVwbGFjZSB0aGUgY29uc3RydWN0b3IgcG9ydGlvbiBvZiB0aGUgdG9TdHJpbmdcbiAgICAvLyB3aXRoIHRoZSBjbGFzcyBuYW1lLiBXZSBjaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBjbGFzcyBuYW1lIHRvIHByZXZlbnQgZG9pbmdcbiAgICAvLyB0aGlzIHdoZW4gdGhlIHZhbHVlIGlzIG1pbmlmaWVkLlxuICAgIGlmIChcbiAgICAgIG5hbWUgJiZcbiAgICAgIG5hbWUubWF0Y2goLzwuKjplbWJlclxcZCs+LykgJiZcbiAgICAgIGNsYXNzTmFtZSAmJlxuICAgICAgY2xhc3NOYW1lWzBdICE9PSAnXycgJiZcbiAgICAgIGNsYXNzTmFtZS5sZW5ndGggPiAyICYmXG4gICAgICBjbGFzc05hbWUgIT09ICdDbGFzcydcbiAgICApIHtcbiAgICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLzwuKjovLCBgPCR7Y2xhc3NOYW1lfTpgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZSB8fCBjbGFzc05hbWU7XG4gIH07XG5cbiAgbGV0IGdldFByaW1pdGl2ZU5hbWUgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9O1xuXG4gIGRlYnVnVG9TdHJpbmcgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZ2V0RnVuY3Rpb25OYW1lKHZhbHVlKSB8fCBgKHVua25vd24gZnVuY3Rpb24pYDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBnZXRPYmplY3ROYW1lKHZhbHVlKSB8fCBgKHVua25vd24gb2JqZWN0KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXRQcmltaXRpdmVOYW1lKHZhbHVlKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlYnVnVG9TdHJpbmc7XG4iLCJpbXBvcnQgeyBMT0NBTF9ERUJVRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi9hc3NlcnQnO1xuaW1wb3J0IHsgZXhwZWN0IH0gZnJvbSAnLi9wbGF0Zm9ybS11dGlscyc7XG5cbmV4cG9ydCBsZXQgYmVnaW5UZXN0U3RlcHM6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgZW5kVGVzdFN0ZXBzOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBsZXQgdmVyaWZ5U3RlcHM6XG4gIHwgKCh0eXBlOiBzdHJpbmcsIHN0ZXBzOiB1bmtub3duW10gfCAoKHN0ZXBzOiB1bmtub3duW10pID0+IHZvaWQpLCBtZXNzYWdlPzogc3RyaW5nKSA9PiB2b2lkKVxuICB8IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgbG9nU3RlcDogKCh0eXBlOiBzdHJpbmcsIHN0ZXBzOiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuaWYgKExPQ0FMX0RFQlVHKSB7XG4gIGxldCBMT0dHRURfU1RFUFM6IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT4gfCBudWxsID0gbnVsbDtcblxuICBiZWdpblRlc3RTdGVwcyA9ICgpID0+IHtcbiAgICBhc3NlcnQoTE9HR0VEX1NURVBTID09PSBudWxsLCAnYXR0ZW1wdGVkIHRvIHN0YXJ0IHN0ZXBzLCBidXQgaXQgYWxyZWFkeSBiZWdhbicpO1xuXG4gICAgTE9HR0VEX1NURVBTID0ge307XG4gIH07XG5cbiAgZW5kVGVzdFN0ZXBzID0gKCkgPT4ge1xuICAgIGFzc2VydChMT0dHRURfU1RFUFMsICdhdHRlbXB0ZWQgdG8gZW5kIHN0ZXBzLCBidXQgdGhleSB3ZXJlIG5vdCBzdGFydGVkJyk7XG5cbiAgICBMT0dHRURfU1RFUFMgPSBudWxsO1xuICB9O1xuXG4gIGxvZ1N0ZXAgPSAodHlwZTogc3RyaW5nLCBzdGVwOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKExPR0dFRF9TVEVQUyA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgTE9HR0VEX1NURVBTW3R5cGVdID0gTE9HR0VEX1NURVBTW3R5cGVdIHx8IFtdO1xuICAgIExPR0dFRF9TVEVQU1t0eXBlXS5wdXNoKHN0ZXApO1xuICB9O1xuXG4gIHZlcmlmeVN0ZXBzID0gKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBleHBlY3RlZFN0ZXBzOiB1bmtub3duW10gfCAoKHN0ZXBzOiB1bmtub3duW10pID0+IHZvaWQpLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmdcbiAgKSA9PiB7XG4gICAgbGV0IGxvZ2dlZFN0ZXBzID0gZXhwZWN0KExPR0dFRF9TVEVQUywgJ2F0dGVtcGV0ZCB0byB2ZXJpZnkgc3RlcHMsIGJ1dCBzdGVwcyB3ZXJlIG5vdCBzdGFydGVkJyk7XG5cbiAgICBsZXQgc3RlcHMgPSBsb2dnZWRTdGVwc1t0eXBlXSB8fCBbXTtcblxuICAgIGxvZ2dlZFN0ZXBzW3R5cGVdID0gW107XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZFN0ZXBzKSkge1xuICAgICAgUVVuaXQuY29uZmlnLmN1cnJlbnQuYXNzZXJ0LmRlZXBFcXVhbChzdGVwcywgZXhwZWN0ZWRTdGVwcywgbWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGVjdGVkU3RlcHMoc3RlcHMpO1xuICAgIH1cbiAgfTtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vbGliL2FycmF5LXV0aWxzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzZXJ0LCBkZXByZWNhdGUgfSBmcm9tICcuL2xpYi9hc3NlcnQnO1xuZXhwb3J0IHsgZGljdCwgaXNEaWN0LCBpc09iamVjdCwgU3RhY2tJbXBsIGFzIFN0YWNrIH0gZnJvbSAnLi9saWIvY29sbGVjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZG9tJztcbmV4cG9ydCB7XG4gIGlzU2VyaWFsaXphdGlvbkZpcnN0Tm9kZSxcbiAgU0VSSUFMSVpBVElPTl9GSVJTVF9OT0RFX1NUUklORyxcbn0gZnJvbSAnLi9saWIvaXMtc2VyaWFsaXphdGlvbi1maXJzdC1ub2RlJztcbmV4cG9ydCB7IGFzc2lnbiwgZmlsbE51bGxzLCB2YWx1ZXMgfSBmcm9tICcuL2xpYi9vYmplY3QtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcGxhdGZvcm0tdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc3RyaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ltbWVkaWF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90ZW1wbGF0ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIF9XZWFrU2V0IH0gZnJvbSAnLi9saWIvd2Vhay1zZXQnO1xuZXhwb3J0IHsgY2FzdFRvU2ltcGxlLCBjYXN0VG9Ccm93c2VyLCBjaGVja05vZGUgfSBmcm9tICcuL2xpYi9zaW1wbGUtY2FzdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9wcmVzZW50JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW50ZXJuIH0gZnJvbSAnLi9saWIvaW50ZXJuJztcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBidWlsZFVudG91Y2hhYmxlVGhpcyB9IGZyb20gJy4vbGliL3VudG91Y2hhYmxlLXRoaXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZWJ1Z1RvU3RyaW5nIH0gZnJvbSAnLi9saWIvZGVidWctdG8tc3RyaW5nJztcbmV4cG9ydCB7IGJlZ2luVGVzdFN0ZXBzLCBlbmRUZXN0U3RlcHMsIGxvZ1N0ZXAsIHZlcmlmeVN0ZXBzIH0gZnJvbSAnLi9saWIvZGVidWctc3RlcHMnO1xuXG5leHBvcnQgdHlwZSBGSVhNRTxULCBTIGV4dGVuZHMgc3RyaW5nPiA9IChUICYgUykgfCBUO1xuXG4vKipcbiAqIFRoaXMgY29uc3RhbnQgZXhpc3RzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRpZmZlcmVudGlhdGUgbm9ybWFsIGxvZ3MgZnJvbVxuICogZXJyYW50IGNvbnNvbGUubG9ncy4gTE9DQUxfTE9HR0VSIHNob3VsZCBvbmx5IGJlIHVzZWQgaW5zaWRlIGFcbiAqIExPQ0FMX1NIT1VMRF9MT0cgY2hlY2suXG4gKlxuICogSXQgZG9lcyBub3QgYWxsZXZpYXRlIHRoZSBuZWVkIHRvIGNoZWNrIExPQ0FMX1NIT1VMRF9MT0csIHdoaWNoIGlzIHVzZWRcbiAqIGZvciBzdHJpcHBpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0NBTF9MT0dHRVIgPSBjb25zb2xlO1xuXG4vKipcbiAqIFRoaXMgY29uc3RhbnQgZXhpc3RzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRpZmZlcmVudGlhdGUgbm9ybWFsIGxvZ3MgZnJvbVxuICogZXJyYW50IGNvbnNvbGUubG9ncy4gTE9HR0VSIGNhbiBiZSB1c2VkIG91dHNpZGUgb2YgTE9DQUxfU0hPVUxEX0xPRyBjaGVja3MsXG4gKiBhbmQgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiB0aGUgcmFyZSBzaXR1YXRpb24gd2hlcmUgYSBjb25zb2xlLiogY2FsbCBpc1xuICogYWN0dWFsbHkgYXBwcm9wcmlhdGUuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0dHRVIgPSBjb25zb2xlO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWU6IG5ldmVyLCBkZXNjID0gJ3VuZXhwZWN0ZWQgdW5yZWFjaGFibGUgYnJhbmNoJyk6IG5ldmVyIHtcbiAgTE9HR0VSLmxvZygndW5yZWFjaGFibGUnLCB2YWx1ZSk7XG4gIExPR0dFUi5sb2coYCR7ZGVzY30gOjogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9ICgke3ZhbHVlfSlgKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoYGNvZGUgcmVhY2hlZCB1bnJlYWNoYWJsZWApO1xufVxuIl0sIm5hbWVzIjpbIkRFQlVHIl0sIm1hcHBpbmdzIjoiOztNQUFhLFdBQVcsR0FBdUIsTUFBTSxDQUFOLE1BQUEsQ0FBeEMsRUFBd0M7RUFFekMsU0FBQSxVQUFBLEdBQW9CO0VBQ3hCLFNBQUEsV0FBQTtFQUNEO01BRVksa0JBQWtCLEdBQUcsVUFBM0I7TUFDTSxrQkFBa0IsR0FBRyxVQUEzQjtFQUVQOzs7OztFQUlNLFNBQUEsWUFBQSxDQUFBLEtBQUEsRUFBNEQ7RUFDaEUsU0FBTyxLQUFLLEtBQVosV0FBQTtFQUNEOztFQ2ZEO0FBRUE7QUFJQSxFQUFNLFNBQUEsV0FBQSxDQUFBLElBQUEsRUFBQSxHQUFBLEVBQTRDO0VBQ2hEO0VBQ0E7RUFDQTtFQUNBO0VBRUEsTUFBSSxDQUFKLElBQUEsRUFBVztFQUNULFVBQU0sSUFBQSxLQUFBLENBQVUsR0FBRyxJQUFuQixtQkFBTSxDQUFO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
|