/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#mixed_content  // f.c.MixedContent
    ${...}  // f.c.DollarVariable
        - content: ?trim  // f.c.BuiltInsForStringsBasic$trimBI
            - left-hand operand: x  // f.c.Identifier
            - right-hand operand: "trim"  // String
    #text  // f.c.TextBlock
        - content: "\n"  // String
    ${...}  // f.c.DollarVariable
        - content: ...(...)  // f.c.MethodCall
            - callee: ?left_pad  // f.c.BuiltInsForStringsBasic$padBI
                - left-hand operand: x  // f.c.Identifier
                - right-hand operand: "left_pad"  // String
            - argument value: 5  // f.c.NumberLiteral
    #text  // f.c.TextBlock
        - content: "\n"  // String
    ${...}  // f.c.DollarVariable
        - content: ...(...)  // f.c.MethodCall
            - callee: ?left_pad  // f.c.BuiltInsForStringsBasic$padBI
                - left-hand operand: x  // f.c.Identifier
                - right-hand operand: "left_pad"  // String
            - argument value: 5  // f.c.NumberLiteral
            - argument value: "-"  // f.c.StringLiteral
    #text  // f.c.TextBlock
        - content: "\n"  // String
    ${...}  // f.c.DollarVariable
        - content: ?then(...)  // f.c.BuiltInsWithLazyConditionals$then_BI
            - left-hand operand: x  // f.c.Identifier
            - right-hand operand: "then"  // String
            - argument value: "y"  // f.c.StringLiteral
            - argument value: "n"  // f.c.StringLiteral
    #text  // f.c.TextBlock
        - content: "\n"  // String
    ${...}  // f.c.DollarVariable
        - content: ?switch(...)  // f.c.BuiltInsWithLazyConditionals$switch_BI
            - left-hand operand: x  // f.c.Identifier
            - right-hand operand: "switch"  // String
            - argument value: 1  // f.c.NumberLiteral
            - argument value: 11  // f.c.NumberLiteral
            - argument value: 2  // f.c.NumberLiteral
            - argument value: 22  // f.c.NumberLiteral
            - argument value: 33  // f.c.NumberLiteral
