UNPKG

ember-legacy-class-transform

Version:
735 lines (720 loc) 92.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.INLINES = exports.Inlines = exports.BLOCKS = exports.Blocks = exports.PartialInvoker = exports.InvokeDynamicLayout = exports.ATTRS_BLOCK = undefined; exports.expr = expr; exports.compileList = compileList; exports.populateBuiltins = populateBuiltins; exports.compileStatement = compileStatement; exports.compileStatements = compileStatements; var _reference = require('@glimmer/reference'); var _util = require('@glimmer/util'); var _wireFormat = require('@glimmer/wire-format'); var WireFormat = _interopRequireWildcard(_wireFormat); var _builder = require('../compiled/opcodes/builder'); var _builder2 = _interopRequireDefault(_builder); var _opcodes = require('../opcodes'); var _clientSide = require('../syntax/client-side'); var ClientSide = _interopRequireWildcard(_clientSide); var _rawBlock = require('./raw-block'); var _rawBlock2 = _interopRequireDefault(_rawBlock); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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; } } var Ops = WireFormat.Ops; const ATTRS_BLOCK = exports.ATTRS_BLOCK = '&attrs'; class Compilers { constructor(offset = 0) { this.offset = offset; this.names = (0, _util.dict)(); this.funcs = []; } add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; } compile(sexp, builder) { let name = sexp[this.offset]; let index = this.names[name]; let func = this.funcs[index]; (0, _util.assert)(!!func, `expected an implementation for ${this.offset === 0 ? Ops[sexp[0]] : ClientSide.Ops[sexp[1]]}`); func(sexp, builder); } } const STATEMENTS = new Compilers(); const CLIENT_SIDE = new Compilers(1); STATEMENTS.add(Ops.Text, (sexp, builder) => { builder.text(sexp[1]); }); STATEMENTS.add(Ops.Comment, (sexp, builder) => { builder.comment(sexp[1]); }); STATEMENTS.add(Ops.CloseElement, (_sexp, builder) => { builder.closeElement(); }); STATEMENTS.add(Ops.FlushElement, (_sexp, builder) => { builder.flushElement(); }); STATEMENTS.add(Ops.Modifier, (sexp, builder) => { let { env, meta } = builder; let [, name, params, hash] = sexp; 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, (sexp, builder) => { let [, name, value, namespace] = sexp; builder.staticAttr(name, namespace, value); }); STATEMENTS.add(Ops.DynamicAttr, (sexp, builder) => { dynamicAttr(sexp, false, builder); }); STATEMENTS.add(Ops.TrustingAttr, (sexp, builder) => { dynamicAttr(sexp, true, builder); }); function dynamicAttr(sexp, trusting, builder) { let [, name, value, namespace] = sexp; expr(value, builder); if (namespace) { builder.dynamicAttrNS(name, namespace, trusting); } else { builder.dynamicAttr(name, trusting); } } STATEMENTS.add(Ops.OpenElement, (sexp, builder) => { builder.openPrimitiveElement(sexp[1]); }); CLIENT_SIDE.add(ClientSide.Ops.OpenComponentElement, (sexp, builder) => { builder.pushComponentOperations(); builder.openElementWithOperations(sexp[2]); }); CLIENT_SIDE.add(ClientSide.Ops.DidCreateElement, (_sexp, builder) => { builder.didCreateElement(_opcodes.Register.s0); }); CLIENT_SIDE.add(ClientSide.Ops.DidRenderLayout, (_sexp, builder) => { builder.didRenderLayout(_opcodes.Register.s0); }); STATEMENTS.add(Ops.Append, (sexp, builder) => { let [, value, trusting] = sexp; let { inlines } = builder.env.macros(); let returned = inlines.compile(sexp, builder) || value; if (returned === true) return; let isGet = E.isGet(value); let 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, (sexp, builder) => { let [, name, params, hash, _template, _inverse] = sexp; let template = builder.template(_template); let inverse = builder.template(_inverse); let templateBlock = template && template.scan(); let inverseBlock = inverse && inverse.scan(); let { blocks } = builder.env.macros(); blocks.compile(name, params, hash, templateBlock, inverseBlock, builder); }); class InvokeDynamicLayout { constructor(attrs) { this.attrs = attrs; } invoke(vm, layout) { let { symbols, hasEval } = layout.symbolTable; let stack = vm.stack; let scope = vm.pushRootScope(symbols.length + 1, true); scope.bindSelf(stack.pop()); scope.bindBlock(symbols.indexOf(ATTRS_BLOCK) + 1, this.attrs); let lookup = null; let $eval = -1; if (hasEval) { $eval = symbols.indexOf('$eval') + 1; lookup = (0, _util.dict)(); } let callerNames = stack.pop(); for (let i = callerNames.length - 1; i >= 0; i--) { let symbol = symbols.indexOf(callerNames[i]); let value = stack.pop(); if (symbol !== -1) scope.bindSymbol(symbol + 1, value); if (hasEval) lookup[callerNames[i]] = value; } let numPositionalArgs = stack.pop(); (0, _util.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); let inverseSymbol = symbols.indexOf('&inverse'); let inverse = stack.pop(); if (inverseSymbol !== -1) { scope.bindBlock(inverseSymbol + 1, inverse); } if (lookup) lookup['&inverse'] = inverse; let defaultSymbol = symbols.indexOf('&default'); let 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); } toJSON() { return { GlimmerDebug: '<invoke-dynamic-layout>' }; } } exports.InvokeDynamicLayout = InvokeDynamicLayout; STATEMENTS.add(Ops.Component, (sexp, builder) => { let [, tag, attrs, args, block] = sexp; if (builder.env.hasComponentDefinition(tag, builder.meta.templateMeta)) { let child = builder.template(block); let attrsBlock = new _rawBlock2.default(builder.meta, attrs, _util.EMPTY_ARRAY); let 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 (let i = 0; i < attrs.length; i++) { STATEMENTS.compile(attrs[i], builder); } builder.flushElement(); if (block) { let stmts = block.statements; for (let i = 0; i < stmts.length; i++) { STATEMENTS.compile(stmts[i], builder); } } builder.closeElement(); } }); class PartialInvoker { constructor(outerSymbols, evalInfo) { this.outerSymbols = outerSymbols; this.evalInfo = evalInfo; } invoke(vm, _partial) { let partial = (0, _util.unwrap)(_partial); let partialSymbols = partial.symbolTable.symbols; let outerScope = vm.scope(); let partialScope = vm.pushRootScope(partialSymbols.length, false); partialScope.bindCallerScope(outerScope.getCallerScope()); partialScope.bindEvalScope(outerScope.getEvalScope()); partialScope.bindSelf(outerScope.getSelf()); let { evalInfo, outerSymbols } = this; let locals = (0, _util.dict)(); for (let i = 0; i < evalInfo.length; i++) { let slot = evalInfo[i]; let name = outerSymbols[slot - 1]; let ref = outerScope.getSymbol(slot); locals[name] = ref; } let evalScope = outerScope.getEvalScope(); for (let i = 0; i < partialSymbols.length; i++) { let name = partialSymbols[i]; let symbol = i + 1; let value = evalScope[name]; if (value !== undefined) partialScope.bind(symbol, value); } partialScope.bindPartialMap(locals); vm.pushFrame(); vm.call(partial.handle); } } exports.PartialInvoker = PartialInvoker; STATEMENTS.add(Ops.Partial, (sexp, builder) => { let [, name, evalInfo] = sexp; let { templateMeta, symbols } = builder.meta; function helper(vm, args) { let { env } = vm; let nameRef = args.positional.at(0); return (0, _reference.map)(nameRef, 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(_util.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(); }); class InvokeDynamicYield { constructor(callerCount) { this.callerCount = callerCount; } invoke(vm, block) { let { callerCount } = this; let stack = vm.stack; if (!block) { // To balance the pop{Frame,Scope} vm.pushFrame(); vm.pushCallerScope(); return; } let table = block.symbolTable; let locals = table.parameters; // always present in inline blocks let calleeCount = locals ? locals.length : 0; let count = Math.min(callerCount, calleeCount); vm.pushFrame(); vm.pushCallerScope(calleeCount > 0); let scope = vm.scope(); for (let i = 0; i < count; i++) { scope.bindSymbol(locals[i], stack.fromBase(callerCount - i)); } vm.call(block.handle); } toJSON() { return { GlimmerDebug: `<invoke-dynamic-yield caller-count=${this.callerCount}>` }; } } STATEMENTS.add(Ops.Yield, (sexp, builder) => { let [, to, params] = sexp; let 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, (sexp, builder) => { let [, evalInfo] = sexp; builder.debugger(builder.meta.symbols, evalInfo); }); STATEMENTS.add(Ops.ClientSideStatement, (sexp, builder) => { CLIENT_SIDE.compile(sexp, builder); }); const EXPRESSIONS = new Compilers(); const CLIENT_SIDE_EXPRS = new Compilers(1); var E = WireFormat.Expressions; function expr(expression, builder) { if (Array.isArray(expression)) { EXPRESSIONS.compile(expression, builder); } else { builder.primitive(expression); } } EXPRESSIONS.add(Ops.Unknown, (sexp, builder) => { let name = sexp[1]; if (builder.env.hasHelper(name, builder.meta.templateMeta)) { EXPRESSIONS.compile([Ops.Helper, name, _util.EMPTY_ARRAY, null], builder); } else if (builder.meta.asPartial) { builder.resolveMaybeLocal(name); } else { builder.getVariable(0); builder.getProperty(name); } }); EXPRESSIONS.add(Ops.Concat, (sexp, builder) => { let parts = sexp[1]; for (let i = 0; i < parts.length; i++) { expr(parts[i], builder); } builder.concat(parts.length); }); CLIENT_SIDE_EXPRS.add(ClientSide.Ops.FunctionExpression, (sexp, builder) => { builder.function(sexp[2]); }); EXPRESSIONS.add(Ops.Helper, (sexp, builder) => { let { env, meta } = builder; let [, name, params, hash] = sexp; 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, (sexp, builder) => { let [, head, path] = sexp; builder.getVariable(head); for (let i = 0; i < path.length; i++) { builder.getProperty(path[i]); } }); EXPRESSIONS.add(Ops.MaybeLocal, (sexp, builder) => { let [, path] = sexp; if (builder.meta.asPartial) { let head = path[0]; path = path.slice(1); builder.resolveMaybeLocal(head); } else { builder.getVariable(0); } for (let i = 0; i < path.length; i++) { builder.getProperty(path[i]); } }); EXPRESSIONS.add(Ops.Undefined, (_sexp, builder) => { return builder.primitive(undefined); }); EXPRESSIONS.add(Ops.HasBlock, (sexp, builder) => { builder.hasBlock(sexp[1]); }); EXPRESSIONS.add(Ops.HasBlockParams, (sexp, builder) => { builder.hasBlockParams(sexp[1]); }); EXPRESSIONS.add(Ops.ClientSideExpression, (sexp, builder) => { CLIENT_SIDE_EXPRS.compile(sexp, builder); }); function compileList(params, builder) { if (!params) return 0; for (let i = 0; i < params.length; i++) { expr(params[i], builder); } return params.length; } class Blocks { constructor() { this.names = (0, _util.dict)(); this.funcs = []; } add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; } addMissing(func) { this.missing = func; } compile(name, params, hash, template, inverse, builder) { let index = this.names[name]; if (index === undefined) { (0, _util.assert)(!!this.missing, `${name} not found, and no catch-all block handler was registered`); let func = this.missing; let handled = func(name, params, hash, template, inverse, builder); (0, _util.assert)(!!handled, `${name} not found, and the catch-all block handler didn't handle it`); } else { let func = this.funcs[index]; func(params, hash, template, inverse, builder); } } } exports.Blocks = Blocks; const BLOCKS = exports.BLOCKS = new Blocks(); class Inlines { constructor() { this.names = (0, _util.dict)(); this.funcs = []; } add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; } addMissing(func) { this.missing = func; } compile(sexp, builder) { let 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]; let name; let params; let hash; 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]; } let index = this.names[name]; if (index === undefined && this.missing) { let func = this.missing; let returned = func(name, params, hash, builder); return returned === false ? ['expr', value] : returned; } else if (index !== undefined) { let func = this.funcs[index]; let returned = func(name, params, hash, builder); return returned === false ? ['expr', value] : returned; } else { return ['expr', value]; } } } exports.Inlines = Inlines; const INLINES = exports.INLINES = new Inlines(); populateBuiltins(BLOCKS, INLINES); function populateBuiltins(blocks = new Blocks(), inlines = new Inlines()) { blocks.add('if', (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((0, _util.unwrap)(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', (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((0, _util.unwrap)(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', (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((0, _util.unwrap)(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', (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(_opcodes.Register.fp, 1); builder.enterList('BODY'); builder.label('ITER'); builder.iterate('BREAK'); builder.label('BODY'); builder.invokeStatic((0, _util.unwrap)(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', (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) { let [keys, values] = hash; 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((0, _util.unwrap)(template)); builder.popRemoteElement(); builder.label('ELSE'); builder.exit(); builder.return(); builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('-with-dynamic-vars', (_params, hash, template, _inverse, builder) => { if (hash) { let [names, expressions] = hash; compileList(expressions, builder); builder.pushDynamicScope(); builder.bindDynamicScope(names); builder.invokeStatic((0, _util.unwrap)(template)); builder.popDynamicScope(); } else { builder.invokeStatic((0, _util.unwrap)(template)); } }); return { blocks, inlines }; } function compileStatement(statement, builder) { STATEMENTS.compile(statement, builder); } function compileStatements(statements, meta, env) { let b = new _builder2.default(env, meta); for (let i = 0; i < statements.length; i++) { compileStatement(statements[i], b); } return b; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zeW50YXgvZnVuY3Rpb25zLmpzIl0sIm5hbWVzIjpbImV4cHIiLCJjb21waWxlTGlzdCIsInBvcHVsYXRlQnVpbHRpbnMiLCJjb21waWxlU3RhdGVtZW50IiwiY29tcGlsZVN0YXRlbWVudHMiLCJXaXJlRm9ybWF0IiwiQ2xpZW50U2lkZSIsIk9wcyIsIkFUVFJTX0JMT0NLIiwiQ29tcGlsZXJzIiwiY29uc3RydWN0b3IiLCJvZmZzZXQiLCJuYW1lcyIsImZ1bmNzIiwiYWRkIiwibmFtZSIsImZ1bmMiLCJwdXNoIiwibGVuZ3RoIiwiY29tcGlsZSIsInNleHAiLCJidWlsZGVyIiwiaW5kZXgiLCJTVEFURU1FTlRTIiwiQ0xJRU5UX1NJREUiLCJUZXh0IiwidGV4dCIsIkNvbW1lbnQiLCJjb21tZW50IiwiQ2xvc2VFbGVtZW50IiwiX3NleHAiLCJjbG9zZUVsZW1lbnQiLCJGbHVzaEVsZW1lbnQiLCJmbHVzaEVsZW1lbnQiLCJNb2RpZmllciIsImVudiIsIm1ldGEiLCJwYXJhbXMiLCJoYXNoIiwiaGFzTW9kaWZpZXIiLCJ0ZW1wbGF0ZU1ldGEiLCJjb21waWxlQXJncyIsIm1vZGlmaWVyIiwibG9va3VwTW9kaWZpZXIiLCJFcnJvciIsIlN0YXRpY0F0dHIiLCJ2YWx1ZSIsIm5hbWVzcGFjZSIsInN0YXRpY0F0dHIiLCJEeW5hbWljQXR0ciIsImR5bmFtaWNBdHRyIiwiVHJ1c3RpbmdBdHRyIiwidHJ1c3RpbmciLCJkeW5hbWljQXR0ck5TIiwiT3BlbkVsZW1lbnQiLCJvcGVuUHJpbWl0aXZlRWxlbWVudCIsIk9wZW5Db21wb25lbnRFbGVtZW50IiwicHVzaENvbXBvbmVudE9wZXJhdGlvbnMiLCJvcGVuRWxlbWVudFdpdGhPcGVyYXRpb25zIiwiRGlkQ3JlYXRlRWxlbWVudCIsImRpZENyZWF0ZUVsZW1lbnQiLCJzMCIsIkRpZFJlbmRlckxheW91dCIsImRpZFJlbmRlckxheW91dCIsIkFwcGVuZCIsImlubGluZXMiLCJtYWNyb3MiLCJyZXR1cm5lZCIsImlzR2V0IiwiRSIsImlzTWF5YmVMb2NhbCIsImd1YXJkZWRBcHBlbmQiLCJjYXV0aW91c0FwcGVuZCIsIkJsb2NrIiwiX3RlbXBsYXRlIiwiX2ludmVyc2UiLCJ0ZW1wbGF0ZSIsImludmVyc2UiLCJ0ZW1wbGF0ZUJsb2NrIiwic2NhbiIsImludmVyc2VCbG9jayIsImJsb2NrcyIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJhdHRycyIsImludm9rZSIsInZtIiwibGF5b3V0Iiwic3ltYm9scyIsImhhc0V2YWwiLCJzeW1ib2xUYWJsZSIsInN0YWNrIiwic2NvcGUiLCJwdXNoUm9vdFNjb3BlIiwiYmluZFNlbGYiLCJwb3AiLCJiaW5kQmxvY2siLCJpbmRleE9mIiwibG9va3VwIiwiJGV2YWwiLCJjYWxsZXJOYW1lcyIsImkiLCJzeW1ib2wiLCJiaW5kU3ltYm9sIiwibnVtUG9zaXRpb25hbEFyZ3MiLCJpbnZlcnNlU3ltYm9sIiwiZGVmYXVsdFN5bWJvbCIsImRlZmF1bHRCbG9jayIsImJpbmRFdmFsU2NvcGUiLCJwdXNoRnJhbWUiLCJjYWxsIiwiaGFuZGxlIiwidG9KU09OIiwiR2xpbW1lckRlYnVnIiwiQ29tcG9uZW50IiwidGFnIiwiYXJncyIsImJsb2NrIiwiaGFzQ29tcG9uZW50RGVmaW5pdGlvbiIsImNoaWxkIiwiYXR0cnNCbG9jayIsImRlZmluaXRpb24iLCJnZXRDb21wb25lbnREZWZpbml0aW9uIiwicHVzaENvbXBvbmVudE1hbmFnZXIiLCJpbnZva2VDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwic3RtdHMiLCJzdGF0ZW1lbnRzIiwiUGFydGlhbEludm9rZXIiLCJvdXRlclN5bWJvbHMiLCJldmFsSW5mbyIsIl9wYXJ0aWFsIiwicGFydGlhbCIsInBhcnRpYWxTeW1ib2xzIiwib3V0ZXJTY29wZSIsInBhcnRpYWxTY29wZSIsImJpbmRDYWxsZXJTY29wZSIsImdldENhbGxlclNjb3BlIiwiZ2V0RXZhbFNjb3BlIiwiZ2V0U2VsZiIsImxvY2FscyIsInNsb3QiLCJyZWYiLCJnZXRTeW1ib2wiLCJldmFsU2NvcGUiLCJ1bmRlZmluZWQiLCJiaW5kIiwiYmluZFBhcnRpYWxNYXAiLCJQYXJ0aWFsIiwiaGVscGVyIiwibmFtZVJlZiIsInBvc2l0aW9uYWwiLCJhdCIsIm4iLCJoYXNQYXJ0aWFsIiwibG9va3VwUGFydGlhbCIsIlN0cmluZyIsInN0YXJ0TGFiZWxzIiwicmV0dXJuVG8iLCJwdXNoSW1tZWRpYXRlIiwicHVzaEFyZ3MiLCJkdXAiLCJ0ZXN0IiwiZW50ZXIiLCJqdW1wVW5sZXNzIiwiZ2V0UGFydGlhbFRlbXBsYXRlIiwiY29tcGlsZUR5bmFtaWNCbG9jayIsImludm9rZUR5bmFtaWMiLCJwb3BTY29wZSIsInBvcEZyYW1lIiwibGFiZWwiLCJleGl0IiwicmV0dXJuIiwic3RvcExhYmVscyIsIkludm9rZUR5bmFtaWNZaWVsZCIsImNhbGxlckNvdW50IiwicHVzaENhbGxlclNjb3BlIiwidGFibGUiLCJjYWxsZWVDb3VudCIsImNvdW50IiwiTWF0aCIsIm1pbiIsImZyb21CYXNlIiwiWWllbGQiLCJ0byIsImdldEJsb2NrIiwiRGVidWdnZXIiLCJkZWJ1Z2dlciIsIkNsaWVudFNpZGVTdGF0ZW1lbnQiLCJFWFBSRVNTSU9OUyIsIkNMSUVOVF9TSURFX0VYUFJTIiwiRXhwcmVzc2lvbnMiLCJleHByZXNzaW9uIiwiQXJyYXkiLCJpc0FycmF5IiwicHJpbWl0aXZlIiwiVW5rbm93biIsImhhc0hlbHBlciIsIkhlbHBlciIsImFzUGFydGlhbCIsInJlc29sdmVNYXliZUxvY2FsIiwiZ2V0VmFyaWFibGUiLCJnZXRQcm9wZXJ0eSIsIkNvbmNhdCIsInBhcnRzIiwiY29uY2F0IiwiRnVuY3Rpb25FeHByZXNzaW9uIiwiZnVuY3Rpb24iLCJsb29rdXBIZWxwZXIiLCJHZXQiLCJoZWFkIiwicGF0aCIsIk1heWJlTG9jYWwiLCJzbGljZSIsIlVuZGVmaW5lZCIsIkhhc0Jsb2NrIiwiaGFzQmxvY2siLCJIYXNCbG9ja1BhcmFtcyIsImhhc0Jsb2NrUGFyYW1zIiwiQ2xpZW50U2lkZUV4cHJlc3Npb24iLCJCbG9ja3MiLCJhZGRNaXNzaW5nIiwibWlzc2luZyIsImhhbmRsZWQiLCJCTE9DS1MiLCJJbmxpbmVzIiwiSU5MSU5FUyIsIl9oYXNoIiwiaW52b2tlU3RhdGljIiwianVtcCIsImp1bXBJZiIsInB1dEl0ZXJhdG9yIiwiZnAiLCJlbnRlckxpc3QiLCJpdGVyYXRlIiwiZXhpdExpc3QiLCJrZXlzIiwidmFsdWVzIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiX3BhcmFtcyIsImV4cHJlc3Npb25zIiwicHVzaER5bmFtaWNTY29wZSIsImJpbmREeW5hbWljU2NvcGUiLCJwb3BEeW5hbWljU2NvcGUiLCJzdGF0ZW1lbnQiLCJiIl0sIm1hcHBpbmdzIjoiOzs7Ozs7UUFxVGdCQSxJLEdBQUFBLEk7UUFzRUFDLFcsR0FBQUEsVztRQWdGQUMsZ0IsR0FBQUEsZ0I7UUFzT0FDLGdCLEdBQUFBLGdCO1FBR0FDLGlCLEdBQUFBLGlCOztBQXByQmhCOztBQUNBOztBQUNBOztJQUFZQyxVOztBQUNaOzs7O0FBQ0E7O0FBQ0E7O0lBQVlDLFU7O0FBQ1o7Ozs7Ozs7O0FBQ0EsSUFBSUMsTUFBTUYsV0FBV0UsR0FBckI7QUFDTyxNQUFNQyxvQ0FBYyxRQUFwQjtBQUNQLE1BQU1DLFNBQU4sQ0FBZ0I7QUFDWkMsZ0JBQVlDLFNBQVMsQ0FBckIsRUFBd0I7QUFDcEIsYUFBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsYUFBS0MsS0FBTCxHQUFhLGlCQUFiO0FBQ0EsYUFBS0MsS0FBTCxHQUFhLEVBQWI7QUFDSDtBQUNEQyxRQUFJQyxJQUFKLEVBQVVDLElBQVYsRUFBZ0I7QUFDWixhQUFLSCxLQUFMLENBQVdJLElBQVgsQ0FBZ0JELElBQWhCO0FBQ0EsYUFBS0osS0FBTCxDQUFXRyxJQUFYLElBQW1CLEtBQUtGLEtBQUwsQ0FBV0ssTUFBWCxHQUFvQixDQUF2QztBQUNIO0FBQ0RDLFlBQVFDLElBQVIsRUFBY0MsT0FBZCxFQUF1QjtBQUNuQixZQUFJTixPQUFPSyxLQUFLLEtB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