All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.pulumi.googlenative.dialogflow.v3beta1.kotlin.FlowArgs.kt Maven / Gradle / Ivy

@file:Suppress("NAME_SHADOWING", "DEPRECATION")

package com.pulumi.googlenative.dialogflow.v3beta1.kotlin

import com.pulumi.core.Output
import com.pulumi.core.Output.of
import com.pulumi.googlenative.dialogflow.v3beta1.FlowArgs.builder
import com.pulumi.googlenative.dialogflow.v3beta1.kotlin.inputs.GoogleCloudDialogflowCxV3beta1EventHandlerArgs
import com.pulumi.googlenative.dialogflow.v3beta1.kotlin.inputs.GoogleCloudDialogflowCxV3beta1EventHandlerArgsBuilder
import com.pulumi.googlenative.dialogflow.v3beta1.kotlin.inputs.GoogleCloudDialogflowCxV3beta1NluSettingsArgs
import com.pulumi.googlenative.dialogflow.v3beta1.kotlin.inputs.GoogleCloudDialogflowCxV3beta1NluSettingsArgsBuilder
import com.pulumi.googlenative.dialogflow.v3beta1.kotlin.inputs.GoogleCloudDialogflowCxV3beta1TransitionRouteArgs
import com.pulumi.googlenative.dialogflow.v3beta1.kotlin.inputs.GoogleCloudDialogflowCxV3beta1TransitionRouteArgsBuilder
import com.pulumi.kotlin.ConvertibleToJava
import com.pulumi.kotlin.PulumiTagMarker
import com.pulumi.kotlin.applySuspend
import kotlin.String
import kotlin.Suppress
import kotlin.Unit
import kotlin.collections.List
import kotlin.jvm.JvmName

/**
 * Creates a flow in the specified agent. Note: You should always train a flow prior to sending it queries. See the [training documentation](https://cloud.google.com/dialogflow/cx/docs/concept/training).
 * @property agentId
 * @property description The description of the flow. The maximum length is 500 characters. If exceeded, the request is rejected.
 * @property displayName The human-readable name of the flow.
 * @property eventHandlers A flow's event handlers serve two purposes: * They are responsible for handling events (e.g. no match, webhook errors) in the flow. * They are inherited by every page's event handlers, which can be used to handle common events regardless of the current page. Event handlers defined in the page have higher priority than those defined in the flow. Unlike transition_routes, these handlers are evaluated on a first-match basis. The first one that matches the event get executed, with the rest being ignored.
 * @property languageCode The language of the following fields in `flow`: * `Flow.event_handlers.trigger_fulfillment.messages` * `Flow.event_handlers.trigger_fulfillment.conditional_cases` * `Flow.transition_routes.trigger_fulfillment.messages` * `Flow.transition_routes.trigger_fulfillment.conditional_cases` If not specified, the agent's default language is used. [Many languages](https://cloud.google.com/dialogflow/cx/docs/reference/language) are supported. Note: languages must be enabled in the agent before they can be used.
 * @property location
 * @property name The unique identifier of the flow. Format: `projects//locations//agents//flows/`.
 * @property nluSettings NLU related settings of the flow.
 * @property project
 * @property transitionRouteGroups A flow's transition route group serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition route groups. Transition route groups defined in the page have higher priority than those defined in the flow. Format:`projects//locations//agents//flows//transitionRouteGroups/`.
 * @property transitionRoutes A flow's transition routes serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition routes and can support use cases such as the user saying "help" or "can I talk to a human?", which can be handled in a common way regardless of the current page. Transition routes defined in the page have higher priority than those defined in the flow. TransitionRoutes are evalauted in the following order: * TransitionRoutes with intent specified. * TransitionRoutes with only condition specified. TransitionRoutes with intent specified are inherited by pages in the flow.
 */
