UNPKG

ember-legacy-class-transform

Version:
703 lines (557 loc) 65.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BasicOpcodeBuilder = undefined; var _util = require("@glimmer/util"); var _compiler = require("../../compiler"); var _opcodes = require("../../opcodes"); var _functions = require("../../syntax/functions"); var _rawBlock = require("../../syntax/raw-block"); var _rawBlock2 = _interopRequireDefault(_rawBlock); var _content = require("../opcodes/content"); var _content2 = require("./content"); var content = _interopRequireWildcard(_content2); var _vm = require("./vm"); var vm = _interopRequireWildcard(_vm); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _createClass = function () { 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); } }return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; }; }(); 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"); } } var Labels = function () { function Labels() { _classCallCheck(this, Labels); this.labels = (0, _util.dict)(); this.targets = []; } Labels.prototype.label = function label(name, index) { this.labels[name] = index; }; Labels.prototype.target = function target(at, Target, _target) { this.targets.push({ at: at, Target: Target, target: _target }); }; Labels.prototype.patch = function patch(program) { var targets = this.targets, labels = this.labels; for (var i = 0; i < targets.length; i++) { var _targets$i = targets[i], at = _targets$i.at, target = _targets$i.target; var goto = labels[target] - at; program.heap.setbyaddr(at + 1, goto); } }; return Labels; }(); var BasicOpcodeBuilder = function () { function BasicOpcodeBuilder(env, meta, program) { _classCallCheck(this, BasicOpcodeBuilder); this.env = env; this.meta = meta; this.program = program; this.labelsStack = new _util.Stack(); this.constants = program.constants; this.heap = program.heap; this.start = this.heap.malloc(); } BasicOpcodeBuilder.prototype.upvars = function upvars(count) { return (0, _util.fillNulls)(count); }; BasicOpcodeBuilder.prototype.reserve = function reserve(name) { this.push(name, 0, 0, 0); }; BasicOpcodeBuilder.prototype.push = function push(name) { var op1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var op2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var op3 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; this.heap.push(name); this.heap.push(op1); this.heap.push(op2); this.heap.push(op3); }; BasicOpcodeBuilder.prototype.finalize = function finalize() { this.push(22 /* Return */); this.heap.finishMalloc(this.start); return this.start; }; // args BasicOpcodeBuilder.prototype.pushArgs = function pushArgs(synthetic) { this.push(58 /* PushArgs */, synthetic === true ? 1 : 0); }; // helpers BasicOpcodeBuilder.prototype.startLabels = function startLabels() { this.labelsStack.push(new Labels()); }; BasicOpcodeBuilder.prototype.stopLabels = function stopLabels() { var label = this.labelsStack.pop(); label.patch(this.program); }; // components BasicOpcodeBuilder.prototype.pushComponentManager = function pushComponentManager(definition) { this.push(56 /* PushComponentManager */, this.other(definition)); }; BasicOpcodeBuilder.prototype.pushDynamicComponentManager = function pushDynamicComponentManager() { this.push(57 /* PushDynamicComponentManager */); }; BasicOpcodeBuilder.prototype.prepareArgs = function prepareArgs(state) { this.push(59 /* PrepareArgs */, state); }; BasicOpcodeBuilder.prototype.createComponent = function createComponent(state, hasDefault, hasInverse) { var flag = (hasDefault === true ? 1 : 0) | (hasInverse === true ? 1 : 0) << 1; this.push(60 /* CreateComponent */, flag, state); }; BasicOpcodeBuilder.prototype.registerComponentDestructor = function registerComponentDestructor(state) { this.push(61 /* RegisterComponentDestructor */, state); }; BasicOpcodeBuilder.prototype.beginComponentTransaction = function beginComponentTransaction() { this.push(65 /* BeginComponentTransaction */); }; BasicOpcodeBuilder.prototype.commitComponentTransaction = function commitComponentTransaction() { this.push(66 /* CommitComponentTransaction */); }; BasicOpcodeBuilder.prototype.pushComponentOperations = function pushComponentOperations() { this.push(62 /* PushComponentOperations */); }; BasicOpcodeBuilder.prototype.getComponentSelf = function getComponentSelf(state) { this.push(63 /* GetComponentSelf */, state); }; BasicOpcodeBuilder.prototype.getComponentLayout = function getComponentLayout(state) { this.push(64 /* GetComponentLayout */, state); }; BasicOpcodeBuilder.prototype.didCreateElement = function didCreateElement(state) { this.push(67 /* DidCreateElement */, state); }; BasicOpcodeBuilder.prototype.didRenderLayout = function didRenderLayout(state) { this.push(68 /* DidRenderLayout */, state); }; // partial BasicOpcodeBuilder.prototype.getPartialTemplate = function getPartialTemplate() { this.push(69 /* GetPartialTemplate */); }; BasicOpcodeBuilder.prototype.resolveMaybeLocal = function resolveMaybeLocal(name) { this.push(70 /* ResolveMaybeLocal */, this.string(name)); }; // debugger BasicOpcodeBuilder.prototype.debugger = function _debugger(symbols, evalInfo) { this.push(71 /* Debugger */, this.constants.other(symbols), this.constants.array(evalInfo)); }; // content BasicOpcodeBuilder.prototype.dynamicContent = function dynamicContent(Opcode) { this.push(26 /* DynamicContent */, this.other(Opcode)); }; BasicOpcodeBuilder.prototype.cautiousAppend = function cautiousAppend() { this.dynamicContent(new content.OptimizedCautiousAppendOpcode()); }; BasicOpcodeBuilder.prototype.trustingAppend = function trustingAppend() { this.dynamicContent(new content.OptimizedTrustingAppendOpcode()); }; // dom BasicOpcodeBuilder.prototype.text = function text(_text) { this.push(24 /* Text */, this.constants.string(_text)); }; BasicOpcodeBuilder.prototype.openPrimitiveElement = function openPrimitiveElement(tag) { this.push(27 /* OpenElement */, this.constants.string(tag)); }; BasicOpcodeBuilder.prototype.openElementWithOperations = function openElementWithOperations(tag) { this.push(28 /* OpenElementWithOperations */, this.constants.string(tag)); }; BasicOpcodeBuilder.prototype.openDynamicElement = function openDynamicElement() { this.push(29 /* OpenDynamicElement */); }; BasicOpcodeBuilder.prototype.flushElement = function flushElement() { this.push(33 /* FlushElement */); }; BasicOpcodeBuilder.prototype.closeElement = function closeElement() { this.push(34 /* CloseElement */); }; BasicOpcodeBuilder.prototype.staticAttr = function staticAttr(_name, _namespace, _value) { var name = this.constants.string(_name); var namespace = _namespace ? this.constants.string(_namespace) : 0; var value = this.constants.string(_value); this.push(30 /* StaticAttr */, name, value, namespace); }; BasicOpcodeBuilder.prototype.dynamicAttrNS = function dynamicAttrNS(_name, _namespace, trusting) { var name = this.constants.string(_name); var namespace = this.constants.string(_namespace); this.push(32 /* DynamicAttrNS */, name, namespace, trusting === true ? 1 : 0); }; BasicOpcodeBuilder.prototype.dynamicAttr = function dynamicAttr(_name, trusting) { var name = this.constants.string(_name); this.push(31 /* DynamicAttr */, name, trusting === true ? 1 : 0); }; BasicOpcodeBuilder.prototype.comment = function comment(_comment) { var comment = this.constants.string(_comment); this.push(25 /* Comment */, comment); }; BasicOpcodeBuilder.prototype.modifier = function modifier(_definition) { this.push(35 /* Modifier */, this.other(_definition)); }; // lists BasicOpcodeBuilder.prototype.putIterator = function putIterator() { this.push(54 /* PutIterator */); }; BasicOpcodeBuilder.prototype.enterList = function enterList(start) { this.reserve(52 /* EnterList */); this.labels.target(this.pos, 52 /* EnterList */, start); }; BasicOpcodeBuilder.prototype.exitList = function exitList() { this.push(53 /* ExitList */); }; BasicOpcodeBuilder.prototype.iterate = function iterate(breaks) { this.reserve(55 /* Iterate */); this.labels.target(this.pos, 55 /* Iterate */, breaks); }; // expressions BasicOpcodeBuilder.prototype.setVariable = function setVariable(symbol) { this.push(4 /* SetVariable */, symbol); }; BasicOpcodeBuilder.prototype.getVariable = function getVariable(symbol) { this.push(5 /* GetVariable */, symbol); }; BasicOpcodeBuilder.prototype.getProperty = function getProperty(key) { this.push(6 /* GetProperty */, this.string(key)); }; BasicOpcodeBuilder.prototype.getBlock = function getBlock(symbol) { this.push(8 /* GetBlock */, symbol); }; BasicOpcodeBuilder.prototype.hasBlock = function hasBlock(symbol) { this.push(9 /* HasBlock */, symbol); }; BasicOpcodeBuilder.prototype.hasBlockParams = function hasBlockParams(symbol) { this.push(10 /* HasBlockParams */, symbol); }; BasicOpcodeBuilder.prototype.concat = function concat(size) { this.push(11 /* Concat */, size); }; BasicOpcodeBuilder.prototype.function = function _function(f) { this.push(2 /* Function */, this.func(f)); }; BasicOpcodeBuilder.prototype.load = function load(register) { this.push(17 /* Load */, register); }; BasicOpcodeBuilder.prototype.fetch = function fetch(register) { this.push(18 /* Fetch */, register); }; BasicOpcodeBuilder.prototype.dup = function dup() { var register = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _opcodes.Register.sp; var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return this.push(15 /* Dup */, register, offset); }; BasicOpcodeBuilder.prototype.pop = function pop() { var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; return this.push(16 /* Pop */, count); }; // vm BasicOpcodeBuilder.prototype.pushRemoteElement = function pushRemoteElement() { this.push(36 /* PushRemoteElement */); }; BasicOpcodeBuilder.prototype.popRemoteElement = function popRemoteElement() { this.push(37 /* PopRemoteElement */); }; BasicOpcodeBuilder.prototype.label = function label(name) { this.labels.label(name, this.nextPos); }; BasicOpcodeBuilder.prototype.pushRootScope = function pushRootScope(symbols, bindCallerScope) { this.push(19 /* RootScope */, symbols, bindCallerScope ? 1 : 0); }; BasicOpcodeBuilder.prototype.pushChildScope = function pushChildScope() { this.push(20 /* ChildScope */); }; BasicOpcodeBuilder.prototype.popScope = function popScope() { this.push(21 /* PopScope */); }; BasicOpcodeBuilder.prototype.returnTo = function returnTo(label) { this.reserve(23 /* ReturnTo */); this.labels.target(this.pos, 23 /* ReturnTo */, label); }; BasicOpcodeBuilder.prototype.pushDynamicScope = function pushDynamicScope() { this.push(39 /* PushDynamicScope */); }; BasicOpcodeBuilder.prototype.popDynamicScope = function popDynamicScope() { this.push(40 /* PopDynamicScope */); }; BasicOpcodeBuilder.prototype.pushImmediate = function pushImmediate(value) { this.push(13 /* Constant */, this.other(value)); }; BasicOpcodeBuilder.prototype.primitive = function primitive(_primitive) { var flag = 0; var primitive = void 0; switch (typeof _primitive) { case 'number': if (_primitive % 1 === 0 && _primitive > 0) { primitive = _primitive; } else { primitive = this.float(_primitive); flag = 1; } break; case 'string': primitive = this.string(_primitive); flag = 2; break; case 'boolean': primitive = _primitive | 0; flag = 3; break; case 'object': // assume null primitive = 2; flag = 3; break; case 'undefined': primitive = 3; flag = 3; break; default: throw new Error('Invalid primitive passed to pushPrimitive'); } this.push(14 /* PrimitiveReference */, flag << 30 | primitive); }; BasicOpcodeBuilder.prototype.helper = function helper(func) { this.push(1 /* Helper */, this.func(func)); }; BasicOpcodeBuilder.prototype.pushBlock = function pushBlock(block) { this.push(7 /* PushBlock */, this.block(block)); }; BasicOpcodeBuilder.prototype.bindDynamicScope = function bindDynamicScope(_names) { this.push(38 /* BindDynamicScope */, this.names(_names)); }; BasicOpcodeBuilder.prototype.enter = function enter(args) { this.push(49 /* Enter */, args); }; BasicOpcodeBuilder.prototype.exit = function exit() { this.push(50 /* Exit */); }; BasicOpcodeBuilder.prototype.return = function _return() { this.push(22 /* Return */); }; BasicOpcodeBuilder.prototype.pushFrame = function pushFrame() { this.push(47 /* PushFrame */); }; BasicOpcodeBuilder.prototype.popFrame = function popFrame() { this.push(48 /* PopFrame */); }; BasicOpcodeBuilder.prototype.compileDynamicBlock = function compileDynamicBlock() { this.push(41 /* CompileDynamicBlock */); }; BasicOpcodeBuilder.prototype.invokeDynamic = function invokeDynamic(invoker) { this.push(43 /* InvokeDynamic */, this.other(invoker)); }; BasicOpcodeBuilder.prototype.invokeStatic = function invokeStatic(block) { var callerCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var parameters = block.symbolTable.parameters; var calleeCount = parameters.length; var count = Math.min(callerCount, calleeCount); this.pushFrame(); if (count) { this.pushChildScope(); for (var i = 0; i < count; i++) { this.dup(_opcodes.Register.fp, callerCount - i); this.setVariable(parameters[i]); } } var _block = this.constants.block(block); this.push(42 /* InvokeStatic */, _block); if (count) { this.popScope(); } this.popFrame(); }; BasicOpcodeBuilder.prototype.test = function test(testFunc) { var _func = void 0; if (testFunc === 'const') { _func = vm.ConstTest; } else if (testFunc === 'simple') { _func = vm.SimpleTest; } else if (testFunc === 'environment') { _func = vm.EnvironmentTest; } else if (typeof testFunc === 'function') { _func = testFunc; } else { throw new Error('unreachable'); } var func = this.constants.function(_func); this.push(51 /* Test */, func); }; BasicOpcodeBuilder.prototype.jump = function jump(target) { this.reserve(44 /* Jump */); this.labels.target(this.pos, 44 /* Jump */, target); }; BasicOpcodeBuilder.prototype.jumpIf = function jumpIf(target) { this.reserve(45 /* JumpIf */); this.labels.target(this.pos, 45 /* JumpIf */, target); }; BasicOpcodeBuilder.prototype.jumpUnless = function jumpUnless(target) { this.reserve(46 /* JumpUnless */); this.labels.target(this.pos, 46 /* JumpUnless */, target); }; BasicOpcodeBuilder.prototype.string = function string(_string) { return this.constants.string(_string); }; BasicOpcodeBuilder.prototype.float = function float(num) { return this.constants.float(num); }; BasicOpcodeBuilder.prototype.names = function names(_names) { var names = []; for (var i = 0; i < _names.length; i++) { var n = _names[i]; names[i] = this.constants.string(n); } return this.constants.array(names); }; BasicOpcodeBuilder.prototype.symbols = function symbols(_symbols) { return this.constants.array(_symbols); }; BasicOpcodeBuilder.prototype.other = function other(value) { return this.constants.other(value); }; BasicOpcodeBuilder.prototype.block = function block(_block2) { return _block2 ? this.constants.block(_block2) : 0; }; BasicOpcodeBuilder.prototype.func = function func(_func2) { return this.constants.function(_func2); }; _createClass(BasicOpcodeBuilder, [{ key: 'pos', get: function () { return (0, _util.typePos)(this.heap.size()); } }, { key: 'nextPos', get: function () { return this.heap.size(); } }, { key: 'labels', get: function () { return this.labelsStack.current; } }]); return BasicOpcodeBuilder; }(); exports.BasicOpcodeBuilder = BasicOpcodeBuilder; function isCompilableExpression(expr) { return typeof expr === 'object' && expr !== null && typeof expr.compile === 'function'; } var OpcodeBuilder = function (_BasicOpcodeBuilder) { _inherits(OpcodeBuilder, _BasicOpcodeBuilder); function OpcodeBuilder(env, meta) { var program = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : env.program; _classCallCheck(this, OpcodeBuilder); var _this = _possibleConstructorReturn(this, _BasicOpcodeBuilder.call(this, env, meta, program)); _this.component = new _compiler.ComponentBuilder(_this); return _this; } OpcodeBuilder.prototype.compileArgs = function compileArgs(params, hash, synthetic) { var positional = 0; if (params) { for (var i = 0; i < params.length; i++) { (0, _functions.expr)(params[i], this); } positional = params.length; } this.pushImmediate(positional); var names = _util.EMPTY_ARRAY; if (hash) { names = hash[0]; var val = hash[1]; for (var _i = 0; _i < val.length; _i++) { (0, _functions.expr)(val[_i], this); } } this.pushImmediate(names); this.pushArgs(synthetic); }; OpcodeBuilder.prototype.compile = function compile(expr) { if (isCompilableExpression(expr)) { return expr.compile(this); } else { return expr; } }; OpcodeBuilder.prototype.guardedAppend = function guardedAppend(expression, trusting) { this.startLabels(); this.pushFrame(); this.returnTo('END'); (0, _functions.expr)(expression, this); this.dup(); this.test(function (reference) { return _content.IsComponentDefinitionReference.create(reference); }); this.enter(2); this.jumpUnless('ELSE'); this.pushDynamicComponentManager(); this.invokeComponent(null, null, null, null, null); this.exit(); this.return(); this.label('ELSE'); if (trusting) { this.trustingAppend(); } else { this.cautiousAppend(); } this.exit(); this.return(); this.label('END'); this.popFrame(); this.stopLabels(); }; OpcodeBuilder.prototype.invokeComponent = function invokeComponent(attrs, params, hash, block) { var inverse = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; this.fetch(_opcodes.Register.s0); this.dup(_opcodes.Register.sp, 1); this.load(_opcodes.Register.s0); this.pushBlock(block); this.pushBlock(inverse); this.compileArgs(params, hash, false); this.prepareArgs(_opcodes.Register.s0); this.beginComponentTransaction(); this.pushDynamicScope(); this.createComponent(_opcodes.Register.s0, block !== null, inverse !== null); this.registerComponentDestructor(_opcodes.Register.s0); this.getComponentSelf(_opcodes.Register.s0); this.getComponentLayout(_opcodes.Register.s0); this.invokeDynamic(new _functions.InvokeDynamicLayout(attrs && attrs.scan())); this.popFrame(); this.popScope(); this.popDynamicScope(); this.commitComponentTransaction(); this.load(_opcodes.Register.s0); }; OpcodeBuilder.prototype.template = function template(block) { if (!block) return null; return new _rawBlock2.default(this.meta, block.statements, block.parameters); }; return OpcodeBuilder; }(BasicOpcodeBuilder); exports.default = OpcodeBuilder; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXIuanMiXSwibmFtZXMiOlsiZGljdCIsIkVNUFRZX0FSUkFZIiwiZmlsbE51bGxzIiwiU3RhY2siLCJ0eXBlUG9zIiwiQ29tcG9uZW50QnVpbGRlciIsIlJlZ2lzdGVyIiwiZXhwciIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJSYXdJbmxpbmVCbG9jayIsIklzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSIsImNvbnRlbnQiLCJ2bSIsIkxhYmVscyIsImxhYmVscyIsInRhcmdldHMiLCJsYWJlbCIsIm5hbWUiLCJpbmRleCIsInRhcmdldCIsImF0IiwiVGFyZ2V0IiwicHVzaCIsInBhdGNoIiwicHJvZ3JhbSIsImkiLCJsZW5ndGgiLCJnb3RvIiwiaGVhcCIsInNldGJ5YWRkciIsIkJhc2ljT3Bjb2RlQnVpbGRlciIsImVudiIsIm1ldGEiLCJsYWJlbHNTdGFjayIsImNvbnN0YW50cyIsInN0YXJ0IiwibWFsbG9jIiwidXB2YXJzIiwiY291bnQiLCJyZXNlcnZlIiwib3AxIiwib3AyIiwib3AzIiwiZmluYWxpemUiLCJmaW5pc2hNYWxsb2MiLCJwdXNoQXJncyIsInN5bnRoZXRpYyIsInN0YXJ0TGFiZWxzIiwic3RvcExhYmVscyIsInBvcCIsInB1c2hDb21wb25lbnRNYW5hZ2VyIiwiZGVmaW5pdGlvbiIsIm90aGVyIiwicHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyIiwicHJlcGFyZUFyZ3MiLCJzdGF0ZSIsImNyZWF0ZUNvbXBvbmVudCIsImhhc0RlZmF1bHQiLCJoYXNJbnZlcnNlIiwiZmxhZyIsInJlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvciIsImJlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24iLCJjb21taXRDb21wb25lbnRUcmFuc2FjdGlvbiIsInB1c2hDb21wb25lbnRPcGVyYXRpb25zIiwiZ2V0Q29tcG9uZW50U2VsZiIsImdldENvbXBvbmVudExheW91dCIsImRpZENyZWF0ZUVsZW1lbnQiLCJkaWRSZW5kZXJMYXlvdXQiLCJnZXRQYXJ0aWFsVGVtcGxhdGUiLCJyZXNvbHZlTWF5YmVMb2NhbCIsInN0cmluZyIsImRlYnVnZ2VyIiwic3ltYm9scyIsImV2YWxJbmZvIiwiYXJyYXkiLCJkeW5hbWljQ29udGVudCIsIk9wY29kZSIsImNhdXRpb3VzQXBwZW5kIiwiT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGUiLCJ0cnVzdGluZ0FwcGVuZCIsIk9wdGltaXplZFRydXN0aW5nQXBwZW5kT3Bjb2RlIiwidGV4dCIsIm9wZW5QcmltaXRpdmVFbGVtZW50IiwidGFnIiwib3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyIsIm9wZW5EeW5hbWljRWxlbWVudCIsImZsdXNoRWxlbWVudCIsImNsb3NlRWxlbWVudCIsInN0YXRpY0F0dHIiLCJfbmFtZSIsIl9uYW1lc3BhY2UiLCJfdmFsdWUiLCJuYW1lc3BhY2UiLCJ2YWx1ZSIsImR5bmFtaWNBdHRyTlMiLCJ0cnVzdGluZyIsImR5bmFtaWNBdHRyIiwiY29tbWVudCIsIl9jb21tZW50IiwibW9kaWZpZXIiLCJfZGVmaW5pdGlvbiIsInB1dEl0ZXJhdG9yIiwiZW50ZXJMaXN0IiwicG9zIiwiZXhpdExpc3QiLCJpdGVyYXRlIiwiYnJlYWtzIiwic2V0VmFyaWFibGUiLCJzeW1ib2wiLCJnZXRWYXJpYWJsZSIsImdldFByb3BlcnR5Iiwia2V5IiwiZ2V0QmxvY2siLCJoYXNCbG9jayIsImhhc0Jsb2NrUGFyYW1zIiwiY29uY2F0Iiwic2l6ZSIsImZ1bmN0aW9uIiwiZiIsImZ1bmMiLCJsb2FkIiwicmVnaXN0ZXIiLCJmZXRjaCIsImR1cCIsInNwIiwib2Zmc2V0IiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwibmV4dFBvcyIsInB1c2hSb290U2NvcGUiLCJiaW5kQ2FsbGVyU2NvcGUiLCJwdXNoQ2hpbGRTY29wZSIsInBvcFNjb3BlIiwicmV0dXJuVG8iLCJwdXNoRHluYW1pY1Njb3BlIiwicG9wRHluYW1pY1Njb3BlIiwicHVzaEltbWVkaWF0ZSIsInByaW1pdGl2ZSIsIl9wcmltaXRpdmUiLCJmbG9hdCIsIkVycm9yIiwiaGVscGVyIiwicHVzaEJsb2NrIiwiYmxvY2siLCJiaW5kRHluYW1pY1Njb3BlIiwiX25hbWVzIiwibmFtZXMiLCJlbnRlciIsImFyZ3MiLCJleGl0IiwicmV0dXJuIiwicHVzaEZyYW1lIiwicG9wRnJhbWUiLCJjb21waWxlRHluYW1pY0Jsb2NrIiwiaW52b2tlRHluYW1pYyIsImludm9rZXIiLCJpbnZva2VTdGF0aWMiLCJjYWxsZXJDb3VudCIsInBhcmFtZXRlcnMiLCJzeW1ib2xUYWJsZSIsImNhbGxlZUNvdW50IiwiTWF0aCIsIm1pbiIsImZwIiwiX2Jsb2NrIiwidGVzdCIsInRlc3RGdW5jIiwiX2Z1bmMiLCJDb25zdFRlc3QiLCJTaW1wbGVUZXN0IiwiRW52aXJvbm1lbnRUZXN0IiwianVtcCIsImp1bXBJZiIsImp1bXBVbmxlc3MiLCJfc3RyaW5nIiwibnVtIiwibiIsImN1cnJlbnQiLCJpc0NvbXBpbGFibGVFeHByZXNzaW9uIiwiY29tcGlsZSIsIk9wY29kZUJ1aWxkZXIiLCJjb21wb25lbnQiLCJjb21waWxlQXJncyIsInBhcmFtcyIsImhhc2giLCJwb3NpdGlvbmFsIiwidmFsIiwiZ3VhcmRlZEFwcGVuZCIsImV4cHJlc3Npb24iLCJjcmVhdGUiLCJyZWZlcmVuY2UiLCJpbnZva2VDb21wb25lbnQiLCJhdHRycyIsImludmVyc2UiLCJzMCIsInNjYW4iLCJ0ZW1wbGF0ZSIsInN0YXRlbWVudHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxBQUFTLEFBQU0sQUFBcUIsQUFBVyxBQUFPLEFBQWU7O0FBQ3JFLEFBQVMsQUFBd0I7O0FBQ2pDLEFBQVMsQUFBZ0I7O0FBQ3pCLEFBQVMsQUFBTSxBQUEyQjs7QUFDMUMsQUFBTyxBQUFvQjs7OztBQUMzQixBQUFTLEFBQXNDOztBQUMvQyxBQUFPOztJQUFQLEFBQVksQUFBYTs7QUFDekIsQUFBTzs7SUFBUCxBQUFZLEFBQVE7Ozs7Ozs7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QUFBSyxBQUNMO2FBQUEsQUFBSyxBQUNMO2FBQUEsQUFBSyxnQkFBZ0Isa0JBQXJCLEFBQThCLElBQUksVUFBbEMsQUFBNEMsTUFBTSxZQUFsRCxBQUE4RCxBQUM5RDthQUFBLEFBQUssNEJBQTRCLGtCQUFqQyxBQUEwQyxBQUMxQzthQUFBLEFBQUssaUJBQWlCLGtCQUF0QixBQUErQixBQUMvQjthQUFBLEFBQUssbUJBQW1CLGtCQUF4QixBQUFpQyxBQUNqQzthQUFBLEFBQUssY0FBYyxBQUFJLG1DQUFvQixTQUFTLE1BQXBELEFBQW1CLEFBQWlDLEFBQU0sQUFDMUQ7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEtBQUssa0JBQVYsQUFBbUIsQUFDdEI7QTs7NEIsQUFDRCw2QkFBUyxBLE9BQU8sQUFDWjtZQUFJLENBQUosQUFBSyxPQUFPLE9BQUEsQUFBTyxBQUNuQjtlQUFPLEFBQUksdUJBQWUsS0FBbkIsQUFBd0IsTUFBTSxNQUE5QixBQUFvQyxZQUFZLE1BQXZELEFBQU8sQUFBc0QsQUFDaEU7QTs7O0VBbkZzQyxBOztrQkFBdEIsQSIsImZpbGUiOiJsaWIvY29tcGlsZWQvb3Bjb2Rlcy9idWlsZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGljdCwgRU1QVFlfQVJSQVksIGV4cGVjdCwgZmlsbE51bGxzLCBTdGFjaywgdHlwZVBvcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50QnVpbGRlciB9IGZyb20gJy4uLy4uL2NvbXBpbGVyJztcbmltcG9ydCB7IFJlZ2lzdGVyIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBleHByLCBJbnZva2VEeW5hbWljTGF5b3V0IH0gZnJvbSAnLi4vLi4vc3ludGF4L2Z1bmN0aW9ucyc7XG5pbXBvcnQgUmF3SW5saW5lQmxvY2sgZnJvbSAnLi4vLi4vc3ludGF4L3Jhdy1ibG9jayc7XG5pbXBvcnQgeyBJc0NvbXBvbmVudERlZmluaXRpb25SZWZlcmVuY2UgfSBmcm9tICcuLi9vcGNvZGVzL2NvbnRlbnQnO1xuaW1wb3J0ICogYXMgY29udGVudCBmcm9tICcuL2NvbnRlbnQnO1xuaW1wb3J0ICogYXMgdm0gZnJvbSAnLi92bSc7XG5jbGFzcyBMYWJlbHMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxhYmVscyA9IGRpY3QoKTtcbiAgICAgICAgdGhpcy50YXJnZXRzID0gW107XG4gICAgfVxuICAgIGxhYmVsKG5hbWUsIGluZGV4KSB7XG4gICAgICAgIHRoaXMubGFiZWxzW25hbWVdID0gaW5kZXg7XG4gICAgfVxuICAgIHRhcmdldChhdCwgVGFyZ2V0LCB0YXJnZXQpIHtcbiAgICAgICAgdGhpcy50YXJnZXRzLnB1c2goeyBhdCwgVGFyZ2V0LCB0YXJnZXQgfSk7XG4gICAgfVxuICAgIHBhdGNoKHByb2dyYW0pIHtcbiAgICAgICAgbGV0IHsgdGFyZ2V0cywgbGFiZWxzIH0gPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IGF0LCB0YXJnZXQgfSA9IHRhcmdldHNbaV07XG4gICAgICAgICAgICBsZXQgZ290byA9IGxhYmVsc1t0YXJnZXRdIC0gYXQ7XG4gICAgICAgICAgICBwcm9ncmFtLmhlYXAuc2V0YnlhZGRyKGF0ICsgMSwgZ290byk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQmFzaWNPcGNvZGVCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYsIG1ldGEsIHByb2dyYW0pIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIHRoaXMubGFiZWxzU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMgPSBwcm9ncmFtLmNvbnN0YW50cztcbiAgICAgICAgdGhpcy5oZWFwID0gcHJvZ3JhbS5oZWFwO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5oZWFwLm1hbGxvYygpO1xuICAgIH1cbiAgICBnZXQgcG9zKCkge1xuICAgICAgICByZXR1cm4gdHlwZVBvcyh0aGlzLmhlYXAuc2l6ZSgpKTtcbiAgICB9XG4gICAgZ2V0IG5leHRQb3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXAuc2l6ZSgpO1xuICAgIH1cbiAgICB1cHZhcnMoY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGZpbGxOdWxscyhjb3VudCk7XG4gICAgfVxuICAgIHJlc2VydmUobmFtZSkge1xuICAgICAgICB0aGlzLnB1c2gobmFtZSwgMCwgMCwgMCk7XG4gICAgfVxuICAgIHB1c2gobmFtZSwgb3AxID0gMCwgb3AyID0gMCwgb3AzID0gMCkge1xuICAgICAgICB0aGlzLmhlYXAucHVzaChuYW1lKTtcbiAgICAgICAgdGhpcy5oZWFwLnB1c2gob3AxKTtcbiAgICAgICAgdGhpcy5oZWFwLnB1c2gob3AyKTtcbiAgICAgICAgdGhpcy5oZWFwLnB1c2gob3AzKTtcbiAgICB9XG4gICAgZmluYWxpemUoKSB7XG4gICAgICAgIHRoaXMucHVzaCgyMiAvKiBSZXR1cm4gKi8pO1xuICAgICAgICB0aGlzLmhlYXAuZmluaXNoTWFsbG9jKHRoaXMuc3RhcnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydDtcbiAgICB9XG4gICAgLy8gYXJnc1xuICAgIHB1c2hBcmdzKHN5bnRoZXRpYykge1xuICAgICAgICB0aGlzLnB1c2goNTggLyogUHVzaEFyZ3MgKi8sIHN5bnRoZXRpYyA9PT0gdHJ1ZSA/IDEgOiAwKTtcbiAgICB9XG4gICAgLy8gaGVscGVyc1xuICAgIGdldCBsYWJlbHMoKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5sYWJlbHNTdGFjay5jdXJyZW50LCAnYnVnOiBub3QgaW4gYSBsYWJlbCBzdGFjaycpO1xuICAgIH1cbiAgICBzdGFydExhYmVscygpIHtcbiAgICAgICAgdGhpcy5sYWJlbHNTdGFjay5wdXNoKG5ldyBMYWJlbHMoKSk7XG4gICAgfVxuICAgIHN0b3BMYWJlbHMoKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IGV4cGVjdCh0aGlzLmxhYmVsc1N0YWNrLnBvcCgpLCAndW5iYWxhbmNlZCBwdXNoIGFuZCBwb3AgbGFiZWxzJyk7XG4gICAgICAgIGxhYmVsLnBhdGNoKHRoaXMucHJvZ3JhbSk7XG4gICAgfVxuICAgIC8vIGNvbXBvbmVudHNcbiAgICBwdXNoQ29tcG9uZW50TWFuYWdlcihkZWZpbml0aW9uKSB7XG4gICAgICAgIHRoaXMucHVzaCg1NiAvKiBQdXNoQ29tcG9uZW50TWFuYWdlciAqLywgdGhpcy5vdGhlcihkZWZpbml0aW9uKSk7XG4gICAgfVxuICAgIHB1c2hEeW5hbWljQ29tcG9uZW50TWFuYWdlcigpIHtcbiAgICAgICAgdGhpcy5wdXNoKDU3IC8qIFB1c2hEeW5hbWljQ29tcG9uZW50TWFuYWdlciAqLyk7XG4gICAgfVxuICAgIHByZXBhcmVBcmdzKHN0YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaCg1OSAvKiBQcmVwYXJlQXJncyAqLywgc3RhdGUpO1xuICAgIH1cbiAgICBjcmVhdGVDb21wb25lbnQoc3RhdGUsIGhhc0RlZmF1bHQsIGhhc0ludmVyc2UpIHtcbiAgICAgICAgbGV0IGZsYWcgPSAoaGFzRGVmYXVsdCA9PT0gdHJ1ZSA/IDEgOiAwKSB8IChoYXNJbnZlcnNlID09PSB0cnVlID8gMSA6IDApIDw8IDE7XG4gICAgICAgIHRoaXMucHVzaCg2MCAvKiBDcmVhdGVDb21wb25lbnQgKi8sIGZsYWcsIHN0YXRlKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJDb21wb25lbnREZXN0cnVjdG9yKHN0YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaCg2MSAvKiBSZWdpc3RlckNvbXBvbmVudERlc3RydWN0b3IgKi8sIHN0YXRlKTtcbiAgICB9XG4gICAgYmVnaW5Db21wb25lbnRUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgdGhpcy5wdXNoKDY1IC8qIEJlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24gKi8pO1xuICAgIH1cbiAgICBjb21taXRDb21wb25lbnRUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgdGhpcy5wdXNoKDY2IC8qIENvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uICovKTtcbiAgICB9XG4gICAgcHVzaENvbXBvbmVudE9wZXJhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMucHVzaCg2MiAvKiBQdXNoQ29tcG9uZW50T3BlcmF0aW9ucyAqLyk7XG4gICAgfVxuICAgIGdldENvbXBvbmVudFNlbGYoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDYzIC8qIEdldENvbXBvbmVudFNlbGYgKi8sIHN0YXRlKTtcbiAgICB9XG4gICAgZ2V0Q29tcG9uZW50TGF5b3V0KHN0YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaCg2NCAvKiBHZXRDb21wb25lbnRMYXlvdXQgKi8sIHN0YXRlKTtcbiAgICB9XG4gICAgZGlkQ3JlYXRlRWxlbWVudChzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNjcgLyogRGlkQ3JlYXRlRWxlbWVudCAqLywgc3RhdGUpO1xu