---
Function {
 argument: None,
 arguments: FunctionArguments {
  arguments: [
   FunctionArgument {
    identifier: "pkgs",
    default: None,
   },
   FunctionArgument {
    identifier: "options",
    default: None,
   },
   FunctionArgument {
    identifier: "lib",
    default: None,
   },
   FunctionArgument {
    identifier: "config",
    default: None,
   },
  ],
  ellipsis: true,
 },
 definition: With {
  expression: Variable {
   identifier: "lib",
   position: (3, 6),
  },
  target: LetIn {
   bindings: [
    KeyValue(
     AttributePath {
      attributes: [
       Raw {
        content: "cfg",
        position: (6, 3),
       },
      ],
     },
     PropertyAccess {
      expression: Variable {
       identifier: "config",
       position: (6, 9),
      },
      attribute_path: AttributePath {
       attributes: [
        Raw {
         content: "services",
         position: (6, 16),
        },
        Raw {
         content: "airsonic",
         position: (6, 25),
        },
       ],
      },
      default: None,
     },
    ),
    KeyValue(
     AttributePath {
      attributes: [
       Raw {
        content: "opt",
        position: (7, 3),
       },
      ],
     },
     PropertyAccess {
      expression: Variable {
       identifier: "options",
       position: (7, 9),
      },
      attribute_path: AttributePath {
       attributes: [
        Raw {
         content: "services",
         position: (7, 17),
        },
        Raw {
         content: "airsonic",
         position: (7, 26),
        },
       ],
      },
      default: None,
     },
    ),
   ],
   target: Map {
    bindings: [
     KeyValue(
      AttributePath {
       attributes: [
        Raw {
         content: "options",
         position: (9, 3),
        },
       ],
      },
      Map {
       bindings: [
        KeyValue(
         AttributePath {
          attributes: [
           Raw {
            content: "services",
            position: (11, 5),
           },
           Raw {
            content: "airsonic",
            position: (11, 14),
           },
          ],
         },
         Map {
          bindings: [
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "enable",
               position: (12, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkEnableOption",
              position: (12, 16),
             },
             arguments: [
              String {
               parts: [
                Raw {
                 content: "Airsonic, the Free and Open Source media streaming server (fork of Subsonic and Libresonic)",
                 position: (12, 32),
                },
               ],
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "user",
               position: (14, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (14, 14),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (15, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "types",
                   position: (15, 16),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "str",
                     position: (15, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (16, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "airsonic",
                    position: (16, 20),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (17, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "User account under which airsonic runs.",
                    position: (17, 24),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (14, 23),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "home",
               position: (20, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (20, 14),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (21, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "types",
                   position: (21, 16),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "path",
                     position: (21, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (22, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "/var/lib/airsonic",
                    position: (22, 20),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (23, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "The directory where Airsonic will create files.\nMake sure it is writable.\n",
                    position: (24, 1),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (20, 23),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "virtualHost",
               position: (29, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (29, 21),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (30, 9),
                   },
                  ],
                 },
                 FunctionApplication {
                  function: PropertyAccess {
                   expression: Variable {
                    identifier: "types",
                    position: (30, 16),
                   },
                   attribute_path: AttributePath {
                    attributes: [
                     Raw {
                      content: "nullOr",
                      position: (30, 22),
                     },
                    ],
                   },
                   default: None,
                  },
                  arguments: [
                   PropertyAccess {
                    expression: Variable {
                     identifier: "types",
                     position: (30, 29),
                    },
                    attribute_path: AttributePath {
                     attributes: [
                      Raw {
                       content: "str",
                       position: (30, 35),
                      },
                     ],
                    },
                    default: None,
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (31, 9),
                   },
                  ],
                 },
                 Variable {
                  identifier: "null",
                  position: (31, 19),
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (32, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "Name of the nginx virtualhost to use and setup. If null, do not setup any virtualhost.\n",
                    position: (33, 1),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (29, 30),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "listenAddress",
               position: (37, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (37, 23),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (38, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "types",
                   position: (38, 16),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "str",
                     position: (38, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (39, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "127.0.0.1",
                    position: (39, 20),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (40, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "The host name or IP address on which to bind Airsonic.\nThe default value is appropriate for first launch, when the\ndefault credentials are easy to guess. It is also appropriate\nif you intend to use the virtualhost option in the service\nmodule. In other cases, you may want to change this to a\nspecific IP or 0.0.0.0 to listen on all interfaces.\n",
                    position: (41, 1),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (37, 32),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "port",
               position: (50, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (50, 14),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (51, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "types",
                   position: (51, 16),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "int",
                     position: (51, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (52, 9),
                   },
                  ],
                 },
                 Int {
                  value: 4040,
                  position: (52, 19),
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (53, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "The port on which Airsonic will listen for\nincoming HTTP traffic. Set to 0 to disable.\n",
                    position: (54, 1),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (50, 23),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "contextPath",
               position: (59, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (59, 21),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (60, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "types",
                   position: (60, 16),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "path",
                     position: (60, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (61, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "/",
                    position: (61, 20),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (62, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "The context path, i.e., the last part of the Airsonic\nURL. Typically '/' or '/airsonic'. Default '/'\n",
                    position: (63, 1),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (59, 30),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "maxMemory",
               position: (68, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (68, 19),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (69, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "types",
                   position: (69, 16),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "int",
                     position: (69, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (70, 9),
                   },
                  ],
                 },
                 Int {
                  value: 100,
                  position: (70, 19),
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (71, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "The memory limit (max Java heap size) in megabytes.\nDefault: 100\n",
                    position: (72, 1),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (68, 28),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "transcoders",
               position: (77, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (77, 21),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (78, 9),
                   },
                  ],
                 },
                 FunctionApplication {
                  function: PropertyAccess {
                   expression: Variable {
                    identifier: "types",
                    position: (78, 16),
                   },
                   attribute_path: AttributePath {
                    attributes: [
                     Raw {
                      content: "listOf",
                      position: (78, 22),
                     },
                    ],
                   },
                   default: None,
                  },
                  arguments: [
                   PropertyAccess {
                    expression: Variable {
                     identifier: "types",
                     position: (78, 29),
                    },
                    attribute_path: AttributePath {
                     attributes: [
                      Raw {
                       content: "path",
                       position: (78, 35),
                      },
                     ],
                    },
                    default: None,
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (79, 9),
                   },
                  ],
                 },
                 List {
                  elements: [
                   String {
                    parts: [
                     Expression {
                      expression: PropertyAccess {
                       expression: Variable {
                        identifier: "pkgs",
                        position: (79, 24),
                       },
                       attribute_path: AttributePath {
                        attributes: [
                         Raw {
                          content: "ffmpeg",
                          position: (79, 29),
                         },
                         Raw {
                          content: "bin",
                          position: (79, 36),
                         },
                        ],
                       },
                       default: None,
                      },
                     },
                     Raw {
                      content: "/bin/ffmpeg",
                      position: (79, 40),
                     },
                    ],
                   },
                  ],
                  position: (79, 19),
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "defaultText",
                    position: (80, 9),
                   },
                  ],
                 },
                 FunctionApplication {
                  function: Variable {
                   identifier: "literalExpression",
                   position: (80, 23),
                  },
                  arguments: [
                   String {
                    parts: [
                     Raw {
                      content: "[ \"",
                      position: (80, 43),
                     },
                     Raw {
                      content: "$",
                      position: (80, 46),
                     },
                     Raw {
                      content: "{pkgs.ffmpeg.bin}/bin/ffmpeg\" ]",
                      position: (80, 49),
                     },
                    ],
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (81, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "List of paths to transcoder executables that should be accessible\nfrom Airsonic. Symlinks will be created to each executable inside\n",
                    position: (82, 1),
                   },
                   Raw {
                    content: "$",
                    position: (84, 11),
                   },
                   Raw {
                    content: "{config.",
                    position: (84, 14),
                   },
                   Expression {
                    expression: PropertyAccess {
                     expression: Variable {
                      identifier: "opt",
                      position: (84, 24),
                     },
                     attribute_path: AttributePath {
                      attributes: [
                       Raw {
                        content: "home",
                        position: (84, 28),
                       },
                      ],
                     },
                     default: None,
                    },
                   },
                   Raw {
                    content: "}/transcoders.\n",
                    position: (84, 33),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (77, 30),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "jre",
               position: (88, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (88, 13),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (89, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "types",
                   position: (89, 16),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "package",
                     position: (89, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (90, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "pkgs",
                   position: (90, 19),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "jre8",
                     position: (90, 24),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "defaultText",
                    position: (91, 9),
                   },
                  ],
                 },
                 FunctionApplication {
                  function: Variable {
                   identifier: "literalExpression",
                   position: (91, 23),
                  },
                  arguments: [
                   String {
                    parts: [
                     Raw {
                      content: "pkgs.jre8",
                      position: (91, 42),
                     },
                    ],
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (92, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "JRE package to use.\n\nAirsonic only supports Java 8, airsonic-advanced requires at least\nJava 11.\n",
                    position: (93, 1),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (88, 22),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "war",
               position: (100, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (100, 13),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (101, 9),
                   },
                  ],
                 },
                 PropertyAccess {
                  expression: Variable {
                   identifier: "types",
                   position: (101, 16),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "path",
                     position: (101, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (102, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Expression {
                    expression: PropertyAccess {
                     expression: Variable {
                      identifier: "pkgs",
                      position: (102, 22),
                     },
                     attribute_path: AttributePath {
                      attributes: [
                       Raw {
                        content: "airsonic",
                        position: (102, 27),
                       },
                      ],
                     },
                     default: None,
                    },
                   },
                   Raw {
                    content: "/webapps/airsonic.war",
                    position: (102, 36),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "defaultText",
                    position: (103, 9),
                   },
                  ],
                 },
                 FunctionApplication {
                  function: Variable {
                   identifier: "literalExpression",
                   position: (103, 23),
                  },
                  arguments: [
                   String {
                    parts: [
                     Raw {
                      content: "\"",
                      position: (103, 43),
                     },
                     Raw {
                      content: "$",
                      position: (103, 44),
                     },
                     Raw {
                      content: "{pkgs.airsonic}/webapps/airsonic.war\"",
                      position: (103, 47),
                     },
                    ],
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (104, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "Airsonic war file to use.",
                    position: (104, 24),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (100, 22),
              },
             ],
            },
           ),
           KeyValue(
            AttributePath {
             attributes: [
              Raw {
               content: "jvmOptions",
               position: (107, 7),
              },
             ],
            },
            FunctionApplication {
             function: Variable {
              identifier: "mkOption",
              position: (107, 20),
             },
             arguments: [
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "description",
                    position: (108, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "Extra command line options for the JVM running AirSonic.\nUseful for sending jukebox output to non-default alsa\ndevices.\n",
                    position: (109, 1),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "default",
                    position: (113, 9),
                   },
                  ],
                 },
                 List {
                  elements: [],
                  position: (113, 19),
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "type",
                    position: (115, 9),
                   },
                  ],
                 },
                 FunctionApplication {
                  function: PropertyAccess {
                   expression: Variable {
                    identifier: "types",
                    position: (115, 16),
                   },
                   attribute_path: AttributePath {
                    attributes: [
                     Raw {
                      content: "listOf",
                      position: (115, 22),
                     },
                    ],
                   },
                   default: None,
                  },
                  arguments: [
                   PropertyAccess {
                    expression: Variable {
                     identifier: "types",
                     position: (115, 29),
                    },
                    attribute_path: AttributePath {
                     attributes: [
                      Raw {
                       content: "str",
                       position: (115, 35),
                      },
                     ],
                    },
                    default: None,
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "example",
                    position: (116, 9),
                   },
                  ],
                 },
                 List {
                  elements: [
                   String {
                    parts: [
                     Raw {
                      content: "-Djavax.sound.sampled.Clip='#CODEC [plughw:1,0]'",
                      position: (117, 12),
                     },
                    ],
                   },
                   String {
                    parts: [
                     Raw {
                      content: "-Djavax.sound.sampled.Port='#Port CODEC [hw:1]'",
                      position: (118, 12),
                     },
                    ],
                   },
                   String {
                    parts: [
                     Raw {
                      content: "-Djavax.sound.sampled.SourceDataLine='#CODEC [plughw:1,0]'",
                      position: (119, 12),
                     },
                    ],
                   },
                   String {
                    parts: [
                     Raw {
                      content: "-Djavax.sound.sampled.TargetDataLine='#CODEC [plughw:1,0]'",
                      position: (120, 12),
                     },
                    ],
                   },
                  ],
                  position: (116, 19),
                 },
                ),
               ],
               recursive: false,
               position: (107, 29),
              },
             ],
            },
           ),
          ],
          recursive: false,
          position: (11, 25),
         },
        ),
       ],
       recursive: false,
       position: (9, 13),
      },
     ),
     KeyValue(
      AttributePath {
       attributes: [
        Raw {
         content: "config",
         position: (127, 3),
        },
       ],
      },
      FunctionApplication {
       function: Variable {
        identifier: "mkIf",
        position: (127, 12),
       },
       arguments: [
        PropertyAccess {
         expression: Variable {
          identifier: "cfg",
          position: (127, 17),
         },
         attribute_path: AttributePath {
          attributes: [
           Raw {
            content: "enable",
            position: (127, 21),
           },
          ],
         },
         default: None,
        },
        Map {
         bindings: [
          KeyValue(
           AttributePath {
            attributes: [
             Raw {
              content: "systemd",
              position: (128, 5),
             },
             Raw {
              content: "services",
              position: (128, 13),
             },
             Raw {
              content: "airsonic",
              position: (128, 22),
             },
            ],
           },
           Map {
            bindings: [
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "description",
                 position: (129, 7),
                },
               ],
              },
              String {
               parts: [
                Raw {
                 content: "Airsonic Media Server",
                 position: (129, 22),
                },
               ],
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "after",
                 position: (130, 7),
                },
               ],
              },
              List {
               elements: [
                String {
                 parts: [
                  Raw {
                   content: "network.target",
                   position: (130, 18),
                  },
                 ],
                },
               ],
               position: (130, 15),
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "wantedBy",
                 position: (131, 7),
                },
               ],
              },
              List {
               elements: [
                String {
                 parts: [
                  Raw {
                   content: "multi-user.target",
                   position: (131, 21),
                  },
                 ],
                },
               ],
               position: (131, 18),
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "preStart",
                 position: (133, 7),
                },
               ],
              },
              String {
               parts: [
                Raw {
                 content: "# Install transcoders.\nrm -rf ",
                 position: (134, 1),
                },
                Expression {
                 expression: PropertyAccess {
                  expression: Variable {
                   identifier: "cfg",
                   position: (135, 18),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "home",
                     position: (135, 22),
                    },
                   ],
                  },
                  default: None,
                 },
                },
                Raw {
                 content: "/transcode\nmkdir -p ",
                 position: (135, 27),
                },
                Expression {
                 expression: PropertyAccess {
                  expression: Variable {
                   identifier: "cfg",
                   position: (136, 20),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "home",
                     position: (136, 24),
                    },
                   ],
                  },
                  default: None,
                 },
                },
                Raw {
                 content: "/transcode\nfor exe in ",
                 position: (136, 29),
                },
                Expression {
                 expression: FunctionApplication {
                  function: Variable {
                   identifier: "toString",
                   position: (137, 22),
                  },
                  arguments: [
                   PropertyAccess {
                    expression: Variable {
                     identifier: "cfg",
                     position: (137, 31),
                    },
                    attribute_path: AttributePath {
                     attributes: [
                      Raw {
                       content: "transcoders",
                       position: (137, 35),
                      },
                     ],
                    },
                    default: None,
                   },
                  ],
                 },
                },
                Raw {
                 content: "; do\n  ln -sf \"$exe\" ",
                 position: (137, 47),
                },
                Expression {
                 expression: PropertyAccess {
                  expression: Variable {
                   identifier: "cfg",
                   position: (138, 27),
                  },
                  attribute_path: AttributePath {
                   attributes: [
                    Raw {
                     content: "home",
                     position: (138, 31),
                    },
                   ],
                  },
                  default: None,
                 },
                },
                Raw {
                 content: "/transcode\ndone\n",
                 position: (138, 36),
                },
               ],
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "serviceConfig",
                 position: (141, 7),
                },
               ],
              },
              Map {
               bindings: [
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "ExecStart",
                    position: (142, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "",
                    position: (143, 1),
                   },
                   Expression {
                    expression: PropertyAccess {
                     expression: Variable {
                      identifier: "cfg",
                      position: (143, 13),
                     },
                     attribute_path: AttributePath {
                      attributes: [
                       Raw {
                        content: "jre",
                        position: (143, 17),
                       },
                      ],
                     },
                     default: None,
                    },
                   },
                   Raw {
                    content: "/bin/java -Xmx",
                    position: (143, 21),
                   },
                   Expression {
                    expression: FunctionApplication {
                     function: Variable {
                      identifier: "toString",
                      position: (143, 37),
                     },
                     arguments: [
                      PropertyAccess {
                       expression: Variable {
                        identifier: "cfg",
                        position: (143, 46),
                       },
                       attribute_path: AttributePath {
                        attributes: [
                         Raw {
                          content: "maxMemory",
                          position: (143, 50),
                         },
                        ],
                       },
                       default: None,
                      },
                     ],
                    },
                   },
                   Raw {
                    content: "m \\\n-Dairsonic.home=",
                    position: (143, 60),
                   },
                   Expression {
                    expression: PropertyAccess {
                     expression: Variable {
                      identifier: "cfg",
                      position: (144, 29),
                     },
                     attribute_path: AttributePath {
                      attributes: [
                       Raw {
                        content: "home",
                        position: (144, 33),
                       },
                      ],
                     },
                     default: None,
                    },
                   },
                   Raw {
                    content: " \\\n-Dserver.address=",
                    position: (144, 38),
                   },
                   Expression {
                    expression: PropertyAccess {
                     expression: Variable {
                      identifier: "cfg",
                      position: (145, 30),
                     },
                     attribute_path: AttributePath {
                      attributes: [
                       Raw {
                        content: "listenAddress",
                        position: (145, 34),
                       },
                      ],
                     },
                     default: None,
                    },
                   },
                   Raw {
                    content: " \\\n-Dserver.port=",
                    position: (145, 48),
                   },
                   Expression {
                    expression: FunctionApplication {
                     function: Variable {
                      identifier: "toString",
                      position: (146, 27),
                     },
                     arguments: [
                      PropertyAccess {
                       expression: Variable {
                        identifier: "cfg",
                        position: (146, 36),
                       },
                       attribute_path: AttributePath {
                        attributes: [
                         Raw {
                          content: "port",
                          position: (146, 40),
                         },
                        ],
                       },
                       default: None,
                      },
                     ],
                    },
                   },
                   Raw {
                    content: " \\\n-Dairsonic.contextPath=",
                    position: (146, 45),
                   },
                   Expression {
                    expression: PropertyAccess {
                     expression: Variable {
                      identifier: "cfg",
                      position: (147, 36),
                     },
                     attribute_path: AttributePath {
                      attributes: [
                       Raw {
                        content: "contextPath",
                        position: (147, 40),
                       },
                      ],
                     },
                     default: None,
                    },
                   },
                   Raw {
                    content: " \\\n-Djava.awt.headless=true \\\n",
                    position: (147, 52),
                   },
                   Expression {
                    expression: FunctionApplication {
                     function: Variable {
                      identifier: "optionalString",
                      position: (149, 13),
                     },
                     arguments: [
                      BinaryOperation {
                       operator: NotEqualTo,
                       operands: [
                        PropertyAccess {
                         expression: Variable {
                          identifier: "cfg",
                          position: (149, 29),
                         },
                         attribute_path: AttributePath {
                          attributes: [
                           Raw {
                            content: "virtualHost",
                            position: (149, 33),
                           },
                          ],
                         },
                         default: None,
                        },
                        Variable {
                         identifier: "null",
                         position: (149, 48),
                        },
                       ],
                       position: (149, 45),
                      },
                      String {
                       parts: [
                        Raw {
                         content: "-Dserver.use-forward-headers=true",
                         position: (150, 14),
                        },
                       ],
                      },
                     ],
                    },
                   },
                   Raw {
                    content: " \\\n",
                    position: (150, 49),
                   },
                   Expression {
                    expression: FunctionApplication {
                     function: Variable {
                      identifier: "toString",
                      position: (151, 13),
                     },
                     arguments: [
                      PropertyAccess {
                       expression: Variable {
                        identifier: "cfg",
                        position: (151, 22),
                       },
                       attribute_path: AttributePath {
                        attributes: [
                         Raw {
                          content: "jvmOptions",
                          position: (151, 26),
                         },
                        ],
                       },
                       default: None,
                      },
                     ],
                    },
                   },
                   Raw {
                    content: " \\\n-verbose:gc \\\n-jar ",
                    position: (151, 37),
                   },
                   Expression {
                    expression: PropertyAccess {
                     expression: Variable {
                      identifier: "cfg",
                      position: (153, 18),
                     },
                     attribute_path: AttributePath {
                      attributes: [
                       Raw {
                        content: "war",
                        position: (153, 22),
                       },
                      ],
                     },
                     default: None,
                    },
                   },
                   Raw {
                    content: "\n",
                    position: (153, 26),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "Restart",
                    position: (155, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "always",
                    position: (155, 20),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "User",
                    position: (156, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "airsonic",
                    position: (156, 17),
                   },
                  ],
                 },
                ),
                KeyValue(
                 AttributePath {
                  attributes: [
                   Raw {
                    content: "UMask",
                    position: (157, 9),
                   },
                  ],
                 },
                 String {
                  parts: [
                   Raw {
                    content: "0022",
                    position: (157, 18),
                   },
                  ],
                 },
                ),
               ],
               recursive: false,
               position: (141, 23),
              },
             ),
            ],
            recursive: false,
            position: (128, 33),
           },
          ),
          KeyValue(
           AttributePath {
            attributes: [
             Raw {
              content: "services",
              position: (161, 5),
             },
             Raw {
              content: "nginx",
              position: (161, 14),
             },
            ],
           },
           FunctionApplication {
            function: Variable {
             identifier: "mkIf",
             position: (161, 22),
            },
            arguments: [
             BinaryOperation {
              operator: NotEqualTo,
              operands: [
               PropertyAccess {
                expression: Variable {
                 identifier: "cfg",
                 position: (161, 28),
                },
                attribute_path: AttributePath {
                 attributes: [
                  Raw {
                   content: "virtualHost",
                   position: (161, 32),
                  },
                 ],
                },
                default: None,
               },
               Variable {
                identifier: "null",
                position: (161, 47),
               },
              ],
              position: (161, 44),
             },
             Map {
              bindings: [
               KeyValue(
                AttributePath {
                 attributes: [
                  Raw {
                   content: "enable",
                   position: (162, 7),
                  },
                 ],
                },
                Variable {
                 identifier: "true",
                 position: (162, 16),
                },
               ),
               KeyValue(
                AttributePath {
                 attributes: [
                  Raw {
                   content: "recommendedProxySettings",
                   position: (163, 7),
                  },
                 ],
                },
                Variable {
                 identifier: "true",
                 position: (163, 34),
                },
               ),
               KeyValue(
                AttributePath {
                 attributes: [
                  Raw {
                   content: "virtualHosts",
                   position: (164, 7),
                  },
                  Expression {
                   expression: PropertyAccess {
                    expression: Variable {
                     identifier: "cfg",
                     position: (164, 22),
                    },
                    attribute_path: AttributePath {
                     attributes: [
                      Raw {
                       content: "virtualHost",
                       position: (164, 26),
                      },
                     ],
                    },
                    default: None,
                   },
                  },
                 ],
                },
                Map {
                 bindings: [
                  KeyValue(
                   AttributePath {
                    attributes: [
                     Raw {
                      content: "locations",
                      position: (165, 9),
                     },
                     Expression {
                      expression: PropertyAccess {
                       expression: Variable {
                        identifier: "cfg",
                        position: (165, 21),
                       },
                       attribute_path: AttributePath {
                        attributes: [
                         Raw {
                          content: "contextPath",
                          position: (165, 25),
                         },
                        ],
                       },
                       default: None,
                      },
                     },
                     Raw {
                      content: "proxyPass",
                      position: (165, 38),
                     },
                    ],
                   },
                   String {
                    parts: [
                     Raw {
                      content: "http://",
                      position: (165, 51),
                     },
                     Expression {
                      expression: PropertyAccess {
                       expression: Variable {
                        identifier: "cfg",
                        position: (165, 60),
                       },
                       attribute_path: AttributePath {
                        attributes: [
                         Raw {
                          content: "listenAddress",
                          position: (165, 64),
                         },
                        ],
                       },
                       default: None,
                      },
                     },
                     Raw {
                      content: ":",
                      position: (165, 78),
                     },
                     Expression {
                      expression: FunctionApplication {
                       function: Variable {
                        identifier: "toString",
                        position: (165, 81),
                       },
                       arguments: [
                        PropertyAccess {
                         expression: Variable {
                          identifier: "cfg",
                          position: (165, 90),
                         },
                         attribute_path: AttributePath {
                          attributes: [
                           Raw {
                            content: "port",
                            position: (165, 94),
                           },
                          ],
                         },
                         default: None,
                        },
                       ],
                      },
                     },
                    ],
                   },
                  ),
                 ],
                 recursive: false,
                 position: (164, 41),
                },
               ),
              ],
              recursive: false,
              position: (161, 53),
             },
            ],
           },
          ),
          KeyValue(
           AttributePath {
            attributes: [
             Raw {
              content: "users",
              position: (169, 5),
             },
             Raw {
              content: "users",
              position: (169, 11),
             },
             Raw {
              content: "airsonic",
              position: (169, 17),
             },
            ],
           },
           Map {
            bindings: [
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "description",
                 position: (170, 7),
                },
               ],
              },
              String {
               parts: [
                Raw {
                 content: "Airsonic service user",
                 position: (170, 22),
                },
               ],
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "group",
                 position: (171, 7),
                },
               ],
              },
              String {
               parts: [
                Raw {
                 content: "airsonic",
                 position: (171, 16),
                },
               ],
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "name",
                 position: (172, 7),
                },
               ],
              },
              PropertyAccess {
               expression: Variable {
                identifier: "cfg",
                position: (172, 14),
               },
               attribute_path: AttributePath {
                attributes: [
                 Raw {
                  content: "user",
                  position: (172, 18),
                 },
                ],
               },
               default: None,
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "home",
                 position: (173, 7),
                },
               ],
              },
              PropertyAccess {
               expression: Variable {
                identifier: "cfg",
                position: (173, 14),
               },
               attribute_path: AttributePath {
                attributes: [
                 Raw {
                  content: "home",
                  position: (173, 18),
                 },
                ],
               },
               default: None,
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "createHome",
                 position: (174, 7),
                },
               ],
              },
              Variable {
               identifier: "true",
               position: (174, 20),
              },
             ),
             KeyValue(
              AttributePath {
               attributes: [
                Raw {
                 content: "isSystemUser",
                 position: (175, 7),
                },
               ],
              },
              Variable {
               identifier: "true",
               position: (175, 22),
              },
             ),
            ],
            recursive: false,
            position: (169, 28),
           },
          ),
          KeyValue(
           AttributePath {
            attributes: [
             Raw {
              content: "users",
              position: (177, 5),
             },
             Raw {
              content: "groups",
              position: (177, 11),
             },
             Raw {
              content: "airsonic",
              position: (177, 18),
             },
            ],
           },
           Map {
            bindings: [],
            recursive: false,
            position: (177, 29),
           },
          ),
         ],
         recursive: false,
         position: (127, 28),
        },
       ],
      },
     ),
    ],
    recursive: false,
    position: (8, 4),
   },
   position: (5, 1),
  },
  position: (3, 1),
 },
 position: (1, 1),
}