public data class FlowArgs(
    public val agentId: Output? = null,
    public val description: Output? = null,
    public val displayName: Output? = null,
    public val eventHandlers: Output>? = null,
    public val languageCode: Output? = null,
    public val location: Output? = null,
    public val name: Output? = null,
    public val nluSettings: Output? = null,
    public val project: Output? = null,
    public val transitionRouteGroups: Output>? = null,
    public val transitionRoutes: Output>? =
        null,
) : ConvertibleToJava {
    override fun toJava(): com.pulumi.googlenative.dialogflow.v3beta1.FlowArgs =
        com.pulumi.googlenative.dialogflow.v3beta1.FlowArgs.builder()
            .agentId(agentId?.applyValue({ args0 -> args0 }))
            .description(description?.applyValue({ args0 -> args0 }))
            .displayName(displayName?.applyValue({ args0 -> args0 }))
            .eventHandlers(
                eventHandlers?.applyValue({ args0 ->
                    args0.map({ args0 ->
                        args0.let({ args0 ->
                            args0.toJava()
                        })
                    })
                }),
            )
            .languageCode(languageCode?.applyValue({ args0 -> args0 }))
            .location(location?.applyValue({ args0 -> args0 }))
            .name(name?.applyValue({ args0 -> args0 }))
            .nluSettings(nluSettings?.applyValue({ args0 -> args0.let({ args0 -> args0.toJava() }) }))
            .project(project?.applyValue({ args0 -> args0 }))
            .transitionRouteGroups(transitionRouteGroups?.applyValue({ args0 -> args0.map({ args0 -> args0 }) }))
            .transitionRoutes(
                transitionRoutes?.applyValue({ args0 ->
                    args0.map({ args0 ->
                        args0.let({ args0 ->
                            args0.toJava()
                        })
                    })
                }),
            ).build()
}

/**
 * Builder for [FlowArgs].
 */
@PulumiTagMarker
public class FlowArgsBuilder internal constructor() {
    private var agentId: Output? = null

    private var description: Output? = null

    private var displayName: Output? = null

    private var eventHandlers: Output>? = null

    private var languageCode: Output? = null

    private var location: Output? = null

    private var name: Output? = null

    private var nluSettings: Output? = null

    private var project: Output? = null

    private var transitionRouteGroups: Output>? = null

    private var transitionRoutes: Output>? =
        null

    /**
     * @param value
     */
    @JvmName("vlpyejolcmjwderk")
    public suspend fun agentId(`value`: Output) {
        this.agentId = value
    }

    /**
     * @param value The description of the flow. The maximum length is 500 characters. If exceeded, the request is rejected.
     */
    @JvmName("tfnstoqmsrlpdgnf")
    public suspend fun description(`value`: Output) {
        this.description = value
    }

    /**
     * @param value The human-readable name of the flow.
     */
    @JvmName("cufpledaiwwruddf")
    public suspend fun displayName(`value`: Output) {
        this.displayName = value
    }

    /**
     * @param value A flow's event handlers serve two purposes: * They are responsible for handling events (e.g. no match, webhook errors) in the flow. * They are inherited by every page's event handlers, which can be used to handle common events regardless of the current page. Event handlers defined in the page have higher priority than those defined in the flow. Unlike transition_routes, these handlers are evaluated on a first-match basis. The first one that matches the event get executed, with the rest being ignored.
     */
    @JvmName("qbhnuuuljoduuhqc")
    public suspend fun eventHandlers(`value`: Output>) {
        this.eventHandlers = value
    }

    @JvmName("xwkraglfkpvggmnr")
    public suspend fun eventHandlers(vararg values: Output) {
        this.eventHandlers = Output.all(values.asList())
    }

    /**
     * @param values A flow's event handlers serve two purposes: * They are responsible for handling events (e.g. no match, webhook errors) in the flow. * They are inherited by every page's event handlers, which can be used to handle common events regardless of the current page. Event handlers defined in the page have higher priority than those defined in the flow. Unlike transition_routes, these handlers are evaluated on a first-match basis. The first one that matches the event get executed, with the rest being ignored.
     */
    @JvmName("fqcqsbpcjknjsafw")
    public suspend fun eventHandlers(values: List>) {
        this.eventHandlers = Output.all(values)
    }

