set(autostart ${PLUGIN_COBALT_AUTOSTART})
set(preconditions Platform Graphics Internet)

if(PLUGIN_COBALT_PERSISTENTPATHPOSTFIX)
  set(persistentpathpostfix ${PLUGIN_COBALT_PERSISTENTPATHPOSTFIX})
endif()

map()
    kv(mode ${PLUGIN_COBALT_MODE})
    kv(locator lib${PLUGIN_COBALT_IMPLEMENTATION}.so)
    if(PLUGIN_COBALT_USER)
        kv(user ${PLUGIN_COBALT_USER})
    endif()
    if(PLUGIN_COBALT_GROUP)
        kv(group ${PLUGIN_COBALT_GROUP})
    endif()
end()
ans(rootobject)

map()
    kv(url "https://www.youtube.com/tv")
    if(PLUGIN_COBALT_CLIENTIDENTIFIER)
        kv(clientidentifier ${PLUGIN_COBALT_CLIENTIDENTIFIER})
    endif()
    if(PLUGIN_COBALT_LANGUAGE)
        kv(language ${PLUGIN_COBALT_LANGUAGE})
    endif()
    if(PLUGIN_COBALT_CONTENT_DIR)
        kv(contentdir ${PLUGIN_COBALT_CONTENT_DIR})
    endif()
    if(PLUGIN_COBALT_ESSOS_CONTEXT_DESTROY)
        kv(essoscontextdestroy ${PLUGIN_COBALT_ESSOS_CONTEXT_DESTROY})
    endif()
    if(PLUGIN_COBALT_PRELOAD)
        kv(preload ${PLUGIN_COBALT_PRELOAD})
    endif()
    if(PLUGIN_COBALT_CLOSUREPOLICY)
        kv(closurepolicy ${PLUGIN_COBALT_CLOSUREPOLICY})
    endif()
end()
ans(configuration)

map()
    if(PLUGIN_COBALT_ADVERTISING_ID)
        kv(ifa ${PLUGIN_COBALT_ADVERTISING_ID})
    endif()
    if(PLUGIN_COBALT_IFA_TYPE)
        kv(ifa_type ${PLUGIN_COBALT_IFA_TYPE})
    endif()
    if(PLUGIN_COBALT_LIMIT_AD_TRACKING)
        kv(lmt ${PLUGIN_COBALT_LIMIT_AD_TRACKING})
    endif()
end()
ans(advertisingid)

map_isempty(${advertisingid})
ans(advertisingid_isempty)
if (NOT advertisingid_isempty)
  map_append(${configuration} advertisingid ${advertisingid})
endif()

map()
    if(PLUGIN_COBALT_PROP_MODELNAME)
        kv(modelname "${PLUGIN_COBALT_PROP_MODELNAME}")
    endif()
    if(PLUGIN_COBALT_PROP_BRANDNAME)
        kv(brandname "${PLUGIN_COBALT_PROP_BRANDNAME}")
    endif()
    if(PLUGIN_COBALT_PROP_MODELYEAR)
        kv(modelyear "${PLUGIN_COBALT_PROP_MODELYEAR}")
    endif()
    if(PLUGIN_COBALT_PROP_CHIPSETMODELNUMBER)
        kv(chipsetmodelnumber "${PLUGIN_COBALT_PROP_CHIPSETMODELNUMBER}")
    endif()
    if(PLUGIN_COBALT_PROP_FIRMWAREVERSION)
        kv(firmwareversion "${PLUGIN_COBALT_PROP_FIRMWAREVERSION}")
    endif()
    if(PLUGIN_COBALT_PROP_INTEGRATORNAME)
        kv(integratorname "${PLUGIN_COBALT_PROP_INTEGRATORNAME}")
    endif()
    if(PLUGIN_COBALT_PROP_FRIENDLYNAME)
        kv(friendlyname "${PLUGIN_COBALT_PROP_FRIENDLYNAME}")
    endif()
    if(PLUGIN_COBALT_PROP_DEVICETYPE)
        kv(devicetype "${PLUGIN_COBALT_PROP_DEVICETYPE}")
    endif()
end()
ans(systemproperties)

map_isempty(${systemproperties})
ans(systemproperties_isempty)
if (NOT systemproperties_isempty)
  map_append(${configuration} systemproperties ${systemproperties})
endif()

if(PLUGIN_COBALT_EVEGREEN_LITE)
    map_append(${configuration} sbmainargs ___array___)
    map_append(${configuration} sbmainargs "--evergreen_lite")
endif()

map_append(${configuration} root ${rootobject})
