@angular/compiler
Version:
Angular - the compiler library
1 lines • 2.58 MB
Source Map (JSON)
{"version":3,"file":"compiler.mjs","sources":["../../../../../../packages/compiler/src/ml_parser/tags.ts","../../../../../../packages/compiler/src/ml_parser/html_tags.ts","../../../../../../packages/compiler/src/selector.ts","../../../../../../packages/compiler/src/core.ts","../../../../../../packages/compiler/src/output/output_ast.ts","../../../../../../packages/compiler/src/constant_pool.ts","../../../../../../packages/compiler/src/render3/r3_identifiers.ts","../../../../../../packages/compiler/src/util.ts","../../../../../../packages/compiler/src/render3/r3_ast.ts","../../../../../../packages/compiler/src/i18n/i18n_ast.ts","../../../../../../packages/compiler/src/i18n/big_integer.ts","../../../../../../packages/compiler/src/i18n/digest.ts","../../../../../../packages/compiler/src/i18n/serializers/serializer.ts","../../../../../../packages/compiler/src/i18n/serializers/xml_helper.ts","../../../../../../packages/compiler/src/i18n/serializers/xmb.ts","../../../../../../packages/compiler/src/render3/view/i18n/util.ts","../../../../../../packages/compiler/src/render3/view/util.ts","../../../../../../packages/compiler/src/render3/partial/util.ts","../../../../../../packages/compiler/src/output/source_map.ts","../../../../../../packages/compiler/src/output/abstract_emitter.ts","../../../../../../packages/compiler/src/render3/util.ts","../../../../../../packages/compiler/src/render3/r3_factory.ts","../../../../../../packages/compiler/src/injectable_compiler_2.ts","../../../../../../packages/compiler/src/assertions.ts","../../../../../../packages/compiler/src/ml_parser/interpolation_config.ts","../../../../../../packages/compiler/src/aot/static_symbol.ts","../../../../../../packages/compiler/src/chars.ts","../../../../../../packages/compiler/src/parse_util.ts","../../../../../../packages/compiler/src/output/abstract_js_emitter.ts","../../../../../../packages/compiler/src/output/output_jit_trusted_types.ts","../../../../../../packages/compiler/src/output/output_jit.ts","../../../../../../packages/compiler/src/render3/r3_injector_compiler.ts","../../../../../../packages/compiler/src/render3/r3_jit.ts","../../../../../../packages/compiler/src/render3/r3_module_compiler.ts","../../../../../../packages/compiler/src/render3/r3_pipe_compiler.ts","../../../../../../packages/compiler/src/expression_parser/ast.ts","../../../../../../packages/compiler/src/identifiers.ts","../../../../../../packages/compiler/src/compiler_util/expression_converter.ts","../../../../../../packages/compiler/src/shadow_css.ts","../../../../../../packages/compiler/src/compile_metadata.ts","../../../../../../packages/compiler/src/style_compiler.ts","../../../../../../packages/compiler/src/ast_path.ts","../../../../../../packages/compiler/src/ml_parser/ast.ts","../../../../../../packages/compiler/src/ml_parser/entities.ts","../../../../../../packages/compiler/src/ml_parser/lexer.ts","../../../../../../packages/compiler/src/ml_parser/parser.ts","../../../../../../packages/compiler/src/ml_parser/html_whitespaces.ts","../../../../../../packages/compiler/src/ml_parser/icu_ast_expander.ts","../../../../../../packages/compiler/src/template_parser/template_ast.ts","../../../../../../packages/compiler/src/provider_analyzer.ts","../../../../../../packages/compiler/src/style_url_resolver.ts","../../../../../../packages/compiler/src/template_parser/binding_parser.ts","../../../../../../packages/compiler/src/template_parser/template_preparser.ts","../../../../../../packages/compiler/src/template_parser/template_parser.ts","../../../../../../packages/compiler/src/render3/view/style_parser.ts","../../../../../../packages/compiler/src/render3/view/styling_builder.ts","../../../../../../packages/compiler/src/expression_parser/lexer.ts","../../../../../../packages/compiler/src/expression_parser/parser.ts","../../../../../../packages/compiler/src/ml_parser/html_parser.ts","../../../../../../packages/compiler/src/output/map_util.ts","../../../../../../packages/compiler/src/schema/dom_security_schema.ts","../../../../../../packages/compiler/src/schema/element_schema_registry.ts","../../../../../../packages/compiler/src/schema/dom_element_schema_registry.ts","../../../../../../packages/compiler/src/schema/trusted_types_sinks.ts","../../../../../../packages/compiler/src/render3/r3_template_transform.ts","../../../../../../packages/compiler/src/render3/view/i18n/context.ts","../../../../../../packages/compiler/src/render3/view/i18n/icu_serializer.ts","../../../../../../packages/compiler/src/i18n/serializers/placeholder.ts","../../../../../../packages/compiler/src/i18n/i18n_parser.ts","../../../../../../packages/compiler/src/i18n/parse_util.ts","../../../../../../packages/compiler/src/render3/view/i18n/meta.ts","../../../../../../packages/compiler/src/render3/view/i18n/get_msg_utils.ts","../../../../../../packages/compiler/src/render3/view/i18n/localize_utils.ts","../../../../../../packages/compiler/src/render3/view/template.ts","../../../../../../packages/compiler/src/render3/view/compiler.ts","../../../../../../packages/compiler/src/resource_loader.ts","../../../../../../packages/compiler/src/jit_compiler_facade.ts","../../../../../../packages/compiler/src/version.ts","../../../../../../packages/compiler/src/config.ts","../../../../../../packages/compiler/src/directive_normalizer.ts","../../../../../../packages/compiler/src/directive_resolver.ts","../../../../../../packages/compiler/src/i18n/extractor_merger.ts","../../../../../../packages/compiler/src/ml_parser/xml_tags.ts","../../../../../../packages/compiler/src/ml_parser/xml_parser.ts","../../../../../../packages/compiler/src/i18n/serializers/xliff.ts","../../../../../../packages/compiler/src/i18n/serializers/xliff2.ts","../../../../../../packages/compiler/src/i18n/serializers/xtb.ts","../../../../../../packages/compiler/src/i18n/translation_bundle.ts","../../../../../../packages/compiler/src/i18n/i18n_html_parser.ts","../../../../../../packages/compiler/src/output/value_util.ts","../../../../../../packages/compiler/src/injectable_compiler.ts","../../../../../../packages/compiler/src/aot/util.ts","../../../../../../packages/compiler/src/lifecycle_reflector.ts","../../../../../../packages/compiler/src/metadata_resolver.ts","../../../../../../packages/compiler/src/view_compiler/provider_compiler.ts","../../../../../../packages/compiler/src/ng_module_compiler.ts","../../../../../../packages/compiler/src/ng_module_resolver.ts","../../../../../../packages/compiler/src/output/ts_emitter.ts","../../../../../../packages/compiler/src/pipe_resolver.ts","../../../../../../packages/compiler/src/view_compiler/type_check_compiler.ts","../../../../../../packages/compiler/src/view_compiler/view_compiler.ts","../../../../../../packages/compiler/src/i18n/message_bundle.ts","../../../../../../packages/compiler/src/aot/generated_file.ts","../../../../../../packages/compiler/src/aot/static_symbol_resolver.ts","../../../../../../packages/compiler/src/aot/summary_serializer.ts","../../../../../../packages/compiler/src/aot/compiler.ts","../../../../../../packages/compiler/src/aot/formatted_error.ts","../../../../../../packages/compiler/src/aot/static_reflector.ts","../../../../../../packages/compiler/src/aot/summary_resolver.ts","../../../../../../packages/compiler/src/aot/compiler_factory.ts","../../../../../../packages/compiler/src/aot/compiler_options.ts","../../../../../../packages/compiler/src/aot/compiler_host.ts","../../../../../../packages/compiler/src/aot/partial_module.ts","../../../../../../packages/compiler/src/summary_resolver.ts","../../../../../../packages/compiler/src/output/output_interpreter.ts","../../../../../../packages/compiler/src/jit/compiler.ts","../../../../../../packages/compiler/src/compile_reflector.ts","../../../../../../packages/compiler/src/url_resolver.ts","../../../../../../packages/compiler/src/i18n/extractor.ts","../../../../../../packages/compiler/src/i18n/index.ts","../../../../../../packages/compiler/src/render3/partial/api.ts","../../../../../../packages/compiler/src/render3/view/api.ts","../../../../../../packages/compiler/src/render3/view/t2_api.ts","../../../../../../packages/compiler/src/render3/view/t2_binder.ts","../../../../../../packages/compiler/src/render3/r3_class_metadata_compiler.ts","../../../../../../packages/compiler/src/render3/partial/class_metadata.ts","../../../../../../packages/compiler/src/render3/partial/directive.ts","../../../../../../packages/compiler/src/render3/partial/component.ts","../../../../../../packages/compiler/src/render3/partial/factory.ts","../../../../../../packages/compiler/src/render3/partial/injectable.ts","../../../../../../packages/compiler/src/render3/partial/injector.ts","../../../../../../packages/compiler/src/render3/partial/ng_module.ts","../../../../../../packages/compiler/src/render3/partial/pipe.ts","../../../../../../packages/compiler/src/compiler.ts","../../../../../../packages/compiler/public_api.ts","../../../../../../packages/compiler/compiler.ts","../../../../../../packages/compiler/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport enum TagContentType {\n RAW_TEXT,\n ESCAPABLE_RAW_TEXT,\n PARSABLE_DATA\n}\n\nexport interface TagDefinition {\n closedByParent: boolean;\n implicitNamespacePrefix: string|null;\n isVoid: boolean;\n ignoreFirstLf: boolean;\n canSelfClose: boolean;\n preventNamespaceInheritance: boolean;\n\n isClosedByChild(name: string): boolean;\n getContentType(prefix?: string): TagContentType;\n}\n\nexport function splitNsName(elementName: string): [string|null, string] {\n if (elementName[0] != ':') {\n return [null, elementName];\n }\n\n const colonIndex = elementName.indexOf(':', 1);\n\n if (colonIndex === -1) {\n throw new Error(`Unsupported format \"${elementName}\" expecting \":namespace:name\"`);\n }\n\n return [elementName.slice(1, colonIndex), elementName.slice(colonIndex + 1)];\n}\n\n// `<ng-container>` tags work the same regardless the namespace\nexport function isNgContainer(tagName: string): boolean {\n return splitNsName(tagName)[1] === 'ng-container';\n}\n\n// `<ng-content>` tags work the same regardless the namespace\nexport function isNgContent(tagName: string): boolean {\n return splitNsName(tagName)[1] === 'ng-content';\n}\n\n// `<ng-template>` tags work the same regardless the namespace\nexport function isNgTemplate(tagName: string): boolean {\n return splitNsName(tagName)[1] === 'ng-template';\n}\n\nexport function getNsPrefix(fullName: string): string;\nexport function getNsPrefix(fullName: null): null;\nexport function getNsPrefix(fullName: string|null): string|null {\n return fullName === null ? null : splitNsName(fullName)[0];\n}\n\nexport function mergeNsAndName(prefix: string, localName: string): string {\n return prefix ? `:${prefix}:${localName}` : localName;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {TagContentType, TagDefinition} from './tags';\n\nexport class HtmlTagDefinition implements TagDefinition {\n private closedByChildren: {[key: string]: boolean} = {};\n private contentType: TagContentType|\n {default: TagContentType, [namespace: string]: TagContentType};\n\n closedByParent: boolean = false;\n implicitNamespacePrefix: string|null;\n isVoid: boolean;\n ignoreFirstLf: boolean;\n canSelfClose: boolean = false;\n preventNamespaceInheritance: boolean;\n\n constructor({\n closedByChildren,\n implicitNamespacePrefix,\n contentType = TagContentType.PARSABLE_DATA,\n closedByParent = false,\n isVoid = false,\n ignoreFirstLf = false,\n preventNamespaceInheritance = false\n }: {\n closedByChildren?: string[],\n closedByParent?: boolean,\n implicitNamespacePrefix?: string,\n contentType?: TagContentType|{default: TagContentType, [namespace: string]: TagContentType},\n isVoid?: boolean,\n ignoreFirstLf?: boolean,\n preventNamespaceInheritance?: boolean\n } = {}) {\n if (closedByChildren && closedByChildren.length > 0) {\n closedByChildren.forEach(tagName => this.closedByChildren[tagName] = true);\n }\n this.isVoid = isVoid;\n this.closedByParent = closedByParent || isVoid;\n this.implicitNamespacePrefix = implicitNamespacePrefix || null;\n this.contentType = contentType;\n this.ignoreFirstLf = ignoreFirstLf;\n this.preventNamespaceInheritance = preventNamespaceInheritance;\n }\n\n isClosedByChild(name: string): boolean {\n return this.isVoid || name.toLowerCase() in this.closedByChildren;\n }\n\n getContentType(prefix?: string): TagContentType {\n if (typeof this.contentType === 'object') {\n const overrideType = prefix === undefined ? undefined : this.contentType[prefix];\n return overrideType ?? this.contentType.default;\n }\n return this.contentType;\n }\n}\n\nlet _DEFAULT_TAG_DEFINITION!: HtmlTagDefinition;\n\n// see https://www.w3.org/TR/html51/syntax.html#optional-tags\n// This implementation does not fully conform to the HTML5 spec.\nlet TAG_DEFINITIONS!: {[key: string]: HtmlTagDefinition};\n\nexport function getHtmlTagDefinition(tagName: string): HtmlTagDefinition {\n if (!TAG_DEFINITIONS) {\n _DEFAULT_TAG_DEFINITION = new HtmlTagDefinition();\n TAG_DEFINITIONS = {\n 'base': new HtmlTagDefinition({isVoid: true}),\n 'meta': new HtmlTagDefinition({isVoid: true}),\n 'area': new HtmlTagDefinition({isVoid: true}),\n 'embed': new HtmlTagDefinition({isVoid: true}),\n 'link': new HtmlTagDefinition({isVoid: true}),\n 'img': new HtmlTagDefinition({isVoid: true}),\n 'input': new HtmlTagDefinition({isVoid: true}),\n 'param': new HtmlTagDefinition({isVoid: true}),\n 'hr': new HtmlTagDefinition({isVoid: true}),\n 'br': new HtmlTagDefinition({isVoid: true}),\n 'source': new HtmlTagDefinition({isVoid: true}),\n 'track': new HtmlTagDefinition({isVoid: true}),\n 'wbr': new HtmlTagDefinition({isVoid: true}),\n 'p': new HtmlTagDefinition({\n closedByChildren: [\n 'address', 'article', 'aside', 'blockquote', 'div', 'dl', 'fieldset',\n 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5',\n 'h6', 'header', 'hgroup', 'hr', 'main', 'nav', 'ol',\n 'p', 'pre', 'section', 'table', 'ul'\n ],\n closedByParent: true\n }),\n 'thead': new HtmlTagDefinition({closedByChildren: ['tbody', 'tfoot']}),\n 'tbody': new HtmlTagDefinition({closedByChildren: ['tbody', 'tfoot'], closedByParent: true}),\n 'tfoot': new HtmlTagDefinition({closedByChildren: ['tbody'], closedByParent: true}),\n 'tr': new HtmlTagDefinition({closedByChildren: ['tr'], closedByParent: true}),\n 'td': new HtmlTagDefinition({closedByChildren: ['td', 'th'], closedByParent: true}),\n 'th': new HtmlTagDefinition({closedByChildren: ['td', 'th'], closedByParent: true}),\n 'col': new HtmlTagDefinition({isVoid: true}),\n 'svg': new HtmlTagDefinition({implicitNamespacePrefix: 'svg'}),\n 'foreignObject': new HtmlTagDefinition({\n // Usually the implicit namespace here would be redundant since it will be inherited from\n // the parent `svg`, but we have to do it for `foreignObject`, because the way the parser\n // works is that the parent node of an end tag is its own start tag which means that\n // the `preventNamespaceInheritance` on `foreignObject` would have it default to the\n // implicit namespace which is `html`, unless specified otherwise.\n implicitNamespacePrefix: 'svg',\n // We want to prevent children of foreignObject from inheriting its namespace, because\n // the point of the element is to allow nodes from other namespaces to be inserted.\n preventNamespaceInheritance: true,\n }),\n 'math': new HtmlTagDefinition({implicitNamespacePrefix: 'math'}),\n 'li': new HtmlTagDefinition({closedByChildren: ['li'], closedByParent: true}),\n 'dt': new HtmlTagDefinition({closedByChildren: ['dt', 'dd']}),\n 'dd': new HtmlTagDefinition({closedByChildren: ['dt', 'dd'], closedByParent: true}),\n 'rb': new HtmlTagDefinition(\n {closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true}),\n 'rt': new HtmlTagDefinition(\n {closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true}),\n 'rtc': new HtmlTagDefinition({closedByChildren: ['rb', 'rtc', 'rp'], closedByParent: true}),\n 'rp': new HtmlTagDefinition(\n {closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true}),\n 'optgroup': new HtmlTagDefinition({closedByChildren: ['optgroup'], closedByParent: true}),\n 'option':\n new HtmlTagDefinition({closedByChildren: ['option', 'optgroup'], closedByParent: true}),\n 'pre': new HtmlTagDefinition({ignoreFirstLf: true}),\n 'listing': new HtmlTagDefinition({ignoreFirstLf: true}),\n 'style': new HtmlTagDefinition({contentType: TagContentType.RAW_TEXT}),\n 'script': new HtmlTagDefinition({contentType: TagContentType.RAW_TEXT}),\n 'title': new HtmlTagDefinition({\n // The browser supports two separate `title` tags which have to use\n // a different content type: `HTMLTitleElement` and `SVGTitleElement`\n contentType: {default: TagContentType.ESCAPABLE_RAW_TEXT, svg: TagContentType.PARSABLE_DATA}\n }),\n 'textarea': new HtmlTagDefinition(\n {contentType: TagContentType.ESCAPABLE_RAW_TEXT, ignoreFirstLf: true}),\n };\n }\n // We have to make both a case-sensitive and a case-insesitive lookup, because\n // HTML tag names are case insensitive, whereas some SVG tags are case sensitive.\n return TAG_DEFINITIONS[tagName] ?? TAG_DEFINITIONS[tagName.toLowerCase()] ??\n _DEFAULT_TAG_DEFINITION;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {getHtmlTagDefinition} from './ml_parser/html_tags';\n\nconst _SELECTOR_REGEXP = new RegExp(\n '(\\\\:not\\\\()|' + // 1: \":not(\"\n '(([\\\\.\\\\#]?)[-\\\\w]+)|' + // 2: \"tag\"; 3: \".\"/\"#\";\n // \"-\" should appear first in the regexp below as FF31 parses \"[.-\\w]\" as a range\n // 4: attribute; 5: attribute_string; 6: attribute_value\n '(?:\\\\[([-.\\\\w*\\\\\\\\$]+)(?:=([\\\"\\']?)([^\\\\]\\\"\\']*)\\\\5)?\\\\])|' + // \"[name]\", \"[name=value]\",\n // \"[name=\"value\"]\",\n // \"[name='value']\"\n '(\\\\))|' + // 7: \")\"\n '(\\\\s*,\\\\s*)', // 8: \",\"\n 'g');\n\n/**\n * These offsets should match the match-groups in `_SELECTOR_REGEXP` offsets.\n */\nconst enum SelectorRegexp {\n ALL = 0, // The whole match\n NOT = 1,\n TAG = 2,\n PREFIX = 3,\n ATTRIBUTE = 4,\n ATTRIBUTE_STRING = 5,\n ATTRIBUTE_VALUE = 6,\n NOT_END = 7,\n SEPARATOR = 8,\n}\n/**\n * A css selector contains an element name,\n * css classes and attribute/value pairs with the purpose\n * of selecting subsets out of them.\n */\nexport class CssSelector {\n element: string|null = null;\n classNames: string[] = [];\n /**\n * The selectors are encoded in pairs where:\n * - even locations are attribute names\n * - odd locations are attribute values.\n *\n * Example:\n * Selector: `[key1=value1][key2]` would parse to:\n * ```\n * ['key1', 'value1', 'key2', '']\n * ```\n */\n attrs: string[] = [];\n notSelectors: CssSelector[] = [];\n\n static parse(selector: string): CssSelector[] {\n const results: CssSelector[] = [];\n const _addResult = (res: CssSelector[], cssSel: CssSelector) => {\n if (cssSel.notSelectors.length > 0 && !cssSel.element && cssSel.classNames.length == 0 &&\n cssSel.attrs.length == 0) {\n cssSel.element = '*';\n }\n res.push(cssSel);\n };\n let cssSelector = new CssSelector();\n let match: string[]|null;\n let current = cssSelector;\n let inNot = false;\n _SELECTOR_REGEXP.lastIndex = 0;\n while (match = _SELECTOR_REGEXP.exec(selector)) {\n if (match[SelectorRegexp.NOT]) {\n if (inNot) {\n throw new Error('Nesting :not in a selector is not allowed');\n }\n inNot = true;\n current = new CssSelector();\n cssSelector.notSelectors.push(current);\n }\n const tag = match[SelectorRegexp.TAG];\n if (tag) {\n const prefix = match[SelectorRegexp.PREFIX];\n if (prefix === '#') {\n // #hash\n current.addAttribute('id', tag.substr(1));\n } else if (prefix === '.') {\n // Class\n current.addClassName(tag.substr(1));\n } else {\n // Element\n current.setElement(tag);\n }\n }\n const attribute = match[SelectorRegexp.ATTRIBUTE];\n\n if (attribute) {\n current.addAttribute(\n current.unescapeAttribute(attribute), match[SelectorRegexp.ATTRIBUTE_VALUE]);\n }\n if (match[SelectorRegexp.NOT_END]) {\n inNot = false;\n current = cssSelector;\n }\n if (match[SelectorRegexp.SEPARATOR]) {\n if (inNot) {\n throw new Error('Multiple selectors in :not are not supported');\n }\n _addResult(results, cssSelector);\n cssSelector = current = new CssSelector();\n }\n }\n _addResult(results, cssSelector);\n return results;\n }\n\n /**\n * Unescape `\\$` sequences from the CSS attribute selector.\n *\n * This is needed because `$` can have a special meaning in CSS selectors,\n * but we might want to match an attribute that contains `$`.\n * [MDN web link for more\n * info](https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors).\n * @param attr the attribute to unescape.\n * @returns the unescaped string.\n */\n unescapeAttribute(attr: string): string {\n let result = '';\n let escaping = false;\n for (let i = 0; i < attr.length; i++) {\n const char = attr.charAt(i);\n if (char === '\\\\') {\n escaping = true;\n continue;\n }\n if (char === '$' && !escaping) {\n throw new Error(\n `Error in attribute selector \"${attr}\". ` +\n `Unescaped \"$\" is not supported. Please escape with \"\\\\$\".`);\n }\n escaping = false;\n result += char;\n }\n return result;\n }\n\n /**\n * Escape `$` sequences from the CSS attribute selector.\n *\n * This is needed because `$` can have a special meaning in CSS selectors,\n * with this method we are escaping `$` with `\\$'.\n * [MDN web link for more\n * info](https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors).\n * @param attr the attribute to escape.\n * @returns the escaped string. \n */\n escapeAttribute(attr: string): string {\n return attr.replace(/\\\\/g, '\\\\\\\\').replace(/\\$/g, '\\\\$');\n }\n\n isElementSelector(): boolean {\n return this.hasElementSelector() && this.classNames.length == 0 && this.attrs.length == 0 &&\n this.notSelectors.length === 0;\n }\n\n hasElementSelector(): boolean {\n return !!this.element;\n }\n\n setElement(element: string|null = null) {\n this.element = element;\n }\n\n /** Gets a template string for an element that matches the selector. */\n getMatchingElementTemplate(): string {\n const tagName = this.element || 'div';\n const classAttr = this.classNames.length > 0 ? ` class=\"${this.classNames.join(' ')}\"` : '';\n\n let attrs = '';\n for (let i = 0; i < this.attrs.length; i += 2) {\n const attrName = this.attrs[i];\n const attrValue = this.attrs[i + 1] !== '' ? `=\"${this.attrs[i + 1]}\"` : '';\n attrs += ` ${attrName}${attrValue}`;\n }\n\n return getHtmlTagDefinition(tagName).isVoid ? `<${tagName}${classAttr}${attrs}/>` :\n `<${tagName}${classAttr}${attrs}></${tagName}>`;\n }\n\n getAttrs(): string[] {\n const result: string[] = [];\n if (this.classNames.length > 0) {\n result.push('class', this.classNames.join(' '));\n }\n return result.concat(this.attrs);\n }\n\n addAttribute(name: string, value: string = '') {\n this.attrs.push(name, value && value.toLowerCase() || '');\n }\n\n addClassName(name: string) {\n this.classNames.push(name.toLowerCase());\n }\n\n toString(): string {\n let res: string = this.element || '';\n if (this.classNames) {\n this.classNames.forEach(klass => res += `.${klass}`);\n }\n if (this.attrs) {\n for (let i = 0; i < this.attrs.length; i += 2) {\n const name = this.escapeAttribute(this.attrs[i]);\n const value = this.attrs[i + 1];\n res += `[${name}${value ? '=' + value : ''}]`;\n }\n }\n this.notSelectors.forEach(notSelector => res += `:not(${notSelector})`);\n return res;\n }\n}\n\n/**\n * Reads a list of CssSelectors and allows to calculate which ones\n * are contained in a given CssSelector.\n */\nexport class SelectorMatcher<T = any> {\n static createNotMatcher(notSelectors: CssSelector[]): SelectorMatcher<null> {\n const notMatcher = new SelectorMatcher<null>();\n notMatcher.addSelectables(notSelectors, null);\n return notMatcher;\n }\n\n private _elementMap = new Map<string, SelectorContext<T>[]>();\n private _elementPartialMap = new Map<string, SelectorMatcher<T>>();\n private _classMap = new Map<string, SelectorContext<T>[]>();\n private _classPartialMap = new Map<string, SelectorMatcher<T>>();\n private _attrValueMap = new Map<string, Map<string, SelectorContext<T>[]>>();\n private _attrValuePartialMap = new Map<string, Map<string, SelectorMatcher<T>>>();\n private _listContexts: SelectorListContext[] = [];\n\n addSelectables(cssSelectors: CssSelector[], callbackCtxt?: T) {\n let listContext: SelectorListContext = null!;\n if (cssSelectors.length > 1) {\n listContext = new SelectorListContext(cssSelectors);\n this._listContexts.push(listContext);\n }\n for (let i = 0; i < cssSelectors.length; i++) {\n this._addSelectable(cssSelectors[i], callbackCtxt as T, listContext);\n }\n }\n\n /**\n * Add an object that can be found later on by calling `match`.\n * @param cssSelector A css selector\n * @param callbackCtxt An opaque object that will be given to the callback of the `match` function\n */\n private _addSelectable(\n cssSelector: CssSelector, callbackCtxt: T, listContext: SelectorListContext) {\n let matcher: SelectorMatcher<T> = this;\n const element = cssSelector.element;\n const classNames = cssSelector.classNames;\n const attrs = cssSelector.attrs;\n const selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);\n\n if (element) {\n const isTerminal = attrs.length === 0 && classNames.length === 0;\n if (isTerminal) {\n this._addTerminal(matcher._elementMap, element, selectable);\n } else {\n matcher = this._addPartial(matcher._elementPartialMap, element);\n }\n }\n\n if (classNames) {\n for (let i = 0; i < classNames.length; i++) {\n const isTerminal = attrs.length === 0 && i === classNames.length - 1;\n const className = classNames[i];\n if (isTerminal) {\n this._addTerminal(matcher._classMap, className, selectable);\n } else {\n matcher = this._addPartial(matcher._classPartialMap, className);\n }\n }\n }\n\n if (attrs) {\n for (let i = 0; i < attrs.length; i += 2) {\n const isTerminal = i === attrs.length - 2;\n const name = attrs[i];\n const value = attrs[i + 1];\n if (isTerminal) {\n const terminalMap = matcher._attrValueMap;\n let terminalValuesMap = terminalMap.get(name);\n if (!terminalValuesMap) {\n terminalValuesMap = new Map<string, SelectorContext<T>[]>();\n terminalMap.set(name, terminalValuesMap);\n }\n this._addTerminal(terminalValuesMap, value, selectable);\n } else {\n const partialMap = matcher._attrValuePartialMap;\n let partialValuesMap = partialMap.get(name);\n if (!partialValuesMap) {\n partialValuesMap = new Map<string, SelectorMatcher<T>>();\n partialMap.set(name, partialValuesMap);\n }\n matcher = this._addPartial(partialValuesMap, value);\n }\n }\n }\n }\n\n private _addTerminal(\n map: Map<string, SelectorContext<T>[]>, name: string, selectable: SelectorContext<T>) {\n let terminalList = map.get(name);\n if (!terminalList) {\n terminalList = [];\n map.set(name, terminalList);\n }\n terminalList.push(selectable);\n }\n\n private _addPartial(map: Map<string, SelectorMatcher<T>>, name: string): SelectorMatcher<T> {\n let matcher = map.get(name);\n if (!matcher) {\n matcher = new SelectorMatcher<T>();\n map.set(name, matcher);\n }\n return matcher;\n }\n\n /**\n * Find the objects that have been added via `addSelectable`\n * whose css selector is contained in the given css selector.\n * @param cssSelector A css selector\n * @param matchedCallback This callback will be called with the object handed into `addSelectable`\n * @return boolean true if a match was found\n */\n match(cssSelector: CssSelector, matchedCallback: ((c: CssSelector, a: T) => void)|null): boolean {\n let result = false;\n const element = cssSelector.element!;\n const classNames = cssSelector.classNames;\n const attrs = cssSelector.attrs;\n\n for (let i = 0; i < this._listContexts.length; i++) {\n this._listContexts[i].alreadyMatched = false;\n }\n\n result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;\n result = this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) ||\n result;\n\n if (classNames) {\n for (let i = 0; i < classNames.length; i++) {\n const className = classNames[i];\n result =\n this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;\n result =\n this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) ||\n result;\n }\n }\n\n if (attrs) {\n for (let i = 0; i < attrs.length; i += 2) {\n const name = attrs[i];\n const value = attrs[i + 1];\n\n const terminalValuesMap = this._attrValueMap.get(name)!;\n if (value) {\n result =\n this._matchTerminal(terminalValuesMap, '', cssSelector, matchedCallback) || result;\n }\n result =\n this._matchTerminal(terminalValuesMap, value, cssSelector, matchedCallback) || result;\n\n const partialValuesMap = this._attrValuePartialMap.get(name)!;\n if (value) {\n result = this._matchPartial(partialValuesMap, '', cssSelector, matchedCallback) || result;\n }\n result =\n this._matchPartial(partialValuesMap, value, cssSelector, matchedCallback) || result;\n }\n }\n return result;\n }\n\n /** @internal */\n _matchTerminal(\n map: Map<string, SelectorContext<T>[]>, name: string, cssSelector: CssSelector,\n matchedCallback: ((c: CssSelector, a: any) => void)|null): boolean {\n if (!map || typeof name !== 'string') {\n return false;\n }\n\n let selectables: SelectorContext<T>[] = map.get(name) || [];\n const starSelectables: SelectorContext<T>[] = map.get('*')!;\n if (starSelectables) {\n selectables = selectables.concat(starSelectables);\n }\n if (selectables.length === 0) {\n return false;\n }\n let selectable: SelectorContext<T>;\n let result = false;\n for (let i = 0; i < selectables.length; i++) {\n selectable = selectables[i];\n result = selectable.finalize(cssSelector, matchedCallback) || result;\n }\n return result;\n }\n\n /** @internal */\n _matchPartial(\n map: Map<string, SelectorMatcher<T>>, name: string, cssSelector: CssSelector,\n matchedCallback: ((c: CssSelector, a: any) => void)|null): boolean {\n if (!map || typeof name !== 'string') {\n return false;\n }\n\n const nestedSelector = map.get(name);\n if (!nestedSelector) {\n return false;\n }\n // TODO(perf): get rid of recursion and measure again\n // TODO(perf): don't pass the whole selector into the recursion,\n // but only the not processed parts\n return nestedSelector.match(cssSelector, matchedCallback);\n }\n}\n\n\nexport class SelectorListContext {\n alreadyMatched: boolean = false;\n\n constructor(public selectors: CssSelector[]) {}\n}\n\n// Store context to pass back selector and context when a selector is matched\nexport class SelectorContext<T = any> {\n notSelectors: CssSelector[];\n\n constructor(\n public selector: CssSelector, public cbContext: T, public listContext: SelectorListContext) {\n this.notSelectors = selector.notSelectors;\n }\n\n finalize(cssSelector: CssSelector, callback: ((c: CssSelector, a: T) => void)|null): boolean {\n let result = true;\n if (this.notSelectors.length > 0 && (!this.listContext || !this.listContext.alreadyMatched)) {\n const notMatcher = SelectorMatcher.createNotMatcher(this.notSelectors);\n result = !notMatcher.match(cssSelector, null);\n }\n if (result && callback && (!this.listContext || !this.listContext.alreadyMatched)) {\n if (this.listContext) {\n this.listContext.alreadyMatched = true;\n }\n callback(this.selector, this.cbContext);\n }\n return result;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n// Attention:\n// This file duplicates types and values from @angular/core\n// so that we are able to make @angular/compiler independent of @angular/core.\n// This is important to prevent a build cycle, as @angular/core needs to\n// be compiled with the compiler.\n\nimport {CssSelector} from './selector';\n\nexport interface Inject {\n token: any;\n}\nexport const createInject = makeMetadataFactory<Inject>('Inject', (token: any) => ({token}));\nexport const createInjectionToken = makeMetadataFactory<object>(\n 'InjectionToken', (desc: string) => ({_desc: desc, ɵprov: undefined}));\n\nexport interface Attribute {\n attributeName: string;\n}\nexport const createAttribute =\n makeMetadataFactory<Attribute>('Attribute', (attributeName: string) => ({attributeName}));\n\n// Stores the default value of `emitDistinctChangesOnly` when the `emitDistinctChangesOnly` is not\n// explicitly set.\nexport const emitDistinctChangesOnlyDefaultValue = true;\n\n\nexport interface Query {\n descendants: boolean;\n first: boolean;\n read: any;\n isViewQuery: boolean;\n selector: any;\n static?: boolean;\n emitDistinctChangesOnly: boolean;\n}\n\nexport const createContentChildren = makeMetadataFactory<Query>(\n 'ContentChildren', (selector?: any, data: any = {}) => ({\n selector,\n first: false,\n isViewQuery: false,\n descendants: false,\n emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue,\n ...data\n }));\nexport const createContentChild = makeMetadataFactory<Query>(\n 'ContentChild',\n (selector?: any, data: any = {}) =>\n ({selector, first: true, isViewQuery: false, descendants: true, ...data}));\nexport const createViewChildren = makeMetadataFactory<Query>(\n 'ViewChildren', (selector?: any, data: any = {}) => ({\n selector,\n first: false,\n isViewQuery: true,\n descendants: true,\n emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue,\n ...data\n }));\nexport const createViewChild = makeMetadataFactory<Query>(\n 'ViewChild',\n (selector: any, data: any) =>\n ({selector, first: true, isViewQuery: true, descendants: true, ...data}));\n\nexport interface Directive {\n selector?: string;\n inputs?: string[];\n outputs?: string[];\n host?: {[key: string]: string};\n providers?: Provider[];\n exportAs?: string;\n queries?: {[key: string]: any};\n guards?: {[key: string]: any};\n}\nexport const createDirective =\n makeMetadataFactory<Directive>('Directive', (dir: Directive = {}) => dir);\n\nexport interface Component extends Directive {\n changeDetection?: ChangeDetectionStrategy;\n viewProviders?: Provider[];\n moduleId?: string;\n templateUrl?: string;\n template?: string;\n styleUrls?: string[];\n styles?: string[];\n animations?: any[];\n encapsulation?: ViewEncapsulation;\n interpolation?: [string, string];\n entryComponents?: Array<Type|any[]>;\n preserveWhitespaces?: boolean;\n}\nexport enum ViewEncapsulation {\n Emulated = 0,\n // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.\n None = 2,\n ShadowDom = 3\n}\n\nexport enum ChangeDetectionStrategy {\n OnPush = 0,\n Default = 1\n}\n\nexport const createComponent = makeMetadataFactory<Component>(\n 'Component', (c: Component = {}) => ({changeDetection: ChangeDetectionStrategy.Default, ...c}));\n\nexport interface Pipe {\n name: string;\n pure?: boolean;\n}\nexport const createPipe = makeMetadataFactory<Pipe>('Pipe', (p: Pipe) => ({pure: true, ...p}));\n\nexport interface Input {\n bindingPropertyName?: string;\n}\nexport const createInput =\n makeMetadataFactory<Input>('Input', (bindingPropertyName?: string) => ({bindingPropertyName}));\n\nexport interface Output {\n bindingPropertyName?: string;\n}\nexport const createOutput = makeMetadataFactory<Output>(\n 'Output', (bindingPropertyName?: string) => ({bindingPropertyName}));\n\nexport interface HostBinding {\n hostPropertyName?: string;\n}\nexport const createHostBinding = makeMetadataFactory<HostBinding>(\n 'HostBinding', (hostPropertyName?: string) => ({hostPropertyName}));\n\nexport interface HostListener {\n eventName?: string;\n args?: string[];\n}\nexport const createHostListener = makeMetadataFactory<HostListener>(\n 'HostListener', (eventName?: string, args?: string[]) => ({eventName, args}));\n\nexport interface NgModule {\n providers?: Provider[];\n declarations?: Array<Type|any[]>;\n imports?: Array<Type|ModuleWithProviders|any[]>;\n exports?: Array<Type|any[]>;\n entryComponents?: Array<Type|any[]>;\n bootstrap?: Array<Type|any[]>;\n schemas?: Array<SchemaMetadata|any[]>;\n id?: string;\n}\nexport const createNgModule =\n makeMetadataFactory<NgModule>('NgModule', (ngModule: NgModule) => ngModule);\n\nexport interface ModuleWithProviders {\n ngModule: Type;\n providers?: Provider[];\n}\nexport interface Injectable {\n providedIn?: Type|'root'|any;\n useClass?: Type|any;\n useExisting?: Type|any;\n useValue?: any;\n useFactory?: Type|any;\n deps?: Array<Type|any[]>;\n}\nexport const createInjectable =\n makeMetadataFactory('Injectable', (injectable: Injectable = {}) => injectable);\nexport interface SchemaMetadata {\n name: string;\n}\n\nexport const CUSTOM_ELEMENTS_SCHEMA: SchemaMetadata = {\n name: 'custom-elements'\n};\n\nexport const NO_ERRORS_SCHEMA: SchemaMetadata = {\n name: 'no-errors-schema'\n};\n\nexport const createOptional = makeMetadataFactory('Optional');\nexport const createSelf = makeMetadataFactory('Self');\nexport const createSkipSelf = makeMetadataFactory('SkipSelf');\nexport const createHost = makeMetadataFactory('Host');\n\nexport interface Type extends Function {\n new(...args: any[]): any;\n}\nexport const Type = Function;\n\nexport enum SecurityContext {\n NONE = 0,\n HTML = 1,\n STYLE = 2,\n SCRIPT = 3,\n URL = 4,\n RESOURCE_URL = 5,\n}\n\nexport type Provider = any;\n\nexport const enum NodeFlags {\n None = 0,\n TypeElement = 1 << 0,\n TypeText = 1 << 1,\n ProjectedTemplate = 1 << 2,\n CatRenderNode = TypeElement | TypeText,\n TypeNgContent = 1 << 3,\n TypePipe = 1 << 4,\n TypePureArray = 1 << 5,\n TypePureObject = 1 << 6,\n TypePurePipe = 1 << 7,\n CatPureExpression = TypePureArray | TypePureObject | TypePurePipe,\n TypeValueProvider = 1 << 8,\n TypeClassProvider = 1 << 9,\n TypeFactoryProvider = 1 << 10,\n TypeUseExistingProvider = 1 << 11,\n LazyProvider = 1 << 12,\n PrivateProvider = 1 << 13,\n TypeDirective = 1 << 14,\n Component = 1 << 15,\n CatProviderNoDirective =\n TypeValueProvider | TypeClassProvider | TypeFactoryProvider | TypeUseExistingProvider,\n CatProvider = CatProviderNoDirective | TypeDirective,\n OnInit = 1 << 16,\n OnDestroy = 1 << 17,\n DoCheck = 1 << 18,\n OnChanges = 1 << 19,\n AfterContentInit = 1 << 20,\n AfterContentChecked = 1 << 21,\n AfterViewInit = 1 << 22,\n AfterViewChecked = 1 << 23,\n EmbeddedViews = 1 << 24,\n ComponentView = 1 << 25,\n TypeContentQuery = 1 << 26,\n TypeViewQuery = 1 << 27,\n StaticQuery = 1 << 28,\n DynamicQuery = 1 << 29,\n TypeModuleProvider = 1 << 30,\n EmitDistinctChangesOnly = 1 << 31,\n CatQuery = TypeContentQuery | TypeViewQuery,\n\n // mutually exclusive values...\n Types = CatRenderNode | TypeNgContent | TypePipe | CatPureExpression | CatProvider | CatQuery\n}\n\nexport const enum DepFlags {\n None = 0,\n SkipSelf = 1 << 0,\n Optional = 1 << 1,\n Self = 1 << 2,\n Value = 1 << 3,\n}\n\n/**\n * Injection flags for DI.\n */\nexport const enum InjectFlags {\n Default = 0,\n\n /**\n * Specifies that an injector should retrieve a dependency from any injector until reaching the\n * host element of the current component. (Only used with Element Injector)\n */\n Host = 1 << 0,\n /** Don't descend into ancestors of the node requesting injection. */\n Self = 1 << 1,\n /** Skip the node that is requesting injection. */\n SkipSelf = 1 << 2,\n /** Inject `defaultValue` instead if token not found. */\n Optional = 1 << 3,\n /**\n * This token is being injected into a pipe.\n * @internal\n */\n ForPipe = 1 << 4,\n}\n\nexport const enum ArgumentType {\n Inline = 0,\n Dynamic = 1\n}\n\nexport const enum BindingFlags {\n TypeElementAttribute = 1 << 0,\n TypeElementClass = 1 << 1,\n TypeElementStyle = 1 << 2,\n TypeProperty = 1 << 3,\n SyntheticProperty = 1 << 4,\n SyntheticHostProperty = 1 << 5,\n CatSyntheticProperty = SyntheticProperty | SyntheticHostProperty,\n\n // mutually exclusive values...\n Types = TypeElementAttribute | TypeElementClass | TypeElementStyle | TypeProperty\n}\n\nexport const enum QueryBindingType {\n First = 0,\n All = 1\n}\n\nexport const enum QueryValueType {\n ElementRef = 0,\n RenderElement = 1,\n TemplateRef = 2,\n ViewContainerRef = 3,\n Provider = 4\n}\n\nexport const enum ViewFlags {\n None = 0,\n OnPush = 1 << 1,\n}\n\nexport enum MissingTranslationStrategy {\n Error = 0,\n Warning = 1,\n Ignore = 2,\n}\n\nexport interface MetadataFactory<T> {\n (...args: any[]): T;\n isTypeOf(obj: any): obj is T;\n ngMetadataName: string;\n}\n\nfunction makeMetadataFactory<T>(name: string, props?: (...args: any[]) => T): MetadataFactory<T> {\n // This must be declared as a function, not a fat arrow, so that ES2015 devmode produces code\n // that works with the static_reflector.ts in the ViewEngine compiler.\n // In particular, `_registerDecoratorOrConstructor` assumes that the value returned here can be\n // new'ed.\n function factory(...args: any[]) {\n const values = props ? props(...args) : {};\n return {\n ngMetadataName: name,\n ...values,\n };\n }\n (factory as any).isTypeOf = (obj: any) => obj && obj.ngMetadataName === name;\n (factory as any).ngMetadataName = name;\n return factory as any;\n}\n\nexport interface Route {\n children?: Route[];\n loadChildren?: string|Type|any;\n}\n\n/**\n * Flags used to generate R3-style CSS Selectors. They are pasted from\n * core/src/render3/projection.ts because they cannot be referenced directly.\n */\nexport const enum SelectorFlags {\n /** Indicates this is the beginning of a new negative selector */\n NOT = 0b0001,\n\n /** Mode for matching attributes */\n ATTRIBUTE = 0b0010,\n\n /** Mode for matching tag names */\n ELEMENT = 0b0100,\n\n /** Mode for matching class names */\n CLASS = 0b1000,\n}\n\n// These are a copy the CSS types from core/src/render3/interfaces/projection.ts\n// They are duplicated here as they cannot be directly referenced from core.\nexport type R3CssSelector = (string|SelectorFlags)[];\nexport type R3CssSelectorList = R3CssSelector[];\n\nfunction parserSelectorToSimpleSelector(selector: CssSelector): R3CssSelector {\n const classes = selector.classNames && selector.classNames.length ?\n [SelectorFlags.CLASS, ...selector.classNames] :\n [];\n const elementName = selector.element && selector.element !== '*' ? selector.element : '';\n return [elementName, ...selector.attrs, ...classes];\n}\n\nfunction parserSelectorToNegativeSelector(selector: CssSelector): R3CssSelector {\n const classes = selector.classNames && selector.classNames.length ?\n [SelectorFlags.CLASS, ...selector.classNames] :\n [];\n\n if (selector.element) {\n return [\n SelectorFlags.NOT | SelectorFlags.ELEMENT, selector.element, ...selector.attrs, ...classes\n ];\n } else if (selector.attrs.length) {\n return [SelectorFlags.NOT | SelectorFlags.ATTRIBUTE, ...selector.attrs, ...classes];\n } else {\n return selector.classNames && selector.classNames.length ?\n [SelectorFlags.NOT | SelectorFlags.CLASS, ...selector.classNames] :\n [];\n }\n}\n\nfunction parserSelectorToR3Selector(selector: CssSelector): R3CssSelector {\n const positive = parserSelectorToSimpleSelector(selector);\n\n const negative: R3CssSelectorList = selector.notSelectors && selector.notSelectors.length ?\n selector.notSelectors.map(notSelector => parserSelectorToNegativeSelector(notSelector)) :\n [];\n\n return positive.concat(...negative);\n}\n\nexport function parseSelectorToR3Selector(selector: string|null): R3CssSelectorList {\n return selector ? CssSelector.parse(selector).map(parserSelectorToR3Selector) : [];\n}\n\n// Pasted from render3/interfaces/definition since it cannot be referenced directly\n/**\n * Flags passed into template functions to determine which blocks (i.e. creation, update)\n * should be executed.\n *\n * Typically, a template runs both the creation block and the update block on initialization and\n * subsequent runs only execute the update block. However, dynamically created views require that\n * the creation block be executed separately from the update block (for backwards compat).\n */\nexport const enum RenderFlags {\n /* Whether to run the creation block (e.g. create elements and directives) */\n Create = 0b01,\n\n /* Whether to run the update block (e.g. refresh bindings) */\n Update = 0b10\n}\n\n// Pasted from render3/interfaces/node.ts\n/**\n * A set of marker values to be used in the attributes arrays. These markers indicate that some\n * items are not regular attributes and the processing should be adapted accordingly.\n */\nexport const enum AttributeMarker {\n /**\n * Marker indicates that the following 3 values in the attributes array are:\n * namespaceUri, attributeName, attributeValue\n * in that order.\n */\n NamespaceURI = 0,\n\n /**\n * Signals class declaration.\n *\n * Each value following `Classes` designates a class name to include on the element.\n * ## Example:\n *\n * Given:\n * ```\n * <div class=\"foo bar baz\">...<d/vi>\n * ```\n *\n * the generated code is:\n * ```\n * var _c1 = [AttributeMarker.Classes, 'foo', 'bar', 'baz'];\n * ```\n */\n Classes = 1,\n\n /**\n * Signals style declaration.\n *\n * Each pair of values following `Styles` designates a style name and value to include on the\n * element.\n * ## Example:\n *\n * Given:\n * ```\n * <div style=\"width:100px; height:200px; color:red\">...</div>\n * ```\n *\n * the generated code is:\n * ```\n * var _c1 = [AttributeMarker.Styles, 'width', '100px', 'height'. '200px', 'color', 'red'];\n * ```\n */\n Styles = 2,\n\n /**\n * Signals that the following attribute names were extracted from input or output bindings.\n *\n * For example, given the following HTML:\n *\n * ```\n * <div moo=\"car\" [foo]=\"exp\" (bar)=\"doSth()\">\n * ```\n *\n * the generated code is:\n *\n * ```\n * var _c1 = ['moo', 'car', AttributeMarker.Bindings, 'foo', 'bar'];\n * ```\n */\n Bindings = 3,\n\n /**\n * Signals that the following attribute names were hoisted from an inline-template declaration.\n *\n * For example, given the following HTML:\n *\n * ```\n * <div *ngFor=\"let value of values; trackBy:trackBy\" dirA [dirB]=\"value\">\n * ```\n *\n * the generated code for the `template()` instruction would include:\n *\n * ```\n * ['dirA', '', AttributeMarker.Bindings, 'dirB', AttributeMarker.Template, 'ng