    /**
     * @param value The language of the following fields in `flow`: * `Flow.event_handlers.trigger_fulfillment.messages` * `Flow.event_handlers.trigger_fulfillment.conditional_cases` * `Flow.transition_routes.trigger_fulfillment.messages` * `Flow.transition_routes.trigger_fulfillment.conditional_cases` If not specified, the agent's default language is used. [Many languages](https://cloud.google.com/dialogflow/cx/docs/reference/language) are supported. Note: languages must be enabled in the agent before they can be used.
     */
    @JvmName("jswxgecjjqdbgkrt")
    public suspend fun languageCode(`value`: Output) {
        this.languageCode = value
    }

    /**
     * @param value
     */
    @JvmName("etwtloqopswmqkev")
    public suspend fun location(`value`: Output) {
        this.location = value
    }

    /**
     * @param value The unique identifier of the flow. Format: `projects//locations//agents//flows/`.
     */
    @JvmName("dwahhbwfwgptvjsn")
    public suspend fun name(`value`: Output) {
        this.name = value
    }

    /**
     * @param value NLU related settings of the flow.
     */
    @JvmName("buiuvgcspvcshmrb")
    public suspend fun nluSettings(`value`: Output) {
        this.nluSettings = value
    }

    /**
     * @param value
     */
    @JvmName("uryotvauytaengky")
    public suspend fun project(`value`: Output) {
        this.project = value
    }

    /**
     * @param value A flow's transition route group serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition route groups. Transition route groups defined in the page have higher priority than those defined in the flow. Format:`projects//locations//agents//flows//transitionRouteGroups/`.
     */
    @JvmName("heiheuqhpwhmlsxo")
    public suspend fun transitionRouteGroups(`value`: Output>) {
        this.transitionRouteGroups = value
    }

    @JvmName("hdvdvuxrteoxppwd")
    public suspend fun transitionRouteGroups(vararg values: Output) {
        this.transitionRouteGroups = Output.all(values.asList())
    }

    /**
     * @param values A flow's transition route group serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition route groups. Transition route groups defined in the page have higher priority than those defined in the flow. Format:`projects//locations//agents//flows//transitionRouteGroups/`.
     */
    @JvmName("lqdshnhwpagjqqvn")
    public suspend fun transitionRouteGroups(values: List>) {
        this.transitionRouteGroups = Output.all(values)
    }

    /**
     * @param value A flow's transition routes serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition routes and can support use cases such as the user saying "help" or "can I talk to a human?", which can be handled in a common way regardless of the current page. Transition routes defined in the page have higher priority than those defined in the flow. TransitionRoutes are evalauted in the following order: * TransitionRoutes with intent specified. * TransitionRoutes with only condition specified. TransitionRoutes with intent specified are inherited by pages in the flow.
     */
    @JvmName("puinxonbqfojtsuv")
    public suspend fun transitionRoutes(`value`: Output>) {
        this.transitionRoutes = value
    }

    @JvmName("jolhjvexarusnojl")
    public suspend fun transitionRoutes(vararg values: Output) {
        this.transitionRoutes = Output.all(values.asList())
    }

    /**
     * @param values A flow's transition routes serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition routes and can support use cases such as the user saying "help" or "can I talk to a human?", which can be handled in a common way regardless of the current page. Transition routes defined in the page have higher priority than those defined in the flow. TransitionRoutes are evalauted in the following order: * TransitionRoutes with intent specified. * TransitionRoutes with only condition specified. TransitionRoutes with intent specified are inherited by pages in the flow.
     */
    @JvmName("xmxtkjncjbjjitum")
    public suspend fun transitionRoutes(values: List>) {
        this.transitionRoutes = Output.all(values)
    }

