UNPKG

ember-legacy-class-transform

Version:
799 lines (746 loc) 94.3 kB
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import { map } from '@glimmer/reference'; import { assert, dict, EMPTY_ARRAY } from '@glimmer/util'; import * as WireFormat from '@glimmer/wire-format'; import OpcodeBuilder from '../compiled/opcodes/builder'; import { Register } from '../opcodes'; import * as ClientSide from '../syntax/client-side'; import RawInlineBlock from './raw-block'; var Ops = WireFormat.Ops; export var ATTRS_BLOCK = '&attrs'; var Compilers = function () { function Compilers() { var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; _classCallCheck(this, Compilers); this.offset = offset; this.names = dict(); this.funcs = []; } Compilers.prototype.add = function add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; }; Compilers.prototype.compile = function compile(sexp, builder) { var name = sexp[this.offset]; var index = this.names[name]; var func = this.funcs[index]; assert(!!func, 'expected an implementation for ' + (this.offset === 0 ? Ops[sexp[0]] : ClientSide.Ops[sexp[1]])); func(sexp, builder); }; return Compilers; }(); var STATEMENTS = new Compilers(); var CLIENT_SIDE = new Compilers(1); STATEMENTS.add(Ops.Text, function (sexp, builder) { builder.text(sexp[1]); }); STATEMENTS.add(Ops.Comment, function (sexp, builder) { builder.comment(sexp[1]); }); STATEMENTS.add(Ops.CloseElement, function (_sexp, builder) { builder.closeElement(); }); STATEMENTS.add(Ops.FlushElement, function (_sexp, builder) { builder.flushElement(); }); STATEMENTS.add(Ops.Modifier, function (sexp, builder) { var env = builder.env, meta = builder.meta; var name = sexp[1], params = sexp[2], hash = sexp[3]; if (env.hasModifier(name, meta.templateMeta)) { builder.compileArgs(params, hash, true); builder.modifier(env.lookupModifier(name, meta.templateMeta)); } else { throw new Error('Compile Error ' + name + ' is not a modifier: Helpers may not be used in the element form.'); } }); STATEMENTS.add(Ops.StaticAttr, function (sexp, builder) { var name = sexp[1], value = sexp[2], namespace = sexp[3]; builder.staticAttr(name, namespace, value); }); STATEMENTS.add(Ops.DynamicAttr, function (sexp, builder) { dynamicAttr(sexp, false, builder); }); STATEMENTS.add(Ops.TrustingAttr, function (sexp, builder) { dynamicAttr(sexp, true, builder); }); function dynamicAttr(sexp, trusting, builder) { var name = sexp[1], value = sexp[2], namespace = sexp[3]; expr(value, builder); if (namespace) { builder.dynamicAttrNS(name, namespace, trusting); } else { builder.dynamicAttr(name, trusting); } } STATEMENTS.add(Ops.OpenElement, function (sexp, builder) { builder.openPrimitiveElement(sexp[1]); }); CLIENT_SIDE.add(ClientSide.Ops.OpenComponentElement, function (sexp, builder) { builder.pushComponentOperations(); builder.openElementWithOperations(sexp[2]); }); CLIENT_SIDE.add(ClientSide.Ops.DidCreateElement, function (_sexp, builder) { builder.didCreateElement(Register.s0); }); CLIENT_SIDE.add(ClientSide.Ops.DidRenderLayout, function (_sexp, builder) { builder.didRenderLayout(Register.s0); }); STATEMENTS.add(Ops.Append, function (sexp, builder) { var value = sexp[1], trusting = sexp[2]; var _builder$env$macros = builder.env.macros(), inlines = _builder$env$macros.inlines; var returned = inlines.compile(sexp, builder) || value; if (returned === true) return; var isGet = E.isGet(value); var isMaybeLocal = E.isMaybeLocal(value); if (trusting) { builder.guardedAppend(value, true); } else { if (isGet || isMaybeLocal) { builder.guardedAppend(value, false); } else { expr(value, builder); builder.cautiousAppend(); } } }); STATEMENTS.add(Ops.Block, function (sexp, builder) { var name = sexp[1], params = sexp[2], hash = sexp[3], _template = sexp[4], _inverse = sexp[5]; var template = builder.template(_template); var inverse = builder.template(_inverse); var templateBlock = template && template.scan(); var inverseBlock = inverse && inverse.scan(); var _builder$env$macros2 = builder.env.macros(), blocks = _builder$env$macros2.blocks; blocks.compile(name, params, hash, templateBlock, inverseBlock, builder); }); export var InvokeDynamicLayout = function () { function InvokeDynamicLayout(attrs) { _classCallCheck(this, InvokeDynamicLayout); this.attrs = attrs; } InvokeDynamicLayout.prototype.invoke = function invoke(vm, layout) { var _layout$symbolTable = layout.symbolTable, symbols = _layout$symbolTable.symbols, hasEval = _layout$symbolTable.hasEval; var stack = vm.stack; var scope = vm.pushRootScope(symbols.length + 1, true); scope.bindSelf(stack.pop()); scope.bindBlock(symbols.indexOf(ATTRS_BLOCK) + 1, this.attrs); var lookup = null; var $eval = -1; if (hasEval) { $eval = symbols.indexOf('$eval') + 1; lookup = dict(); } var callerNames = stack.pop(); for (var i = callerNames.length - 1; i >= 0; i--) { var symbol = symbols.indexOf(callerNames[i]); var value = stack.pop(); if (symbol !== -1) scope.bindSymbol(symbol + 1, value); if (hasEval) lookup[callerNames[i]] = value; } var numPositionalArgs = stack.pop(); assert(typeof numPositionalArgs === 'number', '[BUG] Incorrect value of positional argument count found during invoke-dynamic-layout.'); // Currently we don't support accessing positional args in templates, so just throw them away stack.pop(numPositionalArgs); var inverseSymbol = symbols.indexOf('&inverse'); var inverse = stack.pop(); if (inverseSymbol !== -1) { scope.bindBlock(inverseSymbol + 1, inverse); } if (lookup) lookup['&inverse'] = inverse; var defaultSymbol = symbols.indexOf('&default'); var defaultBlock = stack.pop(); if (defaultSymbol !== -1) { scope.bindBlock(defaultSymbol + 1, defaultBlock); } if (lookup) lookup['&default'] = defaultBlock; if (lookup) scope.bindEvalScope(lookup); vm.pushFrame(); vm.call(layout.handle); }; InvokeDynamicLayout.prototype.toJSON = function toJSON() { return { GlimmerDebug: '<invoke-dynamic-layout>' }; }; return InvokeDynamicLayout; }(); STATEMENTS.add(Ops.Component, function (sexp, builder) { var tag = sexp[1], attrs = sexp[2], args = sexp[3], block = sexp[4]; if (builder.env.hasComponentDefinition(tag, builder.meta.templateMeta)) { var child = builder.template(block); var attrsBlock = new RawInlineBlock(builder.meta, attrs, EMPTY_ARRAY); var definition = builder.env.getComponentDefinition(tag, builder.meta.templateMeta); builder.pushComponentManager(definition); builder.invokeComponent(attrsBlock, null, args, child && child.scan()); } else if (block && block.parameters.length) { throw new Error('Compile Error: Cannot find component ' + tag); } else { builder.openPrimitiveElement(tag); for (var i = 0; i < attrs.length; i++) { STATEMENTS.compile(attrs[i], builder); } builder.flushElement(); if (block) { var stmts = block.statements; for (var _i = 0; _i < stmts.length; _i++) { STATEMENTS.compile(stmts[_i], builder); } } builder.closeElement(); } }); export var PartialInvoker = function () { function PartialInvoker(outerSymbols, evalInfo) { _classCallCheck(this, PartialInvoker); this.outerSymbols = outerSymbols; this.evalInfo = evalInfo; } PartialInvoker.prototype.invoke = function invoke(vm, _partial) { var partial = _partial; var partialSymbols = partial.symbolTable.symbols; var outerScope = vm.scope(); var partialScope = vm.pushRootScope(partialSymbols.length, false); partialScope.bindCallerScope(outerScope.getCallerScope()); partialScope.bindEvalScope(outerScope.getEvalScope()); partialScope.bindSelf(outerScope.getSelf()); var evalInfo = this.evalInfo, outerSymbols = this.outerSymbols; var locals = dict(); for (var i = 0; i < evalInfo.length; i++) { var slot = evalInfo[i]; var name = outerSymbols[slot - 1]; var ref = outerScope.getSymbol(slot); locals[name] = ref; } var evalScope = outerScope.getEvalScope(); for (var _i2 = 0; _i2 < partialSymbols.length; _i2++) { var _name = partialSymbols[_i2]; var symbol = _i2 + 1; var value = evalScope[_name]; if (value !== undefined) partialScope.bind(symbol, value); } partialScope.bindPartialMap(locals); vm.pushFrame(); vm.call(partial.handle); }; return PartialInvoker; }(); STATEMENTS.add(Ops.Partial, function (sexp, builder) { var name = sexp[1], evalInfo = sexp[2]; var _builder$meta = builder.meta, templateMeta = _builder$meta.templateMeta, symbols = _builder$meta.symbols; function helper(vm, args) { var env = vm.env; var nameRef = args.positional.at(0); return map(nameRef, function (n) { if (typeof n === 'string' && n) { if (!env.hasPartial(n, templateMeta)) { throw new Error('Could not find a partial named "' + n + '"'); } return env.lookupPartial(n, templateMeta); } else if (n) { throw new Error('Could not find a partial named "' + String(n) + '"'); } else { return null; } }); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); expr(name, builder); builder.pushImmediate(1); builder.pushImmediate(EMPTY_ARRAY); builder.pushArgs(true); builder.helper(helper); builder.dup(); builder.test('simple'); builder.enter(2); builder.jumpUnless('ELSE'); builder.getPartialTemplate(); builder.compileDynamicBlock(); builder.invokeDynamic(new PartialInvoker(symbols, evalInfo)); builder.popScope(); builder.popFrame(); builder.label('ELSE'); builder.exit(); builder.return(); builder.label('END'); builder.popFrame(); builder.stopLabels(); }); var InvokeDynamicYield = function () { function InvokeDynamicYield(callerCount) { _classCallCheck(this, InvokeDynamicYield); this.callerCount = callerCount; } InvokeDynamicYield.prototype.invoke = function invoke(vm, block) { var callerCount = this.callerCount; var stack = vm.stack; if (!block) { // To balance the pop{Frame,Scope} vm.pushFrame(); vm.pushCallerScope(); return; } var table = block.symbolTable; var locals = table.parameters; // always present in inline blocks var calleeCount = locals ? locals.length : 0; var count = Math.min(callerCount, calleeCount); vm.pushFrame(); vm.pushCallerScope(calleeCount > 0); var scope = vm.scope(); for (var i = 0; i < count; i++) { scope.bindSymbol(locals[i], stack.fromBase(callerCount - i)); } vm.call(block.handle); }; InvokeDynamicYield.prototype.toJSON = function toJSON() { return { GlimmerDebug: '<invoke-dynamic-yield caller-count=' + this.callerCount + '>' }; }; return InvokeDynamicYield; }(); STATEMENTS.add(Ops.Yield, function (sexp, builder) { var to = sexp[1], params = sexp[2]; var count = compileList(params, builder); builder.getBlock(to); builder.compileDynamicBlock(); builder.invokeDynamic(new InvokeDynamicYield(count)); builder.popScope(); builder.popFrame(); if (count) { builder.pop(count); } }); STATEMENTS.add(Ops.Debugger, function (sexp, builder) { var evalInfo = sexp[1]; builder.debugger(builder.meta.symbols, evalInfo); }); STATEMENTS.add(Ops.ClientSideStatement, function (sexp, builder) { CLIENT_SIDE.compile(sexp, builder); }); var EXPRESSIONS = new Compilers(); var CLIENT_SIDE_EXPRS = new Compilers(1); var E = WireFormat.Expressions; export function expr(expression, builder) { if (Array.isArray(expression)) { EXPRESSIONS.compile(expression, builder); } else { builder.primitive(expression); } } EXPRESSIONS.add(Ops.Unknown, function (sexp, builder) { var name = sexp[1]; if (builder.env.hasHelper(name, builder.meta.templateMeta)) { EXPRESSIONS.compile([Ops.Helper, name, EMPTY_ARRAY, null], builder); } else if (builder.meta.asPartial) { builder.resolveMaybeLocal(name); } else { builder.getVariable(0); builder.getProperty(name); } }); EXPRESSIONS.add(Ops.Concat, function (sexp, builder) { var parts = sexp[1]; for (var i = 0; i < parts.length; i++) { expr(parts[i], builder); } builder.concat(parts.length); }); CLIENT_SIDE_EXPRS.add(ClientSide.Ops.FunctionExpression, function (sexp, builder) { builder.function(sexp[2]); }); EXPRESSIONS.add(Ops.Helper, function (sexp, builder) { var env = builder.env, meta = builder.meta; var name = sexp[1], params = sexp[2], hash = sexp[3]; if (env.hasHelper(name, meta.templateMeta)) { builder.compileArgs(params, hash, true); builder.helper(env.lookupHelper(name, meta.templateMeta)); } else { throw new Error('Compile Error: ' + name + ' is not a helper'); } }); EXPRESSIONS.add(Ops.Get, function (sexp, builder) { var head = sexp[1], path = sexp[2]; builder.getVariable(head); for (var i = 0; i < path.length; i++) { builder.getProperty(path[i]); } }); EXPRESSIONS.add(Ops.MaybeLocal, function (sexp, builder) { var path = sexp[1]; if (builder.meta.asPartial) { var head = path[0]; path = path.slice(1); builder.resolveMaybeLocal(head); } else { builder.getVariable(0); } for (var i = 0; i < path.length; i++) { builder.getProperty(path[i]); } }); EXPRESSIONS.add(Ops.Undefined, function (_sexp, builder) { return builder.primitive(undefined); }); EXPRESSIONS.add(Ops.HasBlock, function (sexp, builder) { builder.hasBlock(sexp[1]); }); EXPRESSIONS.add(Ops.HasBlockParams, function (sexp, builder) { builder.hasBlockParams(sexp[1]); }); EXPRESSIONS.add(Ops.ClientSideExpression, function (sexp, builder) { CLIENT_SIDE_EXPRS.compile(sexp, builder); }); export function compileList(params, builder) { if (!params) return 0; for (var i = 0; i < params.length; i++) { expr(params[i], builder); } return params.length; } export var Blocks = function () { function Blocks() { _classCallCheck(this, Blocks); this.names = dict(); this.funcs = []; } Blocks.prototype.add = function add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; }; Blocks.prototype.addMissing = function addMissing(func) { this.missing = func; }; Blocks.prototype.compile = function compile(name, params, hash, template, inverse, builder) { var index = this.names[name]; if (index === undefined) { assert(!!this.missing, name + ' not found, and no catch-all block handler was registered'); var func = this.missing; var handled = func(name, params, hash, template, inverse, builder); assert(!!handled, name + ' not found, and the catch-all block handler didn\'t handle it'); } else { var _func = this.funcs[index]; _func(params, hash, template, inverse, builder); } }; return Blocks; }(); export var BLOCKS = new Blocks(); export var Inlines = function () { function Inlines() { _classCallCheck(this, Inlines); this.names = dict(); this.funcs = []; } Inlines.prototype.add = function add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; }; Inlines.prototype.addMissing = function addMissing(func) { this.missing = func; }; Inlines.prototype.compile = function compile(sexp, builder) { var value = sexp[1]; // TODO: Fix this so that expression macros can return // things like components, so that {{component foo}} // is the same as {{(component foo)}} if (!Array.isArray(value)) return ['expr', value]; var name = void 0; var params = void 0; var hash = void 0; if (value[0] === Ops.Helper) { name = value[1]; params = value[2]; hash = value[3]; } else if (value[0] === Ops.Unknown) { name = value[1]; params = hash = null; } else { return ['expr', value]; } var index = this.names[name]; if (index === undefined && this.missing) { var func = this.missing; var returned = func(name, params, hash, builder); return returned === false ? ['expr', value] : returned; } else if (index !== undefined) { var _func2 = this.funcs[index]; var _returned = _func2(name, params, hash, builder); return _returned === false ? ['expr', value] : _returned; } else { return ['expr', value]; } }; return Inlines; }(); export var INLINES = new Inlines(); populateBuiltins(BLOCKS, INLINES); export function populateBuiltins() { var blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Blocks(); var inlines = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Inlines(); blocks.add('if', function (params, _hash, template, inverse, builder) { // PutArgs // Test(Environment) // Enter(BEGIN, END) // BEGIN: Noop // JumpUnless(ELSE) // Evaluate(default) // Jump(END) // ELSE: Noop // Evalulate(inverse) // END: Noop // Exit if (!params || params.length !== 1) { throw new Error('SYNTAX ERROR: #if requires a single argument'); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); expr(params[0], builder); builder.test('environment'); builder.enter(1); builder.jumpUnless('ELSE'); builder.invokeStatic(template); if (inverse) { builder.jump('EXIT'); builder.label('ELSE'); builder.invokeStatic(inverse); builder.label('EXIT'); builder.exit(); builder.return(); } else { builder.label('ELSE'); builder.exit(); builder.return(); } builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('unless', function (params, _hash, template, inverse, builder) { // PutArgs // Test(Environment) // Enter(BEGIN, END) // BEGIN: Noop // JumpUnless(ELSE) // Evaluate(default) // Jump(END) // ELSE: Noop // Evalulate(inverse) // END: Noop // Exit if (!params || params.length !== 1) { throw new Error('SYNTAX ERROR: #unless requires a single argument'); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); expr(params[0], builder); builder.test('environment'); builder.enter(1); builder.jumpIf('ELSE'); builder.invokeStatic(template); if (inverse) { builder.jump('EXIT'); builder.label('ELSE'); builder.invokeStatic(inverse); builder.label('EXIT'); builder.exit(); builder.return(); } else { builder.label('ELSE'); builder.exit(); builder.return(); } builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('with', function (params, _hash, template, inverse, builder) { // PutArgs // Test(Environment) // Enter(BEGIN, END) // BEGIN: Noop // JumpUnless(ELSE) // Evaluate(default) // Jump(END) // ELSE: Noop // Evalulate(inverse) // END: Noop // Exit if (!params || params.length !== 1) { throw new Error('SYNTAX ERROR: #with requires a single argument'); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); expr(params[0], builder); builder.dup(); builder.test('environment'); builder.enter(2); builder.jumpUnless('ELSE'); builder.invokeStatic(template, 1); if (inverse) { builder.jump('EXIT'); builder.label('ELSE'); builder.invokeStatic(inverse); builder.label('EXIT'); builder.exit(); builder.return(); } else { builder.label('ELSE'); builder.exit(); builder.return(); } builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('each', function (params, hash, template, inverse, builder) { // Enter(BEGIN, END) // BEGIN: Noop // PutArgs // PutIterable // JumpUnless(ELSE) // EnterList(BEGIN2, END2) // ITER: Noop // NextIter(BREAK) // BEGIN2: Noop // PushChildScope // Evaluate(default) // PopScope // END2: Noop // Exit // Jump(ITER) // BREAK: Noop // ExitList // Jump(END) // ELSE: Noop // Evalulate(inverse) // END: Noop // Exit builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); if (hash && hash[0][0] === 'key') { expr(hash[1][0], builder); } else { builder.primitive(null); } expr(params[0], builder); builder.enter(2); builder.putIterator(); builder.jumpUnless('ELSE'); builder.pushFrame(); builder.returnTo('ITER'); builder.dup(Register.fp, 1); builder.enterList('BODY'); builder.label('ITER'); builder.iterate('BREAK'); builder.label('BODY'); builder.invokeStatic(template, 2); builder.pop(2); builder.exit(); builder.return(); builder.label('BREAK'); builder.exitList(); builder.popFrame(); if (inverse) { builder.jump('EXIT'); builder.label('ELSE'); builder.invokeStatic(inverse); builder.label('EXIT'); builder.exit(); builder.return(); } else { builder.label('ELSE'); builder.exit(); builder.return(); } builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('-in-element', function (params, hash, template, _inverse, builder) { if (!params || params.length !== 1) { throw new Error('SYNTAX ERROR: #-in-element requires a single argument'); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); if (hash && hash[0].length) { var keys = hash[0], values = hash[1]; if (keys.length === 1 && keys[0] === 'nextSibling') { expr(values[0], builder); } else { throw new Error('SYNTAX ERROR: #-in-element does not take a `' + keys[0] + '` option'); } } else { expr(null, builder); } expr(params[0], builder); builder.dup(); builder.test('simple'); builder.enter(3); builder.jumpUnless('ELSE'); builder.pushRemoteElement(); builder.invokeStatic(template); builder.popRemoteElement(); builder.label('ELSE'); builder.exit(); builder.return(); builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('-with-dynamic-vars', function (_params, hash, template, _inverse, builder) { if (hash) { var names = hash[0], expressions = hash[1]; compileList(expressions, builder); builder.pushDynamicScope(); builder.bindDynamicScope(names); builder.invokeStatic(template); builder.popDynamicScope(); } else { builder.invokeStatic(template); } }); return { blocks: blocks, inlines: inlines }; } export function compileStatement(statement, builder) { STATEMENTS.compile(statement, builder); } export function compileStatements(statements, meta, env) { var b = new OpcodeBuilder(env, meta); for (var i = 0; i < statements.length; i++) { compileStatement(statements[i], b); } return b; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zeW50YXgvZnVuY3Rpb25zLmpzIl0sIm5hbWVzIjpbIm1hcCIsImFzc2VydCIsImRpY3QiLCJFTVBUWV9BUlJBWSIsIldpcmVGb3JtYXQiLCJPcGNvZGVCdWlsZGVyIiwiUmVnaXN0ZXIiLCJDbGllbnRTaWRlIiwiUmF3SW5saW5lQmxvY2siLCJPcHMiLCJBVFRSU19CTE9DSyIsIkNvbXBpbGVycyIsIm9mZnNldCIsIm5hbWVzIiwiZnVuY3MiLCJhZGQiLCJuYW1lIiwiZnVuYyIsInB1c2giLCJsZW5ndGgiLCJjb21waWxlIiwic2V4cCIsImJ1aWxkZXIiLCJpbmRleCIsIlNUQVRFTUVOVFMiLCJDTElFTlRfU0lERSIsIlRleHQiLCJ0ZXh0IiwiQ29tbWVudCIsImNvbW1lbnQiLCJDbG9zZUVsZW1lbnQiLCJfc2V4cCIsImNsb3NlRWxlbWVudCIsIkZsdXNoRWxlbWVudCIsImZsdXNoRWxlbWVudCIsIk1vZGlmaWVyIiwiZW52IiwibWV0YSIsInBhcmFtcyIsImhhc2giLCJoYXNNb2RpZmllciIsInRlbXBsYXRlTWV0YSIsImNvbXBpbGVBcmdzIiwibW9kaWZpZXIiLCJsb29rdXBNb2RpZmllciIsIkVycm9yIiwiU3RhdGljQXR0ciIsInZhbHVlIiwibmFtZXNwYWNlIiwic3RhdGljQXR0ciIsIkR5bmFtaWNBdHRyIiwiZHluYW1pY0F0dHIiLCJUcnVzdGluZ0F0dHIiLCJ0cnVzdGluZyIsImV4cHIiLCJkeW5hbWljQXR0ck5TIiwiT3BlbkVsZW1lbnQiLCJvcGVuUHJpbWl0aXZlRWxlbWVudCIsIk9wZW5Db21wb25lbnRFbGVtZW50IiwicHVzaENvbXBvbmVudE9wZXJhdGlvbnMiLCJvcGVuRWxlbWVudFdpdGhPcGVyYXRpb25zIiwiRGlkQ3JlYXRlRWxlbWVudCIsImRpZENyZWF0ZUVsZW1lbnQiLCJzMCIsIkRpZFJlbmRlckxheW91dCIsImRpZFJlbmRlckxheW91dCIsIkFwcGVuZCIsIm1hY3JvcyIsImlubGluZXMiLCJyZXR1cm5lZCIsImlzR2V0IiwiRSIsImlzTWF5YmVMb2NhbCIsImd1YXJkZWRBcHBlbmQiLCJjYXV0aW91c0FwcGVuZCIsIkJsb2NrIiwiX3RlbXBsYXRlIiwiX2ludmVyc2UiLCJ0ZW1wbGF0ZSIsImludmVyc2UiLCJ0ZW1wbGF0ZUJsb2NrIiwic2NhbiIsImludmVyc2VCbG9jayIsImJsb2NrcyIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJhdHRycyIsImludm9rZSIsInZtIiwibGF5b3V0Iiwic3ltYm9sVGFibGUiLCJzeW1ib2xzIiwiaGFzRXZhbCIsInN0YWNrIiwic2NvcGUiLCJwdXNoUm9vdFNjb3BlIiwiYmluZFNlbGYiLCJwb3AiLCJiaW5kQmxvY2siLCJpbmRleE9mIiwibG9va3VwIiwiJGV2YWwiLCJjYWxsZXJOYW1lcyIsImkiLCJzeW1ib2wiLCJiaW5kU3ltYm9sIiwibnVtUG9zaXRpb25hbEFyZ3MiLCJpbnZlcnNlU3ltYm9sIiwiZGVmYXVsdFN5bWJvbCIsImRlZmF1bHRCbG9jayIsImJpbmRFdmFsU2NvcGUiLCJwdXNoRnJhbWUiLCJjYWxsIiwiaGFuZGxlIiwidG9KU09OIiwiR2xpbW1lckRlYnVnIiwiQ29tcG9uZW50IiwidGFnIiwiYXJncyIsImJsb2NrIiwiaGFzQ29tcG9uZW50RGVmaW5pdGlvbiIsImNoaWxkIiwiYXR0cnNCbG9jayIsImRlZmluaXRpb24iLCJnZXRDb21wb25lbnREZWZpbml0aW9uIiwicHVzaENvbXBvbmVudE1hbmFnZXIiLCJpbnZva2VDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwic3RtdHMiLCJzdGF0ZW1lbnRzIiwiUGFydGlhbEludm9rZXIiLCJvdXRlclN5bWJvbHMiLCJldmFsSW5mbyIsIl9wYXJ0aWFsIiwicGFydGlhbCIsInBhcnRpYWxTeW1ib2xzIiwib3V0ZXJTY29wZSIsInBhcnRpYWxTY29wZSIsImJpbmRDYWxsZXJTY29wZSIsImdldENhbGxlclNjb3BlIiwiZ2V0RXZhbFNjb3BlIiwiZ2V0U2VsZiIsImxvY2FscyIsInNsb3QiLCJyZWYiLCJnZXRTeW1ib2wiLCJldmFsU2NvcGUiLCJ1bmRlZmluZWQiLCJiaW5kIiwiYmluZFBhcnRpYWxNYXAiLCJQYXJ0aWFsIiwiaGVscGVyIiwibmFtZVJlZiIsInBvc2l0aW9uYWwiLCJhdCIsIm4iLCJoYXNQYXJ0aWFsIiwibG9va3VwUGFydGlhbCIsIlN0cmluZyIsInN0YXJ0TGFiZWxzIiwicmV0dXJuVG8iLCJwdXNoSW1tZWRpYXRlIiwicHVzaEFyZ3MiLCJkdXAiLCJ0ZXN0IiwiZW50ZXIiLCJqdW1wVW5sZXNzIiwiZ2V0UGFydGlhbFRlbXBsYXRlIiwiY29tcGlsZUR5bmFtaWNCbG9jayIsImludm9rZUR5bmFtaWMiLCJwb3BTY29wZSIsInBvcEZyYW1lIiwibGFiZWwiLCJleGl0IiwicmV0dXJuIiwic3RvcExhYmVscyIsIkludm9rZUR5bmFtaWNZaWVsZCIsImNhbGxlckNvdW50IiwicHVzaENhbGxlclNjb3BlIiwidGFibGUiLCJjYWxsZWVDb3VudCIsImNvdW50IiwiTWF0aCIsIm1pbiIsImZyb21CYXNlIiwiWWllbGQiLCJ0byIsImNvbXBpbGVMaXN0IiwiZ2V0QmxvY2siLCJEZWJ1Z2dlciIsImRlYnVnZ2VyIiwiQ2xpZW50U2lkZVN0YXRlbWVudCIsIkVYUFJFU1NJT05TIiwiQ0xJRU5UX1NJREVfRVhQUlMiLCJFeHByZXNzaW9ucyIsImV4cHJlc3Npb24iLCJBcnJheSIsImlzQXJyYXkiLCJwcmltaXRpdmUiLCJVbmtub3duIiwiaGFzSGVscGVyIiwiSGVscGVyIiwiYXNQYXJ0aWFsIiwicmVzb2x2ZU1heWJlTG9jYWwiLCJnZXRWYXJpYWJsZSIsImdldFByb3BlcnR5IiwiQ29uY2F0IiwicGFydHMiLCJjb25jYXQiLCJGdW5jdGlvbkV4cHJlc3Npb24iLCJmdW5jdGlvbiIsImxvb2t1cEhlbHBlciIsIkdldCIsImhlYWQiLCJwYXRoIiwiTWF5YmVMb2NhbCIsInNsaWNlIiwiVW5kZWZpbmVkIiwiSGFzQmxvY2siLCJoYXNCbG9jayIsIkhhc0Jsb2NrUGFyYW1zIiwiaGFzQmxvY2tQYXJhbXMiLCJDbGllbnRTaWRlRXhwcmVzc2lvbiIsIkJsb2NrcyIsImFkZE1pc3NpbmciLCJtaXNzaW5nIiwiaGFuZGxlZCIsIkJMT0NLUyIsIklubGluZXMiLCJJTkxJTkVTIiwicG9wdWxhdGVCdWlsdGlucyIsIl9oYXNoIiwiaW52b2tlU3RhdGljIiwianVtcCIsImp1bXBJZiIsInB1dEl0ZXJhdG9yIiwiZnAiLCJlbnRlckxpc3QiLCJpdGVyYXRlIiwiZXhpdExpc3QiLCJrZXlzIiwidmFsdWVzIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiX3BhcmFtcyIsImV4cHJlc3Npb25zIiwicHVzaER5bmFtaWNTY29wZSIsImJpbmREeW5hbWljU2NvcGUiLCJwb3BEeW5hbWljU2NvcGUiLCJjb21waWxlU3RhdGVtZW50Iiwic3RhdGVtZW50IiwiY29tcGlsZVN0YXRlbWVudHMiLCJiIl0sIm1hcHBpbmdzIjoiOztBQUFBLFNBQVNBLEdBQVQsUUFBb0Isb0JBQXBCO0FBQ0EsU0FBU0MsTUFBVCxFQUFpQkMsSUFBakIsRUFBdUJDLFdBQXZCLFFBQWtELGVBQWxEO0FBQ0EsT0FBTyxLQUFLQyxVQUFaLE1BQTRCLHNCQUE1QjtBQUNBLE9BQU9DLGFBQVAsTUFBMEIsNkJBQTFCO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QixZQUF6QjtBQUNBLE9BQU8sS0FBS0MsVUFBWixNQUE0Qix1QkFBNUI7QUFDQSxPQUFPQyxjQUFQLE1BQTJCLGFBQTNCO0FBQ0EsSUFBSUMsTUFBTUwsV0FBV0ssR0FBckI7QUFDQSxPQUFPLElBQU1DLGNBQWMsUUFBcEI7O0lBQ0RDLFM7QUFDRix5QkFBd0I7QUFBQSxZQUFaQyxNQUFZLHVFQUFILENBQUc7O0FBQUE7O0FBQ3BCLGFBQUtBLE1BQUwsR0FBY0EsTUFBZDtBQUNBLGFBQUtDLEtBQUwsR0FBYVgsTUFBYjtBQUNBLGFBQUtZLEtBQUwsR0FBYSxFQUFiO0FBQ0g7O3dCQUNEQyxHLGdCQUFJQyxJLEVBQU1DLEksRUFBTTtBQUNaLGFBQUtILEtBQUwsQ0FBV0ksSUFBWCxDQUFn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