/*
 * 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
    #text  // f.c.TextBlock
        - content: "1 "  // String
    #assign  // f.c.Assignment
        - assignment target: "x"  // String
        - assignment operator: "="  // String
        - assignment source: 1  // f.c.NumberLiteral
        - variable scope: "1"  // Integer
        - namespace: null  // Null
    #text  // f.c.TextBlock
        - content: "\n2 "  // String
    #assign  // f.c.AssignmentInstruction
        - variable scope: "1"  // Integer
        - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "x"  // String
            - assignment operator: "="  // String
            - assignment source: 1  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "y"  // String
            - assignment operator: "="  // String
            - assignment source: 2  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: null  // Null
    #text  // f.c.TextBlock
        - content: "\n3 "  // String
    #assign  // f.c.Assignment
        - assignment target: "x"  // String
        - assignment operator: "="  // String
        - assignment source: 1  // f.c.NumberLiteral
        - variable scope: "1"  // Integer
        - namespace: ns  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\n4 "  // String
    #assign  // f.c.AssignmentInstruction
        - variable scope: "1"  // Integer
        - namespace: ns  // f.c.Identifier
        #assign  // f.c.Assignment
            - assignment target: "x"  // String
            - assignment operator: "="  // String
            - assignment source: 1  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: ns  // f.c.Identifier
        #assign  // f.c.Assignment
            - assignment target: "y"  // String
            - assignment operator: "="  // String
            - assignment source: 2  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: ns  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\n5 "  // String
    #global  // f.c.Assignment
        - assignment target: "x"  // String
        - assignment operator: "="  // String
        - assignment source: 1  // f.c.NumberLiteral
        - variable scope: "3"  // Integer
        - namespace: null  // Null
    #text  // f.c.TextBlock
        - content: "\n6 "  // String
    #global  // f.c.AssignmentInstruction
        - variable scope: "3"  // Integer
        - namespace: null  // Null
        #global  // f.c.Assignment
            - assignment target: "x"  // String
            - assignment operator: "="  // String
            - assignment source: 1  // f.c.NumberLiteral
            - variable scope: "3"  // Integer
            - namespace: null  // Null
        #global  // f.c.Assignment
            - assignment target: "y"  // String
            - assignment operator: "="  // String
            - assignment source: 2  // f.c.NumberLiteral
            - variable scope: "3"  // Integer
            - namespace: null  // Null
    #macro  // f.c.UnboundCallable
        - assignment target: "m"  // String
        - catch-all parameter name: null  // Null
        - AST-node subtype: "0"  // Integer
        #text  // f.c.TextBlock
            - content: "  7 "  // String
        #local  // f.c.Assignment
            - assignment target: "x"  // String
            - assignment operator: "="  // String
            - assignment source: 1  // f.c.NumberLiteral
            - variable scope: "2"  // Integer
            - namespace: null  // Null
        #text  // f.c.TextBlock
            - content: "\n  8 "  // String
        #local  // f.c.AssignmentInstruction
            - variable scope: "2"  // Integer
            - namespace: null  // Null
            #local  // f.c.Assignment
                - assignment target: "x"  // String
                - assignment operator: "="  // String
                - assignment source: 1  // f.c.NumberLiteral
                - variable scope: "2"  // Integer
                - namespace: null  // Null
            #local  // f.c.Assignment
                - assignment target: "y"  // String
                - assignment operator: "="  // String
                - assignment source: 2  // f.c.NumberLiteral
                - variable scope: "2"  // Integer
                - namespace: null  // Null
        #text  // f.c.TextBlock
            - content: "\n"  // String
    #text  // f.c.TextBlock
        - content: "9 "  // String
    #assign  // f.c.AssignmentInstruction
        - variable scope: "1"  // Integer
        - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "a"  // String
            - assignment operator: "+="  // String
            - assignment source: 1  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "b"  // String
            - assignment operator: "-="  // String
            - assignment source: 2  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "c"  // String
            - assignment operator: "*="  // String
            - assignment source: 3  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "d"  // String
            - assignment operator: "/="  // String
            - assignment source: 4  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "e"  // String
            - assignment operator: "%="  // String
            - assignment source: 5  // f.c.NumberLiteral
            - variable scope: "1"  // Integer
            - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "f"  // String
            - assignment operator: "++"  // String
            - assignment source: null  // Null
            - variable scope: "1"  // Integer
            - namespace: null  // Null
        #assign  // f.c.Assignment
            - assignment target: "g"  // String
            - assignment operator: "--"  // String
            - assignment source: null  // Null
            - variable scope: "1"  // Integer
            - namespace: null  // Null