    /**
     * @param value
     */
    @JvmName("eregrosjadyrfixh")
    public suspend fun agentId(`value`: String?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.agentId = mapped
    }

    /**
     * @param value The description of the flow. The maximum length is 500 characters. If exceeded, the request is rejected.
     */
    @JvmName("euluvsbtaemgxbnu")
    public suspend fun description(`value`: String?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.description = mapped
    }

    /**
     * @param value The human-readable name of the flow.
     */
    @JvmName("ffiyvxrfkotxoudf")
    public suspend fun displayName(`value`: String?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.displayName = mapped
    }

    /**
     * @param value A flow's event handlers serve two purposes: * They are responsible for handling events (e.g. no match, webhook errors) in the flow. * They are inherited by every page's event handlers, which can be used to handle common events regardless of the current page. Event handlers defined in the page have higher priority than those defined in the flow. Unlike transition_routes, these handlers are evaluated on a first-match basis. The first one that matches the event get executed, with the rest being ignored.
     */
    @JvmName("cxldagnrjvemtnsn")
    public suspend fun eventHandlers(`value`: List?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.eventHandlers = mapped
    }

    /**
     * @param argument A flow's event handlers serve two purposes: * They are responsible for handling events (e.g. no match, webhook errors) in the flow. * They are inherited by every page's event handlers, which can be used to handle common events regardless of the current page. Event handlers defined in the page have higher priority than those defined in the flow. Unlike transition_routes, these handlers are evaluated on a first-match basis. The first one that matches the event get executed, with the rest being ignored.
     */
    @JvmName("krvdlffkwvgdhrnj")
    public suspend fun eventHandlers(argument: List Unit>) {
        val toBeMapped = argument.toList().map {
            GoogleCloudDialogflowCxV3beta1EventHandlerArgsBuilder().applySuspend { it() }.build()
        }
        val mapped = of(toBeMapped)
        this.eventHandlers = mapped
    }

    /**
     * @param argument A flow's event handlers serve two purposes: * They are responsible for handling events (e.g. no match, webhook errors) in the flow. * They are inherited by every page's event handlers, which can be used to handle common events regardless of the current page. Event handlers defined in the page have higher priority than those defined in the flow. Unlike transition_routes, these handlers are evaluated on a first-match basis. The first one that matches the event get executed, with the rest being ignored.
     */
    @JvmName("gdmrvdlhboyjtaeg")
    public suspend fun eventHandlers(vararg argument: suspend GoogleCloudDialogflowCxV3beta1EventHandlerArgsBuilder.() -> Unit) {
        val toBeMapped = argument.toList().map {
            GoogleCloudDialogflowCxV3beta1EventHandlerArgsBuilder().applySuspend { it() }.build()
        }
        val mapped = of(toBeMapped)
        this.eventHandlers = mapped
    }

    /**
     * @param argument A flow's event handlers serve two purposes: * They are responsible for handling events (e.g. no match, webhook errors) in the flow. * They are inherited by every page's event handlers, which can be used to handle common events regardless of the current page. Event handlers defined in the page have higher priority than those defined in the flow. Unlike transition_routes, these handlers are evaluated on a first-match basis. The first one that matches the event get executed, with the rest being ignored.
     */
    @JvmName("xybvbkdnhgkeuptk")
    public suspend fun eventHandlers(argument: suspend GoogleCloudDialogflowCxV3beta1EventHandlerArgsBuilder.() -> Unit) {
        val toBeMapped = listOf(
            GoogleCloudDialogflowCxV3beta1EventHandlerArgsBuilder().applySuspend {
                argument()
            }.build(),
        )
        val mapped = of(toBeMapped)
        this.eventHandlers = mapped
    }

