UNPKG

ember-legacy-class-transform

Version:
366 lines (346 loc) 50.4 kB
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import { initializeGuid, fillNulls, unreachable, typePos } from '@glimmer/util'; /** * Registers * * For the most part, these follows MIPS naming conventions, however the * register numbers are different. */ export var Register; (function (Register) { // $0 or $pc (program counter): pointer into `program` for the next insturction; -1 means exit Register[Register["pc"] = 0] = "pc"; // $1 or $ra (return address): pointer into `program` for the return Register[Register["ra"] = 1] = "ra"; // $2 or $fp (frame pointer): pointer into the `evalStack` for the base of the stack Register[Register["fp"] = 2] = "fp"; // $3 or $sp (stack pointer): pointer into the `evalStack` for the top of the stack Register[Register["sp"] = 3] = "sp"; // $4-$5 or $s0-$s1 (saved): callee saved general-purpose registers Register[Register["s0"] = 4] = "s0"; Register[Register["s1"] = 5] = "s1"; // $6-$7 or $t0-$t1 (temporaries): caller saved general-purpose registers Register[Register["t0"] = 6] = "t0"; Register[Register["t1"] = 7] = "t1"; })(Register || (Register = {})); export function debugSlice(env, start, end) { if (!false && false) { /* tslint:disable:no-console */ var program = env.program; var constants = program.constants; // console is not available in IE9 if (typeof console === 'undefined') { return; } // IE10 does not have `console.group` if (typeof console.group !== 'function') { return; } console.group("%c" + start + ":" + end, 'color: #999'); for (var i = start; i < end; i = i + 4) { var _program$opcode = program.opcode(i), type = _program$opcode.type, op1 = _program$opcode.op1, op2 = _program$opcode.op2, op3 = _program$opcode.op3; var _debug = debug(constants, type, op1, op2, op3), name = _debug[0], params = _debug[1]; console.log(i + ". " + logOpcode(name, params)); } console.groupEnd(); /* tslint:enable:no-console */ } } function logOpcode(type, params) { if (!false && false) { var out = type; if (params) { var args = Object.keys(params).map(function (p) { return " " + p + "=" + json(params[p]); }).join(''); out += args; } return "(" + out + ")"; } } function json(param) { if (typeof param === 'function') { return '<function>'; } var string = void 0; try { string = JSON.stringify(param); } catch (e) { return '<cannot generate JSON>'; } if (string === undefined) { return 'undefined'; } var debug = JSON.parse(string); if (typeof debug === 'object' && debug !== null && debug.GlimmerDebug !== undefined) { return debug.GlimmerDebug; } return string; } function debug(c, op, op1, op2, op3) { if (!false && false) { switch (op) { case 0 /* Bug */: throw unreachable(); case 1 /* Helper */: return ['Helper', { helper: c.getFunction(op1) }]; case 2 /* Function */: return ['Function', { function: c.getFunction(op1) }]; case 4 /* SetVariable */: return ['SetVariable', { symbol: op1 }]; case 5 /* GetVariable */: return ['GetVariable', { symbol: op1 }]; case 6 /* GetProperty */: return ['GetProperty', { key: c.getString(op1) }]; case 7 /* PushBlock */: return ['PushBlock', { block: c.getBlock(op1) }]; case 8 /* GetBlock */: return ['GetBlock', { symbol: op1 }]; case 9 /* HasBlock */: return ['HasBlock', { block: op1 }]; case 10 /* HasBlockParams */: return ['HasBlockParams', { block: op1 }]; case 11 /* Concat */: return ['Concat', { size: op1 }]; case 12 /* Immediate */: return ['Immediate', { value: op1 }]; case 13 /* Constant */: return ['Constant', { value: c.getOther(op1) }]; case 14 /* PrimitiveReference */: return ['PrimitiveReference', { primitive: op1 }]; case 15 /* Dup */: return ['Dup', { register: Register[op1], offset: op2 }]; case 16 /* Pop */: return ['Pop', { count: op1 }]; case 17 /* Load */: return ['Load', { register: Register[op1] }]; case 18 /* Fetch */: return ['Fetch', { register: Register[op1] }]; /// PRELUDE & EXIT case 19 /* RootScope */: return ['RootScope', { symbols: op1, bindCallerScope: !!op2 }]; case 20 /* ChildScope */: return ['ChildScope', {}]; case 21 /* PopScope */: return ['PopScope', {}]; case 22 /* Return */: return ['Return', {}]; case 23 /* ReturnTo */: return ['ReturnTo', { offset: op1 }]; /// HTML case 24 /* Text */: return ['Text', { text: c.getString(op1) }]; case 25 /* Comment */: return ['Comment', { comment: c.getString(op1) }]; case 26 /* DynamicContent */: return ['DynamicContent', { value: c.getOther(op1) }]; case 27 /* OpenElement */: return ['OpenElement', { tag: c.getString(op1) }]; case 28 /* OpenElementWithOperations */: return ['OpenElementWithOperations', { tag: c.getString(op1) }]; case 29 /* OpenDynamicElement */: return ['OpenDynamicElement', {}]; case 30 /* StaticAttr */: return ['StaticAttr', { name: c.getString(op1), value: c.getString(op2), namespace: op3 ? c.getString(op3) : null }]; case 31 /* DynamicAttr */: return ['DynamicAttr', { name: c.getString(op1), trusting: !!op2 }]; case 32 /* DynamicAttrNS */: return ['DynamicAttrNS', { name: c.getString(op1), ns: c.getString(op2), trusting: !!op2 }]; case 33 /* FlushElement */: return ['FlushElement', {}]; case 34 /* CloseElement */: return ['CloseElement', {}]; /// MODIFIER case 35 /* Modifier */: return ['Modifier', {}]; /// WORMHOLE case 36 /* PushRemoteElement */: return ['PushRemoteElement', {}]; case 37 /* PopRemoteElement */: return ['PopRemoteElement', {}]; /// DYNAMIC SCOPE case 38 /* BindDynamicScope */: return ['BindDynamicScope', {}]; case 39 /* PushDynamicScope */: return ['PushDynamicScope', {}]; case 40 /* PopDynamicScope */: return ['PopDynamicScope', {}]; /// VM case 41 /* CompileDynamicBlock */: return ['CompileDynamicBlock', {}]; case 42 /* InvokeStatic */: return ['InvokeStatic', { block: c.getBlock(op1) }]; case 43 /* InvokeDynamic */: return ['InvokeDynamic', { invoker: c.getOther(op1) }]; case 44 /* Jump */: return ['Jump', { to: op1 }]; case 45 /* JumpIf */: return ['JumpIf', { to: op1 }]; case 46 /* JumpUnless */: return ['JumpUnless', { to: op1 }]; case 47 /* PushFrame */: return ['PushFrame', {}]; case 48 /* PopFrame */: return ['PopFrame', {}]; case 49 /* Enter */: return ['Enter', { args: op1 }]; case 50 /* Exit */: return ['Exit', {}]; case 51 /* Test */: return ['ToBoolean', {}]; /// LISTS case 52 /* EnterList */: return ['EnterList', { start: op1 }]; case 53 /* ExitList */: return ['ExitList', {}]; case 54 /* PutIterator */: return ['PutIterator', {}]; case 55 /* Iterate */: return ['Iterate', { end: op1 }]; /// COMPONENTS case 56 /* PushComponentManager */: return ['PushComponentManager', { definition: c.getOther(op1) }]; case 57 /* PushDynamicComponentManager */: return ['PushDynamicComponentManager', {}]; case 58 /* PushArgs */: return ['PushArgs', { synthetic: !!op2 }]; case 59 /* PrepareArgs */: return ['PrepareArgs', { state: Register[op1] }]; case 60 /* CreateComponent */: return ['CreateComponent', { flags: op1, state: Register[op2] }]; case 61 /* RegisterComponentDestructor */: return ['RegisterComponentDestructor', {}]; case 62 /* PushComponentOperations */: return ['PushComponentOperations', {}]; case 63 /* GetComponentSelf */: return ['GetComponentSelf', { state: Register[op1] }]; case 64 /* GetComponentLayout */: return ['GetComponentLayout', { state: Register[op1] }]; case 65 /* BeginComponentTransaction */: return ['BeginComponentTransaction', {}]; case 66 /* CommitComponentTransaction */: return ['CommitComponentTransaction', {}]; case 67 /* DidCreateElement */: return ['DidCreateElement', { state: Register[op1] }]; case 68 /* DidRenderLayout */: return ['DidRenderLayout', {}]; /// PARTIALS case 69 /* GetPartialTemplate */: return ['CompilePartial', {}]; case 70 /* ResolveMaybeLocal */: return ['ResolveMaybeLocal', { name: c.getString(op1) }]; /// DEBUGGER case 71 /* Debugger */: return ['Debugger', { symbols: c.getOther(op1), evalInfo: c.getArray(op2) }]; /// STATEMENTS case 72 /* Size */: throw unreachable(); } throw unreachable(); } return ['', {}]; } export var AppendOpcodes = function () { function AppendOpcodes() { _classCallCheck(this, AppendOpcodes); this.evaluateOpcode = fillNulls(72 /* Size */).slice(); } AppendOpcodes.prototype.add = function add(name, evaluate) { this.evaluateOpcode[name] = evaluate; }; AppendOpcodes.prototype.evaluate = function evaluate(vm, opcode, type) { var func = this.evaluateOpcode[type]; if (!false && false) { /* tslint:disable */ var _debug2 = debug(vm.constants, opcode.type, opcode.op1, opcode.op2, opcode.op3), name = _debug2[0], params = _debug2[1]; console.log(typePos(vm['pc']) + ". " + logOpcode(name, params)); // console.log(...debug(vm.constants, type, opcode.op1, opcode.op2, opcode.op3)); /* tslint:enable */ } func(vm, opcode); if (!false && false) { /* tslint:disable */ console.log('%c -> pc: %d, ra: %d, fp: %d, sp: %d, s0: %O, s1: %O, t0: %O, t1: %O', 'color: orange', vm['pc'], vm['ra'], vm['fp'], vm['sp'], vm['s0'], vm['s1'], vm['t0'], vm['t1']); console.log('%c -> eval stack', 'color: red', vm.stack.toArray()); console.log('%c -> scope', 'color: green', vm.scope()['slots'].map(function (s) { return s && s['value'] ? s['value']() : s; })); console.log('%c -> elements', 'color: blue', vm.elements()['elementStack'].toArray()); /* tslint:enable */ } }; return AppendOpcodes; }(); export var APPEND_OPCODES = new AppendOpcodes(); export var AbstractOpcode = function () { function AbstractOpcode() { _classCallCheck(this, AbstractOpcode); initializeGuid(this); } AbstractOpcode.prototype.toJSON = function toJSON() { return { guid: this._guid, type: this.type }; }; return AbstractOpcode; }(); export var UpdatingOpcode = function (_AbstractOpcode) { _inherits(UpdatingOpcode, _AbstractOpcode); function UpdatingOpcode() { _classCallCheck(this, UpdatingOpcode); var _this = _possibleConstructorReturn(this, _AbstractOpcode.apply(this, arguments)); _this.next = null; _this.prev = null; return _this; } return UpdatingOpcode; }(AbstractOpcode); export function inspect(opcodes) { var buffer = []; opcodes.forEach(function (opcode, i) { _inspect(opcode.toJSON(), buffer, 0, i); }); return buffer.join(''); } function _inspect(opcode, buffer, level, index) { var indentation = []; for (var i = 0; i < level; i++) { indentation.push(' '); } buffer.push.apply(buffer, indentation); buffer.push(index + ". " + opcode.type); if (opcode.args || opcode.details) { buffer.push('('); if (opcode.args) { buffer.push(opcode.args.join(', ')); } if (opcode.details) { var keys = Object.keys(opcode.details); if (keys.length) { if (opcode.args && opcode.args.length) { buffer.push(', '); } buffer.push(keys.map(function (key) { return key + "=" + (opcode.details && opcode.details[key]); }).join(', ')); } } buffer.push(')'); } buffer.push('\n'); if (opcode.children && opcode.children.length) { for (var _i = 0; _i < opcode.children.length; _i++) { _inspect(opcode.children[_i], buffer, level + 1, _i); } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9vcGNvZGVzLmpzIl0sIm5hbWVzIjpbImluaXRpYWxpemVHdWlkIiwiZmlsbE51bGxzIiwidW5yZWFjaGFibGUiLCJ0eXBlUG9zIiwiUmVnaXN0ZXIiLCJkZWJ1Z1NsaWNlIiwiZW52Iiwic3RhcnQiLCJlbmQiLCJwcm9ncmFtIiwiY29uc3RhbnRzIiwiY29uc29sZSIsImdyb3VwIiwiaSIsIm9wY29kZSIsInR5cGUiLCJvcDEiLCJvcDIiLCJvcDMiLCJkZWJ1ZyIsIm5hbWUiLCJwYXJhbXMiLCJsb2ciLCJsb2dPcGNvZGUiLCJncm91cEVuZCIsIm91dCIsImFyZ3MiLCJPYmplY3QiLCJrZXlzIiwibWFwIiwicCIsImpzb24iLCJqb2luIiwicGFyYW0iLCJzdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsInVuZGVmaW5lZCIsInBhcnNlIiwiR2xpbW1lckRlYnVnIiwiYyIsIm9wIiwiaGVscGVyIiwiZ2V0RnVuY3Rpb24iLCJmdW5jdGlvbiIsInN5bWJvbCIsImtleSIsImdldFN0cmluZyIsImJsb2NrIiwiZ2V0QmxvY2siLCJzaXplIiwidmFsdWUiLCJnZXRPdGhlciIsInByaW1pdGl2ZSIsInJlZ2lzdGVyIiwib2Zmc2V0IiwiY291bnQiLCJzeW1ib2xzIiwiYmluZENhbGxlclNjb3BlIiwidGV4dCIsImNvbW1lbnQiLCJ0YWciLCJuYW1lc3BhY2UiLCJ0cnVzdGluZyIsIm5zIiwiaW52b2tlciIsInRvIiwiZGVmaW5pdGlvbiIsInN5bnRoZXRpYyIsInN0YXRlIiwiZmxhZ3MiLCJldmFsSW5mbyIsImdldEFycmF5IiwiQXBwZW5kT3Bjb2RlcyIsImV2YWx1YXRlT3Bjb2RlIiwic2xpY2UiLCJhZGQiLCJldmFsdWF0ZSIsInZtIiwiZnVuYyIsInN0YWNrIiwidG9BcnJheSIsInNjb3BlIiwicyIsImVsZW1lbnRzIiwiQVBQRU5EX09QQ09ERVMiLCJBYnN0cmFjdE9wY29kZSIsInRvSlNPTiIsImd1aWQiLCJfZ3VpZCIsIlVwZGF0aW5nT3Bjb2RlIiwiYXJndW1lbnRzIiwibmV4dCIsInByZXYiLCJpbnNwZWN0Iiwib3Bjb2RlcyIsImJ1ZmZlciIsImZvckVhY2giLCJfaW5zcGVjdCIsImxldmVsIiwiaW5kZXgiLCJpbmRlbnRhdGlvbiIsInB1c2giLCJkZXRhaWxzIiwibGVuZ3RoIiwiY2hpbGRyZW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsU0FBU0EsY0FBVCxFQUF5QkMsU0FBekIsRUFBb0NDLFdBQXBDLEVBQWlEQyxPQUFqRCxRQUFnRSxlQUFoRTs7QUFFQTs7Ozs7O0FBTUEsT0FBTyxJQUFJQyxRQUFKO0FBQ1AsQ0FBQyxVQUFVQSxRQUFWLEVBQW9CO0FBQ2pCO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBQSxhQUFTQSxTQUFTLElBQVQsSUFBaUIsQ0FBMUIsSUFBK0IsSUFBL0I7QUFDQTtBQUNBQSxhQUFTQSxTQUFTLElBQVQsSUFBaUIsQ0FBMUIsSUFBK0IsSUFBL0I7QUFDQUEsYUFBU0EsU0FBUyxJQUFULElBQWlCLENBQTFCLElBQStCLElBQS9CO0FBQ0gsQ0FmRCxFQWVHQSxhQUFhQSxXQUFXLEVBQXhCLENBZkg7QUFnQkEsT0FBTyxTQUFTQyxVQUFULENBQW9CQyxHQUFwQixFQUF5QkMsS0FBekIsRUFBZ0NDLEdBQWhDLEVBQXFDO0FBQ3hDLFFBQUksQ0FBQyxLQUFELElBQVUsS0FBZCxFQUFxQjtBQUNqQjtBQURpQixZQUVYQyxPQUZXLEdBRUNILEdBRkQsQ0FFWEcsT0FGVztBQUFBLFlBR1hDLFNBSFcsR0FH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Z0JBLEtBQUlDLE9BQU80RixRQUFQLENBQWdCRCxNQUFwQyxFQUE0QzVGLElBQTVDLEVBQWlEO0FBQzdDc0YscUJBQVNyRixPQUFPNEYsUUFBUCxDQUFnQjdGLEVBQWhCLENBQVQsRUFBNkJvRixNQUE3QixFQUFxQ0csUUFBUSxDQUE3QyxFQUFnRHZGLEVBQWhEO0FBQ0g7QUFDSjtBQUNKIiwiZmlsZSI6ImxpYi9vcGNvZGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5pdGlhbGl6ZUd1aWQsIGZpbGxOdWxscywgdW5yZWFjaGFibGUsIHR5cGVQb3MgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuLyoqXG4gKiBSZWdpc3RlcnNcbiAqXG4gKiBGb3IgdGhlIG1vc3QgcGFydCwgdGhlc2UgZm9sbG93cyBNSVBTIG5hbWluZyBjb252ZW50aW9ucywgaG93ZXZlciB0aGVcbiAqIHJlZ2lzdGVyIG51bWJlcnMgYXJlIGRpZmZlcmVudC5cbiAqL1xuZXhwb3J0IHZhciBSZWdpc3RlcjtcbihmdW5jdGlvbiAoUmVnaXN0ZXIpIHtcbiAgICAvLyAkMCBvciAkcGMgKHByb2dyYW0gY291bnRlcik6IHBvaW50ZXIgaW50byBgcHJvZ3JhbWAgZm9yIHRoZSBuZXh0IGluc3R1cmN0aW9uOyAtMSBtZWFucyBleGl0XG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJwY1wiXSA9IDBdID0gXCJwY1wiO1xuICAgIC8vICQxIG9yICRyYSAocmV0dXJuIGFkZHJlc3MpOiBwb2ludGVyIGludG8gYHByb2dyYW1gIGZvciB0aGUgcmV0dXJuXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJyYVwiXSA9IDFdID0gXCJyYVwiO1xuICAgIC8vICQyIG9yICRmcCAoZnJhbWUgcG9pbnRlcik6IHBvaW50ZXIgaW50byB0aGUgYGV2YWxTdGFja2AgZm9yIHRoZSBiYXNlIG9mIHRoZSBzdGFja1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wiZnBcIl0gPSAyXSA9IFwiZnBcIjtcbiAgICAvLyAkMyBvciAkc3AgKHN0YWNrIHBvaW50ZXIpOiBwb2ludGVyIGludG8gdGhlIGBldmFsU3RhY2tgIGZvciB0aGUgdG9wIG9mIHRoZSBzdGFja1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wic3BcIl0gPSAzXSA9IFwic3BcIjtcbiAgICAvLyAkNC0kNSBvciAkczAtJHMxIChzYXZlZCk6IGNhbGxlZSBzYXZlZCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJzMFwiXSA9IDRdID0gXCJzMFwiO1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wiczFcIl0gPSA1XSA9IFwiczFcIjtcbiAgICAvLyAkNi0kNyBvciAkdDAtJHQxICh0ZW1wb3Jhcmllcyk6IGNhbGxlciBzYXZlZCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJ0MFwiXSA9IDZdID0gXCJ0MFwiO1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1widDFcIl0gPSA3XSA9IFwidDFcIjtcbn0pKFJlZ2lzdGVyIHx8IChSZWdpc3RlciA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gZGVidWdTbGljZShlbnYsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIWZhbHNlICYmIGZhbHNlKSB7XG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGUgKi9cbiAgICAgICAgbGV0IHsgcHJvZ3JhbSB9ID0gZW52O1xuICAgICAgICBsZXQgeyBjb25zdGFudHMgfSA9IHByb2dyYW07XG4gICAgICAgIC8vIGNvbnNvbGUgaXMgbm90IGF2YWlsYWJsZSBpbiBJRTlcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElFMTAgZG9lcyBub3QgaGF2ZSBgY29uc29sZS5ncm91cGBcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLmdyb3VwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5ncm91cChgJWMke3N0YXJ0fToke2VuZH1gLCAnY29sb3I6ICM5OTknKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpID0gaSArIDQpIHtcbiAgICAgICAgICAgIGxldCB7IHR5cGUsIG9wMSwgb3AyLCBvcDMgfSA9IHByb2dyYW0ub3Bjb2RlKGkpO1xuICAgICAgICAgICAgbGV0IFtuYW1lLCBwYXJhbXNdID0gZGVidWcoY29uc3RhbnRzLCB0eXBlLCBvcDEsIG9wMiwgb3AzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2l9LiAke2xvZ09wY29kZShuYW1lLCBwYXJhbXMpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgLyogdHNsaW50OmVuYWJsZTpuby1jb25zb2xlICovXG4gICAgfVxufVxuZnVuY3Rpb24gbG9nT3Bjb2RlKHR5cGUsIHBhcmFtcykge1xuICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgbGV0IG91dCA9IHR5cGU7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIGxldCBhcmdzID0gT2JqZWN0LmtleXMocGFyYW1zKS5tYXAocCA9PiBgICR7cH09JHtqc29uKHBhcmFtc1twXSl9YCkuam9pbignJyk7XG4gICAgICAgICAgICBvdXQgKz0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgke291dH0pYDtcbiAgICB9XG59XG5mdW5jdGlvbiBqc29uKHBhcmFtKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gJzxmdW5jdGlvbj4nO1xuICAgIH1cbiAgICBsZXQgc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICAgIHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHBhcmFtKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAnPGNhbm5vdCBnZW5lcmF0ZSBKU09OPic7XG4gICAgfVxuICAgIGlmIChzdHJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIGxldCBkZWJ1ZyA9IEpTT04ucGFyc2Uoc3RyaW5nKTtcbiAgICBpZiAodHlwZW9mIGRlYnVnID09PSAnb2JqZWN0JyAmJiBkZWJ1ZyAhPT0gbnVsbCAmJiBkZWJ1Zy5HbGltbWVyRGVidWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGVidWcuR2xpbW1lckRlYnVnO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nO1xufVxuZnVuY3Rpb24gZGVidWcoYywgb3AsIG9wMSwgb3AyLCBvcDMpIHtcbiAgICBpZiAoIWZhbHNlICYmIGZhbHNlKSB7XG4gICAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgICAgIGNhc2UgMCAvKiBCdWcgKi86XG4gICAgICAgICAgICAgICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBIZWxwZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSGVscGVyJywgeyBoZWxwZXI6IGMuZ2V0RnVuY3Rpb24ob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBGdW5jdGlvbiAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGdW5jdGlvbicsIHsgZnVuY3Rpb246IGMuZ2V0RnVuY3Rpb24ob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgNCAvKiBTZXRWYXJpYWJsZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydTZXRWYXJpYWJsZScsIHsgc3ltYm9sOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDUgLyogR2V0VmFyaWFibGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnR2V0VmFyaWFibGUnLCB7IHN5bWJvbDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA2IC8qIEdldFByb3BlcnR5ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0dldFByb3BlcnR5JywgeyBrZXk6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDcgLyogUHVzaEJsb2NrICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1B1c2hCbG9jaycsIHsgYmxvY2s6IGMuZ2V0QmxvY2sob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgOCAvKiBHZXRCbG9jayAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydHZXRCbG9jaycsIHsgc3ltYm9sOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDkgLyogSGFzQmxvY2sgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSGFzQmxvY2snLCB7IGJsb2NrOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEwIC8qIEhhc0Jsb2NrUGFyYW1zICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0hhc0Jsb2NrUGFyYW1zJywgeyBibG9jazogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSAxMSAvKiBDb25jYXQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29uY2F0JywgeyBzaXplOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEyIC8qIEltbWVkaWF0ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydJbW1lZGlhdGUnLCB7IHZhbHVlOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEzIC8qIENvbnN0YW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NvbnN0YW50JywgeyB2YWx1ZTogYy5nZXRPdGhlcihvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSAxNCAvKiBQcmltaXRpdmVSZWZlcmVuY2UgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHJpbWl0aXZlUmVmZXJlbmNlJywgeyBwcmltaXRpdmU6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgMTUgLyogRHVwICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0R1cCcsIHsgcmVnaXN0ZXI6IFJlZ2lzdGVyW29wMV0sIG9mZnNldDogb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAxNiAvKiBQb3AgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wJywgeyBjb3VudDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSAxNyAvKiBMb2FkICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0xvYWQnLCB7IHJlZ2lzdGVyOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSAxOCAvKiBGZXRjaCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGZXRjaCcsIHsgcmVnaXN0ZXI6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICAvLy8gUFJFTFVERSAmIEVYSVRcbiAgICAgICAgICAgIGNhc2UgMTkgLyogUm9vdFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1Jvb3RTY29wZScsIHsgc3ltYm9sczogb3AxLCBiaW5kQ2FsbGVyU2NvcGU6ICEhb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAyMCAvKiBDaGlsZFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NoaWxkU2NvcGUnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDIxIC8qIFBvcFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1BvcFNjb3BlJywge31dO1xuICAgICAgICAgICAgY2FzZSAyMiAvKiBSZXR1cm4gKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUmV0dXJuJywge31dO1xuICAgICAgICAgICAgY2FzZSAyMyAvKiBSZXR1cm5UbyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydSZXR1cm5UbycsIHsgb2Zmc2V0OiBvcDEgfV07XG4gICAgICAgICAgICAvLy8gSFRNTFxuICAgICAgICAgICAgY2FzZSAyNCAvKiBUZXh0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1RleHQnLCB7IHRleHQ6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI1IC8qIENvbW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29tbWVudCcsIHsgY29tbWVudDogYy5nZXRTdHJpbmcob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMjYgLyogRHluYW1pY0NvbnRlbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRHluYW1pY0NvbnRlbnQnLCB7IHZhbHVlOiBjLmdldE90aGVyKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI3IC8qIE9wZW5FbGVtZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ09wZW5FbGVtZW50JywgeyB0YWc6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI4IC8qIE9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnT3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucycsIHsgdGFnOiBjLmdldFN0cmluZyhvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSAyOSAvKiBPcGVuRHluYW1pY0VsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnT3BlbkR5bmFtaWNFbGVtZW50Jywge31dO1xuICAgICAgICAgICAgY2FzZSAzMCAvKiBTdGF0aWNBdHRyICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1N0YXRpY0F0dHInLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSksIHZhbHVlOiBjLmdldFN0cmluZyhvcDIpLCBuYW1lc3BhY2U6IG9wMyA/IGMuZ2V0U3RyaW5nKG9wMykgOiBudWxsIH1dO1xuICAgICAgICAgICAgY2FzZSAzMSAvKiBEeW5hbWljQXR0ciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydEeW5hbWljQXR0cicsIHsgbmFtZTogYy5nZXRTdHJpbmcob3AxKSwgdHJ1c3Rpbmc6ICEhb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAzMiAvKiBEeW5hbWljQXR0ck5TICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0R5bmFtaWNBdHRyTlMnLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSksIG5zOiBjLmdldFN0cmluZyhvcDIpLCB0cnVzdGluZzogISFvcDIgfV07XG4gICAgICAgICAgICBjYXNlIDMzIC8qIEZsdXNoRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGbHVzaEVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDM0IC8qIENsb3NlRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDbG9zZUVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICAvLy8gTU9ESUZJRVJcbiAgICAgICAgICAgIGNhc2UgMzUgLyogTW9kaWZpZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnTW9kaWZpZXInLCB7fV07XG4gICAgICAgICAgICAvLy8gV09STUhPTEVcbiAgICAgICAgICAgIGNhc2UgMzYgLyogUHVzaFJlbW90ZUVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaFJlbW90ZUVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDM3IC8qIFBvcFJlbW90ZUVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wUmVtb3RlRWxlbWVudCcsIHt9XTtcbiAgICAgICAgICAgIC8vLyBEWU5BTUlDIFNDT1BFXG4gICAgICAgICAgICBjYXNlIDM4IC8qIEJpbmREeW5hbWljU2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQmluZER5bmFtaWNTY29wZScsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgMzkgLyogUHVzaER5bmFtaWNTY29wZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoRHluYW1pY1Njb3BlJywge31dO1xuICAgICAgICAgICAgY2FzZSA0MCAvKiBQb3BEeW5hbWljU2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wRHluYW1pY1Njb3BlJywge31dO1xuICAgICAgICAgICAgLy8vIFZNXG4gICAgICAgICAgICBjYXNlIDQxIC8qIENvbXBpbGVEeW5hbWljQmxvY2sgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29tcGlsZUR5bmFtaWNCbG9jaycsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNDIgLyogSW52b2tlU3RhdGljICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0ludm9rZVN0YXRpYycsIHsgYmxvY2s6IGMuZ2V0QmxvY2sob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDMgLyogSW52b2tlRHluYW1pYyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydJbnZva2VEeW5hbWljJywgeyBpbnZva2VyOiBjLmdldE90aGVyKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDQ0IC8qIEp1bXAgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSnVtcCcsIHsgdG86IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDUgLyogSnVtcElmICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0p1bXBJZicsIHsgdG86IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDYgLyogSnVtcFVubGVzcyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydKdW1wVW5sZXNzJywgeyB0bzogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA0NyAvKiBQdXNoRnJhbWUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaEZyYW1lJywge31dO1xuICAgICAgICAgICAgY2FzZSA0OCAvKiBQb3BGcmFtZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQb3BGcmFtZScsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNDkgLyogRW50ZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRW50ZXInLCB7IGFyZ3M6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNTAgLyogRXhpdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydFeGl0Jywge31dO1xuICAgICAgICAgICAgY2FzZSA1MSAvKiBUZXN0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1RvQm9vbGVhbicsIHt9XTtcbiAgICAgICAgICAgIC8vLyBMSVNUU1xuICAgICAgICAgICAgY2FzZSA1MiAvKiBFbnRlckxpc3QgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRW50ZXJMaXN0JywgeyBzdGFydDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA1MyAvKiBFeGl0TGlzdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydFeGl0TGlzdCcsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNTQgLyogUHV0SXRlcmF0b3IgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHV0SXRlcmF0b3InLCB7fV07XG4gICAgICAgICAgICBjYXNlIDU1IC8qIEl0ZXJhdGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSXRlcmF0ZScsIHsgZW5kOiBvcDEgfV07XG4gICAgICAgICAgICAvLy8gQ09NUE9ORU5UU1xuICAgICAgICAgICAgY2FzZSA1NiAvKiBQdXNoQ29tcG9uZW50TWFuYWdlciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoQ29tcG9uZW50TWFuYWdlcicsIHsgZGVmaW5pdGlvbjogYy5nZXRPdGhlcihvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSA1NyAvKiBQdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyJywge31dO1xuICAgICAgICAgICAgY2FzZSA1OCAvKiBQdXNoQXJncyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoQXJncycsIHsgc3ludGhldGljOiAhIW9wMiB9XTtcbiAgICAgICAgICAgIGNhc2UgNTkgLyogUHJlcGFyZUFyZ3MgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHJlcGFyZUFyZ3MnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2MCAvKiBDcmVhdGVDb21wb25lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ3JlYXRlQ29tcG9uZW50JywgeyBmbGFnczogb3AxLCBzdGF0ZTogUmVnaXN0ZXJbb3AyXSB9XTtcbiAgICAgICAgICAgIGNhc2UgNjEgLyogUmVnaXN0ZXJDb21wb25lbnREZXN0cnVjdG9yICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1JlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvcicsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNjIgLyogUHVzaENvbXBvbmVudE9wZXJhdGlvbnMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaENvbXBvbmVudE9wZXJhdGlvbnMnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDYzIC8qIEdldENvbXBvbmVudFNlbGYgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnR2V0Q29tcG9uZW50U2VsZicsIHsgc3RhdGU6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICBjYXNlIDY0IC8qIEdldENvbXBvbmVudExheW91dCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydHZXRDb21wb25lbnRMYXlvdXQnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2NSAvKiBCZWdpbkNvbXBvbmVudFRyYW5zYWN0aW9uICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0JlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24nLCB7fV07XG4gICAgICAgICAgICBjYXNlIDY2IC8qIENvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uJywge31dO1xuICAgICAgICAgICAgY2FzZSA2NyAvKiBEaWRDcmVhdGVFbGVtZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0RpZENyZWF0ZUVsZW1lbnQnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2OCAvKiBEaWRSZW5kZXJMYXlvdXQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRGlkUmVuZGVyTGF5b3V0Jywge31dO1xuICAgICAgICAgICAgLy8vIFBBUlRJQUxTXG4gICAgICAgICAgICBjYXNlIDY5IC8qIEdldFBhcnRpYWxUZW1wbGF0ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDb21waWxlUGFydGlhbCcsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNzAgLyogUmVzb2x2ZU1heWJlTG9jYWwgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUmVzb2x2ZU1heWJlTG9jYWwnLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICAvLy8gREVCVUdHRVJcbiAgICAgICAgICAgIGNhc2UgNzEgLyogRGVidWdnZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRGVidWdnZXInLCB7IHN5bWJvbHM6IGMuZ2V0T3RoZXIob3AxKSwgZXZhbEluZm86IGMuZ2V0QXJyYXkob3AyKSB9XTtcbiAgICAgICAgICAgIC8vLyBTVEFURU1FTlRTXG4gICAgICAgICAgICBjYXNlIDcyIC8qIFNpemUgKi86XG4gICAgICAgICAgICAgICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyB1bnJlYWNoYWJsZSgpO1xuICAgIH1cbiAgICByZXR1cm4gWycnLCB7fV07XG59XG5leHBvcnQgY2xhc3MgQXBwZW5kT3Bjb2RlcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVPcGNvZGUgPSBmaWxsTnVsbHMoNzIgLyogU2l6ZSAqLykuc2xpY2UoKTtcbiAgICB9XG4gICAgYWRkKG5hbWUsIGV2YWx1YXRlKSB7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVPcGNvZGVbbmFtZV0gPSBldmFsdWF0ZTtcbiAgICB9XG4gICAgZXZhbHVhdGUodm0sIG9wY29kZSwgdHlwZSkge1xuICAgICAgICBsZXQgZnVuYyA9IHRoaXMuZXZhbHVhdGVPcGNvZGVbdHlwZV07XG4gICAgICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlICovXG4gICAgICAgICAgICBsZXQgW25hbWUsIHBhcmFtc10gPSBkZWJ1Zyh2bS5jb25zdGFudHMsIG9wY29kZS50eXBlLCBvcGNvZGUub3AxLCBvcGNvZGUub3AyLCBvcGNvZGUub3AzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3R5cGVQb3Modm1bJ3BjJ10pfS4gJHtsb2dPcGNvZGUobmFtZSwgcGFyYW1zKX1gKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKC4uLmRlYnVnKHZtLmNvbnN0YW50cywgdHlwZSwgb3Bjb2RlLm9wMSwgb3Bjb2RlLm9wMiwgb3Bjb2RlLm9wMykpO1xuICAgICAgICAgICAgLyogdHNsaW50OmVuYWJsZSAqL1xuICAgICAgICB9XG4gICAgICAgIGZ1bmModm0sIG9wY29kZSk7XG4gICAgICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlICovXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgLT4gcGM6ICVkLCByYTogJWQsIGZwOiAlZCwgc3A6ICVkLCBzMDogJU8sIHMxOiAlTywgdDA6ICVPLCB0MTogJU8nLCAnY29sb3I6IG9yYW5nZScsIHZtWydwYyddLCB2bVsncmEnXSwgdm1bJ2ZwJ10sIHZtWydzcCddLCB2bVsnczAnXSwgdm1bJ3MxJ10sIHZtWyd0MCddLCB2bVsndDEnXSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgLT4gZXZhbCBzdGFjaycsICdjb2xvcjogcmVkJywgdm0uc3RhY2sudG9BcnJheSgpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAtPiBzY29wZScsICdjb2xvcjogZ3JlZW4nLCB2bS5zY29wZSgpWydzbG90cyddLm1hcChzID0+IHMgJiYgc1sndmFsdWUnXSA/IHNbJ3ZhbHVlJ10oKSA6IHMpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAtPiBlbGVtZW50cycsICdjb2xvcjogYmx1ZScsIHZtLmVsZW1lbnRzKClbJ2VsZW1lbnRTdGFjayddLnRvQXJyYXkoKSk7XG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovXG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY29uc3QgQVBQRU5EX09QQ09ERVMgPSBuZXcgQXBwZW5kT3Bjb2RlcygpO1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0T3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5pdGlhbGl6ZUd1aWQodGhpcyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgZ3VpZDogdGhpcy5fZ3VpZCwgdHlwZTogdGhpcy50eXBlIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVwZGF0aW5nT3Bjb2RlIGV4dGVuZHMgQWJzdHJhY3RPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0KG9wY29kZXMpIHtcbiAgICBsZXQgYnVmZmVyID0gW107XG4gICAgb3Bjb2Rlcy5mb3JFYWNoKChvcGNvZGUsIGkpID0+IHtcbiAgICAgICAgX2luc3BlY3Qob3Bjb2RlLnRvSlNPTigpLCBidWZmZXIsIDAsIGkpO1xuICAgIH0pO1xuICAgIHJldHVybiBidWZmZXIuam9pbignJyk7XG59XG5mdW5jdGlvbiBfaW5zcGVjdChvcGNvZGUsIGJ1ZmZlciwgbGV2ZWwsIGluZGV4KSB7XG4gICAgbGV0IGluZGVudGF0aW9uID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7XG4gICAgICAgIGluZGVudGF0aW9uLnB1c2goJyAgJyk7XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKC4uLmluZGVudGF0aW9uKTtcbiAgICBidWZmZXIucHVzaChgJHtpbmRleH0uICR7b3Bjb2RlLnR5cGV9YCk7XG4gICAgaWYgKG9wY29kZS5hcmdzIHx8IG9wY29kZS5kZXRhaWxzKSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKCcoJyk7XG4gICAgICAgIGlmIChvcGNvZGUuYXJncykge1xuICAgICAgICAgICAgYnVmZmVyLnB1c2gob3Bjb2RlLmFyZ3Muam9pbignLCAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wY29kZS5kZXRhaWxzKSB7XG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG9wY29kZS5kZXRhaWxzKTtcbiAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChvcGNvZGUuYXJncyAmJiBvcGNvZGUuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goJywgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGtleXMubWFwKGtleSA9PiBgJHtrZXl9PSR7b3Bjb2RlLmRldGFpbHMgJiYgb3Bjb2RlLmRldGFpbHNba2V5XX1gKS5qb2luKC