{
    "exportFormatVersion": 2,
    "exportTime": "2026-09-25 08:49:01",
    "containerVersion": {
        "path": "accounts/6365534927/containers/258048563/versions/0",
        "accountId": "6365534927",
        "containerId": "258048563",
        "containerVersionId": "0",
        "container": {
            "path": "accounts/6365534927/containers/258048563",
            "accountId": "6365534927",
            "containerId": "258048563",
            "name": "Contenedor Servidor",
            "publicId": "GTM-MBJFMCRF",
            "usageContext": [
                "SERVER"
            ],
            "fingerprint": "1785320800251",
            "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/6365534927/containers/258048563/workspaces?apiLink=container",
            "features": {
                "supportUserPermissions": true,
                "supportEnvironments": true,
                "supportWorkspaces": true,
                "supportGtagConfigs": false,
                "supportBuiltInVariables": true,
                "supportClients": true,
                "supportFolders": true,
                "supportTags": true,
                "supportTemplates": true,
                "supportTriggers": true,
                "supportVariables": true,
                "supportVersions": true,
                "supportZones": true,
                "supportTransformations": true
            },
            "tagIds": [
                "GTM-MBJFMCRF"
            ],
            "taggingServerUrls": [
                "https://jiknffqc.sav.stape.io"
            ]
        },
        "tag": [
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "tagId": "76",
                "name": "GA4",
                "type": "sgtmgaaw",
                "parameter": [
                    {
                        "type": "BOOLEAN",
                        "key": "redactVisitorIp",
                        "value": "false"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "epToIncludeDropdown",
                        "value": "all"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "upToIncludeDropdown",
                        "value": "all"
                    }
                ],
                "fingerprint": "1790253812262",
                "firingTriggerId": [
                    "75"
                ],
                "tagFiringOption": "ONCE_PER_EVENT",
                "monitoringMetadata": {
                    "type": "MAP"
                },
                "consentSettings": {
                    "consentStatus": "NOT_SET"
                }
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "tagId": "82",
                "name": "FB",
                "type": "cvt_5TP8W",
                "parameter": [
                    {
                        "type": "BOOLEAN",
                        "key": "autoMapCustomData",
                        "value": "true"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "adStorageConsent",
                        "value": "optional"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "autoMapServerEventData",
                        "value": "true"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "generateFbp",
                        "value": "true"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "autoMapUserData",
                        "value": "true"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "overrideCookieDomain",
                        "value": "false"
                    },
                    {
                        "type": "LIST",
                        "key": "userDataList",
                        "list": [
                            {
                                "type": "MAP",
                                "map": [
                                    {
                                        "type": "TEMPLATE",
                                        "key": "name",
                                        "value": "ct"
                                    },
                                    {
                                        "type": "TEMPLATE",
                                        "key": "value",
                                        "value": "{{User - City city_meta - X-GEO-City}}"
                                    }
                                ]
                            },
                            {
                                "type": "MAP",
                                "map": [
                                    {
                                        "type": "TEMPLATE",
                                        "key": "name",
                                        "value": "st"
                                    },
                                    {
                                        "type": "TEMPLATE",
                                        "key": "value",
                                        "value": "{{User - State x-geo-region}}"
                                    }
                                ]
                            },
                            {
                                "type": "MAP",
                                "map": [
                                    {
                                        "type": "TEMPLATE",
                                        "key": "name",
                                        "value": "zp"
                                    },
                                    {
                                        "type": "TEMPLATE",
                                        "key": "value",
                                        "value": "{{User - ZIP x-geo-postalcode}}"
                                    }
                                ]
                            },
                            {
                                "type": "MAP",
                                "map": [
                                    {
                                        "type": "TEMPLATE",
                                        "key": "name",
                                        "value": "country"
                                    },
                                    {
                                        "type": "TEMPLATE",
                                        "key": "value",
                                        "value": "{{User - Country x-geo-country}}"
                                    }
                                ]
                            },
                            {
                                "type": "MAP",
                                "map": [
                                    {
                                        "type": "TEMPLATE",
                                        "key": "name",
                                        "value": "external_id"
                                    },
                                    {
                                        "type": "TEMPLATE",
                                        "key": "value",
                                        "value": "{{User - ID x-stape-user-id}}"
                                    }
                                ]
                            },
                            {
                                "type": "MAP",
                                "map": [
                                    {
                                        "type": "TEMPLATE",
                                        "key": "name",
                                        "value": "client_ip_address"
                                    },
                                    {
                                        "type": "TEMPLATE",
                                        "key": "value",
                                        "value": "{{User - IP address x-real-ip}}"
                                    }
                                ]
                            },
                            {
                                "type": "MAP",
                                "map": [
                                    {
                                        "type": "TEMPLATE",
                                        "key": "name",
                                        "value": "client_user_agent"
                                    },
                                    {
                                        "type": "TEMPLATE",
                                        "key": "value",
                                        "value": "{{User - Agent user-agent}}"
                                    }
                                ]
                            }
                        ]
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "accessToken",
                        "value": "{{FB Access Token}}"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "useAppSecretProof",
                        "value": "false"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "inheritEventName",
                        "value": "inherit"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "actionSource",
                        "value": "website"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "pixelId",
                        "value": "{{ID Pixel FB}}"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "useHttpOnlyCookie",
                        "value": "false"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "itemIdKey"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "mapViewItemListToViewContent",
                        "value": "false"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "useOptimisticScenario",
                        "value": "false"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "mapItemDataTo",
                        "value": "contents"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "enableMultipixelSetup",
                        "value": "false"
                    },
                    {
                        "type": "BOOLEAN",
                        "key": "enableEventEnhancement",
                        "value": "true"
                    }
                ],
                "fingerprint": "1790254494014",
                "firingTriggerId": [
                    "80",
                    "81"
                ],
                "tagFiringOption": "ONCE_PER_EVENT",
                "monitoringMetadata": {
                    "type": "MAP"
                },
                "consentSettings": {
                    "consentStatus": "NOT_SET"
                }
            }
        ],
        "trigger": [
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "triggerId": "75",
                "name": "GA4 Todos",
                "type": "ALWAYS",
                "filter": [
                    {
                        "type": "EQUALS",
                        "parameter": [
                            {
                                "type": "TEMPLATE",
                                "key": "arg0",
                                "value": "{{Client Name}}"
                            },
                            {
                                "type": "TEMPLATE",
                                "key": "arg1",
                                "value": "GA4"
                            }
                        ]
                    }
                ],
                "fingerprint": "1790253794678"
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "triggerId": "80",
                "name": "page_view",
                "type": "CUSTOM_EVENT",
                "customEventFilter": [
                    {
                        "type": "EQUALS",
                        "parameter": [
                            {
                                "type": "TEMPLATE",
                                "key": "arg0",
                                "value": "{{_event}}"
                            },
                            {
                                "type": "TEMPLATE",
                                "key": "arg1",
                                "value": "page_view"
                            }
                        ]
                    }
                ],
                "fingerprint": "1790254110696"
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "triggerId": "81",
                "name": "generate_lead",
                "type": "CUSTOM_EVENT",
                "customEventFilter": [
                    {
                        "type": "EQUALS",
                        "parameter": [
                            {
                                "type": "TEMPLATE",
                                "key": "arg0",
                                "value": "{{_event}}"
                            },
                            {
                                "type": "TEMPLATE",
                                "key": "arg1",
                                "value": "generate_lead"
                            }
                        ]
                    }
                ],
                "fingerprint": "1790254142797"
            }
        ],
        "variable": [
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "78",
                "name": "ID Pixel FB",
                "type": "c",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "value",
                        "value": "866299123243508"
                    }
                ],
                "fingerprint": "1790253879530",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "79",
                "name": "FB Access Token",
                "type": "c",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "value",
                        "value": "EAAHll1LOkRMBSho1ZCRbygtdtuptBAtF4gKNeCDFa73w4b5yawgnZCPoxJ8XERnNCNDIkyMrREbGGBDSgFZAPYWrOdrk6i3crQ9Hn6uFBFnVNYJfZAr3hdHsyTW7cUGzISKoZCkdWcIhdv3sbbgXTWrcRDoqNrsXsSVQuvMDkTrcJxQeZCUk5ZBKdLeTlxEdAZDZD"
                    }
                ],
                "fingerprint": "1790253931487",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "83",
                "name": "User - City x-geo-city",
                "type": "rh",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "headerName",
                        "value": "x-geo-city"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {
                    "caseConversionType": "LOWERCASE"
                }
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "84",
                "name": "User - State x-geo-region",
                "type": "rh",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "headerName",
                        "value": "x-geo-region"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {
                    "caseConversionType": "LOWERCASE"
                }
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "85",
                "name": "User - Email",
                "type": "ed",
                "parameter": [
                    {
                        "type": "BOOLEAN",
                        "key": "setDefaultValue",
                        "value": "false"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "keyPath",
                        "value": "user_data.email"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "86",
                "name": "User - ID x-stape-user-id",
                "type": "rh",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "headerName",
                        "value": "x-stape-user-id"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "87",
                "name": "User - Last name",
                "type": "ed",
                "parameter": [
                    {
                        "type": "BOOLEAN",
                        "key": "setDefaultValue",
                        "value": "false"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "keyPath",
                        "value": "user_data.address.0.last_name"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "88",
                "name": "User - ZIP x-geo-postalcode",
                "type": "rh",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "headerName",
                        "value": "x-geo-postalcode"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "89",
                "name": "User - First name",
                "type": "ed",
                "parameter": [
                    {
                        "type": "BOOLEAN",
                        "key": "setDefaultValue",
                        "value": "false"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "keyPath",
                        "value": "user_data.address.0.first_name"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "90",
                "name": "User - Agent user-agent",
                "type": "rh",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "headerName",
                        "value": "user-agent"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "91",
                "name": "User - IP address x-real-ip",
                "type": "rh",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "headerName",
                        "value": "x-real-ip"
                    }
                ],
                "fingerprint": "1790254195488",
                "formatValue": {}
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "93",
                "name": "User - City city_meta - X-GEO-City",
                "type": "cvt_258048563_92",
                "fingerprint": "1790254195489",
                "formatValue": {
                    "caseConversionType": "LOWERCASE"
                }
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "94",
                "name": "User - Country x-geo-country",
                "type": "rh",
                "parameter": [
                    {
                        "type": "TEMPLATE",
                        "key": "headerName",
                        "value": "x-geo-country"
                    }
                ],
                "fingerprint": "1790254195489",
                "formatValue": {
                    "caseConversionType": "LOWERCASE"
                }
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "variableId": "95",
                "name": "User - Phone",
                "type": "ed",
                "parameter": [
                    {
                        "type": "BOOLEAN",
                        "key": "setDefaultValue",
                        "value": "false"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "keyPath",
                        "value": "user_data.address.0.phone"
                    }
                ],
                "fingerprint": "1790254195489",
                "formatValue": {}
            }
        ],
        "builtInVariable": [
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "type": "EVENT_NAME",
                "name": "Event Name"
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "type": "CLIENT_NAME",
                "name": "Client Name"
            }
        ],
        "fingerprint": "1790326141518",
        "tagManagerUrl": "https://tagmanager.google.com/#/versions/accounts/6365534927/containers/258048563/versions/0?apiLink=version",
        "customTemplate": [
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "templateId": "77",
                "name": "Facebook Conversion API",
                "fingerprint": "1790253839217",
                "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n  \"type\": \"TAG\",\n  \"id\": \"cvt_5TP8W\",\n  \"version\": 1,\n  \"displayName\": \"Facebook Conversion API\",\n  \"categories\": [\n    \"ADVERTISING\",\n    \"ANALYTICS\",\n    \"CONVERSIONS\",\n    \"MARKETING\",\n    \"REMARKETING\"\n  ],\n  \"brand\": {\n    \"id\": \"github.com_stape-io\",\n    \"displayName\": \"stape-io\",\n    \"thumbnail\": \"data:image/png;base64,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\\u003d\"\n  },\n  \"description\": \"Tag that send the event data from the GA4/Data clients to Facebook Conversion API.\",\n  \"containerContexts\": [\n    \"SERVER\"\n  ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"configGroup\",\n    \"subParams\": [\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"inheritEventName\",\n        \"displayName\": \"Event Name Setup Method\",\n        \"selectItems\": [\n          {\n            \"value\": \"inherit\",\n            \"displayValue\": \"Inherit from client\"\n          },\n          {\n            \"value\": \"override\",\n            \"displayValue\": \"Override\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"defaultValue\": \"inherit\",\n        \"subParams\": [\n          {\n            \"type\": \"RADIO\",\n            \"name\": \"eventName\",\n            \"radioItems\": [\n              {\n                \"value\": \"standard\",\n                \"displayValue\": \"Standard\",\n                \"subParams\": [\n                  {\n                    \"type\": \"SELECT\",\n                    \"name\": \"eventNameStandard\",\n                    \"macrosInSelect\": false,\n                    \"selectItems\": [\n                      {\n                        \"value\": \"PageView\",\n                        \"displayValue\": \"PageView\"\n                      },\n                      {\n                        \"value\": \"AddPaymentInfo\",\n                        \"displayValue\": \"AddPaymentInfo\"\n                      },\n                      {\n                        \"value\": \"AddToCart\",\n                        \"displayValue\": \"AddToCart\"\n                      },\n                      {\n                        \"value\": \"AddToWishlist\",\n                        \"displayValue\": \"AddToWishlist\"\n                      },\n                      {\n                        \"value\": \"AppendValue\",\n                        \"displayValue\": \"AppendValue\"\n                      },\n                      {\n                        \"value\": \"CompleteRegistration\",\n                        \"displayValue\": \"CompleteRegistration\"\n                      },\n                      {\n                        \"value\": \"Contact\",\n                        \"displayValue\": \"Contact\"\n                      },\n                      {\n                        \"value\": \"CustomizeProduct\",\n                        \"displayValue\": \"CustomizeProduct\"\n                      },\n                      {\n                        \"value\": \"Donate\",\n                        \"displayValue\": \"Donate\"\n                      },\n                      {\n                        \"value\": \"FindLocation\",\n                        \"displayValue\": \"FindLocation\"\n                      },\n                      {\n                        \"value\": \"InitiateCheckout\",\n                        \"displayValue\": \"InitiateCheckout\"\n                      },\n                      {\n                        \"value\": \"Lead\",\n                        \"displayValue\": \"Lead\"\n                      },\n                      {\n                        \"value\": \"Purchase\",\n                        \"displayValue\": \"Purchase\"\n                      },\n                      {\n                        \"value\": \"Schedule\",\n                        \"displayValue\": \"Schedule\"\n                      },\n                      {\n                        \"value\": \"Search\",\n                        \"displayValue\": \"Search\"\n                      },\n                      {\n                        \"value\": \"StartTrial\",\n                        \"displayValue\": \"StartTrial\"\n                      },\n                      {\n                        \"value\": \"SubmitApplication\",\n                        \"displayValue\": \"SubmitApplication\"\n                      },\n                      {\n                        \"value\": \"Subscribe\",\n                        \"displayValue\": \"Subscribe\"\n                      },\n                      {\n                        \"value\": \"ViewContent\",\n                        \"displayValue\": \"ViewContent\"\n                      }\n                    ],\n                    \"simpleValueType\": true,\n                    \"valueValidators\": [\n                      {\n                        \"type\": \"NON_EMPTY\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"value\": \"custom\",\n                \"displayValue\": \"Custom\",\n                \"subParams\": [\n                  {\n                    \"type\": \"TEXT\",\n                    \"name\": \"eventNameCustom\",\n                    \"simpleValueType\": true,\n                    \"valueValidators\": [\n                      {\n                        \"type\": \"NON_EMPTY\"\n                      }\n                    ]\n                  }\n                ]\n              }\n            ],\n            \"simpleValueType\": true,\n            \"defaultValue\": \"standard\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"inheritEventName\",\n                \"paramValue\": \"override\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"displayName\": \"Event Type\"\n          }\n        ],\n        \"help\": \"\\u003cb\\u003eInherit from client\\u003c/b\\u003e\\n\\u003cbr/\\u003e\\nIf the incoming request follows the \\u003cb\\u003eGoogle Analytics 4 (GA4)\\u003c/b\\u003e schema, the following mappings will be applied to convert GA4 \\u003ci\\u003eEvent Names\\u003c/i\\u003e into the Conversion API \\u003ci\\u003eEvent Name\\u003c/i\\u003e equivalent:\\n\\u003cbr/\\u003e\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003epage_view\\u003c/i\\u003e → \\u003ci\\u003ePageView\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003egtm.dom\\u003c/i\\u003e → \\u003ci\\u003ePageView\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eadd_payment_info\\u003c/i\\u003e → \\u003ci\\u003eAddPaymentInfo\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eadd_to_cart\\u003c/i\\u003e → \\u003ci\\u003eAddToCart\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eadd_to_wishlist\\u003c/i\\u003e → \\u003ci\\u003eAddToWishlist\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003esign_up\\u003c/i\\u003e → \\u003ci\\u003eCompleteRegistration\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003ebegin_checkout\\u003c/i\\u003e → \\u003ci\\u003eInitiateCheckout\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003egenerate_lead\\u003c/i\\u003e → \\u003ci\\u003eLead\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003epurchase\\u003c/i\\u003e → \\u003ci\\u003ePurchase\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003esearch\\u003c/i\\u003e → \\u003ci\\u003eSearch\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eview_item\\u003c/i\\u003e → \\u003ci\\u003eViewContent\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eview_item_list\\u003c/i\\u003e → \\u003ci\\u003eViewContent\\u003c/i\\u003e (conditional)\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003econtact\\u003c/i\\u003e → \\u003ci\\u003eContact\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003ecustomize_product\\u003c/i\\u003e → \\u003ci\\u003eCustomizeProduct\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003edonate\\u003c/i\\u003e → \\u003ci\\u003eDonate\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003efind_location\\u003c/i\\u003e → \\u003ci\\u003eFindLocation\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eschedule\\u003c/i\\u003e → \\u003ci\\u003eSchedule\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003estart_trial\\u003c/i\\u003e → \\u003ci\\u003eStartTrial\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003esubmit_application\\u003c/i\\u003e → \\u003ci\\u003eSubmitApplication\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003esubscribe\\u003c/i\\u003e → \\u003ci\\u003eSubscribe\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003egtm4wp.addProductToCartEEC\\u003c/i\\u003e → \\u003ci\\u003eAddToCart\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003egtm4wp.productClickEEC\\u003c/i\\u003e → \\u003ci\\u003eViewContent\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003egtm4wp.checkoutOptionEEC\\u003c/i\\u003e → \\u003ci\\u003eInitiateCheckout\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003egtm4wp.checkoutStepEEC\\u003c/i\\u003e → \\u003ci\\u003eAddPaymentInfo\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003egtm4wp.orderCompletedEEC\\u003c/i\\u003e → \\u003ci\\u003ePurchase\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003cbr/\\u003e\\nPlease note that it provides partial event mapping. Not all GA4 events can be mapped to Conversion API Event Name.\"\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"actionSource\",\n        \"displayName\": \"Action Source\",\n        \"selectItems\": [\n          {\n            \"value\": \"website\",\n            \"displayValue\": \"Website\"\n          },\n          {\n            \"value\": \"email\",\n            \"displayValue\": \"Email\"\n          },\n          {\n            \"value\": \"app\",\n            \"displayValue\": \"App\"\n          },\n          {\n            \"value\": \"phone_call\",\n            \"displayValue\": \"Phone Call\"\n          },\n          {\n            \"value\": \"chat\",\n            \"displayValue\": \"Chat\"\n          },\n          {\n            \"value\": \"physical_store\",\n            \"displayValue\": \"Physical Store\"\n          },\n          {\n            \"value\": \"system_generated\",\n            \"displayValue\": \"System Generated\"\n          },\n          {\n            \"value\": \"business_messaging\",\n            \"displayValue\": \"Business Messaging\"\n          },\n          {\n            \"value\": \"other\",\n            \"displayValue\": \"Other\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"valueValidators\": [\n          {\n            \"type\": \"NON_EMPTY\"\n          }\n        ],\n        \"defaultValue\": \"website\",\n        \"help\": \"\\u003cb\\u003eEmail\\u003c/b\\u003e — Conversion happened over email.\\n\\u003cbr/\\u003e\\n\\u003cb\\u003eWebsite\\u003c/b\\u003e — Conversion was made on your website.\\n\\u003cbr/\\u003e\\n\\u003cb\\u003eApp\\u003c/b\\u003e — Conversion was made on your mobile app.\\n\\u003cbr/\\u003e\\n\\u003cb\\u003ePhone Call\\u003c/b\\u003e — Conversion was made over the phone.\\n\\u003cbr/\\u003e\\n\\u003cb\\u003eChat\\u003c/b\\u003e — Conversion was made via a messaging app, SMS, or online messaging feature.\\n\\u003cbr/\\u003e\\n\\u003cb\\u003ePhysical Store\\u003c/b\\u003e — Conversion was made in person at your physical store, helping to optimize your omni-channel marketing strategy.\\n\\u003cbr/\\u003e\\n\\u003cb\\u003eSystem Generated\\u003c/b\\u003e — Conversion happened automatically, such as a subscription renewal set to auto-pay, often linked with CRM CAPI for Meta Lead Ads.\\n\\u003cbr/\\u003e\\n\\u003cb\\u003eBusiness Messaging\\u003c/b\\u003e — Conversion was made from ads that click to Messenger, Instagram or WhatsApp.\\n\\u003cbr/\\u003e \\n\\u003cb\\u003eOther\\u003c/b\\u003e — Conversion happened in a way that is not listed.\",\n        \"alwaysInSummary\": true\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"messaging_channel\",\n        \"displayName\": \"Messaging Channel\",\n        \"macrosInSelect\": false,\n        \"selectItems\": [\n          {\n            \"value\": \"messenger\",\n            \"displayValue\": \"Messenger\"\n          },\n          {\n            \"value\": \"whatsapp\",\n            \"displayValue\": \"WhatsApp\"\n          },\n          {\n            \"value\": \"instagram\",\n            \"displayValue\": \"Instagram\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"defaultValue\": \"messenger\",\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"actionSource\",\n            \"paramValue\": \"business_messaging\",\n            \"type\": \"EQUALS\"\n          }\n        ],\n        \"valueValidators\": [\n          {\n            \"type\": \"NON_EMPTY\"\n          }\n        ],\n        \"alwaysInSummary\": true\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"pixelId\",\n        \"displayName\": \"Facebook Pixel ID\",\n        \"simpleValueType\": true,\n        \"valueValidators\": [\n          {\n            \"type\": \"NON_EMPTY\"\n          }\n        ],\n        \"help\": \"Set to a valid Facebook Pixel ID.\"\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"accessToken\",\n        \"displayName\": \"API Access Token\",\n        \"simpleValueType\": true,\n        \"help\": \"Set to your Facebook API Access Token. See \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/server-side-api/get-started#access-token\\\" target\\u003d\\\"_blank\\\"\\u003ehere\\u003c/a\\u003e for more information.\",\n        \"valueValidators\": [\n          {\n            \"type\": \"NON_EMPTY\"\n          }\n        ]\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"enableMultipixelSetup\",\n        \"checkboxText\": \"Add Multiple Facebook Pixel IDs\",\n        \"simpleValueType\": true,\n        \"help\": \"Add one \\u003ci\\u003eFacebook Pixel ID\\u003c/i\\u003e and one \\u003ci\\u003eAccess Token\\u003c/i\\u003e per line.\",\n        \"subParams\": [\n          {\n            \"type\": \"SIMPLE_TABLE\",\n            \"name\": \"pixelIdAndAccessTokenTable\",\n            \"simpleTableColumns\": [\n              {\n                \"defaultValue\": \"\",\n                \"displayName\": \"Facebook Pixel ID\",\n                \"name\": \"pixelId\",\n                \"type\": \"TEXT\",\n                \"valueValidators\": [\n                  {\n                    \"type\": \"NON_EMPTY\"\n                  }\n                ]\n              },\n              {\n                \"defaultValue\": \"\",\n                \"displayName\": \"API Access Token\",\n                \"name\": \"accessToken\",\n                \"type\": \"TEXT\",\n                \"valueValidators\": [\n                  {\n                    \"type\": \"NON_EMPTY\"\n                  }\n                ]\n              }\n            ],\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enableMultipixelSetup\",\n                \"paramValue\": true,\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"newRowButtonText\": \"Add Pixel ID\"\n          }\n        ],\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"useAppSecretProof\",\n            \"paramValue\": true,\n            \"type\": \"NOT_EQUALS\"\n          }\n        ]\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"testId\",\n        \"displayName\": \"Test ID\",\n        \"simpleValueType\": true,\n        \"help\": \"Provide a Test ID if you want to test server-side events in the Test Events feature of Events Manager.\\n\\u003cbr/\\u003e\\nIt automatically uses the value in \\u003ci\\u003eeventData.test_event_code\\u003c/i\\u003e, if present.\",\n        \"valueHint\": \"TEST123\"\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"overrideCookieDomain\",\n        \"displayName\": \"Override the cookie domain\",\n        \"macrosInSelect\": true,\n        \"selectItems\": [\n          {\n            \"value\": false,\n            \"displayValue\": \"False\"\n          },\n          {\n            \"value\": true,\n            \"displayValue\": \"True\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"subParams\": [\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"overridenCookieDomain\",\n            \"displayName\": \"Cookie Domain\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"overrideCookieDomain\",\n                \"paramValue\": false,\n                \"type\": \"NOT_EQUALS\"\n              }\n            ],\n            \"help\": \"Enable this option to override the cookie domain.\\u003cbr\\u003eEnter your website\\u0027s top-level domain as a fixed value (e.g., example.com). \\u003cbr\\u003e If left as \\\"auto\\\", the top-level domain will be automatically determined using the following priority: \\u003cul\\u003e \\u003cli\\u003eTop-level domain of the \\u003ci\\u003eForwarded\\u003c/i\\u003e header (if present).\\u003c/li\\u003e \\u003cli\\u003eTop-level domain of the \\u003ci\\u003eX-Forwarded-Host\\u003c/i\\u003e header (if present).\\u003c/li\\u003e \\u003cli\\u003eTop-level domain of the \\u003ci\\u003eHost\\u003c/i\\u003e header.\\u003c/li\\u003e \\u003c/ul\\u003e\",\n            \"defaultValue\": \"auto\",\n            \"valueHint\": \"example.com\",\n            \"alwaysInSummary\": true\n          }\n        ],\n        \"defaultValue\": false\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"generateFbp\",\n        \"checkboxText\": \"Generate _fbp cookie if it does not exist\",\n        \"simpleValueType\": true,\n        \"defaultValue\": true,\n        \"alwaysInSummary\": true\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"useHttpOnlyCookie\",\n        \"checkboxText\": \"Use HttpOnly cookies for _fbc and _fbp\",\n        \"simpleValueType\": true,\n        \"help\": \"If enabled, Forbids JavaScript from accessing the \\u003ci\\u003e_fbc\\u003c/i\\u003e and \\u003ci\\u003e_fbp\\u003c/i\\u003e cookies.\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"enableEventEnhancement\",\n        \"checkboxText\": \"Enable Event Enhancement\",\n        \"simpleValueType\": true,\n        \"help\": \"Enable Use of HTTP Only Secure Cookie (gtmeec) to Enhance Event Data.\",\n        \"defaultValue\": true,\n        \"alwaysInSummary\": true\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"useOptimisticScenario\",\n        \"checkboxText\": \"Use Optimistic Scenario\",\n        \"simpleValueType\": true,\n        \"help\": \"The tag will call gtmOnSuccess() without waiting for a response from the API. This will speed up sGTM response time however your tag will always return the status fired successfully even in case it is not.\"\n      }\n    ]\n  },\n  {\n    \"displayName\": \"Server Event Data Override\",\n    \"name\": \"serverEventDataListGroup\",\n    \"groupStyle\": \"ZIPPY_OPEN_ON_PARAM\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"serverEventDataLabel\",\n        \"displayName\": \"Check \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/server-event\\\"\\u003ethis documentation\\u003c/a\\u003e for more details on which parameters you can override.\\u003cbr/\\u003e\\u003cbr/\\u003e\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"autoMapServerEventData\",\n        \"checkboxText\": \"Automap Server Event Data\",\n        \"simpleValueType\": true,\n        \"help\": \"If enabled, the tag will attempt to automatically map parameters from your event data.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nAny value you manually enter in a field below will always override the auto-mapped value.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nDefault mappings:\\n\\u003cul\\u003e\\n\\u003cli\\u003eSource URL:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.page_location\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003cli\\u003eReferrer URL:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.page_referrer\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003cli\\u003eEvent ID:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.event_id\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.transaction_id\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003c/ul\\u003e\",\n        \"defaultValue\": true\n      },\n      {\n        \"name\": \"serverEventDataList\",\n        \"simpleTableColumns\": [\n          {\n            \"valueValidators\": [\n              {\n                \"type\": \"NON_EMPTY\"\n              }\n            ],\n            \"defaultValue\": \"event_id\",\n            \"displayName\": \"Property Name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"SELECT\",\n            \"selectItems\": [\n              {\n                \"value\": \"event_time\",\n                \"displayValue\": \"Event Time\"\n              },\n              {\n                \"value\": \"event_source_url\",\n                \"displayValue\": \"Source URL\"\n              },\n              {\n                \"value\": \"opt_out\",\n                \"displayValue\": \"Opt Out\"\n              },\n              {\n                \"value\": \"event_id\",\n                \"displayValue\": \"Event ID\"\n              },\n              {\n                \"value\": \"data_processing_options\",\n                \"displayValue\": \"Data Processing Options\"\n              },\n              {\n                \"value\": \"data_processing_options_country\",\n                \"displayValue\": \"Data Processing Options Country\"\n              },\n              {\n                \"value\": \"data_processing_options_state\",\n                \"displayValue\": \"Data Processing Options State\"\n              },\n              {\n                \"value\": \"referrer_url\",\n                \"displayValue\": \"Referrer URL\"\n              }\n            ]\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\",\n        \"newRowButtonText\": \"Add property\"\n      }\n    ]\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"originalEventDataListGroup\",\n    \"displayName\": \"Original Event Data\",\n    \"groupStyle\": \"ZIPPY_OPEN_ON_PARAM\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"originalEventDataLabel\",\n        \"displayName\": \"Check \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/original-event\\\"\\u003ethis documentation\\u003c/a\\u003e for more details on which parameters you can override.\\n\\u003cbr/\\u003e\\nUse these parameters to identify the Original Event that happened at an earlier time. Then, use the \\u003ci\\u003eAppendValue\\u003c/i\\u003e event and the other sections to supplement information the Original Event. This is useful for Value Optimization for Profit (using the \\u003ci\\u003enet_revenue\\u003c/i\\u003e parameter), allowing you to report the final profit margin after the initial sale has occurred.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\"\n      },\n      {\n        \"type\": \"SIMPLE_TABLE\",\n        \"name\": \"originalEventDataList\",\n        \"displayName\": \"\",\n        \"simpleTableColumns\": [\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Name\",\n            \"name\": \"name\",\n            \"type\": \"SELECT\",\n            \"isUnique\": true,\n            \"valueValidators\": [\n              {\n                \"type\": \"NON_EMPTY\"\n              }\n            ],\n            \"selectItems\": [\n              {\n                \"value\": \"event_name\",\n                \"displayValue\": \"Original Event Name\"\n              },\n              {\n                \"value\": \"event_time\",\n                \"displayValue\": \"Original Event Time\"\n              },\n              {\n                \"value\": \"order_id\",\n                \"displayValue\": \"Original Order ID\"\n              },\n              {\n                \"value\": \"event_id\",\n                \"displayValue\": \"Original Event ID\"\n              }\n            ]\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\",\n            \"valueValidators\": [\n              {\n                \"type\": \"NON_EMPTY\"\n              }\n            ]\n          }\n        ],\n        \"valueValidators\": [\n          {\n            \"type\": \"NON_EMPTY\"\n          }\n        ],\n        \"newRowButtonText\": \"Add property\"\n      }\n    ],\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"eventNameStandard\",\n        \"paramValue\": \"AppendValue\",\n        \"type\": \"EQUALS\"\n      },\n      {\n        \"paramName\": \"eventNameCustom\",\n        \"paramValue\": \"AppendValue\",\n        \"type\": \"EQUALS\"\n      }\n    ]\n  },\n  {\n    \"displayName\": \"User Data\",\n    \"name\": \"userDataListGroup\",\n    \"groupStyle\": \"ZIPPY_OPEN_ON_PARAM\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"userDataLabel\",\n        \"displayName\": \"User Data is your main \\u003ca href\\u003d\\\"https://www.facebook.com/business/help/765081237991954?id\\u003d818859032317965\\\"\\u003eEvent Match Quality (EMQ) contributor\\u003c/a\\u003e. Matched events improve ad targeting by connecting actions to Meta accounts. Events with better match quality can lead to lower costs per action.\\n\\u003cbr/\\u003e\\nCheck \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/server-side-api/parameters/user-data\\\"\\u003ethis documentation\\u003c/a\\u003e for more details on accepted User Data parameters.\\n\\u003cbr/\\u003e\\nThe tag will automatically hash parameters that need it, pre-hashed data is also accepted.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"autoMapUserData\",\n        \"checkboxText\": \"Automap User Data\",\n        \"simpleValueType\": true,\n        \"help\": \"If enabled, the tag will attempt to automatically map parameters from your event data.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nAny value you manually enter in a field below will always override the auto-mapped value.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nDefault mappings:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eClick ID:\\u003c/b\\u003e \\u003ci\\u003efbclid URL parameter\\u003c/i\\u003e, \\u003ci\\u003e_fbc cookie\\u003c/i\\u003e, \\u003ci\\u003eeventData.common_cookie._fbc\\u003c/i\\u003e, \\u003ci\\u003eeventData._fbc\\u003c/i\\u003e, \\u003ci\\u003eeventData.fbc\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eBrowser ID:\\u003c/b\\u003e \\u003ci\\u003e_fbp cookie\\u003c/i\\u003e, \\u003ci\\u003eeventData.common_cookie._fbp\\u003c/i\\u003e, \\u003ci\\u003eeventData._fbp\\u003c/i\\u003e, \\u003ci\\u003eeventData.fbp\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eEmail:\\u003c/b\\u003e \\u003ci\\u003eeventData.email\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.email_address\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.email\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.sha256_email_address\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003ePhone:\\u003c/b\\u003e \\u003ci\\u003eeventData.phone\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.phone_number\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.phone\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eFirst Name:\\u003c/b\\u003e \\u003ci\\u003eeventData.firstName\\u003c/i\\u003e, \\u003ci\\u003eeventData.FirstName\\u003c/i\\u003e, \\u003ci\\u003eeventData.nameFirst\\u003c/i\\u003e, \\u003ci\\u003eeventData.first_name\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.first_name\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.address[].first_name\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.address[].sha256_first_name\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eLast Name:\\u003c/b\\u003e \\u003ci\\u003eeventData.lastName\\u003c/i\\u003e, \\u003ci\\u003eeventData.LastName\\u003c/i\\u003e, \\u003ci\\u003eeventData.nameLast\\u003c/i\\u003e, \\u003ci\\u003eeventData.last_name\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.last_name\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.address[].last_name\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.address[].sha256_last_name\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eCity:\\u003c/b\\u003e \\u003ci\\u003eeventData.city\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.address[].city\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eState:\\u003c/b\\u003e \\u003ci\\u003eeventData.state\\u003c/i\\u003e, \\u003ci\\u003eeventData.region\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.region\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.address[].region\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eZip:\\u003c/b\\u003e \\u003ci\\u003eeventData.zip\\u003c/i\\u003e, \\u003ci\\u003eeventData.postal_code\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.postal_code\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.address[].postal_code\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eCountry:\\u003c/b\\u003e \\u003ci\\u003eeventData.countryCode\\u003c/i\\u003e, \\u003ci\\u003eeventData.country\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.country\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_data.address[].country\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eGender:\\u003c/b\\u003e \\u003ci\\u003eeventData.gender\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eDate of Birth:\\u003c/b\\u003e \\u003ci\\u003eeventData.db\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eExternal ID:\\u003c/b\\u003e \\u003ci\\u003eeventData.external_id\\u003c/i\\u003e, \\u003ci\\u003eeventData.user_id\\u003c/i\\u003e, \\u003ci\\u003eeventData.userId\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eFB Login ID:\\u003c/b\\u003e \\u003ci\\u003eeventData.fb_login_id\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eInstall ID:\\u003c/b\\u003e \\u003ci\\u003eeventData.anon_id\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eMobile Advertising ID:\\u003c/b\\u003e \\u003ci\\u003eeventData.madid\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eLead ID:\\u003c/b\\u003e \\u003ci\\u003eeventData.lead_id\\u003c/i\\u003e, \\u003ci\\u003eeventData.leadId\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eSubscription ID:\\u003c/b\\u003e \\u003ci\\u003eeventData.subscription_id\\u003c/i\\u003e, \\u003ci\\u003eeventData.subscriptionId\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003ePlaintext IP Address:\\u003c/b\\u003e \\u003ci\\u003eeventData.ip_override\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003cb\\u003eClient User Agent:\\u003c/b\\u003e \\u003ci\\u003eeventData.user_agent\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\",\n        \"defaultValue\": true\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"userDataObject\",\n        \"displayName\": \"User Data Properties Object\",\n        \"macrosInSelect\": true,\n        \"selectItems\": [],\n        \"simpleValueType\": true,\n        \"help\": \"Provide an object with User Data Properties to merge with the fields below. Any conflicting properties will be overwritten.\",\n        \"notSetText\": \"(not set)\"\n      },\n      {\n        \"name\": \"userDataList\",\n        \"simpleTableColumns\": [\n          {\n            \"valueValidators\": [\n              {\n                \"type\": \"NON_EMPTY\"\n              }\n            ],\n            \"defaultValue\": \"em\",\n            \"displayName\": \"Property Name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"SELECT\",\n            \"selectItems\": [\n              {\n                \"value\": \"em\",\n                \"displayValue\": \"Email\"\n              },\n              {\n                \"value\": \"ph\",\n                \"displayValue\": \"Phone\"\n              },\n              {\n                \"value\": \"ge\",\n                \"displayValue\": \"Gender\"\n              },\n              {\n                \"value\": \"db\",\n                \"displayValue\": \"Date of Birth\"\n              },\n              {\n                \"value\": \"ln\",\n                \"displayValue\": \"Last Name\"\n              },\n              {\n                \"value\": \"fn\",\n                \"displayValue\": \"First Name\"\n              },\n              {\n                \"value\": \"ct\",\n                \"displayValue\": \"City\"\n              },\n              {\n                \"value\": \"st\",\n                \"displayValue\": \"State\"\n              },\n              {\n                \"value\": \"zp\",\n                \"displayValue\": \"Zip\"\n              },\n              {\n                \"value\": \"country\",\n                \"displayValue\": \"Country\"\n              },\n              {\n                \"value\": \"external_id\",\n                \"displayValue\": \"External ID\"\n              },\n              {\n                \"value\": \"client_ip_address\",\n                \"displayValue\": \"Client IP Address\"\n              },\n              {\n                \"value\": \"client_user_agent\",\n                \"displayValue\": \"Client User Agent\"\n              },\n              {\n                \"value\": \"fbc\",\n                \"displayValue\": \"Click ID\"\n              },\n              {\n                \"value\": \"fbp\",\n                \"displayValue\": \"Browser ID\"\n              },\n              {\n                \"value\": \"subscription_id\",\n                \"displayValue\": \"Subscription ID\"\n              },\n              {\n                \"value\": \"lead_id\",\n                \"displayValue\": \"Lead ID\"\n              },\n              {\n                \"value\": \"fb_login_id\",\n                \"displayValue\": \"FB Login ID\"\n              },\n              {\n                \"value\": \"anon_id\",\n                \"displayValue\": \"Install ID\"\n              },\n              {\n                \"value\": \"madid\",\n                \"displayValue\": \"Mobile Advertiser ID\"\n              },\n              {\n                \"value\": \"page_id\",\n                \"displayValue\": \"Page ID\"\n              },\n              {\n                \"value\": \"page_scoped_user_id\",\n                \"displayValue\": \"Page Scoped User ID\"\n              },\n              {\n                \"value\": \"ctwa_clid\",\n                \"displayValue\": \"Click to WhatsApp ID\"\n              },\n              {\n                \"value\": \"ig_account_id\",\n                \"displayValue\": \"IG Account ID\"\n              },\n              {\n                \"value\": \"ig_sid\",\n                \"displayValue\": \"Click to Instagram ID\"\n              }\n            ]\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\",\n        \"newRowButtonText\": \"Add property\"\n      }\n    ]\n  },\n  {\n    \"displayName\": \"App Data\",\n    \"name\": \"appDataListGroup\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"appDataLabel\",\n        \"displayName\": \"Check \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/app-data\\\"\\u003ethis documentation\\u003c/a\\u003e for more details on which parameters you can override.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"autoMapAppData\",\n        \"checkboxText\": \"Automap App Data\",\n        \"simpleValueType\": true,\n        \"help\": \"If enabled, the tag will attempt to automatically map parameters from your event data.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nAny value you manually enter in a field below will always override the auto-mapped value.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nDefault mappings:\\n\\u003cul\\u003e\\n\\u003cli\\u003eIf \\u003ci\\u003eeventData.app_data\\u003c/i\\u003e is an object, it is used directly.\\u003c/li\\u003e\\n\\u003cli\\u003eOtherwise:\\n\\u003cul\\u003e\\n\\u003cli\\u003eAdvertiser Tracking Enabled: \\u003ci\\u003eeventData.advertiser_tracking_enabled\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eApplication Tracking Enabled: \\u003ci\\u003eeventData.application_tracking_enabled\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eExt Info: \\u003ci\\u003eeventData.extinfo\\u003c/i\\u003e, or built from \\u003ci\\u003eeventData[x-ga-platform]\\u003c/i\\u003e, \\u003ci\\u003eeventData.app_id\\u003c/i\\u003e, \\u003ci\\u003eeventData.app_version\\u003c/i\\u003e, \\u003ci\\u003eeventData[x-ga-os_version]\\u003c/i\\u003e, \\u003ci\\u003eeventData[x-ga-device_model]\\u003c/i\\u003e, \\u003ci\\u003eeventData.language\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eCampaign IDs: \\u003ci\\u003eeventData.campaign_ids\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eInstall Referrer: \\u003ci\\u003eeventData.install_referrer\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eInstaller Package: \\u003ci\\u003eeventData.installer_package\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eURL Schemes: \\u003ci\\u003eeventData.url_schemes\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eVendor ID: \\u003ci\\u003eeventData.vendor_id\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eWindows Attribution ID: \\u003ci\\u003eeventData.windows_attribution_id\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003c/ul\\u003e\",\n        \"defaultValue\": true\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"appDataObject\",\n        \"displayName\": \"App Data Properties Object\",\n        \"macrosInSelect\": true,\n        \"selectItems\": [],\n        \"simpleValueType\": true,\n        \"help\": \"Provide an object with App Data Properties to merge with the fields below. Any conflicting properties will be overwritten.\",\n        \"notSetText\": \"(not set)\"\n      },\n      {\n        \"name\": \"appDataList\",\n        \"simpleTableColumns\": [\n          {\n            \"valueValidators\": [\n              {\n                \"type\": \"NON_EMPTY\"\n              }\n            ],\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"SELECT\",\n            \"selectItems\": [\n              {\n                \"value\": \"advertiser_tracking_enabled\",\n                \"displayValue\": \"Advertiser Tracking Enabled\"\n              },\n              {\n                \"value\": \"application_tracking_enabled\",\n                \"displayValue\": \"Application Tracking Enabled\"\n              },\n              {\n                \"value\": \"extinfo\",\n                \"displayValue\": \"Ext Info\"\n              },\n              {\n                \"value\": \"campaign_ids\",\n                \"displayValue\": \"Campaign IDs\"\n              },\n              {\n                \"value\": \"install_referrer\",\n                \"displayValue\": \"Install Referrer\"\n              },\n              {\n                \"value\": \"installer_package\",\n                \"displayValue\": \"Installer Package\"\n              },\n              {\n                \"value\": \"url_schemes\",\n                \"displayValue\": \"URL Schemes\"\n              },\n              {\n                \"value\": \"vendor_id\",\n                \"displayValue\": \"Vendor ID\"\n              },\n              {\n                \"value\": \"windows_attribution_id\",\n                \"displayValue\": \"Windows Attribution ID\"\n              }\n            ]\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\",\n        \"newRowButtonText\": \"Add property\"\n      }\n    ],\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"actionSource\",\n        \"paramValue\": \"app\",\n        \"type\": \"EQUALS\"\n      }\n    ],\n    \"groupStyle\": \"ZIPPY_OPEN_ON_PARAM\"\n  },\n  {\n    \"displayName\": \"Custom Data\",\n    \"name\": \"customDataListGroup\",\n    \"groupStyle\": \"ZIPPY_OPEN_ON_PARAM\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"customDataLabel\",\n        \"displayName\": \"Check \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/custom-data\\\"\\u003ethis documentation\\u003c/a\\u003e for more details on which parameters you can override.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"autoMapCustomData\",\n        \"checkboxText\": \"Automap Custom Data\",\n        \"simpleValueType\": true,\n        \"help\": \"If enabled, the tag will attempt to automatically map parameters from your event data.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nAny value you manually enter in a field below will always override the auto-mapped value.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nDefault mappings:\\n\\u003cul\\u003e\\n\\u003cli\\u003eValue:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData[\\u0027x-ga-mp1-ev\\u0027]\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData[\\u0027x-ga-mp1-tr\\u0027]\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.value\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eSum of Price * Quantity from eventData.items[] or eventData.ecommerce.items[]\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003e0\\u003c/i\\u003e, if event is \\\"Purchase\\\" and no value is defined\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003cli\\u003eCurrency:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.currency\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eCurrency from eventData.items[] or eventData.ecommerce.items[]\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eUSD\\u003c/i\\u003e, if event is \\\"Purchase\\\" and no currency is defined\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003cli\\u003eContents:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.items[]\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.ecommerce.items[]\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003cli\\u003eContent Type:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData[x-fb-cd-content_type]\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.content_type\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003cli\\u003eDefault: \\u003ci\\u003eproduct\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003cli\\u003eOrder ID:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.transaction_id\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003cli\\u003eSearch String:\\n\\u003cul\\u003e\\n\\u003cli\\u003e\\u003ci\\u003eeventData.search_term\\u003c/i\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\u003c/ul\\u003e\",\n        \"defaultValue\": true,\n        \"subParams\": [\n          {\n            \"type\": \"GROUP\",\n            \"name\": \"autoMapCustomDataSettingsGroup\",\n            \"subParams\": [\n              {\n                \"type\": \"TEXT\",\n                \"name\": \"itemIdKey\",\n                \"displayName\": \"Custom Item ID Key\",\n                \"simpleValueType\": true,\n                \"help\": \"Optional.\\n\\u003cbr/\\u003e\\u003cbr/\\u003e\\nYou can specify a custom key, which will be used to set the content Item ID, by default \\u003ci\\u003eitem_id\\u003c/i\\u003e will be used. This may be useful if you are using WooCommerce extensions.\",\n                \"canBeEmptyString\": true\n              },\n              {\n                \"type\": \"SELECT\",\n                \"name\": \"mapItemDataTo\",\n                \"displayName\": \"Map item data to\",\n                \"selectItems\": [\n                  {\n                    \"value\": \"contents\",\n                    \"displayValue\": \"Contents\"\n                  },\n                  {\n                    \"value\": \"content_ids\",\n                    \"displayValue\": \"Content IDs\"\n                  },\n                  {\n                    \"value\": \"both\",\n                    \"displayValue\": \"Both Contents and Content IDs\"\n                  }\n                ],\n                \"simpleValueType\": true,\n                \"defaultValue\": \"contents\",\n                \"help\": \"Choose which parameter(s) to use when mapping item data: Contents, Content IDs or both.\"\n              }\n            ],\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"autoMapCustomData\",\n                \"paramValue\": false,\n                \"type\": \"NOT_EQUALS\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"customDataObject\",\n        \"displayName\": \"Custom Data Properties Object\",\n        \"macrosInSelect\": true,\n        \"selectItems\": [],\n        \"simpleValueType\": true,\n        \"help\": \"Provide an object with Custom Data Properties to merge with the fields below. Any conflicting properties will be overwritten.\",\n        \"notSetText\": \"(not set)\"\n      },\n      {\n        \"name\": \"customDataList\",\n        \"simpleTableColumns\": [\n          {\n            \"valueValidators\": [\n              {\n                \"type\": \"NON_EMPTY\"\n              }\n            ],\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"TEXT\"\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\",\n        \"newRowButtonText\": \"Add property\"\n      }\n    ]\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"tagExecutionConsentSettingsGroup\",\n    \"displayName\": \"Tag Execution Consent Settings\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"subParams\": [\n      {\n        \"type\": \"RADIO\",\n        \"name\": \"adStorageConsent\",\n        \"radioItems\": [\n          {\n            \"value\": \"optional\",\n            \"displayValue\": \"Send data always\"\n          },\n          {\n            \"value\": \"required\",\n            \"displayValue\": \"Send data in case marketing consent given\",\n            \"help\": \"Aborts the tag execution if marketing consent (\\u003ci\\u003ead_storage\\u003c/i\\u003e Google Consent Mode or Stape\\u0027s Data Tag parameter) is not given.\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"defaultValue\": \"optional\"\n      }\n    ]\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"moreSettingsGroup\",\n    \"displayName\": \"More Settings\",\n    \"groupStyle\": \"ZIPPY_OPEN_ON_PARAM\",\n    \"subParams\": [\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"useAppSecretProof\",\n        \"checkboxText\": \"Use App Secret Proof\",\n        \"simpleValueType\": true,\n        \"help\": \"Optional. \\u003cbr/\\u003e\\u003cbr/\\u003e Use this field only if your Business Manager’s Conversions API Application requires API calls to include the \\u003ci\\u003eapp secret proof\\u003c/i\\u003e.   \\u003cbr/\\u003e\\u003cbr/\\u003e You’ll encounter this requirement if event requests fail with the error:  \\u003ci\\u003e\\\"API calls from the server require an appsecret_proof argument\\\"\\u003c/i\\u003e. \\u003cbr/\\u003e\\u003cbr/\\u003e \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/graph-api/guides/secure-requests#appsecret_proof\\\"\\u003eLearn more\\u003c/a\\u003e about how to generate this value.\",\n        \"subParams\": [\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"appSecretProof\",\n            \"displayName\": \"App Secret Proof\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"useAppSecretProof\",\n                \"paramValue\": true,\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"valueValidators\": [\n              {\n                \"type\": \"NON_EMPTY\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"mapViewItemListToViewContent\",\n        \"checkboxText\": \"Automap GA4 \\\"view_item_list\\\" event to \\\"ViewContent\\\"\",\n        \"simpleValueType\": true,\n        \"defaultValue\": false,\n        \"help\": \"When enabled with \\\"Inherit from client\\\" \\u003ci\\u003eEvent Name Setup Method\\u003c/i\\u003e:\\n\\u003cul\\u003e\\n\\u003cli\\u003eMaps the GA4 \\\"view_item_list\\\" event to \\\"ViewContent\\\".\\u003c/li\\u003e\\n\\u003cli\\u003eSets \\\"content_type\\\" to \\\"product_group\\\" if an items array is present.\\u003c/li\\u003e\\n\\u003c/ul\\u003e\",\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"inheritEventName\",\n            \"paramValue\": \"inherit\",\n            \"type\": \"EQUALS\"\n          }\n        ]\n      }\n    ]\n  }\n]\n\n\n___SANDBOXED_JS_FOR_SERVER___\n\nconst computeEffectiveTldPlusOne = require('computeEffectiveTldPlusOne');\nconst createRegex = require('createRegex');\nconst decodeUriComponent = require('decodeUriComponent');\nconst encodeUriComponent = require('encodeUriComponent');\nconst fromBase64 = require('fromBase64');\nconst generateRandom = require('generateRandom');\nconst getAllEventData = require('getAllEventData');\nconst getCookieValues = require('getCookieValues');\nconst getRequestHeader = require('getRequestHeader');\nconst getTimestampMillis = require('getTimestampMillis');\nconst getType = require('getType');\nconst JSON = require('JSON');\nconst makeNumber = require('makeNumber');\nconst makeString = require('makeString');\nconst Math = require('Math');\nconst parseUrl = require('parseUrl');\nconst Promise = require('Promise');\nconst sendHttpRequest = require('sendHttpRequest');\nconst setCookie = require('setCookie');\nconst sha256Sync = require('sha256Sync');\nconst testRegex = require('testRegex');\nconst toBase64 = require('toBase64');\n\n/*==============================================================================\n==============================================================================*/\n\nconst eventData = getAllEventData();\nconst API_VERSION = '26.0';\nconst PARTNER_AGENT_STRING = 'stape-gtmss-2.1.7' + (data.enableEventEnhancement ? '-ee' : '');\n\nif (shouldExitEarly(data, eventData)) {\n  return data.gtmOnSuccess();\n}\n\nconst ids = getClickAndBrowserId(data, eventData);\nconst fbc = ids.fbc;\nconst fbp = ids.fbp;\nsetIDsCookies(data, fbc, fbp);\n\nconst mappedPostBody = mapEvent(data, eventData, fbc, fbp);\nsendRequests(data, mappedPostBody);\n\nif (data.useOptimisticScenario) {\n  return data.gtmOnSuccess();\n}\n\n/*==============================================================================\n  Vendor related functions\n==============================================================================*/\n\nfunction setIDsCookies(data, fbc, fbp) {\n  const cookieOptions = {\n    domain: isUIFieldTrue(data.overrideCookieDomain)\n      ? data.overridenCookieDomain || 'auto'\n      : 'auto',\n    path: '/',\n    samesite: 'Lax',\n    secure: true,\n    'max-age': 7776000, // 90 days\n    HttpOnly: !!data.useHttpOnlyCookie\n  };\n\n  if (fbc) {\n    setCookie('_fbc', fbc, cookieOptions);\n  }\n\n  if (fbp) {\n    setCookie('_fbp', fbp, cookieOptions);\n  }\n}\n\nfunction getClickAndBrowserId(data, eventData) {\n  const ids = {\n    fbc:\n      getCookieValues('_fbc')[0] ||\n      (eventData.common_cookie || {})._fbc ||\n      eventData._fbc ||\n      eventData.fbc,\n    fbp:\n      getCookieValues('_fbp')[0] ||\n      (eventData.common_cookie || {})._fbp ||\n      eventData._fbp ||\n      eventData.fbp\n  };\n\n  const url = getUrl(eventData);\n  const subDomainIndex = url ? computeEffectiveTldPlusOne(url).split('.').length - 1 : 1;\n\n  if (url) {\n    const urlParsed = parseUrl(url);\n    if (urlParsed && urlParsed.searchParams.fbclid) {\n      const fbclid = decodeUriComponent(urlParsed.searchParams.fbclid);\n      const fbcParts = ids.fbc ? ids.fbc.split('.') : [];\n\n      if (isValidValue(fbclid) && (!ids.fbc || fbcParts[fbcParts.length - 1] !== fbclid)) {\n        ids.fbc = 'fb.' + subDomainIndex + '.' + getTimestampMillis() + '.' + fbclid;\n      }\n    }\n  }\n\n  if (!ids.fbp && data.generateFbp) {\n    ids.fbp =\n      'fb.' +\n      subDomainIndex +\n      '.' +\n      getTimestampMillis() +\n      '.' +\n      generateRandom(1000000000, 2147483647);\n  }\n\n  return ids;\n}\n\nfunction getEventName(data) {\n  const gaToFacebookEventName = {\n    page_view: 'PageView',\n    'gtm.dom': 'PageView',\n    add_payment_info: 'AddPaymentInfo',\n    add_to_cart: 'AddToCart',\n    add_to_wishlist: 'AddToWishlist',\n    sign_up: 'CompleteRegistration',\n    begin_checkout: 'InitiateCheckout',\n    generate_lead: 'Lead',\n    purchase: 'Purchase',\n    search: 'Search',\n    view_item: 'ViewContent',\n\n    contact: 'Contact',\n    customize_product: 'CustomizeProduct',\n    donate: 'Donate',\n    find_location: 'FindLocation',\n    schedule: 'Schedule',\n    start_trial: 'StartTrial',\n    submit_application: 'SubmitApplication',\n    subscribe: 'Subscribe',\n\n    'gtm4wp.addProductToCartEEC': 'AddToCart',\n    'gtm4wp.productClickEEC': 'ViewContent',\n    'gtm4wp.checkoutOptionEEC': 'InitiateCheckout',\n    'gtm4wp.checkoutStepEEC': 'AddPaymentInfo',\n    'gtm4wp.orderCompletedEEC': 'Purchase'\n  };\n\n  if (data.inheritEventName !== 'override') {\n    if (data.mapViewItemListToViewContent) {\n      gaToFacebookEventName.view_item_list = 'ViewContent';\n    }\n    const eventName = eventData.event_name;\n    return gaToFacebookEventName[eventName] || eventName;\n  }\n\n  let selectedEventName;\n  if (data.eventName === 'standard') {\n    selectedEventName = data.eventNameStandard;\n  } else if (data.eventName === 'custom') {\n    selectedEventName = data.eventNameCustom;\n  }\n\n  if (isValidValue(selectedEventName)) return selectedEventName;\n\n  // An incomplete override falls back to the incoming name, as the inherit branch does.\n  return gaToFacebookEventName[eventData.event_name] || eventData.event_name;\n}\n\nfunction mapEvent(data, eventData, fbc, fbp) {\n  let mappedData = {\n    event_name: getEventName(data),\n    action_source: data.actionSource || 'website',\n    event_time: Math.round(getTimestampMillis() / 1000),\n    custom_data: {},\n    user_data: {}\n  };\n  const mappedPostBody = {\n    data: [mappedData],\n    partner_agent: PARTNER_AGENT_STRING\n  };\n\n  if (eventData.test_event_code || data.testId) {\n    mappedPostBody.test_event_code = eventData.test_event_code\n      ? eventData.test_event_code\n      : data.testId;\n  }\n\n  if (mappedData.action_source === 'app') {\n    mappedData.app_data = {};\n  }\n\n  if (mappedData.action_source === 'business_messaging') {\n    mappedData.messaging_channel = data.messaging_channel;\n  }\n\n  mappedData = addServerEventData(data, eventData, mappedData);\n  mappedData = addUserData(data, eventData, mappedData, fbc, fbp);\n  mappedData = addAppData(data, eventData, mappedData);\n  mappedData = addEcommerceData(data, eventData, mappedData);\n  mappedData = addOriginalEventData(mappedData);\n\n  if (data.enableEventEnhancement) {\n    mappedData.user_data = enhanceEventData(eventData, mappedData.user_data);\n  }\n\n  mappedData = overrideDataIfNeeded(mappedData);\n  mappedData = cleanupData(mappedData);\n  mappedData = hashDataIfNeeded(mappedData);\n\n  if (data.enableEventEnhancement) {\n    setGtmEecCookie(mappedData.user_data);\n  }\n\n  return mappedPostBody;\n}\n\nfunction hashData(key, value) {\n  if (!value) {\n    return value;\n  }\n\n  const type = getType(value);\n\n  if (type === 'undefined' || value === 'undefined') {\n    return undefined;\n  }\n\n  if (type === 'array') {\n    return value.map((val) => {\n      return hashData(key, val);\n    });\n  }\n\n  if (isHashed(value)) {\n    return value;\n  }\n\n  value = makeString(value).trim().toLowerCase();\n\n  if (key === 'ph') {\n    value = normalizePhoneNumber(value);\n  } else if (key === 'ct') {\n    value = value.split(' ').join('');\n  }\n\n  return sha256Sync(value, { outputEncoding: 'hex' });\n}\n\nfunction hashDataIfNeeded(mappedData) {\n  if (mappedData.user_data) {\n    const keysToHash = [\n      'em',\n      'ph',\n      'ge',\n      'db',\n      'ln',\n      'fn',\n      'ct',\n      'st',\n      'zp',\n      'country',\n      'external_id'\n    ];\n    for (let key in mappedData.user_data) {\n      if (keysToHash.indexOf(key) !== -1) {\n        mappedData.user_data[key] = hashData(key, mappedData.user_data[key]);\n      }\n    }\n  }\n\n  return mappedData;\n}\n\nfunction overrideDataIfNeeded(mappedData) {\n  if (getType(data.userDataObject) === 'object') {\n    mergeObj(mappedData.user_data, data.userDataObject);\n  }\n  if (data.userDataList) {\n    data.userDataList.forEach((d) => {\n      mappedData.user_data[d.name] = d.value;\n    });\n  }\n\n  if (getType(data.customDataObject) === 'object') {\n    mergeObj(mappedData.custom_data, data.customDataObject);\n  }\n  if (data.customDataList) {\n    data.customDataList.forEach((d) => {\n      mappedData.custom_data[d.name] = d.value;\n    });\n  }\n\n  if (mappedData.action_source === 'app') {\n    if (getType(data.appDataObject) === 'object') {\n      mergeObj(mappedData.app_data, data.appDataObject);\n    }\n    if (data.appDataList) {\n      data.appDataList.forEach((d) => {\n        mappedData.app_data[d.name] = d.value;\n      });\n    }\n  }\n\n  return mappedData;\n}\n\nfunction cleanupData(mappedData) {\n  if (mappedData.action_source === 'business_messaging') {\n    mappedData.event_source_url = undefined;\n    ['client_ip_address', 'client_user_agent', 'fbc', 'fbp'].forEach(\n      (key) => (mappedData.user_data[key] = undefined)\n    );\n  }\n\n  if (mappedData.user_data) {\n    const userData = {};\n\n    for (let userDataKey in mappedData.user_data) {\n      if (isValidValue(mappedData.user_data[userDataKey])) {\n        userData[userDataKey] = mappedData.user_data[userDataKey];\n      }\n    }\n\n    mappedData.user_data = userData;\n  }\n\n  if (mappedData.custom_data) {\n    const customData = {};\n\n    for (let customDataKey in mappedData.custom_data) {\n      if (isValidValue(mappedData.custom_data[customDataKey])) {\n        customData[customDataKey] = mappedData.custom_data[customDataKey];\n      }\n    }\n\n    if (customData.value === 0 || customData.value === '0') customData.value = '0.00';\n\n    mappedData.custom_data = customData;\n  }\n\n  if (mappedData.app_data) {\n    const appData = {};\n\n    for (let appDataKey in mappedData.app_data) {\n      if (isValidValue(mappedData.app_data[appDataKey])) {\n        appData[appDataKey] = mappedData.app_data[appDataKey];\n      }\n    }\n\n    mappedData.app_data = appData;\n  }\n\n  if (mappedData.original_event_data) {\n    const originalEventData = {};\n\n    for (let originalEventDataKey in mappedData.original_event_data) {\n      if (isValidValue(mappedData.original_event_data[originalEventDataKey])) {\n        originalEventData[originalEventDataKey] =\n          mappedData.original_event_data[originalEventDataKey];\n      }\n    }\n\n    mappedData.original_event_data = originalEventData;\n  }\n\n  for (let key in mappedData) { // Assigned, not rebuilt: the post body holds this reference.\n    if (!isValidValue(mappedData[key])) mappedData[key] = undefined;\n  }\n\n  return mappedData;\n}\n\nfunction addEcommerceData(data, eventData, mappedData) {\n  const autoMapEnabled = data.hasOwnProperty('autoMapCustomData') ? data.autoMapCustomData : true; // To avoid a breaking change.\n  if (autoMapEnabled) {\n    let currencyFromItems = '';\n    let valueFromItems = 0;\n\n    let items;\n    if (getType(eventData.items) === 'array' && eventData.items.length) items = eventData.items;\n    else if (\n      getType(eventData.ecommerce) === 'object' &&\n      getType(eventData.ecommerce.items) === 'array' &&\n      eventData.ecommerce.items.length\n    ) {\n      items = eventData.ecommerce.items;\n    }\n\n    if (items) {\n      mappedData.custom_data.content_type =\n        eventData['x-fb-cd-content_type'] || eventData.content_type || 'product';\n\n      if (\n        data.mapViewItemListToViewContent &&\n        data.inheritEventName !== 'override' &&\n        eventData.event_name === 'view_item_list'\n      ) {\n        mappedData.custom_data.content_type = 'product_group';\n      }\n\n      if (!items[1]) {\n        if (items[0].item_name) mappedData.custom_data.content_name = items[0].item_name;\n        if (items[0].item_category)\n          mappedData.custom_data.content_category = items[0].item_category;\n\n        const singleItemPrice = toFiniteNumber(items[0].price);\n        const singleItemQuantity = toFiniteNumber(items[0].quantity);\n        if (isValidValue(singleItemPrice)) {\n          mappedData.custom_data.value = isValidValue(singleItemQuantity)\n            ? singleItemQuantity * singleItemPrice\n            : singleItemPrice;\n        }\n      }\n\n      const itemIdKey = data.itemIdKey ? data.itemIdKey : 'item_id';\n      const mapItemDataTo = data.mapItemDataTo || 'contents';\n      items.forEach((d) => {\n        if (!currencyFromItems && d.currency) currencyFromItems = d.currency;\n\n        const content = {};\n        let hasContent = false;\n\n        if (isValidValue(d[itemIdKey])) {\n          content.id = makeString(d[itemIdKey]);\n          hasContent = true;\n        }\n        if (d.item_name) {\n          content.title = d.item_name;\n          hasContent = true;\n        }\n        if (d.item_brand) {\n          content.brand = d.item_brand;\n          hasContent = true;\n        }\n        if (d.item_category) {\n          content.category = d.item_category;\n          hasContent = true;\n        }\n\n        const quantity = toFiniteNumber(d.quantity);\n        if (isValidValue(quantity)) {\n          content.quantity = quantity;\n          hasContent = true;\n        }\n\n        const itemPrice = toFiniteNumber(d.price);\n        if (isValidValue(itemPrice)) {\n          content.item_price = itemPrice;\n          hasContent = true;\n          valueFromItems += isValidValue(quantity) ? quantity * itemPrice : itemPrice;\n        }\n\n        if (!hasContent) return;\n\n        if (mapItemDataTo === 'contents' || mapItemDataTo === 'both') {\n          mappedData.custom_data.contents = mappedData.custom_data.contents || [];\n          mappedData.custom_data.contents.push(content);\n        }\n        if (content.id && (mapItemDataTo === 'content_ids' || mapItemDataTo === 'both')) {\n          mappedData.custom_data.content_ids = mappedData.custom_data.content_ids || [];\n          mappedData.custom_data.content_ids.push(content.id);\n        }\n      });\n\n      if (!mappedData.custom_data.contents && !mappedData.custom_data.content_ids) {\n        mappedData.custom_data.content_type = undefined;\n      }\n    }\n\n    const value = toFiniteNumber(\n      eventData['x-ga-mp1-ev'] || eventData['x-ga-mp1-tr'] || eventData.value\n    );\n    if (isValidValue(value)) mappedData.custom_data.value = value;\n\n    const currency = eventData.currency || currencyFromItems;\n    if (currency) mappedData.custom_data.currency = currency;\n\n    if (eventData.search_term) mappedData.custom_data.search_string = eventData.search_term;\n\n    if (eventData.transaction_id) mappedData.custom_data.order_id = eventData.transaction_id;\n\n    if (mappedData.event_name === 'Purchase') {\n      // Facebook rejects a Purchase event with no value at all, so this always assigns one.\n      if (!isValidValue(mappedData.custom_data.value))\n        mappedData.custom_data.value = valueFromItems;\n    }\n\n    if (\n      !mappedData.custom_data.currency &&\n      (isValidValue(mappedData.custom_data.value) || valueFromItems)\n    ) {\n      mappedData.custom_data.currency = 'USD';\n    }\n  }\n\n  return mappedData;\n}\n\nfunction addUserData(data, eventData, mappedData, fbc, fbp) {\n  const autoMapEnabled = data.hasOwnProperty('autoMapUserData') ? data.autoMapUserData : true; // To avoid a breaking change.\n  if (autoMapEnabled) {\n    let address = {};\n    let user_data = {};\n    if (getType(eventData.user_data) === 'object') {\n      user_data = eventData.user_data;\n      const addressType = getType(user_data.address);\n      if (addressType === 'object' || addressType === 'array') {\n        address = user_data.address[0] || user_data.address;\n      }\n    }\n\n    if (fbc) mappedData.user_data.fbc = fbc;\n    if (fbp) mappedData.user_data.fbp = fbp;\n\n    if (eventData.user_agent) mappedData.user_data.client_user_agent = eventData.user_agent;\n\n    if (eventData.ip_override) {\n      mappedData.user_data.client_ip_address = eventData.ip_override\n        .split(' ')\n        .join('')\n        .split(',')[0];\n    }\n\n    if (eventData.fb_login_id) mappedData.user_data.fb_login_id = eventData.fb_login_id;\n\n    if (eventData.anon_id) mappedData.user_data.anon_id = eventData.anon_id;\n\n    if (eventData.madid) mappedData.user_data.madid = eventData.madid;\n\n    const externalId = eventData.external_id || eventData.user_id || eventData.userId;\n    if (externalId) mappedData.user_data.external_id = externalId;\n\n    const subscriptionId = eventData.subscription_id || eventData.subscriptionId;\n    if (subscriptionId) mappedData.user_data.subscription_id = subscriptionId;\n\n    const leadId = eventData.lead_id || eventData.leadId;\n    if (leadId) mappedData.user_data.lead_id = leadId;\n\n    const ln =\n      eventData.lastName ||\n      eventData.LastName ||\n      eventData.nameLast ||\n      eventData.last_name ||\n      user_data.last_name ||\n      address.last_name ||\n      address.sha256_last_name;\n    if (ln) mappedData.user_data.ln = ln;\n\n    const fn =\n      eventData.firstName ||\n      eventData.FirstName ||\n      eventData.nameFirst ||\n      eventData.first_name ||\n      user_data.first_name ||\n      address.first_name ||\n      address.sha256_first_name;\n    if (fn) mappedData.user_data.fn = fn;\n\n    const em =\n      eventData.email ||\n      user_data.email_address ||\n      user_data.email ||\n      user_data.sha256_email_address;\n    if (em) mappedData.user_data.em = em;\n\n    const ph = eventData.phone || user_data.phone_number || user_data.phone;\n    if (ph) mappedData.user_data.ph = ph;\n\n    const ct = eventData.city || address.city;\n    if (ct) mappedData.user_data.ct = ct;\n\n    const st = eventData.state || eventData.region || user_data.region || address.region;\n    if (st) mappedData.user_data.st = st;\n\n    const zp =\n      eventData.zip || eventData.postal_code || user_data.postal_code || address.postal_code;\n    if (zp) mappedData.user_data.zp = zp;\n\n    const country =\n      eventData.countryCode || eventData.country || user_data.country || address.country;\n    if (country) mappedData.user_data.country = country;\n\n    if (eventData.gender) mappedData.user_data.ge = eventData.gender;\n    if (eventData.db) mappedData.user_data.db = eventData.db;\n  }\n  return mappedData;\n}\n\nfunction addServerEventData(data, eventData, mappedData) {\n  const autoMapEnabled = data.hasOwnProperty('autoMapServerEventData')\n    ? data.autoMapServerEventData\n    : true; // To avoid a breaking change.\n  if (autoMapEnabled) {\n    if (eventData.page_location) mappedData.event_source_url = eventData.page_location;\n    if (eventData.page_referrer) mappedData.referrer_url = eventData.page_referrer;\n\n    const eventId = eventData.event_id || eventData.transaction_id;\n    if (eventId) mappedData.event_id = eventId;\n  }\n\n  if (data.serverEventDataList) {\n    const required = ['event_time'];\n\n    data.serverEventDataList.forEach((d) => {\n      // A required field can be replaced but not cleared, so an empty one is ignored.\n      if (required.indexOf(d.name) !== -1 && !isValidValue(d.value)) return;\n      mappedData[d.name] = d.value;\n    });\n\n    if (\n      !mappedData.data_processing_options &&\n      (mappedData.data_processing_options_country || mappedData.data_processing_options_state)\n    ) {\n      mappedData.data_processing_options_country = undefined;\n      mappedData.data_processing_options_state = undefined;\n    }\n  }\n\n  return mappedData;\n}\n\nfunction addAppData(data, eventData, mappedData) {\n  if (mappedData.action_source !== 'app') {\n    return mappedData;\n  }\n\n  const autoMapEnabled = data.hasOwnProperty('autoMapAppData') ? data.autoMapAppData : true; // To avoid a breaking change.\n  if (autoMapEnabled) {\n    if (getType(eventData.app_data) === 'object') {\n      mappedData.app_data = eventData.app_data;\n      return mappedData;\n    }\n\n    mappedData.app_data.advertiser_tracking_enabled = eventData.advertiser_tracking_enabled ? 1 : 0; // Required\n    mappedData.app_data.application_tracking_enabled = eventData.application_tracking_enabled\n      ? 1\n      : 0; // Required\n    if (eventData.extinfo) {\n      mappedData.app_data.extinfo = eventData.extinfo;\n    } else {\n      const platform = makeString(eventData['x-ga-platform'] || '').toLowerCase();\n      const extinfoArray = [\n        platform === 'android' ? 'a2' : platform === 'ios' ? 'i2' : '', // Required\n        eventData.app_id || '',\n        eventData.app_version || '',\n        eventData.app_version ? 'Version ' + eventData.app_version : '',\n        makeString(eventData['x-ga-os_version'] || ''), // Required\n        eventData['x-ga-device_model'] || '',\n        eventData.language || '',\n        '',\n        '',\n        '',\n        '',\n        '',\n        '',\n        '',\n        '',\n        ''\n      ];\n      mappedData.app_data.extinfo = extinfoArray;\n    }\n    if (eventData.campaign_ids) mappedData.app_data.campaign_ids = eventData.campaign_ids;\n    if (eventData.install_referrer)\n      mappedData.app_data.install_referrer = eventData.install_referrer;\n    if (eventData.installer_package)\n      mappedData.app_data.installer_package = eventData.installer_package;\n    if (eventData.url_schemes) mappedData.app_data.url_schemes = eventData.url_schemes;\n    if (eventData.vendor_id) mappedData.app_data.vendor_id = eventData.vendor_id;\n    if (eventData.windows_attribution_id)\n      mappedData.app_data.windows_attribution_id = eventData.windows_attribution_id;\n  }\n\n  return mappedData;\n}\n\nfunction addOriginalEventData(mappedData) {\n  if (mappedData.event_name !== 'AppendValue') {\n    return mappedData;\n  }\n\n  if (data.originalEventDataList) {\n    mappedData.action_source = undefined;\n\n    mappedData.original_event_data = {};\n    data.originalEventDataList.forEach((d) => {\n      mappedData.original_event_data[d.name] = d.value;\n    });\n  }\n\n  return mappedData;\n}\n\nfunction setGtmEecCookie(userData) {\n  const gtmeecCookie = {};\n\n  if (userData.em) gtmeecCookie.em = userData.em;\n  if (userData.ph) gtmeecCookie.ph = userData.ph;\n  if (userData.ln) gtmeecCookie.ln = userData.ln;\n  if (userData.fn) gtmeecCookie.fn = userData.fn;\n  if (userData.ct) gtmeecCookie.ct = userData.ct;\n  if (userData.st) gtmeecCookie.st = userData.st;\n  if (userData.zp) gtmeecCookie.zp = userData.zp;\n  if (userData.ge) gtmeecCookie.ge = userData.ge;\n  if (userData.db) gtmeecCookie.db = userData.db;\n  if (userData.country) gtmeecCookie.country = userData.country;\n  if (userData.external_id) gtmeecCookie.external_id = userData.external_id;\n  if (userData.fb_login_id) gtmeecCookie.fb_login_id = userData.fb_login_id;\n\n  setCookie('_gtmeec', toBase64(JSON.stringify(gtmeecCookie)), {\n    domain: isUIFieldTrue(data.overrideCookieDomain)\n      ? data.overridenCookieDomain || 'auto'\n      : 'auto',\n    path: '/',\n    samesite: 'strict',\n    secure: true,\n    'max-age': 7776000, // 90 days\n    HttpOnly: true\n  });\n}\n\nfunction enhanceEventData(eventData, userData) {\n  const commonCookie = eventData.common_cookie || {};\n\n  const cookieValues = getCookieValues('_gtmeec');\n  if ((!cookieValues || cookieValues.length === 0) && !commonCookie._gtmeec) {\n    return userData;\n  }\n\n  const encodedValue = cookieValues[0] || commonCookie._gtmeec;\n  if (!encodedValue) {\n    return userData;\n  }\n\n  const jsonStr = fromBase64(encodedValue);\n  if (!jsonStr) {\n    return userData;\n  }\n\n  const gtmeecData = JSON.parse(jsonStr);\n\n  if (getType(gtmeecData) !== 'object') {\n    return userData;\n  }\n\n  const keys = 'em,ph,ln,fn,ct,st,zp,ge,db,country,external_id,fb_login_id'.split(',');\n  keys.forEach((key) => {\n    const value = gtmeecData[key];\n    const valueType = getType(value);\n    if (userData[key] || (valueType !== 'string' && valueType !== 'number')) return;\n    if (isValidValue(value)) userData[key] = value;\n  });\n\n  return userData;\n}\n\nfunction sendRequests(data, mappedPostBody) {\n  let pixelsConfig = [\n    {\n      pixelId: data.pixelId,\n      accessToken: data.accessToken,\n      appSecretProof: data.useAppSecretProof ? data.appSecretProof : undefined\n    }\n  ];\n  if (data.enableMultipixelSetup) {\n    pixelsConfig = pixelsConfig.concat(data.pixelIdAndAccessTokenTable);\n  }\n\n  const requests = pixelsConfig.map((pixelConfig) => {\n    const pixelId = pixelConfig.pixelId;\n    const accessToken = pixelConfig.accessToken;\n    const appSecretProof = pixelConfig.appSecretProof;\n    const postUrl =\n      'https://graph.facebook.com/v' +\n      API_VERSION +\n      '/' +\n      enc(pixelId) +\n      '/events?access_token=' +\n      enc(accessToken) +\n      (appSecretProof ? '&appsecret_proof=' + enc(appSecretProof) : '');\n\n    return sendHttpRequest(\n      postUrl,\n      { headers: { 'content-type': 'application/json' }, method: 'POST' },\n      JSON.stringify(mappedPostBody)\n    )\n      .then((result) => {\n        if (result.statusCode < 200 || result.statusCode >= 300) return false;\n        return true;\n      })\n      .catch((result) => {\n        return false;\n      });\n  });\n\n  Promise.all(requests)\n    .then((results) => {\n      if (!data.useOptimisticScenario) {\n        const someRequestFailed = results.some((success) => !success);\n        if (someRequestFailed) return data.gtmOnFailure();\n        return data.gtmOnSuccess();\n      }\n    })\n    .catch((result) => {\n      if (!data.useOptimisticScenario) return data.gtmOnFailure();\n    });\n}\n\n/*==============================================================================\n  Helpers\n==============================================================================*/\n\nfunction getUrl(eventData) {\n  return eventData.page_location || getRequestHeader('referer') || eventData.page_referrer;\n}\n\nfunction shouldExitEarly(data, eventData) {\n  if (!isConsentGivenOrNotRequired(data, eventData)) return true;\n\n  const url = getUrl(eventData);\n  if (url && url.lastIndexOf('https://gtm-msr.appspot.com/', 0) === 0) return true;\n\n  return false;\n}\n\nfunction enc(data) {\n  if (['null', 'undefined'].indexOf(getType(data)) !== -1) data = '';\n  return encodeUriComponent(makeString(data));\n}\n\nfunction isHashed(value) {\n  if (!value) return false;\n  return makeString(value).match('^[A-Fa-f0-9]{64}$') !== null;\n}\n\nfunction isValidValue(value) {\n  const valueType = getType(value);\n  if (valueType === 'null' || valueType === 'undefined' || value !== value) return false;\n  return value !== '' && value !== 'undefined' && value !== 'null';\n}\n\nfunction toFiniteNumber(value) {\n  if (!isValidValue(value)) return undefined;\n\n  const valueType = getType(value);\n  if (valueType !== 'number' && valueType !== 'string') return undefined;\n  if (valueType === 'string' && value.trim() === '') return undefined; // Whitespace coerces to 0.\n\n  const parsed = makeNumber(value);\n  if (parsed * 0 !== 0) return undefined; // Rejects NaN and +/-Infinity.\n\n  return parsed;\n}\n\nfunction normalizePhoneNumber(phoneNumber) {\n  if (!phoneNumber) return phoneNumber;\n  const itemRegex = createRegex('^[0-9]$');\n  return phoneNumber\n    .split('')\n    .filter((item) => testRegex(itemRegex, item))\n    .join('');\n}\n\nfunction isUIFieldTrue(field) {\n  return [true, 'true'].indexOf(field) !== -1;\n}\n\nfunction mergeObj(target, source) {\n  for (const key in source) {\n    if (source.hasOwnProperty(key)) target[key] = source[key];\n  }\n  return target;\n}\n\nfunction isConsentGivenOrNotRequired(data, eventData) {\n  if (data.adStorageConsent !== 'required') return true;\n  if (eventData.consent_state) return !!eventData.consent_state.ad_storage;\n  const xGaGcs = eventData['x-ga-gcs'] || ''; // x-ga-gcs is a string like \"G110\"\n  return xGaGcs[2] === '1';\n}\n\n\n___SERVER_PERMISSIONS___\n\n[\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"read_event_data\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"eventDataAccess\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"set_cookies\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"allowedCookies\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"name\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"domain\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"path\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"secure\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"session\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbc\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"*\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"*\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"any\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"any\"\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"name\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"domain\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"path\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"secure\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"session\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbp\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"*\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"*\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"any\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"any\"\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"name\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"domain\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"path\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"secure\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"session\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_gtmeec\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"*\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"*\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"any\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"any\"\n                  }\n                ]\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"send_http\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"allowedUrls\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"specific\"\n          }\n        },\n        {\n          \"key\": \"urls\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 1,\n                \"string\": \"https://graph.facebook.com/\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"get_cookies\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"cookieAccess\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"specific\"\n          }\n        },\n        {\n          \"key\": \"cookieNames\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 1,\n                \"string\": \"_fbc\"\n              },\n              {\n                \"type\": 1,\n                \"string\": \"_fbp\"\n              },\n              {\n                \"type\": 1,\n                \"string\": \"_gtmeec\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"read_request\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"headerWhitelist\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"headerName\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"referer\"\n                  }\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"key\": \"headersAllowed\",\n          \"value\": {\n            \"type\": 8,\n            \"boolean\": true\n          }\n        },\n        {\n          \"key\": \"requestAccess\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"specific\"\n          }\n        },\n        {\n          \"key\": \"headerAccess\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"specific\"\n          }\n        },\n        {\n          \"key\": \"queryParameterAccess\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  }\n]\n\n\n___TESTS___\n\nscenarios:\n- name: Check semantical errors\n  code: \"mock('sendHttpRequest', (requestUrl, requestOptions, requestBody) => {\\n\\\n    \\  return {\\n    then: (callback) => { \\n      callback({ statusCode: 200 });\\n\\\n    \\      return {\\n        then: () => {},\\n        catch: () => {}\\n      };\\n\\\n    \\    },\\n    catch: (callback) => callback()\\n  };\\n});\\n\\nrunCode(mockData);\"\n- name: '[Cookie] Cookie domain is NOT overriden when option is NOT selected'\n  code: |-\n    mockData.overrideCookieDomain = false;\n    mockData.enableEventEnhancement = true;\n\n    const expectedFbp = 'expectedFbp';\n    const expectedFbc = 'expectedFbc';\n    mock('getAllEventData', {\n      _fbp: expectedFbp,\n      _fbc: expectedFbc\n    });\n\n    mock('setCookie', (cookieName, cookieValue, cookieOptions, noEncode) => {\n      switch (cookieName) {\n        case '_fbp':\n        case '_fbc':\n        case '_gtmeec':\n          if (cookieOptions.domain !== 'auto') fail('cookieDomain shouldn\\'t have been overriden');\n          break;\n      }\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      assertApi('gtmOnSuccess').wasCalled();\n      assertApi('gtmOnFailure').wasNotCalled();\n    });\n- name: '[Cookie] Cookie domain is overriden when option is selected'\n  code: |-\n    mockData.overrideCookieDomain = true;\n    mockData.overridenCookieDomain = 'example.com';\n    mockData.enableEventEnhancement = true;\n\n    const expectedFbp = 'expectedFbp';\n    const expectedFbc = 'expectedFbc';\n    mock('getAllEventData', {\n      _fbp: expectedFbp,\n      _fbc: expectedFbc\n    });\n\n    mock('setCookie', (cookieName, cookieValue, cookieOptions, noEncode) => {\n      switch (cookieName) {\n        case '_fbp':\n        case '_fbc':\n        case '_gtmeec':\n          assertThat(cookieOptions.domain).isEqualTo(mockData.overridenCookieDomain);\n          break;\n      }\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      assertApi('gtmOnSuccess').wasCalled();\n      assertApi('gtmOnFailure').wasNotCalled();\n    });\n- name: '[Action Source = App] Request is sent successfully when using Event Data\n    as source'\n  code: \"mockData.generateFbp = false;\\nmockData.actionSource = 'app';\\nmockData.appDataList\\\n    \\ = undefined;\\nmockData.eventName = 'custom';\\n\\nmock('getAllEventData', {\\n\\\n    \\  app_data: {\\n    advertiser_tracking_enabled: 1,\\n    application_tracking_enabled:\\\n    \\ 0,\\n    extinfo: [\\n      'a2',\\n      'app_id',\\n      'app_version',\\n   \\\n    \\   'Version app_version',\\n      'os_version',\\n      'device_model',\\n     \\\n    \\ 'language',\\n      '',\\n      '',\\n      '',\\n      '',\\n      '',\\n      '',\\n\\\n    \\      '',\\n      '',\\n      ''\\n    ],\\n    campaign_ids: 'expected-campaign_ids',\\n\\\n    \\    install_referrer: 'expected-install_referrer',\\n    installer_package: 'expected-installer_package',\\\n    \\ \\n    url_schemes: ['foobar', 'abcdef'],\\n    vendor_id: 'expected-vendor_id',\\n\\\n    \\    windows_attribution_id: 'expected-windows_attribution_id'\\n  }\\n});\\n\\nconst\\\n    \\ expectedRequestBody = {\\n  data: [\\n    {\\n      event_name: 'test',\\n     \\\n    \\ action_source: 'app',\\n      event_time: 1747945830,\\n      custom_data: {},\\n\\\n    \\      user_data: {},\\n      app_data: {\\n        advertiser_tracking_enabled:\\\n    \\ 1,\\n        application_tracking_enabled: 0,\\n        extinfo: [\\n         \\\n    \\ 'a2',\\n          'app_id',\\n          'app_version',\\n          'Version app_version',\\n\\\n    \\          'os_version',\\n          'device_model',\\n          'language',\\n \\\n    \\         '',\\n          '',\\n          '',\\n          '',\\n          '',\\n  \\\n    \\        '',\\n          '',\\n          '',\\n          ''\\n        ],\\n       \\\n    \\ campaign_ids: 'expected-campaign_ids',\\n        install_referrer: 'expected-install_referrer',\\n\\\n    \\        installer_package: 'expected-installer_package',\\n        url_schemes:\\\n    \\ ['foobar', 'abcdef'],\\n        vendor_id: 'expected-vendor_id',\\n        windows_attribution_id:\\\n    \\ 'expected-windows_attribution_id'\\n      }\\n    }\\n  ],\\n  partner_agent: expectedPartnerAgent\\n\\\n    };\\n\\nmock('sendHttpRequest', (requestUrl, requestOptions, requestBody) => {\\n\\\n    \\  const parsedBody = JSON.parse(requestBody);\\n  assertThat(parsedBody).isEqualTo(expectedRequestBody);\\n\\\n    \\  return Promise.create((resolve, reject) => {\\n    resolve({ statusCode: 200\\\n    \\ });\\n  });    \\n});\\n\\nrunCode(mockData);\\n\\ncallLater(() => {\\n  assertApi('gtmOnSuccess').wasCalled();\\n\\\n    \\  assertApi('gtmOnFailure').wasNotCalled();\\n});\"\n- name: '[Action Source = App] Request is sent successfully when using UI data as\n    source'\n  code: \"mockData.generateFbp = false;\\nmockData.actionSource = 'app';\\nmockData.appDataList\\\n    \\ = [\\n  { name: 'advertiser_tracking_enabled', value: '1' },\\n  { name: 'application_tracking_enabled',\\\n    \\ value: '0' },\\n  { \\n   name: 'extinfo',\\n   value: \\n     [\\n      'a2',\\n\\\n    \\      'app_id',\\n      'app_version',\\n      'Version app_version',\\n      'os_version',\\n\\\n    \\      'device_model',\\n      'language',\\n      '',\\n      '',\\n      '',\\n \\\n    \\     '',\\n      '',\\n      '',\\n      '',\\n      '',\\n      ''\\n    ]\\n  },\\n\\\n    \\  { name: 'campaign_ids', value: 'expected-campaign_ids' },\\n  { name: 'install_referrer',\\\n    \\ value: 'expected-install_referrer' },\\n  { name: 'installer_package', value:\\\n    \\ 'expected-installer_package' }, \\n  { name: 'url_schemes', value: ['foobar',\\\n    \\ 'abcdef'] },\\n  { name: 'vendor_id', value: 'expected-vendor_id' },\\n  { name:\\\n    \\ 'windows_attribution_id', value: 'expected-windows_attribution_id' }\\n];\\nmockData.eventName\\\n    \\ = 'custom';\\n\\nmock('getAllEventData', {});\\n\\nconst expectedRequestBody = {\\n\\\n    \\  data: [\\n    {\\n      event_name: 'test',\\n      action_source: 'app',\\n  \\\n    \\    event_time: 1747945830,\\n      custom_data: {},\\n      user_data: {},\\n \\\n    \\     app_data: {\\n        advertiser_tracking_enabled: '1',\\n        application_tracking_enabled:\\\n    \\ '0',\\n        extinfo: [\\n          'a2',\\n          'app_id',\\n          'app_version',\\n\\\n    \\          'Version app_version',\\n          'os_version',\\n          'device_model',\\n\\\n    \\          'language',\\n          '',\\n          '',\\n          '',\\n        \\\n    \\  '',\\n          '',\\n          '',\\n          '',\\n          '',\\n         \\\n    \\ ''\\n        ],\\n        campaign_ids: 'expected-campaign_ids',\\n        install_referrer:\\\n    \\ 'expected-install_referrer',\\n        installer_package: 'expected-installer_package',\\n\\\n    \\        url_schemes: ['foobar', 'abcdef'],\\n        vendor_id: 'expected-vendor_id',\\n\\\n    \\        windows_attribution_id: 'expected-windows_attribution_id'\\n      }\\n\\\n    \\    }\\n  ],\\n  partner_agent: expectedPartnerAgent\\n};\\n\\nmock('sendHttpRequest',\\\n    \\ (requestUrl, requestOptions, requestBody) => {\\n  const parsedBody = JSON.parse(requestBody);\\n\\\n    \\  assertThat(parsedBody).isEqualTo(expectedRequestBody);\\n  return Promise.create((resolve,\\\n    \\ reject) => {\\n    resolve({ statusCode: 200 });\\n  });    \\n});\\n\\nrunCode(mockData);\\n\\\n    \\ncallLater(() => {\\n  assertApi('gtmOnSuccess').wasCalled();\\n  assertApi('gtmOnFailure').wasNotCalled();\\n\\\n    });\"\n- name: '[Event = AppendValue] Request is sent successfully'\n  code: \"mockData.inheritEventName = 'override';\\nmockData.eventNameCustom = 'AppendValue';\\n\\\n    mockData.eventName = 'custom';\\nmockData.generateFbp = false;\\nmockData.actionSource\\\n    \\ = 'website';\\nmockData.userDataList = [\\n  { name: 'em', value: 'test' },\\n\\\n    \\  { name: 'ph', value: 'test' }\\n];\\nmockData.customDataList = [\\n  { name: 'currency',\\\n    \\ value: 'BRL' },\\n  { name: 'net_revenue', value: 123 }\\n];\\nmockData.originalEventDataList\\\n    \\ = [\\n  { name: 'event_name', value: 'Purchase' },\\n  { name: 'event_time', value:\\\n    \\ 17555555 },\\n  { name: 'order_id', value: 'foobar123' },\\n  { name: 'event_id',\\\n    \\ value: '1747945830' }\\n];\\n\\nmock('getAllEventData', {});\\n\\nconst expectedRequestBody\\\n    \\ = {\\n  data: [\\n    {\\n      event_name: 'AppendValue',\\n      event_time: 1747945830,\\n\\\n    \\      custom_data: { currency: 'BRL', net_revenue: 123 },\\n      user_data: {\\n\\\n    \\        em: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08',\\n\\\n    \\        ph: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\\n\\\n    \\      },\\n      original_event_data: {\\n        event_name: 'Purchase',\\n   \\\n    \\     event_time: 17555555,\\n        order_id: 'foobar123',\\n        event_id:\\\n    \\ '1747945830'\\n      }\\n    }\\n  ],\\n  partner_agent: expectedPartnerAgent\\n\\\n    };\\n\\nmock('sendHttpRequest', (requestUrl, requestOptions, requestBody) => {\\n\\\n    \\  const parsedBody = JSON.parse(requestBody);\\n  assertThat(parsedBody).isEqualTo(expectedRequestBody);\\n\\\n    \\  return Promise.create((resolve, reject) => {\\n    resolve({ statusCode: 200\\\n    \\ });\\n  });    \\n});\\n\\nrunCode(mockData);\\n\\ncallLater(() => {\\n  assertApi('gtmOnSuccess').wasCalled();\\n\\\n    \\  assertApi('gtmOnFailure').wasNotCalled();\\n});\"\n- name: '[Parameters from Object or List] Parameters are read and sent succesfullly'\n  code: \"mockData.actionSource = 'app'; // Using 'app' just to have access to the\\\n    \\ App Data section.\\n\\n[\\n  // Object empty, list empty\\n  {\\n    mockDataObj:\\\n    \\ {\\n      appDataObject: undefined,\\n      appDataList: undefined,\\n      userDataObject:\\\n    \\ undefined,\\n      userDataList: undefined,\\n      customDataObject: undefined,\\n\\\n    \\      customDataList: undefined\\n    },\\n    expectedRequestBody: {\\n      appData:\\\n    \\ {\\n        advertiser_tracking_enabled: 0,\\n        application_tracking_enabled:\\\n    \\ 0,\\n        extinfo: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',\\\n    \\ '', '']\\n      },\\n      userData: {},\\n      customData: {}\\n    }\\n  },\\n\\\n    \\  \\n  // Object empty, list not-empty\\n  {\\n    mockDataObj: {\\n      appDataObject:\\\n    \\ undefined,\\n      appDataList: [\\n        { name: 'vendor_id', value: 'vendor_id'\\\n    \\ },\\n        { name: 'campaign_ids', value: 'campaign_ids' }\\n      ],\\n    \\\n    \\  userDataObject: undefined,\\n      userDataList: [{ name: 'fn', value: 'test'\\\n    \\ }],\\n      customDataObject: undefined,\\n      customDataList: [\\n        {\\\n    \\ name: 'currency', value: 'BRL' },\\n        { name: 'net_revenue', value: 123\\\n    \\ },\\n        { name: 'test', value: 'test' }\\n      ]\\n    },\\n    expectedRequestBody:\\\n    \\ {\\n      appData: {\\n        advertiser_tracking_enabled: 0,\\n        application_tracking_enabled:\\\n    \\ 0,\\n        extinfo: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',\\\n    \\ '', ''],\\n        vendor_id: 'vendor_id',\\n        campaign_ids: 'campaign_ids'\\n\\\n    \\      },\\n      userData: { fn: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'\\\n    \\ },\\n      customData: { currency: 'BRL', net_revenue: 123, test: 'test' }\\n\\\n    \\    }\\n  },\\n  \\n  // Object not-empty, list empty\\n  {\\n    mockDataObj: {\\n\\\n    \\      appDataObject: { vendor_id: 'vendor_id_obj' },\\n      appDataList: undefined,\\n\\\n    \\      userDataObject: { em: 'test@example.com_obj' },\\n      userDataList: undefined,\\n\\\n    \\      customDataObject: { test: 'test_obj' },\\n      customDataList: undefined\\n\\\n    \\    },\\n    expectedRequestBody: {\\n      appData: {\\n        advertiser_tracking_enabled:\\\n    \\ 0,\\n        application_tracking_enabled: 0,\\n        extinfo: ['', '', '',\\\n    \\ '', '', '', '', '', '', '', '', '', '', '', '', ''],\\n        vendor_id: 'vendor_id_obj'\\n\\\n    \\      },\\n      userData: { em: '0217a86a7b92e2511273b0081bfc67f939b7f9a897d960849690056732795b3d'\\\n    \\ },\\n      customData: { test: 'test_obj' }\\n    }\\n  },\\n  \\n  // Object not-empty\\\n    \\ and list not-empty, with different values each.\\n  {\\n    mockDataObj: {\\n \\\n    \\     appDataObject: { vendor_id: 'vendor_id_obj' },\\n      appDataList: [\\n \\\n    \\       { name: 'campaign_ids', value: 'campaign_ids' }\\n      ],\\n      userDataObject:\\\n    \\ { em: 'test@example.com_obj' },\\n      userDataList: [{ name: 'fn', value: 'test'\\\n    \\ }],\\n      customDataObject: { test: 'test_obj' },\\n      customDataList: [\\n\\\n    \\        { name: 'currency', value: 'BRL' },\\n        { name: 'net_revenue', value:\\\n    \\ 123 }\\n      ],\\n    },\\n    expectedRequestBody: {\\n      appData: {\\n    \\\n    \\    advertiser_tracking_enabled: 0,\\n        application_tracking_enabled: 0,\\n\\\n    \\        extinfo: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\\\n    \\ ''],\\n        vendor_id: 'vendor_id_obj',\\n        campaign_ids: 'campaign_ids'\\n\\\n    \\      },\\n      userData: { em: '0217a86a7b92e2511273b0081bfc67f939b7f9a897d960849690056732795b3d',\\\n    \\ fn: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08' },\\n\\\n    \\      customData: { test: 'test_obj', currency: 'BRL', net_revenue: 123 }\\n \\\n    \\   }\\n  },\\n  \\n  // Object not-empty and list not-empty, with overlapping values.\\\n    \\ Should favor list.\\n  {\\n    mockDataObj: {\\n      appDataObject: { vendor_id:\\\n    \\ 'vendor_id_obj' },\\n      appDataList: [\\n        { name: 'vendor_id', value:\\\n    \\ 'vendor_id' },\\n        { name: 'campaign_ids', value: 'campaign_ids' }\\n  \\\n    \\    ],\\n      userDataObject: { em: 'test@example.com_obj' },\\n      userDataList:\\\n    \\ [{ name: 'fn', value: 'test' }, { name: 'em', value: 'test' }],\\n      customDataObject:\\\n    \\ { test: 'test_obj' },\\n      customDataList: [\\n        { name: 'currency',\\\n    \\ value: 'BRL' },\\n        { name: 'net_revenue', value: 123 },\\n        { name:\\\n    \\ 'test', value: 'test' }\\n      ],\\n    },\\n    expectedRequestBody: {\\n    \\\n    \\  appData: {\\n        advertiser_tracking_enabled: 0,\\n        application_tracking_enabled:\\\n    \\ 0,\\n        extinfo: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',\\\n    \\ '', ''],\\n        vendor_id: 'vendor_id',\\n        campaign_ids: 'campaign_ids'\\n\\\n    \\      },\\n      userData: { em: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08',\\\n    \\ fn: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08' },\\n\\\n    \\      customData: { test: 'test', currency: 'BRL', net_revenue: 123 }\\n    }\\n\\\n    \\  }\\n].forEach((scenario, index) => {\\n  const copyMockData = JSON.parse(JSON.stringify(mockData));\\n\\\n    \\  mergeObj(copyMockData, scenario.mockDataObj);\\n  \\n  mock('sendHttpRequest',\\\n    \\ (requestUrl, requestOptions, requestBody) => {\\n    const parsedBody = JSON.parse(requestBody);\\n\\\n    \\    assertThat(parsedBody.data[0].app_data).isEqualTo(scenario.expectedRequestBody.appData);\\n\\\n    \\    assertThat(parsedBody.data[0].user_data).isEqualTo(scenario.expectedRequestBody.userData);\\n\\\n    \\    assertThat(parsedBody.data[0].custom_data).isEqualTo(scenario.expectedRequestBody.customData);\\n\\\n    \\    return Promise.create((resolve, reject) => {\\n      resolve({ statusCode:\\\n    \\ 200 });\\n    });\\n  });\\n  \\n  runCode(copyMockData);\\n  \\n  callLater(() =>\\\n    \\ {\\n    assertApi('gtmOnSuccess').wasCalled();\\n    assertApi('gtmOnFailure').wasNotCalled();\\n\\\n    \\  });\\n});\"\n- name: '[App Secret Proof] App Secret Proof is handled and sent succesfully'\n  code: \"mockData.useAppSecretProof = true;\\nmockData.appSecretProof = 'appSecretProof1';\\n\\\n    \\nmock('sendHttpRequest', (requestUrl, requestOptions, requestBody) => {\\n  const\\\n    \\ pixelId = mockData.pixelId;\\n  const accessToken = mockData.accessToken;\\n \\\n    \\ const appSecretProof = mockData.appSecretProof;\\n  \\n  assertThat(requestUrl).isEqualTo(\\n\\\n    \\    'https://graph.facebook.com/v' + expectedApiVersion + '/' + pixelId + \\n\\\n    \\    '/events?access_token=' + accessToken +\\n    '&appsecret_proof=' + appSecretProof\\n\\\n    \\  );\\n\\n  return Promise.create((resolve, reject) => {\\n    resolve({ statusCode:\\\n    \\ 200 });\\n  });  \\n});\\n\\nrunCode(mockData);\\n\\ncallLater(() => {\\n  assertApi('gtmOnSuccess').wasCalled();\\n\\\n    \\  assertApi('gtmOnFailure').wasNotCalled();\\n});\"\n- name: gtmOnFailure handler is called if a request fails, rejects, or Promise all\n    rejects\n  code: |-\n    [\n      // A request resolves with a non-200 status code.\n      () => {\n        let requestCount = 0;\n        mock('sendHttpRequest', (requestUrl, requestOptions, requestBody) => {\n          requestCount++;\n          const statusCode = requestCount === 1 ? 500 : 200;\n          return Promise.create((resolve, reject) => {\n            resolve({ statusCode: statusCode });\n          });\n        });\n      },\n      // A request rejects outright.\n      () => {\n        let requestCount = 0;\n        mock('sendHttpRequest', (requestUrl, requestOptions, requestBody) => {\n          requestCount++;\n          return Promise.create((resolve, reject) => {\n            if (requestCount === 1) reject({ reason: 'failed' });\n            else resolve({ statusCode: 200 });\n          });\n        });\n      },\n      // Every request succeeds, but Promise.all itself rejects.\n      () => {\n        mock('sendHttpRequest', (requestUrl, requestOptions, requestBody) => {\n          return Promise.create((resolve, reject) => {\n            resolve({ statusCode: 200 });\n          });\n        });\n        mockObject('Promise', {\n          all: () => Promise.create((resolve, reject) => reject({ reason: 'failed' }))\n        });\n      }\n    ].forEach((setupFailure) => {\n      mockData.enableMultipixelSetup = true;\n      mockData.pixelIdAndAccessTokenTable = [\n        {\n          pixelId: 'pixelId2',\n          accessToken: 'accessToken2',\n          appSecretProof: 'appSecretProof2'\n        }\n      ];\n\n      setupFailure();\n\n      runCode(mockData);\n\n      callLater(() => {\n        assertApi('gtmOnSuccess').wasNotCalled();\n        assertApi('gtmOnFailure').wasCalled();\n      });\n    });\n- name: '[Event Name] Resolves across setup-method, override and fallback scenarios'\n  code: |-\n    [\n      // Setup method unset: behaves as inherit.\n      { inheritEventName: undefined, eventData: { event_name: 'purchase' }, expected: 'Purchase' },\n      { inheritEventName: undefined, eventData: {}, expected: undefined },\n\n      // Explicit inherit with nothing to map.\n      { inheritEventName: 'inherit', eventData: {}, expected: undefined },\n\n      // Override, standard selected but left blank: falls back to the mapped incoming name.\n      {\n        inheritEventName: 'override',\n        eventName: 'standard',\n        eventData: { event_name: 'purchase' },\n        expected: 'Purchase'\n      },\n      // Override, custom selected but blank: falls back to the mapped incoming name.\n      {\n        inheritEventName: 'override',\n        eventName: 'custom',\n        eventNameCustom: '',\n        eventData: { event_name: 'add_to_cart' },\n        expected: 'AddToCart'\n      },\n      // Incomplete override with an incoming name outside the GA4 mapping table: forwarded as-is.\n      {\n        inheritEventName: 'override',\n        eventName: 'standard',\n        eventData: { event_name: 'session_start' },\n        expected: 'session_start'\n      },\n      // Incomplete override with no incoming name at all: still sent, unresolved.\n      { inheritEventName: 'override', eventName: 'standard', eventData: {}, expected: undefined },\n\n      // Override, standard event chosen: sent as chosen regardless of the incoming name.\n      {\n        inheritEventName: 'override',\n        eventName: 'standard',\n        eventNameStandard: 'PageView',\n        eventData: { event_name: 'purchase' },\n        expected: 'PageView'\n      },\n      // Incomplete override does not apply the view_item_list mapping, which is scoped to inherit.\n      {\n        inheritEventName: 'override',\n        eventName: 'standard',\n        mapViewItemListToViewContent: true,\n        eventData: { event_name: 'view_item_list' },\n        expected: 'view_item_list'\n      },\n      // Override switched to custom after a standard event was picked: the stale standard value is not reused.\n      {\n        inheritEventName: 'override',\n        eventName: 'custom',\n        eventNameStandard: 'PageView',\n        eventNameCustom: '',\n        eventData: { event_name: 'purchase' },\n        expected: 'Purchase'\n      },\n      // A sentinel string is not treated as a valid override name.\n      {\n        inheritEventName: 'override',\n        eventName: 'custom',\n        eventNameCustom: 'undefined',\n        eventData: {},\n        expected: undefined\n      }\n    ].forEach((scenario) => {\n      const copyMockData = JSON.parse(JSON.stringify(mockData));\n      copyMockData.inheritEventName = scenario.inheritEventName;\n      copyMockData.eventName = scenario.eventName;\n      copyMockData.eventNameStandard = scenario.eventNameStandard;\n      copyMockData.eventNameCustom = scenario.eventNameCustom;\n      copyMockData.mapViewItemListToViewContent = scenario.mapViewItemListToViewContent;\n\n      mock('getAllEventData', scenario.eventData);\n\n      let requestBody;\n      mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n        requestBody = JSON.parse(body);\n        return Promise.create((resolve) => resolve({ statusCode: 200 }));\n      });\n\n      runCode(copyMockData);\n\n      callLater(() => {\n        assertThat(requestBody.data[0].event_name).isEqualTo(scenario.expected);\n        assertThat(requestBody.data[0].action_source).isEqualTo('website');\n        assertApi('gtmOnSuccess').wasCalled();\n        assertApi('gtmOnFailure').wasNotCalled();\n      });\n    });\n- name: '[Event Name] An absent inherit setting still maps view_item_list to a product\n    group'\n  code: |-\n    mockData.inheritEventName = undefined;\n    mockData.eventNameCustom = undefined;\n    mockData.mapViewItemListToViewContent = true;\n\n    mock('getAllEventData', {\n      event_name: 'view_item_list',\n      items: [{ item_id: 'SKU_1' }, { item_id: 'SKU_2' }]\n    });\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      assertThat(requestBody.data[0].event_name).isEqualTo('ViewContent');\n      assertThat(requestBody.data[0].custom_data.content_type).isEqualTo('product_group');\n      assertApi('gtmOnSuccess').wasCalled();\n      assertApi('gtmOnFailure').wasNotCalled();\n    });\n- name: '[Server Event Data] An empty value clears a field unless it is required'\n  code: |-\n    mock('getAllEventData', {\n      event_name: 'purchase',\n      page_location: 'https://example.com/checkout'\n    });\n\n    mockData.serverEventDataList = [\n      { name: 'event_source_url', value: undefined },\n      { name: 'action_source', value: 'undefined' },\n      { name: 'event_time', value: 'undefined' },\n      { name: 'event_id', value: 'order-1' }\n    ];\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      assertThat(requestBody.data[0].event_source_url).isEqualTo(undefined);\n      assertThat(requestBody.data[0].action_source).isEqualTo(undefined);\n      assertThat(requestBody.data[0].event_id).isEqualTo('order-1');\n      assertThat(requestBody.data[0].event_time).isEqualTo(1747945830);\n    });\n- name: '[Event Enhancement] Non-scalar cookie values are ignored'\n  code: |-\n    mockData.enableEventEnhancement = true;\n\n    mock('getCookieValues', (name) => {\n      // {\"em\": {\"a\": 1}, \"ct\": \"paris\"}\n      if (name === '_gtmeec') return ['eyJlbSI6IHsiYSI6IDF9LCAiY3QiOiAicGFyaXMifQ=='];\n      return [];\n    });\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      assertThat(requestBody.data[0].user_data.em).isUndefined();\n      assertThat(requestBody.data[0].user_data.ct).isDefined();\n    });\n- name: '[Currency] Currency is found on an item other than the first'\n  code: |-\n    mock('getAllEventData', {\n      items: [\n        { item_id: 'sku1', price: 5 },\n        { item_id: 'sku2', price: 7, currency: 'EUR' }\n      ]\n    });\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      assertThat(requestBody.data[0].custom_data.currency).isEqualTo('EUR');\n    });\n- name: '[Currency] A price with no currency falls back to the existing default'\n  code: |-\n    mock('getAllEventData', {\n      items: [{ item_id: 'sku1', price: '9.99' }]\n    });\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      const customData = requestBody.data[0].custom_data;\n      assertThat(customData.contents[0].id).isEqualTo('sku1');\n      assertThat(customData.contents[0].item_price).isEqualTo(9.99);\n      assertThat(customData.value).isEqualTo(9.99);\n      assertThat(customData.currency).isEqualTo('USD');\n    });\n- name: '[Click ID] A malformed fbclid is not written into the click ID'\n  code: |-\n    mock('getAllEventData', {\n      page_location: 'https://example.com/p?fbclid=%E0%A4%A'\n    });\n    mock('getCookieValues', () => []);\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      assertThat(requestBody.data[0].user_data.fbc).isEqualTo(undefined);\n    });\n- name: '[Price] A blank item price still fills in a value on a Purchase event'\n  code: |-\n    mock('getAllEventData', {\n      event_name: 'purchase',\n      items: [{ item_id: 'sku1', price: ' ' }]\n    });\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      const customData = requestBody.data[0].custom_data;\n      assertThat(customData.contents[0].item_price).isEqualTo(undefined);\n      // Facebook rejects a Purchase event with no value at all.\n      assertThat(customData.value).isEqualTo('0.00');\n      assertThat(customData.currency).isEqualTo('USD');\n    });\n- name: '[Contents] Mapping item data to content_ids only does not require contents'\n  code: |-\n    mock('getAllEventData', {\n      currency: 'USD',\n      items: [\n        { item_id: 'sku1', price: '12.50 USD' },\n        { item_name: 'no id or price' }\n      ]\n    });\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mergeObj({ mapItemDataTo: 'content_ids' }, mockData));\n\n    callLater(() => {\n      const customData = requestBody.data[0].custom_data;\n      assertThat(customData.content_ids).isEqualTo(['sku1']);\n      assertThat(customData.contents).isEqualTo(undefined);\n      assertThat(customData.content_type).isEqualTo('product');\n    });\n- name: '[Price] A malformed price is still rejected'\n  code: |-\n    mock('getAllEventData', {\n      currency: 'EUR',\n      items: [\n        { item_id: 'sku1', price: '1.2.3' },\n        { item_id: 'sku2', price: '3 x 12.50' },\n        { item_id: 'sku3', price: '1,23,456' }\n      ]\n    });\n\n    let requestBody;\n    mock('sendHttpRequest', (requestUrl, requestOptions, body) => {\n      requestBody = JSON.parse(body);\n      return Promise.create((resolve) => resolve({ statusCode: 200 }));\n    });\n\n    runCode(mockData);\n\n    callLater(() => {\n      const contents = requestBody.data[0].custom_data.contents;\n      assertThat(contents[0].item_price).isEqualTo(undefined);\n      assertThat(contents[1].item_price).isEqualTo(undefined);\n      assertThat(contents[2].item_price).isEqualTo(undefined);\n    });\nsetup: \"const JSON = require('JSON');\\nconst Promise = require('Promise');\\nconst\\\n  \\ callLater = require('callLater');\\n\\nconst mergeObj = (target, source) => {\\n\\\n  \\  for (const key in source) {\\n    if (source.hasOwnProperty(key)) target[key]\\\n  \\ = source[key];\\n  }\\n  return target;\\n};\\n\\nconst expectedBigQuerySettings =\\\n  \\ {\\n  logBigQueryProjectId: 'logBigQueryProjectId',\\n  logBigQueryDatasetId: 'logBigQueryDatasetId',\\n\\\n  \\  logBigQueryTableId: 'logBigQueryTableId'\\n};\\n\\nconst requiredConsoleKeys = ['Type',\\\n  \\ 'TraceId', 'Name'];\\nconst requiredBqKeys = ['timestamp', 'type', 'trace_id',\\\n  \\ 'tag_name'];\\nconst expectedBqOptions = { ignoreUnknownValues: true };\\n\\nconst\\\n  \\ expectedValue = 'test';\\nconst expectedPixelId = '1111111111111';\\nconst expectedPartnerAgent\\\n  \\ = 'stape-gtmss-2.1.7';\\nconst expectedApiVersion = '26.0';\\n\\n\\nconst mockData\\\n  \\ = {\\n  pixelId: expectedPixelId,\\n  accessToken: expectedValue,\\n  inheritEventName:\\\n  \\ 'override',\\n  eventNameCustom: expectedValue,\\n  logBigQueryProjectId: expectedBigQuerySettings.logBigQueryProjectId,\\n\\\n  \\  logBigQueryDatasetId: expectedBigQuerySettings.logBigQueryDatasetId,\\n  logBigQueryTableId:\\\n  \\ expectedBigQuerySettings.logBigQueryTableId,\\n};\\n\\nmock('sendHttpRequest', (requestUrl,\\\n  \\ callback, requestOptions, requestBody) => {\\n  if (typeof callback === 'function')\\\n  \\ {\\n    callback(200);\\n  } else {\\n    requestBody = requestOptions;\\n    requestOptions\\\n  \\ = callback;\\n    return Promise.create((resolve, reject) => {\\n      resolve({\\\n  \\ statusCode: 200 });\\n    });  \\n  }\\n});\\n\\nmock('getRequestHeader', (header)\\\n  \\ => {\\n  if (header === 'trace-id') return 'expectedTraceId';\\n});\\n\\nmock('getTimestampMillis',\\\n  \\ 1747945830456);\"\n\n\n___NOTES___\n\n2026-09-02 - Change Notes:\n  - Empty or invalid values are no longer sent to Facebook for any field, preventing malformed requests\n  - Prices and quantities with unusual formatting (e.g. \"$1,234.56\") are no longer guessed at; only plain numbers are accepted, blank or invalid ones are safely skipped\n  - Simplified how the event name is resolved when no override is configured\n  - Bumped partner agent string to 2.1.7\n\n2026-09-01 - Change Notes:\n  - Bumped partner agent string to 2.1.6.\n\n2026-08-28 - Change Notes:\n  - Fix event name being silently blank when the setup method is left unset; it now inherits from the client, as intended\n  - Require a non-empty standard/custom event name on Override, and default the setup method to \"Inherit from client\"\n\n2026-08-25 Change Notes:\n - Add option to map item data to contents, content_ids or both.\n - Bump API version to 26.0.\n\n2026-05-25 Change Notes:\n - Logging removal.\n\n2026-05-20 - Change Notes:\n  - Add four automap toggle checkboxes (Server Event Data, User Data, App Data, Custom Data), each defaulting to true, allowing individual auto-mapping groups to be disabled without affecting manual overrides; existing configurations are unaffected via a hasOwnProperty fallback\n  - Add optional GA4 \"view_item_list\" → \"ViewContent\" mapping (sets content_type to \"product_group\") and move \"Use App Secret Proof\" into a new \"More Settings\" group\n  - Move \"Custom Item ID Key\" into the Custom Data section gated on automap being enabled; improve help texts for \"Inherit from client\" event name, HttpOnly cookies, and Test ID fields\n  - Refactor fbc/fbp resolution, cookie writing, and exit checks into dedicated functions; add page_referrer as a third URL fallback for subdomain index calculation\n  - Bump API version to 25.0 and partner agent to stape-gtmss-2.1.4\n\nCreated on 10/11/2020, 18:14:02\n\n\n",
                "galleryReference": {
                    "host": "github.com",
                    "owner": "stape-io",
                    "repository": "facebook-tag",
                    "version": "0c0e8cb5c299526bbf53649bcf2a28fa919320e4",
                    "signature": "80bac1cfb8796049c465bf1ac8f1125bf81ff263f06d7ef3057c5fad44f1af09",
                    "galleryTemplateId": "5TP8W"
                }
            },
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "templateId": "92",
                "name": "city_meta - X-GEO-City",
                "fingerprint": "1790254195489",
                "templateData": "___INFO___\n\n{\n  \"type\": \"MACRO\",\n  \"id\": \"cvt_temp_public_id\",\n  \"version\": 1,\n  \"securityGroups\": [],\n  \"displayName\": \"city_meta - X-GEO-City\",\n  \"description\": \"Transforma o valor do X-GEO-City no padrão exigido pela Meta.\\n\\nCódigo desenvolvido por um aluno do Treinamento Traqueamento Avançado - @gustavobork.\",\n  \"containerContexts\": [\n    \"SERVER\"\n  ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[]\n\n\n___SANDBOXED_JS_FOR_SERVER___\n\nconst getRequestHeader = require('getRequestHeader');\nconst logToConsole = require('logToConsole');\n\nlet cityName = getRequestHeader('X-Geo-City');\nlogToConsole(\"Original cityName: \" + cityName); // Log before replacement\n\nif (cityName) {\n    let result = '';\n    for (let i = 0; i < cityName.length; i++) {\n        const current = cityName.charAt(i);\n        const next = i + 1 < cityName.length ? cityName.charAt(i + 1) : '';\n        const pair = current + next;\n\n        if (pair === 'Ã£' || pair === 'Ã¡' || pair === 'Ã ' || pair === 'Ã¢') {\n            result += 'a';\n            i++; // Skip next character\n        } else if (pair === 'Ã©' || pair === 'Ãª') {\n            result += 'e';\n            i++; // Skip next character\n        } else if (pair === 'Ã­') {\n            result += 'i';\n            i++; // Skip next character\n        } else if (pair === 'Ã³' || pair === 'Ã´' || pair === 'Ãµ') {\n            result += 'o';\n            i++; // Skip next character\n        } else if (pair === 'Ãº' || pair === 'Ã¼') {\n            result += 'u';\n            i++; // Skip next character\n        } else if (pair === 'Ã§') {\n            result += 'c';\n            i++; // Skip next character\n        } else if (current !== ' ') { // Check if the current character is not a space\n            result += current;\n        }\n        // If it is a space, do nothing (effectively removing it)\n    }\n\n    cityName = result.toLowerCase(); // Lowercase result\n    logToConsole(\"Processed cityName: \" + cityName); // Log after replacement\n    return cityName;\n}\n\ndata.gtmOnSuccess(); // In GTM, end with this call\n\n//Código desenvolvido por um aluno do Treinamento Traqueamento Avançado - @gustavobork.\n\n\n___SERVER_PERMISSIONS___\n\n[\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"read_request\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"requestAccess\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        },\n        {\n          \"key\": \"headerAccess\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        },\n        {\n          \"key\": \"queryParameterAccess\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"logging\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"environments\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"all\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  }\n]\n\n\n___TESTS___\n\nscenarios: []\n\n\n___NOTES___\n\nCreated on 6/29/2024, 3:17:49 PM\n\n\n"
            }
        ],
        "client": [
            {
                "accountId": "6365534927",
                "containerId": "258048563",
                "clientId": "1",
                "name": "GA4",
                "type": "gaaw_client",
                "parameter": [
                    {
                        "type": "BOOLEAN",
                        "key": "activateDefaultPaths",
                        "value": "true"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "cookieManagement",
                        "value": "server"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "cookieName",
                        "value": "FPID"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "cookieDomain",
                        "value": "auto"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "cookiePath",
                        "value": "/"
                    },
                    {
                        "type": "TEMPLATE",
                        "key": "cookieMaxAgeInSec",
                        "value": "63072000"
                    }
                ],
                "fingerprint": "1783779587807"
            }
        ]
    }
}