    /**
     * @param values A flow's event handlers serve two purposes: * They are responsible for handling events (e.g. no match, webhook errors) in the flow. * They are inherited by every page's event handlers, which can be used to handle common events regardless of the current page. Event handlers defined in the page have higher priority than those defined in the flow. Unlike transition_routes, these handlers are evaluated on a first-match basis. The first one that matches the event get executed, with the rest being ignored.
     */
    @JvmName("txdsmjykbyhwbxfo")
    public suspend fun eventHandlers(vararg values: GoogleCloudDialogflowCxV3beta1EventHandlerArgs) {
        val toBeMapped = values.toList()
        val mapped = toBeMapped.let({ args0 -> of(args0) })
        this.eventHandlers = mapped
    }

    /**
     * @param value The language of the following fields in `flow`: * `Flow.event_handlers.trigger_fulfillment.messages` * `Flow.event_handlers.trigger_fulfillment.conditional_cases` * `Flow.transition_routes.trigger_fulfillment.messages` * `Flow.transition_routes.trigger_fulfillment.conditional_cases` If not specified, the agent's default language is used. [Many languages](https://cloud.google.com/dialogflow/cx/docs/reference/language) are supported. Note: languages must be enabled in the agent before they can be used.
     */
    @JvmName("exponwmwwvfrhysr")
    public suspend fun languageCode(`value`: String?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.languageCode = mapped
    }

    /**
     * @param value
     */
    @JvmName("rctywwppmubgneuu")
    public suspend fun location(`value`: String?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.location = mapped
    }

    /**
     * @param value The unique identifier of the flow. Format: `projects//locations//agents//flows/`.
     */
    @JvmName("delsdcsyabnwmpwt")
    public suspend fun name(`value`: String?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.name = mapped
    }

    /**
     * @param value NLU related settings of the flow.
     */
    @JvmName("krdjcxlxrqtevbep")
    public suspend fun nluSettings(`value`: GoogleCloudDialogflowCxV3beta1NluSettingsArgs?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.nluSettings = mapped
    }

    /**
     * @param argument NLU related settings of the flow.
     */
    @JvmName("jbtdebvwsysjxapo")
    public suspend fun nluSettings(argument: suspend GoogleCloudDialogflowCxV3beta1NluSettingsArgsBuilder.() -> Unit) {
        val toBeMapped = GoogleCloudDialogflowCxV3beta1NluSettingsArgsBuilder().applySuspend {
            argument()
        }.build()
        val mapped = of(toBeMapped)
        this.nluSettings = mapped
    }

    /**
     * @param value
     */
    @JvmName("vnihtvchfulrdvce")
    public suspend fun project(`value`: String?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.project = mapped
    }

    /**
     * @param value A flow's transition route group serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition route groups. Transition route groups defined in the page have higher priority than those defined in the flow. Format:`projects//locations//agents//flows//transitionRouteGroups/`.
     */
    @JvmName("blahveouawarfdfx")
    public suspend fun transitionRouteGroups(`value`: List?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.transitionRouteGroups = mapped
    }

    /**
     * @param values A flow's transition route group serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition route groups. Transition route groups defined in the page have higher priority than those defined in the flow. Format:`projects//locations//agents//flows//transitionRouteGroups/`.
     */
    @JvmName("xotlbsriqgxnrosl")
    public suspend fun transitionRouteGroups(vararg values: String) {
        val toBeMapped = values.toList()
        val mapped = toBeMapped.let({ args0 -> of(args0) })
        this.transitionRouteGroups = mapped
    }

    /**
     * @param value A flow's transition routes serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition routes and can support use cases such as the user saying "help" or "can I talk to a human?", which can be handled in a common way regardless of the current page. Transition routes defined in the page have higher priority than those defined in the flow. TransitionRoutes are evalauted in the following order: * TransitionRoutes with intent specified. * TransitionRoutes with only condition specified. TransitionRoutes with intent specified are inherited by pages in the flow.
     */
    @JvmName("lcppaecadiqawfqq")
    public suspend fun transitionRoutes(`value`: List?) {
        val toBeMapped = value
        val mapped = toBeMapped?.let({ args0 -> of(args0) })
        this.transitionRoutes = mapped
    }

