UNPKG

babel-plugin-ember-template-compilation

Version:
185 lines (184 loc) 29.6 kB
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _JSUtils_instances, _JSUtils_babel, _JSUtils_state, _JSUtils_template, _JSUtils_addedBinding, _JSUtils_importer, _JSUtils_emitStatement, _JSUtils_parseExpression, _ExpressionContext_importer, _ExpressionContext_target; import { astNodeHasBinding } from './hbs-utils.js'; // This exists to give AST plugins a controlled interface for influencing the // surrounding Javascript scope export class JSUtils { constructor(babel, state, template, addedBinding, importer) { _JSUtils_instances.add(this); _JSUtils_babel.set(this, void 0); _JSUtils_state.set(this, void 0); _JSUtils_template.set(this, void 0); _JSUtils_addedBinding.set(this, void 0); _JSUtils_importer.set(this, void 0); __classPrivateFieldSet(this, _JSUtils_babel, babel, "f"); __classPrivateFieldSet(this, _JSUtils_state, state, "f"); __classPrivateFieldSet(this, _JSUtils_template, template, "f"); __classPrivateFieldSet(this, _JSUtils_addedBinding, addedBinding, "f"); __classPrivateFieldSet(this, _JSUtils_importer, importer, "f"); if (!__classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath) { let target; for (let statement of __classPrivateFieldGet(this, _JSUtils_state, "f").program.get('body')) { if (!statement.isImportDeclaration()) { break; } target = statement; } if (target) { __classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath = target; } } } /** * Create a new binding that you can use in your template, initialized with * the given Javascript expression. * * @param { Expression } expression A javascript expression whose value will * initialize your new binding. See docs on the Expression type for details. * @param target The location within your template where the binding will be * used. This matters so we can avoid naming collisions. * @param opts.nameHint Optionally, provide a descriptive name for your new * binding. We will mangle this name as needed to avoid collisions, but * picking a good name here can aid in debugging. * * @return The name you can use in your template to access the binding. */ bindExpression(expression, target, opts) { let name = unusedNameLike(opts?.nameHint ?? 'a', (candidate) => __classPrivateFieldGet(this, _JSUtils_template, "f").scope.hasBinding(candidate) || astNodeHasBinding(target, candidate)); let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types; let declaration = __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.variableDeclaration('let', [ t.variableDeclarator(t.identifier(name), __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_parseExpression).call(this, __classPrivateFieldGet(this, _JSUtils_state, "f").program, expression)), ])); declaration.scope.registerBinding('let', declaration.get('declarations.0')); __classPrivateFieldGet(this, _JSUtils_addedBinding, "f").call(this, name); return name; } /** * Gain access to an imported value within your template. * * @param moduleSpecifier The path to import from. * @param exportedName The named export you wish to access, or "default" for * the default export, or "*" for the namespace export. * @param target The location within your template where the binding will be * used. This matters so we can avoid naming collisions. * @param opts.nameHint Optionally, provide a descriptive name for your new * binding. We will mangle this name as needed to avoid collisions, but * picking a good name here can aid in debugging. * * @return The name you can use in your template to access the imported value. */ bindImport(moduleSpecifier, exportedName, target, opts) { // This will discover or create the local name for accessing the given import. let importedIdentifier = __classPrivateFieldGet(this, _JSUtils_importer, "f").import(__classPrivateFieldGet(this, _JSUtils_template, "f"), moduleSpecifier, exportedName, opts?.nameHint); // Simple base case: the JS name that's available is also unused at our spot // in HBS, so just use it. if (!astNodeHasBinding(target, importedIdentifier.name)) { __classPrivateFieldGet(this, _JSUtils_addedBinding, "f").call(this, importedIdentifier.name); return importedIdentifier.name; } // The importedIdentifier that we have in Javascript is not usable within // our HBS because it's shadowed by a block param. So we will introduce a // second name via a variable declaration. // // The reason we don't force the import itself to have this name is that // we might be re-using an existing import, and we don't want to go // rewriting all of its callsites that are unrelated to us. let identifier = unusedNameLike(importedIdentifier.name, (candidate) => __classPrivateFieldGet(this, _JSUtils_template, "f").scope.hasBinding(candidate) || astNodeHasBinding(target, candidate)); let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types; let declaration = __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.variableDeclaration('let', [ t.variableDeclarator(t.identifier(identifier), importedIdentifier), ])); declaration.scope.registerBinding('let', declaration.get('declarations.0')); __classPrivateFieldGet(this, _JSUtils_addedBinding, "f").call(this, identifier); return identifier; } /** * Add an import statement purely for side effect. * * @param moduleSpecifier the module to import */ importForSideEffect(moduleSpecifier) { __classPrivateFieldGet(this, _JSUtils_importer, "f").importForSideEffect(moduleSpecifier); } /** * Emit a javascript expresison for side-effect. This only accepts * expressions, not statements, because you should not introduce new bindings. * To introduce a binding see bindExpression or bindImport instead. * * @param { Expression } expression A javascript expression whose value will * initialize your new binding. See docs on the Expression type below for * details. */ emitExpression(expression) { let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types; __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.expressionStatement(__classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_parseExpression).call(this, __classPrivateFieldGet(this, _JSUtils_state, "f").program, expression))); } } _JSUtils_babel = new WeakMap(), _JSUtils_state = new WeakMap(), _JSUtils_template = new WeakMap(), _JSUtils_addedBinding = new WeakMap(), _JSUtils_importer = new WeakMap(), _JSUtils_instances = new WeakSet(), _JSUtils_emitStatement = function _JSUtils_emitStatement(statement) { if (__classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath) { __classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath = __classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath.insertAfter(statement)[0]; } else { __classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath = __classPrivateFieldGet(this, _JSUtils_state, "f").program.unshiftContainer('body', statement)[0]; } return __classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath; }, _JSUtils_parseExpression = function _JSUtils_parseExpression(target, expression) { let expressionString; if (typeof expression === 'string') { expressionString = expression; } else { expressionString = expression(new ExpressionContext(__classPrivateFieldGet(this, _JSUtils_importer, "f"), target)); } return __classPrivateFieldGet(this, _JSUtils_babel, "f").template.expression.ast(expressionString); }; function unusedNameLike(desiredName, isUsed) { let candidate = desiredName; let counter = 0; while (isUsed(candidate)) { candidate = `${desiredName}${counter++}`; } return candidate; } /** * Allows you to construct an expression that relies on imported values. */ class ExpressionContext { constructor(importer, target) { _ExpressionContext_importer.set(this, void 0); _ExpressionContext_target.set(this, void 0); __classPrivateFieldSet(this, _ExpressionContext_importer, importer, "f"); __classPrivateFieldSet(this, _ExpressionContext_target, target, "f"); } /** * Find or create a local binding for the given import. * * @param moduleSpecifier The path to import from. * @param exportedName The named export you wish to access, or "default" for * the default export, or "*" for the namespace export. * @param nameHint Optionally, provide a descriptive name for your new * binding. We will mangle this name as needed to avoid collisions, but * picking a good name here can aid in debugging. * @return the local identifier for the imported value */ import(moduleSpecifier, exportedName, nameHint) { // this method in babel-import-util is the lower-level one that doesn't try // to create valid references for us. It's our responsibility to do so. But // that's OK here, because we have the same responsibility for every // scope-bag identifier, not just the imported ones, and it will be easier // to handle them all at once. return __classPrivateFieldGet(this, _ExpressionContext_importer, "f").import(__classPrivateFieldGet(this, _ExpressionContext_target, "f"), moduleSpecifier, exportedName, nameHint).name; } } _ExpressionContext_importer = new WeakMap(), _ExpressionContext_target = new WeakMap(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvanMtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBS0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPbkQsNkVBQTZFO0FBQzdFLCtCQUErQjtBQUMvQixNQUFNLE9BQU8sT0FBTztJQU9sQixZQUNFLEtBQW1CLEVBQ25CLEtBQVksRUFDWixRQUFnQyxFQUNoQyxZQUFvQyxFQUNwQyxRQUFvQjs7UUFYdEIsaUNBQXFCO1FBQ3JCLGlDQUFjO1FBQ2Qsb0NBQWtDO1FBQ2xDLHdDQUFzQztRQUN0QyxvQ0FBc0I7UUFTcEIsdUJBQUEsSUFBSSxrQkFBVSxLQUFLLE1BQUEsQ0FBQztRQUNwQix1QkFBQSxJQUFJLGtCQUFVLEtBQUssTUFBQSxDQUFDO1FBQ3BCLHVCQUFBLElBQUkscUJBQWEsUUFBUSxNQUFBLENBQUM7UUFDMUIsdUJBQUEsSUFBSSx5QkFBaUIsWUFBWSxNQUFBLENBQUM7UUFDbEMsdUJBQUEsSUFBSSxxQkFBYSxRQUFRLE1BQUEsQ0FBQztRQUUxQixJQUFJLENBQUMsdUJBQUEsSUFBSSxzQkFBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDbEMsSUFBSSxNQUF5QyxDQUFDO1lBQzlDLEtBQUssSUFBSSxTQUFTLElBQUksdUJBQUEsSUFBSSxzQkFBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7b0JBQ3JDLE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ3JCLENBQUM7WUFDRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLHVCQUFBLElBQUksc0JBQU8sQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7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ZSB7IHR5cGVzIGFzIHQgfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgdHlwZSAqIGFzIEJhYmVsIGZyb20gJ0BiYWJlbC9jb3JlJztcbmltcG9ydCB0eXBlIHsgTm9kZVBhdGggfSBmcm9tICdAYmFiZWwvdHJhdmVyc2UnO1xuaW1wb3J0IHR5cGUgeyBBU1RQbHVnaW5CdWlsZGVyLCBBU1RQbHVnaW5FbnZpcm9ubWVudCwgQVNUdjEsIFdhbGtlclBhdGggfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuaW1wb3J0IHR5cGUgeyBJbXBvcnRVdGlsIH0gZnJvbSAnYmFiZWwtaW1wb3J0LXV0aWwnO1xuaW1wb3J0IHsgYXN0Tm9kZUhhc0JpbmRpbmcgfSBmcm9tICcuL2hicy11dGlscy5qcyc7XG5cbmludGVyZmFjZSBTdGF0ZSB7XG4gIHByb2dyYW06IE5vZGVQYXRoPEJhYmVsLnR5cGVzLlByb2dyYW0+O1xuICBsYXN0SW5zZXJ0ZWRQYXRoOiBOb2RlUGF0aDxCYWJlbC50eXBlcy5TdGF0ZW1lbnQ+IHwgdW5kZWZpbmVkO1xufVxuXG4vLyBUaGlzIGV4aXN0cyB0byBnaXZlIEFTVCBwbHVnaW5zIGEgY29udHJvbGxlZCBpbnRlcmZhY2UgZm9yIGluZmx1ZW5jaW5nIHRoZVxuLy8gc3Vycm91bmRpbmcgSmF2YXNjcmlwdCBzY29wZVxuZXhwb3J0IGNsYXNzIEpTVXRpbHMge1xuICAjYmFiZWw6IHR5cGVvZiBCYWJlbDtcbiAgI3N0YXRlOiBTdGF0ZTtcbiAgI3RlbXBsYXRlOiBOb2RlUGF0aDx0LkV4cHJlc3Npb24+O1xuICAjYWRkZWRCaW5kaW5nOiAobmFtZTogc3RyaW5nKSA9PiB2b2lkO1xuICAjaW1wb3J0ZXI6IEltcG9ydFV0aWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFiZWw6IHR5cGVvZiBCYWJlbCxcbiAgICBzdGF0ZTogU3RhdGUsXG4gICAgdGVtcGxhdGU6IE5vZGVQYXRoPHQuRXhwcmVzc2lvbj4sXG4gICAgYWRkZWRCaW5kaW5nOiAobmFtZTogc3RyaW5nKSA9PiB2b2lkLFxuICAgIGltcG9ydGVyOiBJbXBvcnRVdGlsXG4gICkge1xuICAgIHRoaXMuI2JhYmVsID0gYmFiZWw7XG4gICAgdGhpcy4jc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLiN0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMuI2FkZGVkQmluZGluZyA9IGFkZGVkQmluZGluZztcbiAgICB0aGlzLiNpbXBvcnRlciA9IGltcG9ydGVyO1xuXG4gICAgaWYgKCF0aGlzLiNzdGF0ZS5sYXN0SW5zZXJ0ZWRQYXRoKSB7XG4gICAgICBsZXQgdGFyZ2V0OiBOb2RlUGF0aDx0LlN0YXRlbWVudD4gfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2YgdGhpcy4jc3RhdGUucHJvZ3JhbS5nZXQoJ2JvZHknKSkge1xuICAgICAgICBpZiAoIXN0YXRlbWVudC5pc0ltcG9ydERlY2xhcmF0aW9uKCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBzdGF0ZW1lbnQ7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuI3N0YXRlLmxhc3RJbnNlcnRlZFBhdGggPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nIHRoYXQgeW91IGNhbiB1c2UgaW4geW91ciB0ZW1wbGF0ZSwgaW5pdGlhbGl6ZWQgd2l0aFxuICAgKiB0aGUgZ2l2ZW4gSmF2YXNjcmlwdCBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyBFeHByZXNzaW9uIH0gZXhwcmVzc2lvbiBBIGphdmFzY3JpcHQgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSB3aWxsXG4gICAqIGluaXRpYWxpemUgeW91ciBuZXcgYmluZGluZy4gU2VlIGRvY3Mgb24gdGhlIEV4cHJlc3Npb24gdHlwZSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgbG9jYXRpb24gd2l0aGluIHlvdXIgdGVtcGxhdGUgd2hlcmUgdGhlIGJpbmRpbmcgd2lsbCBiZVxuICAgKiB1c2VkLiBUaGlzIG1hdHRlcnMgc28gd2UgY2FuIGF2b2lkIG5hbWluZyBjb2xsaXNpb25zLlxuICAgKiBAcGFyYW0gb3B0cy5uYW1lSGludCBPcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBuZXdcbiAgICogYmluZGluZy4gV2Ugd2lsbCBtYW5nbGUgdGhpcyBuYW1lIGFzIG5lZWRlZCB0byBhdm9pZCBjb2xsaXNpb25zLCBidXRcbiAgICogcGlja2luZyBhIGdvb2QgbmFtZSBoZXJlIGNhbiBhaWQgaW4gZGVidWdnaW5nLlxuICAgKlxuICAgKiBAcmV0dXJuIFRoZSBuYW1lIHlvdSBjYW4gdXNlIGluIHlvdXIgdGVtcGxhdGUgdG8gYWNjZXNzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgYmluZEV4cHJlc3Npb24oXG4gICAgZXhwcmVzc2lvbjogRXhwcmVzc2lvbixcbiAgICB0YXJnZXQ6IFdhbGtlclBhdGg8QVNUdjEuTm9kZT4sXG4gICAgb3B0cz86IHsgbmFtZUhpbnQ/OiBzdHJpbmcgfVxuICApOiBzdHJpbmcge1xuICAgIGxldCBuYW1lID0gdW51c2VkTmFtZUxpa2UoXG4gICAgICBvcHRzPy5uYW1lSGludCA/PyAnYScsXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICB0aGlzLiN0ZW1wbGF0ZS5zY29wZS5oYXNCaW5kaW5nKGNhbmRpZGF0ZSkgfHwgYXN0Tm9kZUhhc0JpbmRpbmcodGFyZ2V0LCBjYW5kaWRhdGUpXG4gICAgKTtcbiAgICBsZXQgdCA9IHRoaXMuI2JhYmVsLnR5cGVzO1xuICAgIGxldCBkZWNsYXJhdGlvbjogTm9kZVBhdGg8dC5WYXJpYWJsZURlY2xhcmF0aW9uPiA9IHRoaXMuI2VtaXRTdGF0ZW1lbnQoXG4gICAgICB0LnZhcmlhYmxlRGVjbGFyYXRpb24oJ2xldCcsIFtcbiAgICAgICAgdC52YXJpYWJsZURlY2xhcmF0b3IoXG4gICAgICAgICAgdC5pZGVudGlmaWVyKG5hbWUpLFxuICAgICAgICAgIHRoaXMuI3BhcnNlRXhwcmVzc2lvbih0aGlzLiNzdGF0ZS5wcm9ncmFtLCBleHByZXNzaW9uKVxuICAgICAgICApLFxuICAgICAgXSlcbiAgICApO1xuICAgIGRlY2xhcmF0aW9uLnNjb3BlLnJlZ2lzdGVyQmluZGluZygnbGV0JywgZGVjbGFyYXRpb24uZ2V0KCdkZWNsYXJhdGlvbnMuMCcpIGFzIE5vZGVQYXRoKTtcbiAgICB0aGlzLiNhZGRlZEJpbmRpbmcobmFtZSk7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAjZW1pdFN0YXRlbWVudDxUIGV4dGVuZHMgdC5TdGF0ZW1lbnQ+KHN0YXRlbWVudDogVCk6IE5vZGVQYXRoPFQ+IHtcbiAgICBpZiAodGhpcy4jc3RhdGUubGFzdEluc2VydGVkUGF0aCkge1xuICAgICAgdGhpcy4jc3RhdGUubGFzdEluc2VydGVkUGF0aCA9IHRoaXMuI3N0YXRlLmxhc3RJbnNlcnRlZFBhdGguaW5zZXJ0QWZ0ZXIoc3RhdGVtZW50KVswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jc3RhdGUubGFzdEluc2VydGVkUGF0aCA9IHRoaXMuI3N0YXRlLnByb2dyYW0udW5zaGlmdENvbnRhaW5lcignYm9keScsIHN0YXRlbWVudClbMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNzdGF0ZS5sYXN0SW5zZXJ0ZWRQYXRoIGFzIE5vZGVQYXRoPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIEdhaW4gYWNjZXNzIHRvIGFuIGltcG9ydGVkIHZhbHVlIHdpdGhpbiB5b3VyIHRlbXBsYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyIFRoZSBwYXRoIHRvIGltcG9ydCBmcm9tLlxuICAgKiBAcGFyYW0gZXhwb3J0ZWROYW1lIFRoZSBuYW1lZCBleHBvcnQgeW91IHdpc2ggdG8gYWNjZXNzLCBvciBcImRlZmF1bHRcIiBmb3JcbiAgICogdGhlIGRlZmF1bHQgZXhwb3J0LCBvciBcIipcIiBmb3IgdGhlIG5hbWVzcGFjZSBleHBvcnQuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxvY2F0aW9uIHdpdGhpbiB5b3VyIHRlbXBsYXRlIHdoZXJlIHRoZSBiaW5kaW5nIHdpbGwgYmVcbiAgICogdXNlZC4gVGhpcyBtYXR0ZXJzIHNvIHdlIGNhbiBhdm9pZCBuYW1pbmcgY29sbGlzaW9ucy5cbiAgICogQHBhcmFtIG9wdHMubmFtZUhpbnQgT3B0aW9uYWxseSwgcHJvdmlkZSBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHlvdXIgbmV3XG4gICAqIGJpbmRpbmcuIFdlIHdpbGwgbWFuZ2xlIHRoaXMgbmFtZSBhcyBuZWVkZWQgdG8gYXZvaWQgY29sbGlzaW9ucywgYnV0XG4gICAqIHBpY2tpbmcgYSBnb29kIG5hbWUgaGVyZSBjYW4gYWlkIGluIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHJldHVybiBUaGUgbmFtZSB5b3UgY2FuIHVzZSBpbiB5b3VyIHRlbXBsYXRlIHRvIGFjY2VzcyB0aGUgaW1wb3J0ZWQgdmFsdWUuXG4gICAqL1xuICBiaW5kSW1wb3J0KFxuICAgIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuICAgIGV4cG9ydGVkTmFtZTogc3RyaW5nLFxuICAgIHRhcmdldDogV2Fsa2VyUGF0aDxBU1R2MS5Ob2RlPixcbiAgICBvcHRzPzogeyBuYW1lSGludD86IHN0cmluZyB9XG4gICk6IHN0cmluZyB7XG4gICAgLy8gVGhpcyB3aWxsIGRpc2NvdmVyIG9yIGNyZWF0ZSB0aGUgbG9jYWwgbmFtZSBmb3IgYWNjZXNzaW5nIHRoZSBnaXZlbiBpbXBvcnQuXG4gICAgbGV0IGltcG9ydGVkSWRlbnRpZmllciA9IHRoaXMuI2ltcG9ydGVyLmltcG9ydChcbiAgICAgIHRoaXMuI3RlbXBsYXRlLFxuICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgZXhwb3J0ZWROYW1lLFxuICAgICAgb3B0cz8ubmFtZUhpbnRcbiAgICApO1xuXG4gICAgLy8gU2ltcGxlIGJhc2UgY2FzZTogdGhlIEpTIG5hbWUgdGhhdCdzIGF2YWlsYWJsZSBpcyBhbHNvIHVudXNlZCBhdCBvdXIgc3BvdFxuICAgIC8vIGluIEhCUywgc28ganVzdCB1c2UgaXQuXG4gICAgaWYgKCFhc3ROb2RlSGFzQmluZGluZyh0YXJnZXQsIGltcG9ydGVkSWRlbnRpZmllci5uYW1lKSkge1xuICAgICAgdGhpcy4jYWRkZWRCaW5kaW5nKGltcG9ydGVkSWRlbnRpZmllci5uYW1lKTtcbiAgICAgIHJldHVybiBpbXBvcnRlZElkZW50aWZpZXIubmFtZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgaW1wb3J0ZWRJZGVudGlmaWVyIHRoYXQgd2UgaGF2ZSBpbiBKYXZhc2NyaXB0IGlzIG5vdCB1c2FibGUgd2l0aGluXG4gICAgLy8gb3VyIEhCUyBiZWNhdXNlIGl0J3Mgc2hhZG93ZWQgYnkgYSBibG9jayBwYXJhbS4gU28gd2Ugd2lsbCBpbnRyb2R1Y2UgYVxuICAgIC8vIHNlY29uZCBuYW1lIHZpYSBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLlxuICAgIC8vXG4gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBmb3JjZSB0aGUgaW1wb3J0IGl0c2VsZiB0byBoYXZlIHRoaXMgbmFtZSBpcyB0aGF0XG4gICAgLy8gd2UgbWlnaHQgYmUgcmUtdXNpbmcgYW4gZXhpc3RpbmcgaW1wb3J0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBnb1xuICAgIC8vIHJld3JpdGluZyBhbGwgb2YgaXRzIGNhbGxzaXRlcyB0aGF0IGFyZSB1bnJlbGF0ZWQgdG8gdXMuXG4gICAgbGV0IGlkZW50aWZpZXIgPSB1bnVzZWROYW1lTGlrZShcbiAgICAgIGltcG9ydGVkSWRlbnRpZmllci5uYW1lLFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgdGhpcy4jdGVtcGxhdGUuc2NvcGUuaGFzQmluZGluZyhjYW5kaWRhdGUpIHx8IGFzdE5vZGVIYXNCaW5kaW5nKHRhcmdldCwgY2FuZGlkYXRlKVxuICAgICk7XG4gICAgbGV0IHQgPSB0aGlzLiNiYWJlbC50eXBlcztcbiAgICBsZXQgZGVjbGFyYXRpb24gPSB0aGlzLiNlbWl0U3RhdGVtZW50KFxuICAgICAgdC52YXJpYWJsZURlY2xhcmF0aW9uKCdsZXQnLCBbXG4gICAgICAgIHQudmFyaWFibGVEZWNsYXJhdG9yKHQuaWRlbnRpZmllcihpZGVudGlmaWVyKSwgaW1wb3J0ZWRJZGVudGlmaWVyKSxcbiAgICAgIF0pXG4gICAgKTtcbiAgICBkZWNsYXJhdGlvbi5zY29wZS5yZWdpc3RlckJpbmRpbmcoJ2xldCcsIGRlY2xhcmF0aW9uLmdldCgnZGVjbGFyYXRpb25zLjAnKSBhcyBOb2RlUGF0aCk7XG5cbiAgICB0aGlzLiNhZGRlZEJpbmRpbmcoaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGltcG9ydCBzdGF0ZW1lbnQgcHVyZWx5IGZvciBzaWRlIGVmZmVjdC5cbiAgICpcbiAgICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciB0aGUgbW9kdWxlIHRvIGltcG9ydFxuICAgKi9cbiAgaW1wb3J0Rm9yU2lkZUVmZmVjdChtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuI2ltcG9ydGVyLmltcG9ydEZvclNpZGVFZmZlY3QobW9kdWxlU3BlY2lmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGEgamF2YXNjcmlwdCBleHByZXNpc29uIGZvciBzaWRlLWVmZmVjdC4gVGhpcyBvbmx5IGFjY2VwdHNcbiAgICogZXhwcmVzc2lvbnMsIG5vdCBzdGF0ZW1lbnRzLCBiZWNhdXNlIHlvdSBzaG91bGQgbm90IGludHJvZHVjZSBuZXcgYmluZGluZ3MuXG4gICAqIFRvIGludHJvZHVjZSBhIGJpbmRpbmcgc2VlIGJpbmRFeHByZXNzaW9uIG9yIGJpbmRJbXBvcnQgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHsgRXhwcmVzc2lvbiB9IGV4cHJlc3Npb24gQSBqYXZhc2NyaXB0IGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgd2lsbFxuICAgKiBpbml0aWFsaXplIHlvdXIgbmV3IGJpbmRpbmcuIFNlZSBkb2NzIG9uIHRoZSBFeHByZXNzaW9uIHR5cGUgYmVsb3cgZm9yXG4gICAqIGRldGFpbHMuXG4gICAqL1xuICBlbWl0RXhwcmVzc2lvbihleHByZXNzaW9uOiBFeHByZXNzaW9uKTogdm9pZCB7XG4gICAgbGV0IHQgPSB0aGlzLiNiYWJlbC50eXBlcztcbiAgICB0aGlzLiNlbWl0U3RhdGVtZW50KFxuICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KHRoaXMuI3BhcnNlRXhwcmVzc2lvbih0aGlzLiNzdGF0ZS5wcm9ncmFtLCBleHByZXNzaW9uKSlcbiAgICApO1xuICB9XG5cbiAgI3BhcnNlRXhwcmVzc2lvbih0YXJnZXQ6IE5vZGVQYXRoPHQuTm9kZT4sIGV4cHJlc3Npb246IEV4cHJlc3Npb24pOiB0LkV4cHJlc3Npb24ge1xuICAgIGxldCBleHByZXNzaW9uU3RyaW5nOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBleHByZXNzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgZXhwcmVzc2lvblN0cmluZyA9IGV4cHJlc3Npb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cHJlc3Npb25TdHJpbmcgPSBleHByZXNzaW9uKG5ldyBFeHByZXNzaW9uQ29udGV4dCh0aGlzLiNpbXBvcnRlciwgdGFyZ2V0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2JhYmVsLnRlbXBsYXRlLmV4cHJlc3Npb24uYXN0KGV4cHJlc3Npb25TdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVudXNlZE5hbWVMaWtlKGRlc2lyZWROYW1lOiBzdHJpbmcsIGlzVXNlZDogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbik6IHN0cmluZyB7XG4gIGxldCBjYW5kaWRhdGUgPSBkZXNpcmVkTmFtZTtcbiAgbGV0IGNvdW50ZXIgPSAwO1xuICB3aGlsZSAoaXNVc2VkKGNhbmRpZGF0ZSkpIHtcbiAgICBjYW5kaWRhdGUgPSBgJHtkZXNpcmVkTmFtZX0ke2NvdW50ZXIrK31gO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGU7XG59XG5cbi8qKlxuICogVGhpcyBleHRlbmRzIEdsaW1tZXIncyBBU1RQbHVnaW5FbnZpcm9ubWVudCB0eXBlIHRvIHB1dCBvdXIganN1dGlscyBpbnRvIG1ldGFcbiAqL1xuZXhwb3J0IHR5cGUgV2l0aEpTVXRpbHM8VCBleHRlbmRzIHsgbWV0YT86IG9iamVjdCB9PiA9IHtcbiAgbWV0YTogVFsnbWV0YSddICYgeyBqc3V0aWxzOiBKU1V0aWxzIH07XG59ICYgVDtcblxuZXhwb3J0IHR5cGUgRXh0ZW5kZWRQbHVnaW5CdWlsZGVyID0gQVNUUGx1Z2luQnVpbGRlcjxXaXRoSlNVdGlsczxBU1RQbHVnaW5FbnZpcm9ubWVudD4+O1xuXG4vKipcbiAqIEFsbG93cyB5b3UgdG8gY29uc3RydWN0IGFuIGV4cHJlc3Npb24gdGhhdCByZWxpZXMgb24gaW1wb3J0ZWQgdmFsdWVzLlxuICovXG5jbGFzcyBFeHByZXNzaW9uQ29udGV4dCB7XG4gICNpbXBvcnRlcjogSW1wb3J0VXRpbDtcbiAgI3RhcmdldDogTm9kZVBhdGg8dC5Ob2RlPjtcblxuICBjb25zdHJ1Y3RvcihpbXBvcnRlcjogSW1wb3J0VXRpbCwgdGFyZ2V0OiBOb2RlUGF0aDx0Lk5vZGU+KSB7XG4gICAgdGhpcy4jaW1wb3J0ZXIgPSBpbXBvcnRlcjtcbiAgICB0aGlzLiN0YXJnZXQgPSB0YXJnZXQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBvciBjcmVhdGUgYSBsb2NhbCBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gaW1wb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyIFRoZSBwYXRoIHRvIGltcG9ydCBmcm9tLlxuICAgKiBAcGFyYW0gZXhwb3J0ZWROYW1lIFRoZSBuYW1lZCBleHBvcnQgeW91IHdpc2ggdG8gYWNjZXNzLCBvciBcImRlZmF1bHRcIiBmb3JcbiAgICogdGhlIGRlZmF1bHQgZXhwb3J0LCBvciBcIipcIiBmb3IgdGhlIG5hbWVzcGFjZSBleHBvcnQuXG4gICAqIEBwYXJhbSBuYW1lSGludCBPcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBuZXdcbiAgICogYmluZGluZy4gV2Ugd2lsbCBtYW5nbGUgdGhpcyBuYW1lIGFzIG5lZWRlZCB0byBhdm9pZCBjb2xsaXNpb25zLCBidXRcbiAgICogcGlja2luZyBhIGdvb2QgbmFtZSBoZXJlIGNhbiBhaWQgaW4gZGVidWdnaW5nLlxuXG4gICAqIEByZXR1cm4gdGhlIGxvY2FsIGlkZW50aWZpZXIgZm9yIHRoZSBpbXBvcnRlZCB2YWx1ZVxuICAgKi9cbiAgaW1wb3J0KG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLCBleHBvcnRlZE5hbWU6IHN0cmluZywgbmFtZUhpbnQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIHRoaXMgbWV0aG9kIGluIGJhYmVsLWltcG9ydC11dGlsIGlzIHRoZSBsb3dlci1sZXZlbCBvbmUgdGhhdCBkb2Vzbid0IHRyeVxuICAgIC8vIHRvIGNyZWF0ZSB2YWxpZCByZWZlcmVuY2VzIGZvciB1cy4gSXQncyBvdXIgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28uIEJ1dFxuICAgIC8vIHRoYXQncyBPSyBoZXJlLCBiZWNhdXNlIHdlIGhhdmUgdGhlIHNhbWUgcmVzcG9uc2liaWxpdHkgZm9yIGV2ZXJ5XG4gICAgLy8gc2NvcGUtYmFnIGlkZW50aWZpZXIsIG5vdCBqdXN0IHRoZSBpbXBvcnRlZCBvbmVzLCBhbmQgaXQgd2lsbCBiZSBlYXNpZXJcbiAgICAvLyB0byBoYW5kbGUgdGhlbSBhbGwgYXQgb25jZS5cbiAgICByZXR1cm4gdGhpcy4jaW1wb3J0ZXIuaW1wb3J0KHRoaXMuI3RhcmdldCwgbW9kdWxlU3BlY2lmaWVyLCBleHBvcnRlZE5hbWUsIG5hbWVIaW50KS5uYW1lO1xuICB9XG59XG5cbi8qKlxuICogWW91IGNhbiBwYXNzIGEgSmF2YXNjcmlwdCBleHByZXNzaW9uIGFzIGEgc3RyaW5nIGxpa2U6XG4gKlxuICogICBcIm5ldyBEYXRlKClcIlxuICpcbiAqIE9yIGFzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RyaW5nOlxuICpcbiAqICAgKCkgPT4gXCJuZXcgRGF0ZSgpXCJcbiAqXG4gKiBXaGVuIHlvdSB1c2UgYSBmdW5jdGlvbiwgaXQgY2FuIHVzZSBpbXBvcnRlZCB2YWx1ZXM6XG4gKlxuICogICAoY29udGV4dCkgPT4gYG5ldyAke2NvbnRleHQuaW1wb3J0KFwibHV4b25cIiwgXCJEYXRlVGltZVwiKX0oKWBcbiAqXG4gKi9cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb24gPSBzdHJpbmcgfCAoKGNvbnRleHQ6IEV4cHJlc3Npb25Db250ZXh0KSA9PiBzdHJpbmcpO1xuIl19