{"version":3,"sources":["jsdelivr-header.js","/npm/json-string-mapper@1.0.0/src/angular/src/angular/facade/lang.ts","/npm/json-string-mapper@1.0.0/src/angular/src/angular/compiler/ast.ts","/npm/json-string-mapper@1.0.0/src/angular/src/angular/compiler/chars.ts","/npm/json-string-mapper@1.0.0/src/angular/src/angular/compiler/interpolation-config.ts","/npm/json-string-mapper@1.0.0/src/angular/src/angular/compiler/lexer.ts","/npm/json-string-mapper@1.0.0/src/angular/src/angular/compiler/assertions.ts","/npm/json-string-mapper@1.0.0/src/angular/src/angular/compiler/parser.ts","/npm/json-string-mapper@1.0.0/src/src/util/lang.ts","/npm/json-string-mapper@1.0.0/src/visitors/src/visitors/json-string-mapper-visitor/json-string-mapper-visitor.ts","/npm/json-string-mapper@1.0.0/src/src/mapper/json-string-mapper.ts"],"names":[],"mappings":"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","file":"/npm/json-string-mapper@1.0.0/bundles/json-string-mapper.umd.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/json-string-mapper@1.0.0/bundles/json-string-mapper.umd.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nexport interface BrowserNodeGlobal {\r\n    Object: typeof Object;\r\n    Array: typeof Array;\r\n    Map: typeof Map;\r\n    Set: typeof Set;\r\n    Date: DateConstructor;\r\n    RegExp: RegExpConstructor;\r\n    JSON: typeof JSON;\r\n    Math: any;  // typeof Math;\r\n    assert(condition: any): void;\r\n    Reflect: any;\r\n    getAngularTestability: Function;\r\n    getAllAngularTestabilities: Function;\r\n    getAllAngularRootElements: Function;\r\n    frameworkStabilizers: Array<Function>;\r\n    setTimeout: Function;\r\n    clearTimeout: Function;\r\n    setInterval: Function;\r\n    clearInterval: Function;\r\n    encodeURI: Function;\r\n}\r\n\r\n\r\nexport function getTypeNameForDebugging(type: any): string {\r\n    return type['name'] || typeof type;\r\n}\r\n\r\nexport function isPresent(obj: any): boolean {\r\n    return obj != null;\r\n}\r\n\r\nexport function isBlank(obj: any): boolean {\r\n    return obj == null;\r\n}\r\n\r\nconst STRING_MAP_PROTO = Object.getPrototypeOf({});\r\nexport function isStrictStringMap(obj: any): boolean {\r\n    return typeof obj === 'object' && obj !== null && Object.getPrototypeOf(obj) === STRING_MAP_PROTO;\r\n}\r\n\r\nexport function stringify(token: any): string {\r\n    if (typeof token === 'string') {\r\n        return token;\r\n    }\r\n\r\n    if (token == null) {\r\n        return '' + token;\r\n    }\r\n\r\n    if (token.overriddenName) {\r\n        return `${token.overriddenName}`;\r\n    }\r\n\r\n    if (token.name) {\r\n        return `${token.name}`;\r\n    }\r\n\r\n    const res = token.toString();\r\n    const newLineIndex = res.indexOf('\\n');\r\n    return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\r\n}\r\n\r\nexport class NumberWrapper {\r\n    static parseIntAutoRadix(text: string): number {\r\n        const result: number = parseInt(text);\r\n        if (isNaN(result)) {\r\n            throw new Error('Invalid integer literal when parsing ' + text);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    static isNumeric(value: any): boolean { return !isNaN(value - parseFloat(value)); }\r\n}\r\n\r\n// JS has NaN !== NaN\r\nexport function looseIdentical(a: any, b: any): boolean {\r\n    return a === b || typeof a === 'number' && typeof b === 'number' && isNaN(a) && isNaN(b);\r\n}\r\n\r\nexport function isJsObject(o: any): boolean {\r\n    return o !== null && (typeof o === 'function' || typeof o === 'object');\r\n}\r\n\r\nexport function print(obj: Error | Object) {\r\n    // tslint:disable-next-line:no-console\r\n    console.log(obj);\r\n}\r\n\r\nexport function warn(obj: Error | Object) {\r\n    console.warn(obj);\r\n}\r\n\r\nexport function setValueOnPath(global: any, path: string, value: any) {\r\n    const parts = path.split('.');\r\n    let obj: any = global;\r\n    while (parts.length > 1) {\r\n        const name = parts.shift();\r\n        if (obj.hasOwnProperty(name) && obj[name] != null) {\r\n            obj = obj[name];\r\n        } else {\r\n            obj = obj[name] = {};\r\n        }\r\n    }\r\n    if (obj === undefined || obj === null) {\r\n        obj = {};\r\n    }\r\n    obj[parts.shift()] = value;\r\n}\r\n\r\nexport function isPrimitive(obj: any): boolean {\r\n    return !isJsObject(obj);\r\n}\r\n\r\nexport function escapeRegExp(s: string): string {\r\n    return s.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\r\n}","/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\n\r\nimport {isBlank} from '../facade/lang';\r\n\r\nexport class ParserError {\r\n    public message: string;\r\n    constructor(\r\n        message: string, public input: string, public errLocation: string, public ctxLocation?: any) {\r\n        this.message = `Parser Error: ${message} ${errLocation} [${input}] in ${ctxLocation}`;\r\n    }\r\n}\r\n\r\nexport class ParseSpan {\r\n    constructor(public start: number, public end: number) {}\r\n}\r\n\r\nexport class AST {\r\n    constructor(public span: ParseSpan) {}\r\n    visit(visitor: AstVisitor, context: any = null): any { return null; }\r\n    toString(): string { return 'AST'; }\r\n}\r\n\r\n/**\r\n * Represents a quoted expression of the form:\r\n *\r\n * quote = prefix `:` uninterpretedExpression\r\n * prefix = identifier\r\n * uninterpretedExpression = arbitrary string\r\n *\r\n * A quoted expression is meant to be pre-processed by an AST transformer that\r\n * converts it into another AST that no longer contains quoted expressions.\r\n * It is meant to allow third-party developers to extend Angular template\r\n * expression language. The `uninterpretedExpression` part of the quote is\r\n * therefore not interpreted by the Angular's own expression parser.\r\n */\r\nexport class Quote extends AST {\r\n    constructor(\r\n        span: ParseSpan, public prefix: string, public uninterpretedExpression: string,\r\n        public location: any) {\r\n        super(span);\r\n    }\r\n    visit(visitor: AstVisitor, context: any = null): any { return visitor.visitQuote(this, context); }\r\n    toString(): string { return 'Quote'; }\r\n}\r\n\r\nexport class EmptyExpr extends AST {\r\n    visit(visitor: AstVisitor, context: any = null) {\r\n        // do nothing\r\n    }\r\n}\r\n\r\nexport class ImplicitReceiver extends AST {\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitImplicitReceiver(this, context);\r\n    }\r\n}\r\n\r\n/**\r\n * Multiple expressions separated by a semicolon.\r\n */\r\nexport class Chain extends AST {\r\n    constructor(span: ParseSpan, public expressions: any[]) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any { return visitor.visitChain(this, context); }\r\n}\r\n\r\nexport class Conditional extends AST {\r\n    constructor(span: ParseSpan, public condition: AST, public trueExp: AST, public falseExp: AST) {\r\n        super(span);\r\n    }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitConditional(this, context);\r\n    }\r\n}\r\n\r\nexport class PropertyRead extends AST {\r\n    constructor(span: ParseSpan, public receiver: AST, public name: string) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitPropertyRead(this, context);\r\n    }\r\n}\r\n\r\nexport class PropertyWrite extends AST {\r\n    constructor(span: ParseSpan, public receiver: AST, public name: string, public value: AST) {\r\n        super(span);\r\n    }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitPropertyWrite(this, context);\r\n    }\r\n}\r\n\r\nexport class SafePropertyRead extends AST {\r\n    constructor(span: ParseSpan, public receiver: AST, public name: string) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitSafePropertyRead(this, context);\r\n    }\r\n}\r\n\r\nexport class KeyedRead extends AST {\r\n    constructor(span: ParseSpan, public obj: AST, public key: AST) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitKeyedRead(this, context);\r\n    }\r\n}\r\n\r\nexport class KeyedWrite extends AST {\r\n    constructor(span: ParseSpan, public obj: AST, public key: AST, public value: AST) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitKeyedWrite(this, context);\r\n    }\r\n}\r\n\r\nexport class BindingPipe extends AST {\r\n    constructor(span: ParseSpan, public exp: AST, public name: string, public args: any[]) {\r\n        super(span);\r\n    }\r\n    visit(visitor: AstVisitor, context: any = null): any { return visitor.visitPipe(this, context); }\r\n}\r\n\r\nexport class LiteralPrimitive extends AST {\r\n    constructor(span: ParseSpan, public value: any) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitLiteralPrimitive(this, context);\r\n    }\r\n}\r\n\r\nexport class LiteralArray extends AST {\r\n    constructor(span: ParseSpan, public expressions: any[]) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitLiteralArray(this, context);\r\n    }\r\n}\r\n\r\nexport class LiteralMap extends AST {\r\n    constructor(span: ParseSpan, public keys: any[], public values: any[]) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitLiteralMap(this, context);\r\n    }\r\n}\r\n\r\nexport class Interpolation extends AST {\r\n    constructor(span: ParseSpan, public strings: any[], public expressions: any[]) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitInterpolation(this, context);\r\n    }\r\n}\r\n\r\nexport class Binary extends AST {\r\n    constructor(span: ParseSpan, public operation: string, public left: AST, public right: AST) {\r\n        super(span);\r\n    }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitBinary(this, context);\r\n    }\r\n}\r\n\r\nexport class PrefixNot extends AST {\r\n    constructor(span: ParseSpan, public expression: AST) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitPrefixNot(this, context);\r\n    }\r\n}\r\n\r\nexport class MethodCall extends AST {\r\n    constructor(span: ParseSpan, public receiver: AST, public name: string, public args: any[]) {\r\n        super(span);\r\n    }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitMethodCall(this, context);\r\n    }\r\n}\r\n\r\nexport class SafeMethodCall extends AST {\r\n    constructor(span: ParseSpan, public receiver: AST, public name: string, public args: any[]) {\r\n        super(span);\r\n    }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitSafeMethodCall(this, context);\r\n    }\r\n}\r\n\r\nexport class FunctionCall extends AST {\r\n    constructor(span: ParseSpan, public target: AST, public args: any[]) { super(span); }\r\n    visit(visitor: AstVisitor, context: any = null): any {\r\n        return visitor.visitFunctionCall(this, context);\r\n    }\r\n}\r\n\r\nexport class ASTWithSource extends AST {\r\n    constructor(\r\n        public ast: AST, public source: string, public location: string,\r\n        public errors: ParserError[]) {\r\n        super(new ParseSpan(0, isBlank(source) ? 0 : source.length));\r\n    }\r\n    visit(visitor: AstVisitor, context: any = null): any { return this.ast.visit(visitor, context); }\r\n    toString(): string { return `${this.source} in ${this.location}`; }\r\n}\r\n\r\nexport class TemplateBinding {\r\n    constructor(\r\n        public span: ParseSpan, public key: string, public keyIsVar: boolean, public name: string,\r\n        public expression: ASTWithSource) {}\r\n}\r\n\r\nexport interface AstVisitor {\r\n    visitBinary(ast: Binary, context: any): any;\r\n    visitChain(ast: Chain, context: any): any;\r\n    visitConditional(ast: Conditional, context: any): any;\r\n    visitFunctionCall(ast: FunctionCall, context: any): any;\r\n    visitImplicitReceiver(ast: ImplicitReceiver, context: any): any;\r\n    visitInterpolation(ast: Interpolation, context: any): any;\r\n    visitKeyedRead(ast: KeyedRead, context: any): any;\r\n    visitKeyedWrite(ast: KeyedWrite, context: any): any;\r\n    visitLiteralArray(ast: LiteralArray, context: any): any;\r\n    visitLiteralMap(ast: LiteralMap, context: any): any;\r\n    visitLiteralPrimitive(ast: LiteralPrimitive, context: any): any;\r\n    visitMethodCall(ast: MethodCall, context: any): any;\r\n    visitPipe(ast: BindingPipe, context: any): any;\r\n    visitPrefixNot(ast: PrefixNot, context: any): any;\r\n    visitPropertyRead(ast: PropertyRead, context: any): any;\r\n    visitPropertyWrite(ast: PropertyWrite, context: any): any;\r\n    visitQuote(ast: Quote, context: any): any;\r\n    visitSafeMethodCall(ast: SafeMethodCall, context: any): any;\r\n    visitSafePropertyRead(ast: SafePropertyRead, context: any): any;\r\n}\r\n\r\nexport class RecursiveAstVisitor implements AstVisitor {\r\n    visitBinary(ast: Binary, context: any): any {\r\n        ast.left.visit(this);\r\n        ast.right.visit(this);\r\n        return null;\r\n    }\r\n    visitChain(ast: Chain, context: any): any { return this.visitAll(ast.expressions, context); }\r\n    visitConditional(ast: Conditional, context: any): any {\r\n        ast.condition.visit(this);\r\n        ast.trueExp.visit(this);\r\n        ast.falseExp.visit(this);\r\n        return null;\r\n    }\r\n    visitPipe(ast: BindingPipe, context: any): any {\r\n        ast.exp.visit(this);\r\n        this.visitAll(ast.args, context);\r\n        return null;\r\n    }\r\n    visitFunctionCall(ast: FunctionCall, context: any): any {\r\n        ast.target.visit(this);\r\n        this.visitAll(ast.args, context);\r\n        return null;\r\n    }\r\n    visitImplicitReceiver(ast: ImplicitReceiver, context: any): any { return null; }\r\n    visitInterpolation(ast: Interpolation, context: any): any {\r\n        return this.visitAll(ast.expressions, context);\r\n    }\r\n    visitKeyedRead(ast: KeyedRead, context: any): any {\r\n        ast.obj.visit(this);\r\n        ast.key.visit(this);\r\n        return null;\r\n    }\r\n    visitKeyedWrite(ast: KeyedWrite, context: any): any {\r\n        ast.obj.visit(this);\r\n        ast.key.visit(this);\r\n        ast.value.visit(this);\r\n        return null;\r\n    }\r\n    visitLiteralArray(ast: LiteralArray, context: any): any {\r\n        return this.visitAll(ast.expressions, context);\r\n    }\r\n    visitLiteralMap(ast: LiteralMap, context: any): any { return this.visitAll(ast.values, context); }\r\n    visitLiteralPrimitive(ast: LiteralPrimitive, context: any): any { return null; }\r\n    visitMethodCall(ast: MethodCall, context: any): any {\r\n        ast.receiver.visit(this);\r\n        return this.visitAll(ast.args, context);\r\n    }\r\n    visitPrefixNot(ast: PrefixNot, context: any): any {\r\n        ast.expression.visit(this);\r\n        return null;\r\n    }\r\n    visitPropertyRead(ast: PropertyRead, context: any): any {\r\n        ast.receiver.visit(this);\r\n        return null;\r\n    }\r\n    visitPropertyWrite(ast: PropertyWrite, context: any): any {\r\n        ast.receiver.visit(this);\r\n        ast.value.visit(this);\r\n        return null;\r\n    }\r\n    visitSafePropertyRead(ast: SafePropertyRead, context: any): any {\r\n        ast.receiver.visit(this);\r\n        return null;\r\n    }\r\n    visitSafeMethodCall(ast: SafeMethodCall, context: any): any {\r\n        ast.receiver.visit(this);\r\n        return this.visitAll(ast.args, context);\r\n    }\r\n    visitAll(asts: AST[], context: any): any {\r\n        asts.forEach(ast => ast.visit(this, context));\r\n        return null;\r\n    }\r\n    visitQuote(ast: Quote, context: any): any { return null; }\r\n}\r\n\r\nexport class AstTransformer implements AstVisitor {\r\n    visitImplicitReceiver(ast: ImplicitReceiver, context: any): AST { return ast; }\r\n\r\n    visitInterpolation(ast: Interpolation, context: any): AST {\r\n        return new Interpolation(ast.span, ast.strings, this.visitAll(ast.expressions));\r\n    }\r\n\r\n    visitLiteralPrimitive(ast: LiteralPrimitive, context: any): AST {\r\n        return new LiteralPrimitive(ast.span, ast.value);\r\n    }\r\n\r\n    visitPropertyRead(ast: PropertyRead, context: any): AST {\r\n        return new PropertyRead(ast.span, ast.receiver.visit(this), ast.name);\r\n    }\r\n\r\n    visitPropertyWrite(ast: PropertyWrite, context: any): AST {\r\n        return new PropertyWrite(ast.span, ast.receiver.visit(this), ast.name, ast.value);\r\n    }\r\n\r\n    visitSafePropertyRead(ast: SafePropertyRead, context: any): AST {\r\n        return new SafePropertyRead(ast.span, ast.receiver.visit(this), ast.name);\r\n    }\r\n\r\n    visitMethodCall(ast: MethodCall, context: any): AST {\r\n        return new MethodCall(ast.span, ast.receiver.visit(this), ast.name, this.visitAll(ast.args));\r\n    }\r\n\r\n    visitSafeMethodCall(ast: SafeMethodCall, context: any): AST {\r\n        return new SafeMethodCall(\r\n            ast.span, ast.receiver.visit(this), ast.name, this.visitAll(ast.args));\r\n    }\r\n\r\n    visitFunctionCall(ast: FunctionCall, context: any): AST {\r\n        return new FunctionCall(ast.span, ast.target.visit(this), this.visitAll(ast.args));\r\n    }\r\n\r\n    visitLiteralArray(ast: LiteralArray, context: any): AST {\r\n        return new LiteralArray(ast.span, this.visitAll(ast.expressions));\r\n    }\r\n\r\n    visitLiteralMap(ast: LiteralMap, context: any): AST {\r\n        return new LiteralMap(ast.span, ast.keys, this.visitAll(ast.values));\r\n    }\r\n\r\n    visitBinary(ast: Binary, context: any): AST {\r\n        return new Binary(ast.span, ast.operation, ast.left.visit(this), ast.right.visit(this));\r\n    }\r\n\r\n    visitPrefixNot(ast: PrefixNot, context: any): AST {\r\n        return new PrefixNot(ast.span, ast.expression.visit(this));\r\n    }\r\n\r\n    visitConditional(ast: Conditional, context: any): AST {\r\n        return new Conditional(\r\n            ast.span, ast.condition.visit(this), ast.trueExp.visit(this), ast.falseExp.visit(this));\r\n    }\r\n\r\n    visitPipe(ast: BindingPipe, context: any): AST {\r\n        return new BindingPipe(ast.span, ast.exp.visit(this), ast.name, this.visitAll(ast.args));\r\n    }\r\n\r\n    visitKeyedRead(ast: KeyedRead, context: any): AST {\r\n        return new KeyedRead(ast.span, ast.obj.visit(this), ast.key.visit(this));\r\n    }\r\n\r\n    visitKeyedWrite(ast: KeyedWrite, context: any): AST {\r\n        return new KeyedWrite(\r\n            ast.span, ast.obj.visit(this), ast.key.visit(this), ast.value.visit(this));\r\n    }\r\n\r\n    visitAll(asts: any[]): any[] {\r\n        const res = new Array(asts.length);\r\n        for (let i = 0; i < asts.length; ++i) {\r\n            res[i] = asts[i].visit(this);\r\n        }\r\n        return res;\r\n    }\r\n\r\n    visitChain(ast: Chain, context: any): AST {\r\n        return new Chain(ast.span, this.visitAll(ast.expressions));\r\n    }\r\n\r\n    visitQuote(ast: Quote, context: any): AST {\r\n        return new Quote(ast.span, ast.prefix, ast.uninterpretedExpression, ast.location);\r\n    }\r\n}","/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nexport const $EOF = 0;\r\nexport const $TAB = 9;\r\nexport const $LF = 10;\r\nexport const $VTAB = 11;\r\nexport const $FF = 12;\r\nexport const $CR = 13;\r\nexport const $SPACE = 32;\r\nexport const $BANG = 33;\r\nexport const $DQ = 34;\r\nexport const $HASH = 35;\r\nexport const $$ = 36;\r\nexport const $PERCENT = 37;\r\nexport const $AMPERSAND = 38;\r\nexport const $SQ = 39;\r\nexport const $LPAREN = 40;\r\nexport const $RPAREN = 41;\r\nexport const $STAR = 42;\r\nexport const $PLUS = 43;\r\nexport const $COMMA = 44;\r\nexport const $MINUS = 45;\r\nexport const $PERIOD = 46;\r\nexport const $SLASH = 47;\r\nexport const $COLON = 58;\r\nexport const $SEMICOLON = 59;\r\nexport const $LT = 60;\r\nexport const $EQ = 61;\r\nexport const $GT = 62;\r\nexport const $QUESTION = 63;\r\n\r\nexport const $0 = 48;\r\nexport const $9 = 57;\r\n\r\nexport const $A = 65;\r\nexport const $E = 69;\r\nexport const $F = 70;\r\nexport const $X = 88;\r\nexport const $Z = 90;\r\n\r\nexport const $LBRACKET = 91;\r\nexport const $BACKSLASH = 92;\r\nexport const $RBRACKET = 93;\r\nexport const $CARET = 94;\r\nexport const $_ = 95;\r\n\r\nexport const $a = 97;\r\nexport const $e = 101;\r\nexport const $f = 102;\r\nexport const $n = 110;\r\nexport const $r = 114;\r\nexport const $t = 116;\r\nexport const $u = 117;\r\nexport const $v = 118;\r\nexport const $x = 120;\r\nexport const $z = 122;\r\n\r\nexport const $LBRACE = 123;\r\nexport const $BAR = 124;\r\nexport const $RBRACE = 125;\r\nexport const $NBSP = 160;\r\n\r\nexport const $PIPE = 124;\r\nexport const $TILDA = 126;\r\nexport const $AT = 64;\r\n\r\nexport const $BT = 96;\r\n\r\nexport function isWhitespace(code: number): boolean {\r\n    return (code >= $TAB && code <= $SPACE) || (code == $NBSP);\r\n}\r\n\r\nexport function isDigit(code: number): boolean {\r\n    return $0 <= code && code <= $9;\r\n}\r\n\r\nexport function isAsciiLetter(code: number): boolean {\r\n    return code >= $a && code <= $z || code >= $A && code <= $Z;\r\n}\r\n\r\nexport function isAsciiHexDigit(code: number): boolean {\r\n    return code >= $a && code <= $f || code >= $A && code <= $F || isDigit(code);\r\n}","/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nimport {assertInterpolationSymbols} from './assertions';\r\n\r\nexport class InterpolationConfig {\r\n    static fromArray(markers: [string, string]): InterpolationConfig {\r\n        if (!markers) {\r\n            return DEFAULT_INTERPOLATION_CONFIG;\r\n        }\r\n\r\n        assertInterpolationSymbols('interpolation', markers);\r\n        return new InterpolationConfig(markers[0], markers[1]);\r\n    }\r\n\r\n    constructor(public start: string, public end: string){};\r\n}\r\n\r\nexport const DEFAULT_INTERPOLATION_CONFIG: InterpolationConfig =\r\n    new InterpolationConfig('{{', '}}');","/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nimport * as chars from './chars';\r\nimport {NumberWrapper} from '../facade/lang';\r\n\r\nexport enum TokenType {\r\n    Character,\r\n    Identifier,\r\n    Keyword,\r\n    String,\r\n    Operator,\r\n    Number,\r\n    Error\r\n}\r\n\r\nconst KEYWORDS = ['var', 'let', 'null', 'undefined', 'true', 'false', 'if', 'else', 'this'];\r\n\r\nexport class Lexer {\r\n    tokenize(text: string): Token[] {\r\n        const scanner = new _Scanner(text);\r\n        const tokens: Token[] = [];\r\n        let token = scanner.scanToken();\r\n        while (token != null) {\r\n            tokens.push(token);\r\n            token = scanner.scanToken();\r\n        }\r\n        return tokens;\r\n    }\r\n}\r\n\r\nexport class Token {\r\n    constructor(\r\n        public index: number, public type: TokenType, public numValue: number,\r\n        public strValue: string) {}\r\n\r\n    isCharacter(code: number): boolean {\r\n        return this.type == TokenType.Character && this.numValue == code;\r\n    }\r\n\r\n    isNumber(): boolean { return this.type == TokenType.Number; }\r\n\r\n    isString(): boolean { return this.type == TokenType.String; }\r\n\r\n    isOperator(operater: string): boolean {\r\n        return this.type == TokenType.Operator && this.strValue == operater;\r\n    }\r\n\r\n    isIdentifier(): boolean { return this.type == TokenType.Identifier; }\r\n\r\n    isKeyword(): boolean { return this.type == TokenType.Keyword; }\r\n\r\n    isKeywordLet(): boolean { return this.type == TokenType.Keyword && this.strValue == 'let'; }\r\n\r\n    isKeywordNull(): boolean { return this.type == TokenType.Keyword && this.strValue == 'null'; }\r\n\r\n    isKeywordUndefined(): boolean {\r\n        return this.type == TokenType.Keyword && this.strValue == 'undefined';\r\n    }\r\n\r\n    isKeywordTrue(): boolean { return this.type == TokenType.Keyword && this.strValue == 'true'; }\r\n\r\n    isKeywordFalse(): boolean { return this.type == TokenType.Keyword && this.strValue == 'false'; }\r\n\r\n    isKeywordThis(): boolean { return this.type == TokenType.Keyword && this.strValue == 'this'; }\r\n\r\n    isError(): boolean { return this.type == TokenType.Error; }\r\n\r\n    toNumber(): number { return this.type == TokenType.Number ? this.numValue : -1; }\r\n\r\n    toString(): string {\r\n        switch (this.type) {\r\n            case TokenType.Character:\r\n            case TokenType.Identifier:\r\n            case TokenType.Keyword:\r\n            case TokenType.Operator:\r\n            case TokenType.String:\r\n            case TokenType.Error:\r\n                return this.strValue;\r\n            case TokenType.Number:\r\n                return this.numValue.toString();\r\n            default:\r\n                return null;\r\n        }\r\n    }\r\n}\r\n\r\nfunction newCharacterToken(index: number, code: number): Token {\r\n    return new Token(index, TokenType.Character, code, String.fromCharCode(code));\r\n}\r\n\r\nfunction newIdentifierToken(index: number, text: string): Token {\r\n    return new Token(index, TokenType.Identifier, 0, text);\r\n}\r\n\r\nfunction newKeywordToken(index: number, text: string): Token {\r\n    return new Token(index, TokenType.Keyword, 0, text);\r\n}\r\n\r\nfunction newOperatorToken(index: number, text: string): Token {\r\n    return new Token(index, TokenType.Operator, 0, text);\r\n}\r\n\r\nfunction newStringToken(index: number, text: string): Token {\r\n    return new Token(index, TokenType.String, 0, text);\r\n}\r\n\r\nfunction newNumberToken(index: number, n: number): Token {\r\n    return new Token(index, TokenType.Number, n, '');\r\n}\r\n\r\nfunction newErrorToken(index: number, message: string): Token {\r\n    return new Token(index, TokenType.Error, 0, message);\r\n}\r\n\r\nexport const EOF: Token = new Token(-1, TokenType.Character, 0, '');\r\n\r\nclass _Scanner {\r\n    length: number;\r\n    peek: number = 0;\r\n    index: number = -1;\r\n\r\n    constructor(public input: string) {\r\n        this.length = input.length;\r\n        this.advance();\r\n    }\r\n\r\n    advance() {\r\n        this.peek = ++this.index >= this.length ? chars.$EOF : this.input.charCodeAt(this.index);\r\n    }\r\n\r\n    scanToken(): Token {\r\n        const input = this.input, length = this.length;\r\n        let peek = this.peek, index = this.index;\r\n\r\n        // Skip whitespace.\r\n        while (peek <= chars.$SPACE) {\r\n            if (++index >= length) {\r\n                peek = chars.$EOF;\r\n                break;\r\n            } else {\r\n                peek = input.charCodeAt(index);\r\n            }\r\n        }\r\n\r\n        this.peek = peek;\r\n        this.index = index;\r\n\r\n        if (index >= length) {\r\n            return null;\r\n        }\r\n\r\n        // Handle identifiers and numbers.\r\n        if (isIdentifierStart(peek)) return this.scanIdentifier();\r\n        if (chars.isDigit(peek)) return this.scanNumber(index);\r\n\r\n        const start: number = index;\r\n        switch (peek) {\r\n            case chars.$PERIOD:\r\n                this.advance();\r\n                return chars.isDigit(this.peek) ? this.scanNumber(start) :\r\n                    newCharacterToken(start, chars.$PERIOD);\r\n            case chars.$LPAREN:\r\n            case chars.$RPAREN:\r\n            case chars.$LBRACE:\r\n            case chars.$RBRACE:\r\n            case chars.$LBRACKET:\r\n            case chars.$RBRACKET:\r\n            case chars.$COMMA:\r\n            case chars.$COLON:\r\n            case chars.$SEMICOLON:\r\n                return this.scanCharacter(start, peek);\r\n            case chars.$SQ:\r\n            case chars.$DQ:\r\n                return this.scanString();\r\n            case chars.$HASH:\r\n            case chars.$PLUS:\r\n            case chars.$MINUS:\r\n            case chars.$STAR:\r\n            case chars.$SLASH:\r\n            case chars.$PERCENT:\r\n            case chars.$CARET:\r\n                return this.scanOperator(start, String.fromCharCode(peek));\r\n            case chars.$QUESTION:\r\n                return this.scanComplexOperator(start, '?', chars.$PERIOD, '.');\r\n            case chars.$LT:\r\n            case chars.$GT:\r\n                return this.scanComplexOperator(start, String.fromCharCode(peek), chars.$EQ, '=');\r\n            case chars.$BANG:\r\n            case chars.$EQ:\r\n                return this.scanComplexOperator(\r\n                    start, String.fromCharCode(peek), chars.$EQ, '=', chars.$EQ, '=');\r\n            case chars.$AMPERSAND:\r\n                return this.scanComplexOperator(start, '&', chars.$AMPERSAND, '&');\r\n            case chars.$BAR:\r\n                return this.scanComplexOperator(start, '|', chars.$BAR, '|');\r\n            case chars.$NBSP:\r\n                while (chars.isWhitespace(this.peek)) this.advance();\r\n                return this.scanToken();\r\n        }\r\n\r\n        this.advance();\r\n        return this.error(`Unexpected character [${String.fromCharCode(peek)}]`, 0);\r\n    }\r\n\r\n    scanCharacter(start: number, code: number): Token {\r\n        this.advance();\r\n        return newCharacterToken(start, code);\r\n    }\r\n\r\n\r\n    scanOperator(start: number, str: string): Token {\r\n        this.advance();\r\n        return newOperatorToken(start, str);\r\n    }\r\n\r\n    /**\r\n     * Tokenize a 2/3 char long operator\r\n     *\r\n     * @param start start index in the expression\r\n     * @param one first symbol (always part of the operator)\r\n     * @param twoCode code point for the second symbol\r\n     * @param two second symbol (part of the operator when the second code point matches)\r\n     * @param threeCode code point for the third symbol\r\n     * @param three third symbol (part of the operator when provided and matches source expression)\r\n     * @returns {Token}\r\n     */\r\n    scanComplexOperator(\r\n        start: number, one: string, twoCode: number, two: string, threeCode?: number,\r\n        three?: string): Token {\r\n        this.advance();\r\n        let str: string = one;\r\n        if (this.peek == twoCode) {\r\n            this.advance();\r\n            str += two;\r\n        }\r\n        if (threeCode != null && this.peek == threeCode) {\r\n            this.advance();\r\n            str += three;\r\n        }\r\n        return newOperatorToken(start, str);\r\n    }\r\n\r\n    scanIdentifier(): Token {\r\n        const start: number = this.index;\r\n        this.advance();\r\n        while (isIdentifierPart(this.peek)) this.advance();\r\n        const str: string = this.input.substring(start, this.index);\r\n        return KEYWORDS.indexOf(str) > -1 ? newKeywordToken(start, str) :\r\n            newIdentifierToken(start, str);\r\n    }\r\n\r\n    scanNumber(start: number): Token {\r\n        let simple: boolean = (this.index === start);\r\n        this.advance();  // Skip initial digit.\r\n        while (true) {\r\n            if (chars.isDigit(this.peek)) {\r\n                // Do nothing.\r\n            } else if (this.peek == chars.$PERIOD) {\r\n                simple = false;\r\n            } else if (isExponentStart(this.peek)) {\r\n                this.advance();\r\n                if (isExponentSign(this.peek)) this.advance();\r\n                if (!chars.isDigit(this.peek)) return this.error('Invalid exponent', -1);\r\n                simple = false;\r\n            } else {\r\n                break;\r\n            }\r\n            this.advance();\r\n        }\r\n        const str: string = this.input.substring(start, this.index);\r\n        const value: number = simple ? NumberWrapper.parseIntAutoRadix(str) : parseFloat(str);\r\n        return newNumberToken(start, value);\r\n    }\r\n\r\n    scanString(): Token {\r\n        const start: number = this.index;\r\n        const quote: number = this.peek;\r\n        this.advance();  // Skip initial quote.\r\n\r\n        let buffer: string = '';\r\n        let marker: number = this.index;\r\n        const input: string = this.input;\r\n\r\n        while (this.peek != quote) {\r\n            if (this.peek == chars.$BACKSLASH) {\r\n                buffer += input.substring(marker, this.index);\r\n                this.advance();\r\n                let unescapedCode: number;\r\n                // Workaround for TS2.1-introduced type strictness\r\n                this.peek = this.peek;\r\n                if (this.peek == chars.$u) {\r\n                    // 4 character hex code for unicode character.\r\n                    const hex: string = input.substring(this.index + 1, this.index + 5);\r\n                    if (/^[0-9a-f]+$/i.test(hex)) {\r\n                        unescapedCode = parseInt(hex, 16);\r\n                    } else {\r\n                        return this.error(`Invalid unicode escape [\\\\u${hex}]`, 0);\r\n                    }\r\n                    for (let i: number = 0; i < 5; i++) {\r\n                        this.advance();\r\n                    }\r\n                } else {\r\n                    unescapedCode = unescape(this.peek);\r\n                    this.advance();\r\n                }\r\n                buffer += String.fromCharCode(unescapedCode);\r\n                marker = this.index;\r\n            } else if (this.peek == chars.$EOF) {\r\n                return this.error('Unterminated quote', 0);\r\n            } else {\r\n                this.advance();\r\n            }\r\n        }\r\n\r\n        const last: string = input.substring(marker, this.index);\r\n        this.advance();  // Skip terminating quote.\r\n\r\n        return newStringToken(start, buffer + last);\r\n    }\r\n\r\n    error(message: string, offset: number): Token {\r\n        const position: number = this.index + offset;\r\n        return newErrorToken(\r\n            position, `Lexer Error: ${message} at column ${position} in expression [${this.input}]`);\r\n    }\r\n}\r\n\r\nfunction isIdentifierStart(code: number): boolean {\r\n    return (chars.$a <= code && code <= chars.$z) || (chars.$A <= code && code <= chars.$Z) ||\r\n        (code == chars.$_) || (code == chars.$$);\r\n}\r\n\r\nexport function isIdentifier(input: string): boolean {\r\n    if (input.length == 0) return false;\r\n    const scanner = new _Scanner(input);\r\n    if (!isIdentifierStart(scanner.peek)) return false;\r\n    scanner.advance();\r\n    while (scanner.peek !== chars.$EOF) {\r\n        if (!isIdentifierPart(scanner.peek)) return false;\r\n        scanner.advance();\r\n    }\r\n    return true;\r\n}\r\n\r\nfunction isIdentifierPart(code: number): boolean {\r\n    return chars.isAsciiLetter(code) || chars.isDigit(code) || (code == chars.$_) ||\r\n        (code == chars.$$);\r\n}\r\n\r\nfunction isExponentStart(code: number): boolean {\r\n    return code == chars.$e || code == chars.$E;\r\n}\r\n\r\nfunction isExponentSign(code: number): boolean {\r\n    return code == chars.$MINUS || code == chars.$PLUS;\r\n}\r\n\r\nexport function isQuote(code: number): boolean {\r\n    return code === chars.$SQ || code === chars.$DQ || code === chars.$BT;\r\n}\r\n\r\nfunction unescape(code: number): number {\r\n    switch (code) {\r\n        case chars.$n:\r\n            return chars.$LF;\r\n        case chars.$f:\r\n            return chars.$FF;\r\n        case chars.$r:\r\n            return chars.$CR;\r\n        case chars.$t:\r\n            return chars.$TAB;\r\n        case chars.$v:\r\n            return chars.$VTAB;\r\n        default:\r\n            return code;\r\n    }\r\n}","/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\n\r\nimport {isBlank, isPresent} from '../facade/lang';\r\n\r\nconst isDevMode = () => false;\r\n\r\nexport function assertArrayOfStrings(identifier: string, value: any) {\r\n    if (!isDevMode() || isBlank(value)) {\r\n        return;\r\n    }\r\n    if (!Array.isArray(value)) {\r\n        throw new Error(`Expected '${identifier}' to be an array of strings.`);\r\n    }\r\n    for (let i = 0; i < value.length; i += 1) {\r\n        if (typeof value[i] !== 'string') {\r\n            throw new Error(`Expected '${identifier}' to be an array of strings.`);\r\n        }\r\n    }\r\n}\r\n\r\nconst INTERPOLATION_BLACKLIST_REGEXPS = [\r\n    /^\\s*$/,        // empty\r\n    /[<>]/,         // html tag\r\n    /^[{}]$/,       // i18n expansion\r\n    /&(#|[a-z])/i,  // character reference,\r\n    /^\\/\\//,        // comment\r\n];\r\n\r\nexport function assertInterpolationSymbols(identifier: string, value: any): void {\r\n    if (isPresent(value) && !(Array.isArray(value) && value.length == 2)) {\r\n        throw new Error(`Expected '${identifier}' to be an array, [start, end].`);\r\n    } else if (isDevMode() && !isBlank(value)) {\r\n        const start = value[0] as string;\r\n        const end = value[1] as string;\r\n        // black list checking\r\n        INTERPOLATION_BLACKLIST_REGEXPS.forEach(regexp => {\r\n            if (regexp.test(start) || regexp.test(end)) {\r\n                throw new Error(`['${start}', '${end}'] contains unusable interpolation symbol.`);\r\n            }\r\n        });\r\n    }\r\n}","/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nimport * as chars from './chars';\r\nimport {escapeRegExp, isBlank, isPresent} from '../facade/lang';\r\nimport {DEFAULT_INTERPOLATION_CONFIG, InterpolationConfig} from './interpolation-config';\r\n\r\nimport {AST, ASTWithSource, AstVisitor, Binary, BindingPipe, Chain, Conditional, EmptyExpr, FunctionCall, ImplicitReceiver, Interpolation, KeyedRead, KeyedWrite, LiteralArray, LiteralMap, LiteralPrimitive, MethodCall, ParseSpan, ParserError, PrefixNot, PropertyRead, PropertyWrite, Quote, SafeMethodCall, SafePropertyRead, TemplateBinding} from './ast';\r\nimport {EOF, Lexer, Token, TokenType, isIdentifier, isQuote} from './lexer';\r\n\r\n\r\nexport class SplitInterpolation {\r\n    constructor(public strings: string[], public expressions: string[], public offsets: number[]) {}\r\n}\r\n\r\nexport class TemplateBindingParseResult {\r\n    constructor(\r\n        public templateBindings: TemplateBinding[], public warnings: string[],\r\n        public errors: ParserError[]) {}\r\n}\r\n\r\nfunction _createInterpolateRegExp(config: InterpolationConfig): RegExp {\r\n    const pattern = escapeRegExp(config.start) + '([\\\\s\\\\S]*?)' + escapeRegExp(config.end);\r\n    return new RegExp(pattern, 'g');\r\n}\r\n\r\nexport class Parser {\r\n    private errors: ParserError[] = [];\r\n\r\n    constructor(private _lexer: Lexer) {}\r\n\r\n    parseAction(\r\n        input: string, location: any,\r\n        interpolationConfig: InterpolationConfig = DEFAULT_INTERPOLATION_CONFIG): ASTWithSource {\r\n        this._checkNoInterpolation(input, location, interpolationConfig);\r\n        const sourceToLex = this._stripComments(input);\r\n        const tokens = this._lexer.tokenize(this._stripComments(input));\r\n        const ast = new _ParseAST(\r\n            input, location, tokens, sourceToLex.length, true, this.errors,\r\n            input.length - sourceToLex.length)\r\n            .parseChain();\r\n        return new ASTWithSource(ast, input, location, this.errors);\r\n    }\r\n\r\n    parseBinding(\r\n        input: string, location: any,\r\n        interpolationConfig: InterpolationConfig = DEFAULT_INTERPOLATION_CONFIG): ASTWithSource {\r\n        const ast = this._parseBindingAst(input, location, interpolationConfig);\r\n        return new ASTWithSource(ast, input, location, this.errors);\r\n    }\r\n\r\n    parseSimpleBinding(\r\n        input: string, location: string,\r\n        interpolationConfig: InterpolationConfig = DEFAULT_INTERPOLATION_CONFIG): ASTWithSource {\r\n        const ast = this._parseBindingAst(input, location, interpolationConfig);\r\n        const errors = SimpleExpressionChecker.check(ast);\r\n        if (errors.length > 0) {\r\n            this._reportError(\r\n                `Host binding expression cannot contain ${errors.join(' ')}`, input, location);\r\n        }\r\n        return new ASTWithSource(ast, input, location, this.errors);\r\n    }\r\n\r\n    private _reportError(message: string, input: string, errLocation: string, ctxLocation?: any) {\r\n        this.errors.push(new ParserError(message, input, errLocation, ctxLocation));\r\n    }\r\n\r\n    private _parseBindingAst(\r\n        input: string, location: string, interpolationConfig: InterpolationConfig): AST {\r\n        // Quotes expressions use 3rd-party expression language. We don't want to use\r\n        // our lexer or parser for that, so we check for that ahead of time.\r\n        const quote = this._parseQuote(input, location);\r\n\r\n        if (isPresent(quote)) {\r\n            return quote;\r\n        }\r\n\r\n        this._checkNoInterpolation(input, location, interpolationConfig);\r\n        const sourceToLex = this._stripComments(input);\r\n        const tokens = this._lexer.tokenize(sourceToLex);\r\n        return new _ParseAST(\r\n            input, location, tokens, sourceToLex.length, false, this.errors,\r\n            input.length - sourceToLex.length)\r\n            .parseChain();\r\n    }\r\n\r\n    private _parseQuote(input: string, location: any): AST {\r\n        if (isBlank(input)) return null;\r\n        const prefixSeparatorIndex = input.indexOf(':');\r\n        if (prefixSeparatorIndex == -1) return null;\r\n        const prefix = input.substring(0, prefixSeparatorIndex).trim();\r\n        if (!isIdentifier(prefix)) return null;\r\n        const uninterpretedExpression = input.substring(prefixSeparatorIndex + 1);\r\n        return new Quote(new ParseSpan(0, input.length), prefix, uninterpretedExpression, location);\r\n    }\r\n\r\n    parseTemplateBindings(prefixToken: string, input: string, location: any):\r\n    TemplateBindingParseResult {\r\n        const tokens = this._lexer.tokenize(input);\r\n        if (prefixToken) {\r\n            // Prefix the tokens with the tokens from prefixToken but have them take no space (0 index).\r\n            const prefixTokens = this._lexer.tokenize(prefixToken).map(t => {\r\n                t.index = 0;\r\n                return t;\r\n            });\r\n            tokens.unshift(...prefixTokens);\r\n        }\r\n        return new _ParseAST(input, location, tokens, input.length, false, this.errors, 0)\r\n            .parseTemplateBindings();\r\n    }\r\n\r\n    parseInterpolation(\r\n        input: string, location: any,\r\n        interpolationConfig: InterpolationConfig = DEFAULT_INTERPOLATION_CONFIG): ASTWithSource {\r\n        const split = this.splitInterpolation(input, location, interpolationConfig);\r\n        if (split == null) return null;\r\n\r\n        const expressions: AST[] = [];\r\n\r\n        for (let i = 0; i < split.expressions.length; ++i) {\r\n            const expressionText = split.expressions[i];\r\n            const sourceToLex = this._stripComments(expressionText);\r\n            const tokens = this._lexer.tokenize(this._stripComments(split.expressions[i]));\r\n            const ast = new _ParseAST(\r\n                input, location, tokens, sourceToLex.length, false, this.errors,\r\n                split.offsets[i] + (expressionText.length - sourceToLex.length))\r\n                .parseChain();\r\n            expressions.push(ast);\r\n        }\r\n\r\n        return new ASTWithSource(\r\n            new Interpolation(\r\n                new ParseSpan(0, isBlank(input) ? 0 : input.length), split.strings, expressions),\r\n            input, location, this.errors);\r\n    }\r\n\r\n    splitInterpolation(\r\n        input: string, location: string,\r\n        interpolationConfig: InterpolationConfig = DEFAULT_INTERPOLATION_CONFIG): SplitInterpolation {\r\n        const regexp = _createInterpolateRegExp(interpolationConfig);\r\n        const parts = input.split(regexp);\r\n        if (parts.length <= 1) {\r\n            return null;\r\n        }\r\n        const strings: string[] = [];\r\n        const expressions: string[] = [];\r\n        const offsets: number[] = [];\r\n        let offset = 0;\r\n        for (let i = 0; i < parts.length; i++) {\r\n            const part: string = parts[i];\r\n            if (i % 2 === 0) {\r\n                // fixed string\r\n                strings.push(part);\r\n                offset += part.length;\r\n            } else if (part.trim().length > 0) {\r\n                offset += interpolationConfig.start.length;\r\n                expressions.push(part);\r\n                offsets.push(offset);\r\n                offset += part.length + interpolationConfig.end.length;\r\n            } else {\r\n                this._reportError(\r\n                    'Blank expressions are not allowed in interpolated strings', input,\r\n                    `at column ${this._findInterpolationErrorColumn(parts, i, interpolationConfig)} in`,\r\n                    location);\r\n                expressions.push('$implict');\r\n                offsets.push(offset);\r\n            }\r\n        }\r\n        return new SplitInterpolation(strings, expressions, offsets);\r\n    }\r\n\r\n    wrapLiteralPrimitive(input: string, location: any): ASTWithSource {\r\n        return new ASTWithSource(\r\n            new LiteralPrimitive(new ParseSpan(0, isBlank(input) ? 0 : input.length), input), input,\r\n            location, this.errors);\r\n    }\r\n\r\n    private _stripComments(input: string): string {\r\n        const i = this._commentStart(input);\r\n        return isPresent(i) ? input.substring(0, i).trim() : input;\r\n    }\r\n\r\n    private _commentStart(input: string): number {\r\n        let outerQuote: number = null;\r\n        for (let i = 0; i < input.length - 1; i++) {\r\n            const char = input.charCodeAt(i);\r\n            const nextChar = input.charCodeAt(i + 1);\r\n\r\n            if (char === chars.$SLASH && nextChar == chars.$SLASH && isBlank(outerQuote)) return i;\r\n\r\n            if (outerQuote === char) {\r\n                outerQuote = null;\r\n            } else if (isBlank(outerQuote) && isQuote(char)) {\r\n                outerQuote = char;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n\r\n    private _checkNoInterpolation(\r\n        input: string, location: any, interpolationConfig: InterpolationConfig): void {\r\n        const regexp = _createInterpolateRegExp(interpolationConfig);\r\n        const parts = input.split(regexp);\r\n        if (parts.length > 1) {\r\n            this._reportError(\r\n                `Got interpolation (${interpolationConfig.start}${interpolationConfig.end}) where expression was expected`,\r\n                input,\r\n                `at column ${this._findInterpolationErrorColumn(parts, 1, interpolationConfig)} in`,\r\n                location);\r\n        }\r\n    }\r\n\r\n    private _findInterpolationErrorColumn(\r\n        parts: string[], partInErrIdx: number, interpolationConfig: InterpolationConfig): number {\r\n        let errLocation = '';\r\n        for (let j = 0; j < partInErrIdx; j++) {\r\n            errLocation += j % 2 === 0 ?\r\n                parts[j] :\r\n                `${interpolationConfig.start}${parts[j]}${interpolationConfig.end}`;\r\n        }\r\n\r\n        return errLocation.length;\r\n    }\r\n}\r\n\r\nexport class _ParseAST {\r\n    private rparensExpected = 0;\r\n    private rbracketsExpected = 0;\r\n    private rbracesExpected = 0;\r\n\r\n    index: number = 0;\r\n\r\n    constructor(\r\n        public input: string, public location: any, public tokens: Token[],\r\n        public inputLength: number, public parseAction: boolean, private errors: ParserError[],\r\n        private offset: number) {}\r\n\r\n    peek(offset: number): Token {\r\n        const i = this.index + offset;\r\n        return i < this.tokens.length ? this.tokens[i] : EOF;\r\n    }\r\n\r\n    get next(): Token { return this.peek(0); }\r\n\r\n    get inputIndex(): number {\r\n        return (this.index < this.tokens.length) ? this.next.index + this.offset :\r\n            this.inputLength + this.offset;\r\n    }\r\n\r\n    span(start: number) { return new ParseSpan(start, this.inputIndex); }\r\n\r\n    advance() { this.index++; }\r\n\r\n    optionalCharacter(code: number): boolean {\r\n        if (this.next.isCharacter(code)) {\r\n            this.advance();\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    peekKeywordLet(): boolean { return this.next.isKeywordLet(); }\r\n\r\n    expectCharacter(code: number) {\r\n        if (this.optionalCharacter(code)) return;\r\n        this.error(`Missing expected ${String.fromCharCode(code)}`);\r\n    }\r\n\r\n    optionalOperator(op: string): boolean {\r\n        if (this.next.isOperator(op)) {\r\n            this.advance();\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    expectOperator(operator: string) {\r\n        if (this.optionalOperator(operator)) return;\r\n        this.error(`Missing expected operator ${operator}`);\r\n    }\r\n\r\n    expectIdentifierOrKeyword(): string {\r\n        const n = this.next;\r\n        if (!n.isIdentifier() && !n.isKeyword()) {\r\n            this.error(`Unexpected token ${n}, expected identifier or keyword`);\r\n            return '';\r\n        }\r\n        this.advance();\r\n        return n.toString();\r\n    }\r\n\r\n    expectIdentifierOrKeywordOrString(): string {\r\n        const n = this.next;\r\n        if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) {\r\n            this.error(`Unexpected token ${n}, expected identifier, keyword, or string`);\r\n            return '';\r\n        }\r\n        this.advance();\r\n        return n.toString();\r\n    }\r\n\r\n    parseChain(): AST {\r\n        const exprs: AST[] = [];\r\n        const start = this.inputIndex;\r\n        while (this.index < this.tokens.length) {\r\n            const expr = this.parsePipe();\r\n            exprs.push(expr);\r\n\r\n            if (this.optionalCharacter(chars.$SEMICOLON)) {\r\n                if (!this.parseAction) {\r\n                    this.error('Binding expression cannot contain chained expression');\r\n                }\r\n                while (this.optionalCharacter(chars.$SEMICOLON)) {\r\n                }  // read all semicolons\r\n            } else if (this.index < this.tokens.length) {\r\n                this.error(`Unexpected token '${this.next}'`);\r\n            }\r\n        }\r\n        if (exprs.length == 0) return new EmptyExpr(this.span(start));\r\n        if (exprs.length == 1) return exprs[0];\r\n        return new Chain(this.span(start), exprs);\r\n    }\r\n\r\n    parsePipe(): AST {\r\n        let result = this.parseExpression();\r\n        if (this.optionalOperator('|')) {\r\n            if (this.parseAction) {\r\n                this.error('Cannot have a pipe in an action expression');\r\n            }\r\n\r\n            do {\r\n                const name = this.expectIdentifierOrKeyword();\r\n                const args: AST[] = [];\r\n                while (this.optionalCharacter(chars.$COLON)) {\r\n                    args.push(this.parseExpression());\r\n                }\r\n                result = new BindingPipe(this.span(result.span.start), result, name, args);\r\n            } while (this.optionalOperator('|'));\r\n        }\r\n\r\n        return result;\r\n    }\r\n\r\n    parseExpression(): AST { return this.parseConditional(); }\r\n\r\n    parseConditional(): AST {\r\n        const start = this.inputIndex;\r\n        const result = this.parseLogicalOr();\r\n\r\n        if (this.optionalOperator('?')) {\r\n            const yes = this.parsePipe();\r\n            let no: AST;\r\n            if (!this.optionalCharacter(chars.$COLON)) {\r\n                const end = this.inputIndex;\r\n                const expression = this.input.substring(start, end);\r\n                this.error(`Conditional expression ${expression} requires all 3 expressions`);\r\n                no = new EmptyExpr(this.span(start));\r\n            } else {\r\n                no = this.parsePipe();\r\n            }\r\n            return new Conditional(this.span(start), result, yes, no);\r\n        } else {\r\n            return result;\r\n        }\r\n    }\r\n\r\n    parseLogicalOr(): AST {\r\n        // '||'\r\n        let result = this.parseLogicalAnd();\r\n        while (this.optionalOperator('||')) {\r\n            const right = this.parseLogicalAnd();\r\n            result = new Binary(this.span(result.span.start), '||', result, right);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    parseLogicalAnd(): AST {\r\n        // '&&'\r\n        let result = this.parseEquality();\r\n        while (this.optionalOperator('&&')) {\r\n            const right = this.parseEquality();\r\n            result = new Binary(this.span(result.span.start), '&&', result, right);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    parseEquality(): AST {\r\n        // '==','!=','===','!=='\r\n        let result = this.parseRelational();\r\n        while (this.next.type == TokenType.Operator) {\r\n            const operator = this.next.strValue;\r\n            switch (operator) {\r\n                case '==':\r\n                case '===':\r\n                case '!=':\r\n                case '!==':\r\n                    this.advance();\r\n                    const right = this.parseRelational();\r\n                    result = new Binary(this.span(result.span.start), operator, result, right);\r\n                    continue;\r\n            }\r\n            break;\r\n        }\r\n        return result;\r\n    }\r\n\r\n    parseRelational(): AST {\r\n        // '<', '>', '<=', '>='\r\n        let result = this.parseAdditive();\r\n        while (this.next.type == TokenType.Operator) {\r\n            const operator = this.next.strValue;\r\n            switch (operator) {\r\n                case '<':\r\n                case '>':\r\n                case '<=':\r\n                case '>=':\r\n                    this.advance();\r\n                    const right = this.parseAdditive();\r\n                    result = new Binary(this.span(result.span.start), operator, result, right);\r\n                    continue;\r\n            }\r\n            break;\r\n        }\r\n        return result;\r\n    }\r\n\r\n    parseAdditive(): AST {\r\n        // '+', '-'\r\n        let result = this.parseMultiplicative();\r\n        while (this.next.type == TokenType.Operator) {\r\n            const operator = this.next.strValue;\r\n            switch (operator) {\r\n                case '+':\r\n                case '-':\r\n                    this.advance();\r\n                    let right = this.parseMultiplicative();\r\n                    result = new Binary(this.span(result.span.start), operator, result, right);\r\n                    continue;\r\n            }\r\n            break;\r\n        }\r\n        return result;\r\n    }\r\n\r\n    parseMultiplicative(): AST {\r\n        // '*', '%', '/'\r\n        let result = this.parsePrefix();\r\n        while (this.next.type == TokenType.Operator) {\r\n            const operator = this.next.strValue;\r\n            switch (operator) {\r\n                case '*':\r\n                case '%':\r\n                case '/':\r\n                    this.advance();\r\n                    let right = this.parsePrefix();\r\n                    result = new Binary(this.span(result.span.start), operator, result, right);\r\n                    continue;\r\n            }\r\n            break;\r\n        }\r\n        return result;\r\n    }\r\n\r\n    parsePrefix(): AST {\r\n        if (this.next.type == TokenType.Operator) {\r\n            const start = this.inputIndex;\r\n            const operator = this.next.strValue;\r\n            let result: AST;\r\n            switch (operator) {\r\n                case '+':\r\n                    this.advance();\r\n                    return this.parsePrefix();\r\n                case '-':\r\n                    this.advance();\r\n                    result = this.parsePrefix();\r\n                    return new Binary(\r\n                        this.span(start), operator, new LiteralPrimitive(new ParseSpan(start, start), 0),\r\n                        result);\r\n                case '!':\r\n                    this.advance();\r\n                    result = this.parsePrefix();\r\n                    return new PrefixNot(this.span(start), result);\r\n            }\r\n        }\r\n        return this.parseCallChain();\r\n    }\r\n\r\n    parseCallChain(): AST {\r\n        let result = this.parsePrimary();\r\n        while (true) {\r\n            if (this.optionalCharacter(chars.$PERIOD)) {\r\n                result = this.parseAccessMemberOrMethodCall(result, false);\r\n\r\n            } else if (this.optionalOperator('?.')) {\r\n                result = this.parseAccessMemberOrMethodCall(result, true);\r\n\r\n            } else if (this.optionalCharacter(chars.$LBRACKET)) {\r\n                this.rbracketsExpected++;\r\n                const key = this.parsePipe();\r\n                this.rbracketsExpected--;\r\n                this.expectCharacter(chars.$RBRACKET);\r\n                if (this.optionalOperator('=')) {\r\n                    const value = this.parseConditional();\r\n                    result = new KeyedWrite(this.span(result.span.start), result, key, value);\r\n                } else {\r\n                    result = new KeyedRead(this.span(result.span.start), result, key);\r\n                }\r\n\r\n            } else if (this.optionalCharacter(chars.$LPAREN)) {\r\n                this.rparensExpected++;\r\n                const args = this.parseCallArguments();\r\n                this.rparensExpected--;\r\n                this.expectCharacter(chars.$RPAREN);\r\n                result = new FunctionCall(this.span(result.span.start), result, args);\r\n\r\n            } else {\r\n                return result;\r\n            }\r\n        }\r\n    }\r\n\r\n    parsePrimary(): AST {\r\n        const start = this.inputIndex;\r\n        if (this.optionalCharacter(chars.$LPAREN)) {\r\n            this.rparensExpected++;\r\n            const result = this.parsePipe();\r\n            this.rparensExpected--;\r\n            this.expectCharacter(chars.$RPAREN);\r\n            return result;\r\n\r\n        } else if (this.next.isKeywordNull()) {\r\n            this.advance();\r\n            return new LiteralPrimitive(this.span(start), null);\r\n\r\n        } else if (this.next.isKeywordUndefined()) {\r\n            this.advance();\r\n            return new LiteralPrimitive(this.span(start), void 0);\r\n\r\n        } else if (this.next.isKeywordTrue()) {\r\n            this.advance();\r\n            return new LiteralPrimitive(this.span(start), true);\r\n\r\n        } else if (this.next.isKeywordFalse()) {\r\n            this.advance();\r\n            return new LiteralPrimitive(this.span(start), false);\r\n\r\n        } else if (this.next.isKeywordThis()) {\r\n            this.advance();\r\n            return new ImplicitReceiver(this.span(start));\r\n\r\n        } else if (this.optionalCharacter(chars.$LBRACKET)) {\r\n            this.rbracketsExpected++;\r\n            const elements = this.parseExpressionList(chars.$RBRACKET);\r\n            this.rbracketsExpected--;\r\n            this.expectCharacter(chars.$RBRACKET);\r\n            return new LiteralArray(this.span(start), elements);\r\n\r\n        } else if (this.next.isCharacter(chars.$LBRACE)) {\r\n            return this.parseLiteralMap();\r\n\r\n        } else if (this.next.isIdentifier()) {\r\n            return this.parseAccessMemberOrMethodCall(new ImplicitReceiver(this.span(start)), false);\r\n\r\n        } else if (this.next.isNumber()) {\r\n            const value = this.next.toNumber();\r\n            this.advance();\r\n            return new LiteralPrimitive(this.span(start), value);\r\n\r\n        } else if (this.next.isString()) {\r\n            const literalValue = this.next.toString();\r\n            this.advance();\r\n            return new LiteralPrimitive(this.span(start), literalValue);\r\n\r\n        } else if (this.index >= this.tokens.length) {\r\n            this.error(`Unexpected end of expression: ${this.input}`);\r\n            return new EmptyExpr(this.span(start));\r\n        } else {\r\n            this.error(`Unexpected token ${this.next}`);\r\n            return new EmptyExpr(this.span(start));\r\n        }\r\n    }\r\n\r\n    parseExpressionList(terminator: number): AST[] {\r\n        const result: AST[] = [];\r\n        if (!this.next.isCharacter(terminator)) {\r\n            do {\r\n                result.push(this.parsePipe());\r\n            } while (this.optionalCharacter(chars.$COMMA));\r\n        }\r\n        return result;\r\n    }\r\n\r\n    parseLiteralMap(): LiteralMap {\r\n        const keys: string[] = [];\r\n        const values: AST[] = [];\r\n        const start = this.inputIndex;\r\n        this.expectCharacter(chars.$LBRACE);\r\n        if (!this.optionalCharacter(chars.$RBRACE)) {\r\n            this.rbracesExpected++;\r\n            do {\r\n                const key = this.expectIdentifierOrKeywordOrString();\r\n                keys.push(key);\r\n                this.expectCharacter(chars.$COLON);\r\n                values.push(this.parsePipe());\r\n            } while (this.optionalCharacter(chars.$COMMA));\r\n            this.rbracesExpected--;\r\n            this.expectCharacter(chars.$RBRACE);\r\n        }\r\n        return new LiteralMap(this.span(start), keys, values);\r\n    }\r\n\r\n    parseAccessMemberOrMethodCall(receiver: AST, isSafe: boolean = false): AST {\r\n        const start = receiver.span.start;\r\n        const id = this.expectIdentifierOrKeyword();\r\n\r\n        if (this.optionalCharacter(chars.$LPAREN)) {\r\n            this.rparensExpected++;\r\n            const args = this.parseCallArguments();\r\n            this.expectCharacter(chars.$RPAREN);\r\n            this.rparensExpected--;\r\n            const span = this.span(start);\r\n            return isSafe ? new SafeMethodCall(span, receiver, id, args) :\r\n                new MethodCall(span, receiver, id, args);\r\n\r\n        } else {\r\n            if (isSafe) {\r\n                if (this.optionalOperator('=')) {\r\n                    this.error('The \\'?.\\' operator cannot be used in the assignment');\r\n                    return new EmptyExpr(this.span(start));\r\n                } else {\r\n                    return new SafePropertyRead(this.span(start), receiver, id);\r\n                }\r\n            } else {\r\n                if (this.optionalOperator('=')) {\r\n                    if (!this.parseAction) {\r\n                        this.error('Bindings cannot contain assignments');\r\n                        return new EmptyExpr(this.span(start));\r\n                    }\r\n\r\n                    const value = this.parseConditional();\r\n                    return new PropertyWrite(this.span(start), receiver, id, value);\r\n                } else {\r\n                    return new PropertyRead(this.span(start), receiver, id);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    parseCallArguments(): BindingPipe[] {\r\n        if (this.next.isCharacter(chars.$RPAREN)) return [];\r\n        const positionals: AST[] = [];\r\n        do {\r\n            positionals.push(this.parsePipe());\r\n        } while (this.optionalCharacter(chars.$COMMA));\r\n        return positionals as BindingPipe[];\r\n    }\r\n\r\n    /**\r\n     * An identifier, a keyword, a string with an optional `-` inbetween.\r\n     */\r\n    expectTemplateBindingKey(): string {\r\n        let result = '';\r\n        let operatorFound = false;\r\n        do {\r\n            result += this.expectIdentifierOrKeywordOrString();\r\n            operatorFound = this.optionalOperator('-');\r\n            if (operatorFound) {\r\n                result += '-';\r\n            }\r\n        } while (operatorFound);\r\n\r\n        return result.toString();\r\n    }\r\n\r\n    parseTemplateBindings(): TemplateBindingParseResult {\r\n        const bindings: TemplateBinding[] = [];\r\n        let prefix: string = null;\r\n        const warnings: string[] = [];\r\n        while (this.index < this.tokens.length) {\r\n            const start = this.inputIndex;\r\n            const keyIsVar: boolean = this.peekKeywordLet();\r\n            if (keyIsVar) {\r\n                this.advance();\r\n            }\r\n            let key = this.expectTemplateBindingKey();\r\n            if (!keyIsVar) {\r\n                if (prefix == null) {\r\n                    prefix = key;\r\n                } else {\r\n                    key = prefix + key[0].toUpperCase() + key.substring(1);\r\n                }\r\n            }\r\n            this.optionalCharacter(chars.$COLON);\r\n            let name: string = null;\r\n            let expression: ASTWithSource = null;\r\n            if (keyIsVar) {\r\n                if (this.optionalOperator('=')) {\r\n                    name = this.expectTemplateBindingKey();\r\n                } else {\r\n                    name = '\\$implicit';\r\n                }\r\n            } else if (this.next !== EOF && !this.peekKeywordLet()) {\r\n                const start = this.inputIndex;\r\n                const ast = this.parsePipe();\r\n                const source = this.input.substring(start - this.offset, this.inputIndex - this.offset);\r\n                expression = new ASTWithSource(ast, source, this.location, this.errors);\r\n            }\r\n            bindings.push(new TemplateBinding(this.span(start), key, keyIsVar, name, expression));\r\n            if (!this.optionalCharacter(chars.$SEMICOLON)) {\r\n                this.optionalCharacter(chars.$COMMA);\r\n            }\r\n        }\r\n        return new TemplateBindingParseResult(bindings, warnings, this.errors);\r\n    }\r\n\r\n    error(message: string, index: number = null) {\r\n        this.errors.push(new ParserError(message, this.input, this.locationText(index), this.location));\r\n        this.skip();\r\n    }\r\n\r\n    private locationText(index: number = null) {\r\n        if (isBlank(index)) index = this.index;\r\n        return (index < this.tokens.length) ? `at column ${this.tokens[index].index + 1} in` :\r\n            `at the end of the expression`;\r\n    }\r\n\r\n    // Error recovery should skip tokens until it encounters a recovery point. skip() treats\r\n    // the end of input and a ';' as unconditionally a recovery point. It also treats ')',\r\n    // '}' and ']' as conditional recovery points if one of calling productions is expecting\r\n    // one of these symbols. This allows skip() to recover from errors such as '(a.) + 1' allowing\r\n    // more of the AST to be retained (it doesn't skip any tokens as the ')' is retained because\r\n    // of the '(' begins an '(' <expr> ')' production). The recovery points of grouping symbols\r\n    // must be conditional as they must be skipped if none of the calling productions are not\r\n    // expecting the closing token else we will never make progress in the case of an\r\n    // extraneous group closing symbol (such as a stray ')'). This is not the case for ';' because\r\n    // parseChain() is always the root production and it expects a ';'.\r\n\r\n    // If a production expects one of these token it increments the corresponding nesting count,\r\n    // and then decrements it just prior to checking if the token is in the input.\r\n    private skip() {\r\n        let n = this.next;\r\n        while (this.index < this.tokens.length && !n.isCharacter(chars.$SEMICOLON) &&\r\n        (this.rparensExpected <= 0 || !n.isCharacter(chars.$RPAREN)) &&\r\n        (this.rbracesExpected <= 0 || !n.isCharacter(chars.$RBRACE)) &&\r\n        (this.rbracketsExpected <= 0 || !n.isCharacter(chars.$RBRACKET))) {\r\n            if (this.next.isError()) {\r\n                this.errors.push(\r\n                    new ParserError(this.next.toString(), this.input, this.locationText(), this.location));\r\n            }\r\n            this.advance();\r\n            n = this.next;\r\n        }\r\n    }\r\n}\r\n\r\nclass SimpleExpressionChecker implements AstVisitor {\r\n    static check(ast: AST): string[] {\r\n        const s = new SimpleExpressionChecker();\r\n        ast.visit(s);\r\n        return s.errors;\r\n    }\r\n\r\n    errors: string[] = [];\r\n\r\n    visitImplicitReceiver(ast: ImplicitReceiver, context: any) {}\r\n\r\n    visitInterpolation(ast: Interpolation, context: any) {}\r\n\r\n    visitLiteralPrimitive(ast: LiteralPrimitive, context: any) {}\r\n\r\n    visitPropertyRead(ast: PropertyRead, context: any) {}\r\n\r\n    visitPropertyWrite(ast: PropertyWrite, context: any) {}\r\n\r\n    visitSafePropertyRead(ast: SafePropertyRead, context: any) {}\r\n\r\n    visitMethodCall(ast: MethodCall, context: any) {}\r\n\r\n    visitSafeMethodCall(ast: SafeMethodCall, context: any) {}\r\n\r\n    visitFunctionCall(ast: FunctionCall, context: any) {}\r\n\r\n    visitLiteralArray(ast: LiteralArray, context: any) { this.visitAll(ast.expressions); }\r\n\r\n    visitLiteralMap(ast: LiteralMap, context: any) { this.visitAll(ast.values); }\r\n\r\n    visitBinary(ast: Binary, context: any) {}\r\n\r\n    visitPrefixNot(ast: PrefixNot, context: any) {}\r\n\r\n    visitConditional(ast: Conditional, context: any) {}\r\n\r\n    visitPipe(ast: BindingPipe, context: any) { this.errors.push('pipes'); }\r\n\r\n    visitKeyedRead(ast: KeyedRead, context: any) {}\r\n\r\n    visitKeyedWrite(ast: KeyedWrite, context: any) {}\r\n\r\n    visitAll(asts: any[]): any[] { return asts.map(node => node.visit(this)); }\r\n\r\n    visitChain(ast: Chain, context: any) {}\r\n\r\n    visitQuote(ast: Quote, context: any) {}\r\n}","export function compileToJSON (json: any) {\r\n    return JSON.stringify(json).replace(/\"/g, '');\r\n}\r\n\r\nexport function isPresent(obj: any) {\r\n    return obj !== null && obj !== undefined;\r\n}\r\n\r\nexport function isJsObject(obj: any) {\r\n    return obj !== null && (typeof obj === 'function' || typeof obj === 'object');\r\n}\r\n\r\nexport function isFunction(val: any) {\r\n    return typeof val === 'function';\r\n}","import {\r\n    AST, RecursiveAstVisitor, PropertyRead, MethodCall, KeyedRead,\r\n    ImplicitReceiver, LiteralPrimitive, Binary, Chain, Conditional,\r\n    BindingPipe, FunctionCall, Interpolation, KeyedWrite, LiteralArray,\r\n    LiteralMap, PrefixNot, PropertyWrite, SafePropertyRead, SafeMethodCall, Quote\r\n} from '../../angular/compiler/ast';\r\nimport * as util from \"../../util/lang\";\r\n\r\nexport class JsonStringMapperVisitor extends RecursiveAstVisitor {\r\n\r\n    private _handleMethodArgs(args): any {\r\n        if (!args) {\r\n            return ``;\r\n        }\r\n\r\n        let result = ``;\r\n\r\n        for (let i = 0, length = args.length; i < length; i++) {\r\n            if (i === (length - 1)) {\r\n                result += `${args[i]}`;\r\n            }\r\n            else {\r\n                result += `${args[i]}, `;\r\n            }\r\n        }\r\n\r\n        return result;\r\n    }\r\n\r\n    private _handlePipeArgs(args): any {\r\n        if (!args) {\r\n            return ``;\r\n        }\r\n\r\n        let result = ``;\r\n\r\n        for (let arg of args) {\r\n            result += ` : ${arg}`;\r\n        }\r\n\r\n        return result;\r\n    }\r\n\r\n    visitBinary(ast: Binary): any {\r\n        const left = ast.left.visit(this);\r\n        const right = ast.right.visit(this);\r\n\r\n        return `${left} ${ast.operation} ${right}`;\r\n    }\r\n\r\n    // TODO\r\n    visitChain(ast: Chain): any {\r\n        return util.compileToJSON(this.visitAll(ast.expressions));\r\n    }\r\n\r\n    visitConditional(ast: Conditional): any {\r\n        const condition = ast.condition.visit(this);\r\n        const trueExp = ast.trueExp.visit(this);\r\n        const falseExp = ast.falseExp.visit(this);\r\n\r\n        return `${condition} ? ${trueExp} : ${falseExp}`;\r\n    }\r\n\r\n    visitPipe(ast: BindingPipe): any {\r\n        const pipe = ast.name;\r\n        const value = ast.exp.visit(this);\r\n        const args = this._handlePipeArgs(this.visitAll(ast.args));\r\n\r\n        return `${value} | ${pipe}${args}`;\r\n    }\r\n\r\n    // TODO\r\n    visitFunctionCall(ast: FunctionCall): any {\r\n        const target = ast.target.visit(this);\r\n        const args = this._handleMethodArgs(this.visitAll(ast.args));\r\n\r\n        return `${target}(${args})`;\r\n    }\r\n\r\n    visitImplicitReceiver(ast: ImplicitReceiver): any {\r\n        return ``;\r\n    }\r\n\r\n    visitInterpolation(ast: Interpolation): any {\r\n        return `{{${this.visitAll(ast.expressions)[0]}}}`;\r\n    }\r\n\r\n    visitKeyedRead(ast: KeyedRead): any {\r\n        const obj = ast.obj.visit(this);\r\n        let key = ast.key.visit(this);\r\n\r\n        return `${obj}[${key}]`;\r\n    }\r\n\r\n    visitKeyedWrite(ast: KeyedWrite): any {\r\n        return null;\r\n    }\r\n\r\n    visitLiteralArray(ast: LiteralArray): any {\r\n        return util.compileToJSON(this.visitAll(ast.expressions));\r\n    }\r\n\r\n    visitLiteralMap(ast: LiteralMap, firstCall: boolean): any {\r\n        const result = {};\r\n        const keys = ast.keys;\r\n        const values = this.visitAll(ast.values);\r\n\r\n        for (let i = 0, length = keys.length; i < length; i++) {\r\n            let value = values[i];\r\n\r\n            if (typeof value !== 'string' && firstCall) {\r\n                value = `${value}`;\r\n            }\r\n\r\n            result[keys[i]] = value;\r\n        }\r\n\r\n        if (firstCall) {\r\n            return result;\r\n        }\r\n\r\n        return util.compileToJSON(result);\r\n    }\r\n\r\n    visitLiteralPrimitive(ast: LiteralPrimitive): any {\r\n        return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value;\r\n    }\r\n\r\n    visitMethodCall(ast: MethodCall): any {\r\n        const methodName = ast.name;\r\n        const receiver = ast.receiver.visit(this);\r\n        const args = this._handleMethodArgs(this.visitAll(ast.args));\r\n\r\n        return `${receiver ? receiver + '.' : receiver}${methodName}(${args})`;\r\n    }\r\n\r\n    visitPrefixNot(ast: PrefixNot): any {\r\n        return ast.expression.visit(this);\r\n    }\r\n\r\n    visitPropertyRead(ast: PropertyRead): any {\r\n        const property = ast.name;\r\n        const receiver = ast.receiver.visit(this);\r\n\r\n        return `${receiver ? receiver + '.' : receiver}${property}`;\r\n    }\r\n\r\n    visitPropertyWrite(ast: PropertyWrite): any {\r\n        return null;\r\n    }\r\n\r\n    visitSafePropertyRead(ast: SafePropertyRead): any {\r\n        const property = ast.name;\r\n        const receiver = ast.receiver.visit(this);\r\n\r\n        return `${receiver ? receiver + '.' : receiver}${property}`;\r\n    }\r\n\r\n    visitSafeMethodCall(ast: SafeMethodCall): any {\r\n        const methodName = ast.name;\r\n        const receiver = ast.receiver.visit(this);\r\n        const args = this._handleMethodArgs(this.visitAll(ast.args));\r\n\r\n        return `${receiver ? receiver + '.' : receiver}${methodName}(${args})`;\r\n    }\r\n\r\n    visitAll(asts: AST[]): any {\r\n        return asts.map(ast => ast.visit(this));\r\n    }\r\n\r\n    visitQuote(ast: Quote): any {\r\n        return null;\r\n    }\r\n}","import {Parser, Lexer} from '../angular/compiler';\r\nimport {LiteralMap, ASTWithSource} from '../angular/compiler';\r\nimport {JsonStringMapperVisitor} from \"../visitors/json-string-mapper-visitor/json-string-mapper-visitor\";\r\n\r\nexport class JsonStringMapper {\r\n    private _parser: Parser = new Parser(new Lexer());\r\n    private _cache: Map<string, ASTWithSource> = new Map<string, ASTWithSource>();\r\n\r\n    map(expression: string): Map<string, string> {\r\n        let ast: ASTWithSource = null;\r\n        const visitor = new JsonStringMapperVisitor();\r\n\r\n        if (this._cache.has(expression)) {\r\n            ast = this._cache.get(expression);\r\n        }\r\n        else {\r\n            ast = this._parser.parseInterpolation(expression, 'JsonMapper');\r\n\r\n            if (ast) {\r\n                throw new Error(`JsonMapperVisitor ERROR: given expression must be json expression.`);\r\n            }\r\n            else {\r\n                ast = this._parser.parseBinding(expression, 'Parse');\r\n            }\r\n\r\n            if (!(ast.ast instanceof LiteralMap)) {\r\n                throw new Error(`JsonMapper ERROR: given expression must be json expression.`);\r\n            }\r\n\r\n            this._cache.set(expression, ast);\r\n        }\r\n\r\n        const jsonMap = new Map<string, string>();\r\n        const resultObj = ast.visit(visitor, true);\r\n        const keys = Object.keys(resultObj);\r\n\r\n        for (let i = 0, length = keys.length; i < length; i++) {\r\n            jsonMap.set(keys[i], resultObj[keys[i]]);\r\n        }\r\n\r\n        return jsonMap;\r\n    }\r\n}"]}