    /**
     * @param argument A flow's transition routes serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition routes and can support use cases such as the user saying "help" or "can I talk to a human?", which can be handled in a common way regardless of the current page. Transition routes defined in the page have higher priority than those defined in the flow. TransitionRoutes are evalauted in the following order: * TransitionRoutes with intent specified. * TransitionRoutes with only condition specified. TransitionRoutes with intent specified are inherited by pages in the flow.
     */
    @JvmName("xehsgcuexflnpsve")
    public suspend fun transitionRoutes(argument: List Unit>) {
        val toBeMapped = argument.toList().map {
            GoogleCloudDialogflowCxV3beta1TransitionRouteArgsBuilder().applySuspend { it() }.build()
        }
        val mapped = of(toBeMapped)
        this.transitionRoutes = mapped
    }

    /**
     * @param argument A flow's transition routes serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition routes and can support use cases such as the user saying "help" or "can I talk to a human?", which can be handled in a common way regardless of the current page. Transition routes defined in the page have higher priority than those defined in the flow. TransitionRoutes are evalauted in the following order: * TransitionRoutes with intent specified. * TransitionRoutes with only condition specified. TransitionRoutes with intent specified are inherited by pages in the flow.
     */
    @JvmName("tgumkocsutdxsvcr")
    public suspend fun transitionRoutes(vararg argument: suspend GoogleCloudDialogflowCxV3beta1TransitionRouteArgsBuilder.() -> Unit) {
        val toBeMapped = argument.toList().map {
            GoogleCloudDialogflowCxV3beta1TransitionRouteArgsBuilder().applySuspend { it() }.build()
        }
        val mapped = of(toBeMapped)
        this.transitionRoutes = mapped
    }

    /**
     * @param argument A flow's transition routes serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition routes and can support use cases such as the user saying "help" or "can I talk to a human?", which can be handled in a common way regardless of the current page. Transition routes defined in the page have higher priority than those defined in the flow. TransitionRoutes are evalauted in the following order: * TransitionRoutes with intent specified. * TransitionRoutes with only condition specified. TransitionRoutes with intent specified are inherited by pages in the flow.
     */
    @JvmName("rwpmatalkimfyodh")
    public suspend fun transitionRoutes(argument: suspend GoogleCloudDialogflowCxV3beta1TransitionRouteArgsBuilder.() -> Unit) {
        val toBeMapped = listOf(
            GoogleCloudDialogflowCxV3beta1TransitionRouteArgsBuilder().applySuspend
                { argument() }.build(),
        )
        val mapped = of(toBeMapped)
        this.transitionRoutes = mapped
    }

    /**
     * @param values A flow's transition routes serve two purposes: * They are responsible for matching the user's first utterances in the flow. * They are inherited by every page's transition routes and can support use cases such as the user saying "help" or "can I talk to a human?", which can be handled in a common way regardless of the current page. Transition routes defined in the page have higher priority than those defined in the flow. TransitionRoutes are evalauted in the following order: * TransitionRoutes with intent specified. * TransitionRoutes with only condition specified. TransitionRoutes with intent specified are inherited by pages in the flow.
     */
    @JvmName("vhrdavxqjlttfkke")
    public suspend fun transitionRoutes(vararg values: GoogleCloudDialogflowCxV3beta1TransitionRouteArgs) {
        val toBeMapped = values.toList()
        val mapped = toBeMapped.let({ args0 -> of(args0) })
        this.transitionRoutes = mapped
    }

    internal fun build(): FlowArgs = FlowArgs(
        agentId = agentId,
        description = description,
        displayName = displayName,
        eventHandlers = eventHandlers,
        languageCode = languageCode,
        location = location,
        name = name,
        nluSettings = nluSettings,
        project = project,
        transitionRouteGroups = transitionRouteGroups,
        transitionRoutes = transitionRoutes,
    )
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy