/*ja-gadget-virtual-assistant-hybrid@2.20.19*/ 
;require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){var xhr = require('xhr');module.exports = Ajax;function Ajax(config, callback) {    if (!(this instanceof Ajax)) return new Ajax(config, callback);    if (typeof config === "string")config = {        uri: config    };    return xhr(config, callback);}},{"xhr":107}],2:[function(require,module,exports){var tracking = require('ja-tracking');module.exports.track = function track(chat, config, target) {    var target =        target && target.nodeType ? target : document.querySelector(target);    var config = config || {};    config.trackingPixels = config.trackingPixels || {};    config.trackingPixels.appearance = config.trackingPixels.appearance || '';    config.trackingPixels.transition =        config.trackingPixels.transition + '{clickId}' || '';    var transitionPixelQueryStringParamSeparator = /[?]/i.test(        config.trackingPixels.transition    )        ? '&aff_click_id='        : '?aff_click_id=';    var continueLinkClickTrackingParam =        transitionPixelQueryStringParamSeparator + 'continue-link';    var sendButtonClickTrackingParam =        transitionPixelQueryStringParamSeparator + 'send-btn';    var closeButtonTrackingParam =        transitionPixelQueryStringParamSeparator + 'close-btn';    if (!chat || !chat.on || !target || tracking.isBot()) return;    chat.target = chat.target || {};    var chatClassName = '.' + chat.target.className;    var useAdditionalTrackingForLightboxGadget = chatClassName.match(        /ja-chat-container/gi    );    chat.on('appear', function() {        setTimeout(function() {            tracking.fireImagePixel(config.trackingPixels.appearance, {                target: target,                once: true,                partialMatching: true            });        }, 2000);    });    chat.on('complete', function() {        tracking.fireImagePixel(            config.trackingPixels.transition.replace(                '{clickId}',                continueLinkClickTrackingParam            ),            { target: target, once: true, partialMatching: true }        );    });    if (useAdditionalTrackingForLightboxGadget) {        var chatElement = document.querySelector(chatClassName);        chat.on('submit', function() {            tracking.fireImagePixel(                config.trackingPixels.transition.replace(                    '{clickId}',                    sendButtonClickTrackingParam                ),                { target: target, once: false, partialMatching: true }            );        });        chatElement            .querySelector('.toggle-button')            .addEventListener('click', function() {                tracking.fireImagePixel(                    config.trackingPixels.transition.replace(                        '{clickId}',                        closeButtonTrackingParam                    ),                    { target: target, once: false, partialMatching: true }                );            });    }};},{"ja-tracking":16}],3:[function(require,module,exports){var createChainingEvents = require('./chainingEvents');var hardCodedmessages = {    'us' : require('./staticMessages/us.json'),    'uk' : require('./staticMessages/uk.json'),    'de' : require('./staticMessages/de.json'),    'es' : require('./staticMessages/es.json'),    'jp' : require('./staticMessages/jp.json')}module.exports = HardCodedChatClient;var welcomeMessageIndex = 0;var messageIndexToProcess = welcomeMessageIndex;var paymentMessageIndex;var anythingElseMessageIndex;var chatId = 'hardCodedChatId';function HardCodedChatClient(config){    if (!(this instanceof HardCodedChatClient)) return new HardCodedChatClient(config);    this.config = config || {};    this.partner = this.config.partner && config.partner.toLowerCase() || 'us';    this.conversationKey = typeof(this.config.fallbackConversationKey) === 'string' ?        this.config.fallbackConversationKey.toLowerCase() : 'general';    this.fallbackEndpoint = this.config.fallbackEndpoint || 'https://my-secure.justanswer.com/chatfallback/completechat';    this.conversation = getConversation(this.partner, this.conversationKey);    this.categoryId = this.config.categoryId;    paymentMessageIndex = getPaymentMessageIndex(this.conversation.messages);    anythingElseMessageIndex = paymentMessageIndex - 1;       this.recordedMessages = config.chat && config.chat.messages || [];    messageIndexToProcess = getMessageIndexToProcess(this.recordedMessages); }HardCodedChatClient.prototype.getAssistantProfile = function(){    var profile = this.getProfile();    messageIndexToProcess = welcomeMessageIndex + 1;    return this.triggerSuccess(profile);}HardCodedChatClient.prototype.createChat = function(){    var responseData = this.getResponseData();    return this.triggerSuccess(responseData);}HardCodedChatClient.prototype.postMessage = function(){    var responseData = this.getResponseData();    return this.triggerSuccess(responseData);}HardCodedChatClient.prototype.triggerSuccess = function(data){    var request = new FakeRequest();    setTimeout(function() {        request.triggerSuccess(data);    });    return request;}HardCodedChatClient.prototype.getResponseData = function(){    var attributes = paymentMessageIndex == messageIndexToProcess ? {"action":"payment"} : {};    var response = {        text: getMessageByIndex(this.conversation.messages, messageIndexToProcess),        chatId: chatId,        attributes: attributes    };    messageIndexToProcess++;    return response;}function getMessageIndexToProcess(recordedMessages){    var assistantMessages = recordedMessages.filter(function (el) {        return el.role == 'Assistant';      });    if(assistantMessages.length == 0){        return welcomeMessageIndex;    }    else if(assistantMessages.length == 1){        return welcomeMessageIndex + 1;     }    else{        return anythingElseMessageIndex;    }}HardCodedChatClient.prototype.completeChat = function(chat){    var messages = chat && chat.messages || [];    var welcomeMessage = messages && messages.length && messages.length>1 && messages.shift();    var firstCustomerMessage = messages && messages.length && messages.length>1 && messages.shift();        chat = firstCustomerMessage.text + ' \n' + messages.map(function (x) {        return x.role == 'Assistant' ? 'JA: ' + x.text : 'Customer: ' + x.text;      }).join(' \n');    return new CompleteChatRequest().send(this.fallbackEndpoint, chat, this.categoryId);}HardCodedChatClient.prototype.getProfile = function(){    return{        avatar: "",        greeting: getMessageByIndex(this.conversation.messages, welcomeMessageIndex),        name: this.conversation.assistantName,        title: this.conversation.assistantTitle    };}function getConversation(partner, conversationKey){    return hardCodedmessages[partner][conversationKey] || hardCodedmessages[partner].general;}function getMessageByIndex(messages, index){    return messages[index] || "";}function getPaymentMessageIndex(hardCodedmessages){    return hardCodedmessages.length - 1;}function FakeRequest(){    this.callbacks = [];    return this;}createChainingEvents(FakeRequest.prototype, ['Success', 'Failure', 'RequestPerformed', 'ResponseParsingFailed']);function CompleteChatRequest(){    this.callbacks = [];    return this;}createChainingEvents(CompleteChatRequest.prototype, ['Success', 'Failure', 'RequestPerformed', 'ResponseParsingFailed']);CompleteChatRequest.prototype.send = function (endpoint, chat, categoryId) {    var self = this;        function send(retryCount) {        var r = new XMLHttpRequest();        r.open('POST', endpoint, true);        r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');        r.withCredentials = true;        r.send("chat=".concat(encodeURIComponent(chat), "&categoryid=").concat(categoryId));            r.onreadystatechange = function() {            if(r.readyState == 4){                if(r.status == 200){                    var responseData = JSON.parse(r.response);                        if (!responseData) {                        self.triggerFailure({ request: self, error: 'Can\'t post question', type: 'completeChat' });                    } else {                        self.triggerSuccess({ data: responseData });                    }                }                else{                    self.triggerFailure({ request: self, error: 'Can\'t post question', type: 'completeChat' })                    if(retryCount < 1) {                        setTimeout(function(){send(retryCount + 1)} , 5000)                    }                }            }          }    }    send(0);    return self;}},{"./chainingEvents":5,"./staticMessages/de.json":8,"./staticMessages/es.json":9,"./staticMessages/jp.json":10,"./staticMessages/uk.json":11,"./staticMessages/us.json":12}],4:[function(require,module,exports){module.exports = VAServerClient;var sendRequest = require('./sendRequest');var events = require('ja-event');var utils = require('ja-utils');var cookie = require('ja-cookie');var RequestType = {    GetAssistantProfile: {        methodName: 'getAssistantProfile',        numericId: 0    },    CreateChat: {        methodName: 'sendFirstMessage',        numericId: 1    },    PostMessage: {        methodName: 'sendMessage',        numericId: 2    },    CompleteChat: {        methodName: 'getAndCompleteChat',        numericId: 3    },    GetMessages: {        methodName: 'getMessages',        numericId: 4    },    GetChat: {        methodName: 'getChat',        numericId: 5    },    RestoreChat: {        methodName: 'restoreChat',        numericId: 6    }};function VAServerClient(config) {    if (!(this instanceof VAServerClient)) return new VAServerClient(config);    config = config || {};    this.requestDelay = config.requestDelay || 5000;    this.requestTimeout = config.requestTimeout || 10000;    this.maxRetries = config.maxRetries || 5;    this.retryCount = config.retryCount || 0;    this.servicePath = config.endpoint;    this.partnerId = config.partnerId || 'b33305aa2f8441cebfd8bab8b3f3a3da';    this.partner = config.partner || 'US';}utils.mixin(VAServerClient, events);VAServerClient.prototype.getAssistantProfile = function (categoryId, chatTypeValue, botName, source) {    var data = {        CategoryId: categoryId,        ChatType: chatTypeValue || 'FunnelQuestion',        BotName: botName || '',        Source: source || ''    }    return this        .performRequest(RequestType.GetAssistantProfile, data)        .thenSuccess(function (response) {            var data = response.data;            data = data.Profile ? data : data = { Profile: data }; // Profile mut be there            return data && data.Profile ? mapProfile(data.Profile) : { error: 'Error: VAServerClient.prototype.getAssistantProfile: Cannot find profile' };        });};VAServerClient.prototype.createChat = function (context, message, botName) {    var self = this;    var data = {        LocationUrl: context.locationUrl,        InitialCategoryId: context.categoryId,        Type: context.type,        Visitor: {            VisitorGuid: self.getVisitorGuid() || 'a343b324-23b9-4724-b44e-875be1319d08',            PartnerId: self.partnerId,        },        BotName: botName || '',        // first message        Text: message.text,        Role: 'Customer',        Attributes: self.getAttributes(botName, null, context.attributes, context.dynamicAttributes),        PriceSelectionPolicyId: context.pricePolicy,        forcedCurrency: getForcedCurrency()    };    return this.performRequest(RequestType.CreateChat, data).thenSuccess(mapMessage);};VAServerClient.prototype.getChat = function (chatId) {    return this        .performRequest(RequestType.GetChat, { ChatId: chatId })        .thenSuccess(mapChat);};VAServerClient.prototype.postMessage = function (chatId, messageObj, botName) {    var self = this;    var data = {        ChatId: chatId,        Text: messageObj.text,        Role: 'Customer',        BotName: botName || '',        Attributes: self.getAttributes(botName, messageObj.attributes ? messageObj.attributes.MessageCounter : '')    };    return this        .performRequest(RequestType.PostMessage, data)        .thenSuccess(function (response) {            if (response.data.PaymentUrl) window.redirectURL = response.data.PaymentUrl; //window.redirectURL?            return mapMessage(response);        });};VAServerClient.prototype.completeChat = function (chatId, reason, messageObj, botName) {    var self = this;    var data = messageObj && messageObj.text        ? {            ChatId: chatId,            CompleteReason: reason,            Text: messageObj.text || '',            Role: 'Customer',            Attributes: self.getAttributes(botName, messageObj.attributes ? messageObj.attributes.MessageCounter : '')        }        : {            ChatId: chatId,            CompleteReason: reason        };    return this        .performRequest(RequestType.CompleteChat, data)        .thenSuccess(function (response) {            return {                paymentUrl: response.data.PaymentUrl,                paidTrialMembershipInfo: mapPaidTrialInfo(response)            };        });};VAServerClient.prototype.restoreChat = function (chatId, params) {    var data = {        ChatId: chatId    };    if (params && params.botName) {        data.BotName = params.botName;    }    return this.performRequest(RequestType.RestoreChat, data).thenSuccess(mapChat);};VAServerClient.prototype.performRequest = function (remoteMethod, data) {    var url = this.servicePath;    data.partner = this.partner;    // wrap it up in a req object    data = {        jsonrpc: '2.0',        method: remoteMethod.methodName,        params: data    };    var type = remoteMethod.numericId;    return this.send(url, 'POST', data, type);};VAServerClient.prototype.send = function (path, method, data, type) {    var self = this;    var requestMethod = method || 'GET';    var requestBody = '';    var requestPath = path;    var requestHeaders = [];    if (requestMethod === 'POST') {        requestBody = JSON.stringify(data);        requestHeaders = { 'Content-Type': 'application/json; charset=utf-8' };    } else {        requestPath = addParametersToUrlFromKeyValue(path, data);    }    var request = {        url: requestPath,        method: requestMethod,        body: requestBody,        headers: requestHeaders,        timeout: self.requestTimeout    };    return sendRequest({ request: request, data: data, type: type }).thenFailure(function(reqErrType){        self.trigger('RequestFailure', reqErrType);    }).thenRequestPerformed(function(nameAndTime){        self.trigger('RequestPerformed', nameAndTime);    }).thenResponseParsingFailed(function(err){        self.trigger('ResponseParsingFailed', err);    });};VAServerClient.prototype.getVisitorGuid = function () {    return cookie.get('PlatformAgnostincTrackingVisitorGUID') || cookie.get('JAAnonymousGUID') || getGuidFromJaCookie();};function getForcedCurrency() {    return cookie.get('ForcedCurrencyCode');}VAServerClient.prototype.getAttributes = function(botName, messageCounter, contextAttributes, dynamicContextAttributes) {    var attributeCollection = {        Attributes: [{            Key: 'botName',            Value: botName || ''        }, {            Key: 'messageCounter',            Value: messageCounter || 0        }]    };    attributeCollection.Count = attributeCollection.Attributes.length;    for (var attribute in contextAttributes) {        var attributeValue = contextAttributes[attribute];        if (attributeValue !== undefined) {            appendAttributeToCollection(attributeCollection, attribute, attributeValue);        }    }    if (dynamicContextAttributes && dynamicContextAttributes.length) {        for (var i = 0; i < dynamicContextAttributes.length; i++) {            var attributeValue = getDynamicAttributeValue(dynamicContextAttributes[i]);            appendAttributeToCollection(attributeCollection, dynamicContextAttributes[i].name, attributeValue);        }    }    return attributeCollection;};function mapChat(response) {       var data = response.data;    return {        chatId: data.ChatId,        type: data.Type,        locationUrl: data.LocationUrl,        initialCategoryId: data.InitialCategoryId,        status: data.Status,        completionReason: data.CompleteReason,        paymentUrl: data.PaymentUrl,        order: data.Order ? {            id: data.Order.Id,            chatId: data.Order.ChatId,            product: data.Order.Product,            price: data.Order.Price,            currencyIsoNumber: data.Order.CurrencyISONumber,            currencyIso3LetterCode: data.Order.CurrencyIso3LetterCode,            questionDetails: data.Order.QuestionDetails ? {                categoryId: data.Order.QuestionDetails.CategoryId,                questionId: data.Order.QuestionDetails.QuestionId,                preferences: data.Order.QuestionDetails.Preferences && data.Order.QuestionDetails.Preferences.Preferences            } : {}        } : {},        attributes: normalizeAttributes(data.Attributes),        messages: (function () {            var messages = [];            for (var i = 0; i < data.Messages.length; i++) {                messages.push({                    messageId: data.Messages[i].MessageId,                    relatedMessageId: data.Messages[i].RelatedMessageId,                    role: data.Messages[i].Role,                    text: data.Messages[i].Text,                    attributes: normalizeAttributes(data.Messages[i].Attributes)                });            }            return messages;        }()),        count: data.Count || data.Messages.length,        profile: mapProfile(data.Profile || data)    };}function mapProfile(data) {    return {        avatar: data.AvatarUrl,        greeting: data.Greeting,        name: data.Name,        title: data.Title,        details: data.ProfileDetails,        connectionFailureMessageHeader: data.ConnectionFailureMessageHeader,        connectionFailureMessageBody: data.ConnectionFailureMessageBody,        connectionRetryMessageHeader: data.ConnectionRetryMessageHeader,        connectionRetryMessageBody: data.ConnectionRetryMessageBody    };}function mapMessage(response) {    var data = response.data;    return {        text: data.Text,        chatId: data.ChatId,        attributes: normalizeAttributes(data.Attributes),        paymentUrl: data.PaymentUrl    };}function mapPaidTrialInfo(response) {    var data = response.data;    try {        if (data && data.Attributes && data.Attributes.Attributes) {            for (var index = 0; index < data.Attributes.Attributes.length; index++) {                var element = data.Attributes.Attributes[index];                if (element.Key === 'paidTrialMembershipInfo') {                    return JSON.parse(element.Value);                }            }        }    } catch (ex) { }    return null;}function normalizeAttributes(attributes) {    var res = {};    var attrs = attributes || { Attributes: [] };    for (var i = 0; i < attrs.Attributes.length; i++) {        res[attrs.Attributes[i].Key] = attrs.Attributes[i].Value;    }    return res;}function addParametersToUrlFromKeyValue(path, data) {    var params = '';    var url = path;    var key,        value;    if (data) {        for (key in data) {            if (data.hasOwnProperty(key)) {                value = data[key];                params += key + '=' + value + '&';            }        }        if (params.length > 0) {            if (url.indexOf('?') > -1) {                url += '&';            } else {                url += '?';            }            url += params.substring(0, params.length - 1);        }    }    return url;}function getGuidFromJaCookie(){    var jaCookieValue = cookie.get('JA');    if(jaCookieValue){        var regExp = /guid=([\w-]+)/;        var match = regExp.exec(jaCookieValue);        if(match) return match[1];    }    return '';}function getUrlReplacementAttributeValue(attribute) {    if (!window || !window.location) {        return undefined;    }    var regex = new RegExp(attribute.expression, 'g');    var replacedValue = window.location.pathname.replace(regex, attribute.replacementValue);    var result = replacedValue.trim();    return result;}function getUrlParameterAttributeValue(attribute) {    if (!window || !window.location) {        return undefined;    }    var regex = new RegExp('[?&]' + attribute.parameterName + '=([^&#]*)', 'i');    var matched = window.location.search.match(regex);    var matchedResult = matched && matched[1] && window.decodeURI(matched[1]);    if (matchedResult) {        return matchedResult;    }    return attribute.defaultValue || '';}function getDynamicAttributeValue(attribute) {    switch (attribute.type) {        case 'pathnameReplacement':            return getUrlReplacementAttributeValue(attribute);        case 'urlParameter':            return getUrlParameterAttributeValue(attribute);        default:            throw new Error('Unknown dynamic attribute type: "' + attribute.type + '"');    }}function appendAttributeToCollection(collection, attributeName, attributeValue) {    collection.Attributes.push({        Key: attributeName,        Value: attributeValue    });    collection.Count++;}},{"./sendRequest":7,"ja-cookie":13,"ja-event":83,"ja-utils":17}],5:[function(require,module,exports){module.exports = function createChainingEvents(prototype, names) {    for (var i = 0; i < names.length; i++) {        subscribe(names[i])    }    function subscribe(name) {        prototype["then" + name] = function (cb) {            this.callbacks[name] = this.callbacks[name] || [];            this.callbacks[name].push(cb);            return this;        }        prototype["trigger" + name] = function () {            var callbacks = this.callbacks[name] || [];            var response = arguments;            var callbackResult = null;                        for (var i = 0; i < callbacks.length; i++) {                callbackResult = callbacks[i].apply(this, response);                response = callbackResult ? [callbackResult] : response;            }        };    }}},{}],6:[function(require,module,exports){module.exports = ChatClient;var events = require('ja-event');var utils = require('ja-utils');var VAServerClient = require('./VAServerClient');var HardCodedChatClient = require('./HardCodedChatClient');function ChatClient(config) {    if (!(this instanceof ChatClient)) return new ChatClient(config);    config = config || {};    var Client = getClientType(config.endpoint || '/processes/funnel/VirtualAssistantService.asmx/');    var client = new Client(config);    utils.mixin(this, client);}ChatClient.hardCodedEndpoint = 'HardCodedChat';function getClientType(endpoint) {    if (endpoint === '/processes/funnel/VirtualAssistantService.asmx/') throw new Error('Legacy ASMX client is no longer supported');    else if (endpoint === ChatClient.hardCodedEndpoint) return HardCodedChatClient;    return VAServerClient;}utils.mixin(ChatClient, events); },{"./HardCodedChatClient":3,"./VAServerClient":4,"ja-event":83,"ja-utils":17}],7:[function(require,module,exports){var ajax = require('ja-ajax');var createChainingEvents = require('./chainingEvents');module.exports = function sendRequest(options) {    return new ChatRequest().send(options);}function ChatRequest() {    this.callbacks = [];    return this;}createChainingEvents(ChatRequest.prototype, ['Success', 'Failure', 'RequestPerformed', 'ResponseParsingFailed']);ChatRequest.prototype.retry = function () {    var options = this.lastOptions;    delete this.lastOptions;    return this.send(options);}ChatRequest.prototype.send = function (options) {    var startTime = new Date().getTime();    var self = this;    self.lastOptions = options;    options && options.request && ajax(options.request, function (error, resp, body) {        var requestTime = new Date().getTime() - startTime;        var responseData = error ? null : self.parseResponse(body);        if (!responseData) {            self.triggerFailure({ request: self, error: error, type: options.type });        } else {            delete self.lastOptions;            self.triggerSuccess({ data: responseData });        }        self.triggerRequestPerformed({            name: options.data.method,            time: requestTime        });    });    return self;}ChatRequest.prototype.parseResponse = function (body) {    try {        return JSON.parse(body).result;    } catch (e) {        this.triggerResponseParsingFailed(e);    }};},{"./chainingEvents":5,"ja-ajax":1}],8:[function(require,module,exports){module.exports={    "cars": {        "assistantName": "Peter Wilson",        "assistantTitle": "Fachassistent",        "messages": [            "Hallo und willkommen bei unserem Online-Autoservice. Beschreiben Sie bitte Ihr Anliegen in wenigen Worten:",            "Was haben Sie bisher zur Problemlösung versucht?",            "Vielen Dank. Gibt es noch weitere Details, die Sie dem Kfz-Mechaniker mitteilen wollen?",            "Ok. Ich werde den Experten über Ihre Situation informieren. Gehen Sie bitte zur nächsten Seite und vervollständigen die Zahlungsinformationen, danach verbinde ich Sie mit dem Experten."        ]    },    "tech": {        "assistantName": "Pia Wilson",        "assistantTitle": "Assistentin des Experten",        "messages": [            "Hallo! Wie kann ich Ihnen helfen?",            "Was haben Sie bisher zur Problemlösung versucht?",            "Vielen Dank. Gibt es noch weitere Details, die Sie dem Spezialisten mitteilen wollen?",            "Ok. Ich werde den Experten über Ihre Situation informieren. Gehen Sie bitte zur nächsten Seite und vervollständigen die Zahlungsinformationen, danach verbinde ich Sie mit dem Experten."        ]    },    "hi": {        "assistantName": "Pia Wilson",        "assistantTitle": "Fachassistentin",        "messages": [            "Hallo und willkommen bei unserem Online-Heimwerkservice. Beschreiben Sie bitte Ihr Anliegen in wenigen Worten:",            "Was haben Sie bisher zur Problemlösung versucht?",            "Vielen Dank. Gibt es noch weitere Details, die Sie dem Heimwerker mitteilen wollen?",            "Ok. Ich werde den Experten über Ihre Situation informieren. Gehen Sie bitte zur nächsten Seite und vervollständigen die Zahlungsinformationen, danach verbinde ich Sie mit dem Experten."        ]    },    "law": {        "assistantName": "Pia Wilson",        "assistantTitle": "Fachassistentin",        "messages": [            "Hallo und willkommen bei unserem Online-Anwaltservice. Beschreiben Sie bitte Ihr Anliegen in wenigen Worten:",            "In welchem Bundesland leben Sie?",            "Vielen Dank. Gibt es noch weitere Details, die Sie dem Anwalt mitteilen wollen?",            "Ok. Ich werde den Anwalt über Ihre Situation informieren. Gehen Sie bitte zur nächsten Seite und vervollständigen die Zahlungsinformationen, danach verbinde ich Sie mit dem Anwalt."        ]    },    "health": {        "assistantName": "Pia Wilson",        "assistantTitle": "Fachassistentin",        "messages": [            "Hallo und willkommen bei unserem Online-Medizinservice. Beschreiben Sie bitte Ihr Anliegen in wenigen Worten:",            "Bitte nennen Sie mir Ihr Alter, Geschlecht und Medikamente, die Sie einnehmen.",            "Vielen Dank. Gibt es noch weitere Details, die Sie dem Arzt mitteilen wollen?",            "Ok. Ich werde den Experten über Ihre Situation informieren. Gehen Sie bitte zur nächsten Seite und vervollständigen die Zahlungsinformationen, danach verbinde ich Sie mit dem Experten."        ]    },    "business": {        "assistantName": "Pia Wilson",        "assistantTitle": "Fachassistentin",        "messages": [            "Hallo und willkommen bei unserem Online-Steuerservice. Beschreiben Sie bitte Ihr Anliegen in wenigen Worten:",            "In welchem Bundesland leben Sie?",            "Vielen Dank. Gibt es noch weitere Details, die Sie dem Steuerberater mitteilen wollen?",            "Ok. Ich werde den Experten über Ihre Situation informieren. Gehen Sie bitte zur nächsten Seite und vervollständigen die Zahlungsinformationen, danach verbinde ich Sie mit dem Experten."        ]    },    "pets": {        "assistantName": "Pia Wilson",        "assistantTitle": "Fachassistentin",        "messages": [            "Hallo und willkommen bei unserem Online-Tiermedizinservice. Beschreiben Sie bitte Ihr Anliegen in wenigen Worten:",            "Nennen Sie mir bitte Alter, Geschlecht und Rasse Ihres Haustiers.",            "Vielen Dank. Gibt es noch weitere Details, die Sie dem Tierarzt mitteilen wollen?",            "Ok. Ich werde den Experten über Ihre Situation informieren. Gehen Sie bitte zur nächsten Seite und vervollständigen die Zahlungsinformationen, danach verbinde ich Sie mit dem Experten."        ]    },    "general": {        "assistantName": "Pia Wilson",        "assistantTitle": "Fachassistentin",        "messages": [            "Hallo! Wie kann ich Ihnen helfen?",            "In welchem Bundesland leben Sie?",            "Vielen Dank. Gibt es noch weitere Details, die Sie dem Experten mitteilen wollen?",            "Ok. Ich werde den Experten über Ihre Situation informieren. Gehen Sie bitte zur nächsten Seite und vervollständigen die Zahlungsinformationen, danach verbinde ich Sie mit dem Experten."        ]    }}},{}],9:[function(require,module,exports){module.exports={    "cars": {        "assistantName": "Luis P.",        "assistantTitle": "Asistente del mecánico",        "messages": [            "¡Hola! ¿Qué le ocurre a tu coche?",            "¿Qué has intentado hacer hasta ahora para resolver el problema?",            "¿Hay alguna otra cosa que quieras que sepa el mecánico?",            "De acuerdo. Voy a ponerte en contacto ahora con un mecánico. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al mecánico tu problema, para que te pueda ayudar mejor."        ]    },    "tech": {        "assistantName": "Laura P.",        "assistantTitle": "Asistente del técnico",        "messages": [            "¡Hola! ¿Puedo ayudarte a aclarar alguna duda?",            "¿Qué has intentado hacer hasta ahora para resolver el problema?",            "¿Hay alguna otra cosa que quieras que sepa el técnico?",            "De acuerdo. Voy a ponerte en contacto ahora con un técnico. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al técnico tu problema, para que te pueda ayudar mejor."        ]    },    "law": {        "assistantName": "Laura P.",        "assistantTitle": "Asistente del abogado",        "messages": [            "¡Hola! ¿Puedo ayudarte a resolver una duda legal?",            "¿En qué lugar te encuentras? En cuestiones legales, siempre es importante saberlo, porque las normativas y leyes varían.",            "¿Hay algúna otra cosa que quieras que sepa el abogado?",            "De acuerdo. Voy a ponerte en contacto ahora con un abogado. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al abogado tu problema, para que te pueda ayudar mejor."        ]    },    "health": {        "assistantName": "Laura P.",        "assistantTitle": "Asistente del médico",        "messages": [            "¡Hola! ¿Puedo ayudarte a aclarar alguna duda médica?",            "¿Cuánto tiempo hace que ocurre esto?",            "¿Hay algún otro detalle que crees que el médico debería saber?",            "De acuerdo. Voy a ponerte en contacto ahora con un médico. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al médico tu problema, para que te pueda ayudar mejor."        ]    },    "pets": {        "assistantName": "Laura P.",        "assistantTitle": "Asistente del veterinario",        "messages": [            "¡Hola! ¿Qué le ocurre a tu mascota?",            "¿Cuánto tiempo hace que le ocurre esto?",            "¿Hay algún otro detalle que crees que el veterinario debería saber?",            "De acuerdo. Voy a ponerte en contacto ahora con un veterinario. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al veterinario tu problema, para que te pueda ayudar mejor."        ]    },    "general": {        "assistantName": "Laura P.",        "assistantTitle": "Asistente del experto",        "messages": [            "¡Hola! ¿Puedo ayudarte a aclarar alguna duda?",            "¿Qué has intentado hacer hasta ahora para resolver el problema?",            "¿Hay alguna otra cosa que quieras que sepa el experto?",            "De acuerdo. Voy a ponerte en contacto ahora con un experto. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al experto tu problema, para que te pueda ayudar mejor."        ]    },    "business": {        "assistantName": "Laura P.",        "assistantTitle": "Asistente del experto",        "messages": [            "¡Hola! ¿Puedo ayudarte a aclarar alguna duda?",            "¿Qué has intentado hacer hasta ahora para resolver el problema?",            "¿Hay alguna otra cosa que quieras que sepa el experto?",            "De acuerdo. Voy a ponerte en contacto ahora con un experto. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al experto tu problema, para que te pueda ayudar mejor."        ]    },    "homework": {        "assistantName": "Laura P.",        "assistantTitle": "Asistente del experto",        "messages": [            "¡Hola! ¿Puedo ayudarte a aclarar alguna duda?",            "¿Qué has intentado hacer hasta ahora para resolver el problema?",            "¿Hay alguna otra cosa que quieras que sepa el experto?",            "De acuerdo. Voy a ponerte en contacto ahora con un experto. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al experto tu problema, para que te pueda ayudar mejor."        ]    },    "hi": {        "assistantName": "Laura P.",        "assistantTitle": "Asistente del técnico",        "messages": [            "¡Hola! ¿Puedo ayudarte a aclarar alguna duda?",            "¿Qué has intentado hacer hasta ahora para resolver el problema?",            "¿Hay alguna otra cosa que quieras que sepa el técnico?",            "De acuerdo. Voy a ponerte en contacto ahora con un técnico. Mientras introduces tus datos y la información de pago en una página segura, iré explicando al técnico tu problema, para que te pueda ayudar mejor."        ]    }}},{}],10:[function(require,module,exports){module.exports={    "cars": {        "assistantName": "大村真珠",        "assistantTitle": "整備士アシスタント",        "messages": [            "こんにちは、お車のことで何かお困りですか？",            "了解しました。お車の車種と年式を教えていただけますか？",            "ありがとうございます。上記の他に、整備士に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当の整備士にお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、整備士におつなぎいたします。"        ]    },    "hi": {        "assistantName": "大村真珠",        "assistantTitle": "専門家アシスタント",        "messages": [            "こんにちは、家の修理やDIYで何かお困りですか？",            "了解しました。何かご自身で試されたことはありますか？",            "ありがとうございます。上記の他に、専門家に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当の専門家にお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、専門家におつなぎいたします。"        ]    },    "law": {        "assistantName": "大村真珠",        "assistantTitle": "リーガルアシスタント",        "messages": [            "こんにちは、法律のことで何かお悩みですか？",            "了解しました。お住まいの都道府県を教えていただけますか？",            "ありがとうございます。上記の他に、弁護士に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当の法律の専門家にお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、法律の専門家におつなぎいたします。"        ]    },    "health": {        "assistantName": "大村真珠",        "assistantTitle": "医師アシスタント",        "messages": [            "こんにちは、病気や体調不良のことで何かお悩みですか？",            "了解しました。恐れ入りますが、年齢と性別、既往歴、服用中のお薬があれば教えていただけますか？",            "ありがとうございます。上記の他に、医師に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当の医師にお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、医師におつなぎいたします。"        ]    },    "business": {        "assistantName": "大村真珠",        "assistantTitle": "専門家アシスタント",        "messages": [            "こんにちは、税金やその他お金に関することで何かお悩みですか？",            "了解しました。お住まいの都道府県を教えていただけますか？",            "ありがとうございます。上記の他に、専門家に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当の専門家にお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、専門家におつなぎいたします。"        ]    },    "pets": {        "assistantName": "大村真珠",        "assistantTitle": "獣医師アシスタント",        "messages": [            "こんにちは。ペットの体調や病気のことで何かお悩みですか？",            "了解しました。ペットの年齢と性別、既往歴、服用中のお薬があれば教えていただけますか？",            "ありがとうございます。上記の他に、獣医に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当の獣医にお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、獣医におつなぎいたします。"        ]    },    "general": {        "assistantName": "大村真珠",        "assistantTitle": "専門家アシスタント",        "messages": [            "何かお悩みですか？専門家がこちらでお伺いいたします。",            "ありがとうございます。上記の他に、専門家に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当の専門家にお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、専門家におつなぎいたします。"        ]    },    "tech": {        "assistantName": "大村真珠",        "assistantTitle": "テックサポートアシスタント",        "messages": [            "こんにちは、何かお困りですか？テクニカルサポートがこちらでお伺いいたします。",            "了解しました。何かご自身で試されたことはありますか？",            "ありがとうございます。上記の他に、テクニカルサポート専門家に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当のテクニカルサポートにお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、テクニカルサポートにおつなぎいたします。"        ]    },    "homework": {        "assistantName": "大村真珠",        "assistantTitle": "専門家アシスタント",        "messages": [            "何かお悩みですか？専門家がこちらでお伺いいたします。",            "ありがとうございます。上記の他に、専門家に事前に伝えておきたいことはありますか？",            "かしこまりました。ご入力いただきました内容は確実に担当の専門家にお伝えいたします。次のページにお進みください。お支払い方法をご入力いただきましたら、専門家におつなぎいたします。"        ]    }}},{}],11:[function(require,module,exports){module.exports={    "general": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Expert's Assistant",        "messages": [            "Welcome! How can I help with your question?",            "How long has this been going on? What have you tried so far?",            "Anything else we should know to help you?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "cars": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Mechanic's Assistant",        "messages": [            "Welcome! What's going on with your car?",            "What have you tried so far? Are you fixing your vehicle yourself?",            "Anything else you want the Mechanic to know before I connect you?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "tech": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Technician's Assistant",        "messages": [            "Welcome! What's going on with your computer?",            "How long has this been going on? What have you tried so far?",            "Anything else you want the Technician to know before I connect you?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "hi": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Contractor's Assistant",        "messages": [            "Welcome! How can I help with your home repair question?",            "How long has this been going on? What have you tried so far?",            "Anything else you want the Contractor to know before I connect you?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "law": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Lawyer's Assistant",        "messages": [            "Welcome! How can I help with your legal question?",            "Have you spoken to an attorney about this?",            "What other steps have you taken so far?",            "Anything else you want the Lawyer to know before I connect you?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "health": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Doctor's Assistant",        "messages": [            "Welcome! How can I help with your medical question?",            "The Doctor can help. Just a couple quick questions before I transfer you. What are your symptoms? Have you used any medication for this?",            "Have you seen a doctor about this?",            "Anything else in your medical history you think the Doctor should know?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "business": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Expert's Assistant",        "messages": [            "Welcome! How can I help with your tax question?",            "Have you talked to a tax professional about this?",            "Anything else you want the Accountant to know before I connect you?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "pets": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Veterinarian's Assistant",        "messages": [            "Welcome! What's going on with your pet or animal?",            "I'll do all I can to help. Can you tell me a little bit more about what's going on? ",            "When were they last seen by a vet? Are they taking any medications?",            "Anything else you want the Veterinarian to know before I connect you?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "homework": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Expert's Assistant",        "messages": [            "Welcome! How can I help with your homework question?",            "The Tutor can help you get an A on your homework or ace your next test. Tell me more about what you need help with so we can help you best.",            "Is there anything else the Tutor should be aware of?",            "OK. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    }}},{}],12:[function(require,module,exports){module.exports={    "general": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! How can I help with your question?",            "How long has this been going on? What have you tried so far?",            "Anything else we should know to help you?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "appraisals": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! How can I help with your appraisal question?",            "Do you know how old the piece is? What condition is it in?",            "The Appraiser can help. You can also send photos once I've connected you. Before I do, is there anything else they should know?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "car": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! What's going on with your car?",            "What have you tried so far? Are you fixing your vehicle yourself?",            "Anything else you want the Mechanic to know before I connect you?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "computer": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! What's going on with your computer?",            "What's the brand and model of your computer? And the Operating System (OS)?",            "How long has this been going on? What have you tried so far?",            "Anything else you want the Technician to know before I connect you?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "consumer electronics": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! How can I help with your electronics question?",            "What's the brand and model of your product?",            "How long has this been going on? What have you tried so far?",            "Anything else you want the Technician to know before I connect you?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "home improvement": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! How can I help with your home repair question?",            "How long has this been going on? What have you tried so far?",            "Anything else you want the Contractor to know before I connect you?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "legal": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! How can I help with your legal question?",            "Have you spoken to an attorney about this?",            "What other steps have you taken so far?",            "Anything else you want the Lawyer to know before I connect you?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "medical": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! How can I help with your medical question?",            "The Doctor can help. Just a couple quick questions before I transfer you. What are your symptoms? Have you used any medication for this?",            "Have you seen a doctor about this?",            "Anything else in your medical history you think the Doctor should know?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "tax": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! How can I help with your tax question?",            "Have you talked to a tax professional about this?",            "Anything else you want the Accountant to know before I connect you?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two. "        ]    },    "homework":{        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! How can I help with your homework question?",            "The Tutor can help you get an A on your homework or ace your next test. Tell me more about what you need help with so we can help you best.",            "Is there anything else the Tutor should be aware of?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    },    "veterinary": {        "assistantName": "Pearl Wilson",        "assistantTitle": "Assistant",        "messages": [            "Welcome! What's going on with your pet or animal?",            "I'll do all I can to help. Can you tell me a little bit more about what's going on?",            "When were they last seen by a vet? Are they taking any medications?",            "Anything else you want the Veterinarian to know before I connect you?",            "OK. Got it. I'm sending you to a secure page to join JustAnswer. While you're filling out that form, I'll tell the Expert about your situation and then connect you two."        ]    }}    },{}],13:[function(require,module,exports){var cookie = require('cookies-js');cookie.getSharedJaDomain = function() {    // returns JA domain based on url common for my and www so cookie will be shared between both    var hostParts = location.hostname.split('.'),        domain = "";    for (var i = hostParts.length - 1; i > 0 && i > hostParts.length - 4; i--) {        domain = "." + hostParts[i] + domain;    }    return domain;};module.exports = cookie;},{"cookies-js":47}],14:[function(require,module,exports){var utils = require('ja-utils');exports.append = function(to, el) {    var tempNode;    if (!to) {        return null;    }    if (utils.isString(to)) {        to = document.querySelector(to);    }    if (exports.isNodeList(to)) {        to = to[0];    }    if (utils.isString(el)) {        if (exports.isElement(to)) {            el = to.insertAdjacentHTML('beforeend', el);        } else {            tempNode = document.createElement('div');            tempNode.innerHTML = el;            while (tempNode.firstChild) {                to.appendChild(tempNode.firstChild);            }            el = to;        }    } else {        if (utils.isArray(el) || exports.isNodeList(el)) {            var elAr = [];            for (var i = 0; i < el.length; i++) {                elAr.push(exports.append(to, el[i]));            }            el = elAr;        } else {            el = to.appendChild(el);        }    }    return el;};exports.createEl = function(el, options /*, content*/) {    var el = document.createElement(el);    var text = options.text;    var html = options.html;    if (text || text === '') {        el.textContent = text;    }    if (html || html === '') {        el.innerHTML = html;    }    for (var i in options) {        switch (i) {            case 'className':                el.setAttribute('class', options[i]);                break;            case 'text':            case 'html':                break;            default:                el.setAttribute(i, options[i]);                break;        }    }    return el;};exports.h = exports.createEl;exports.html = exports.createEl;exports.createElement = exports.createEl;exports.addCls = function(el, cls) {    if (!(el && cls)) return false;    if (!exports.hasClass(el, cls)) {        el.className += ' ' + cls;    }    return el;};exports.addClass = exports.addCls;exports.removeCls = function(el, cls) {    if (!(el && cls)) return false;    if (el.classList) {        el.classList.remove(cls);    } else {        el.className = el.className.replace(            new RegExp('(^|\\b)' + cls.split(' ').join('|') + '(\\b|$)', 'gi'),            ' '        );    }    return el;};exports.removeClass = exports.removeCls;exports.hasCls = function(el, cls) {    if (!(el && cls)) {        return false;    }    if (el.classList) {        return el.classList.contains(cls);    } else if (el.className) {        var res = el.className.split(' ').filter(function(clss) {            return cls === clss;        });        return !!res.length === 0;    }};exports.hasClass = exports.hasCls;exports.isElement = function(o) {    return typeof HTMLElement === 'object'        ? o instanceof HTMLElement        : o &&              typeof o === 'object' &&              o !== null &&              o.nodeType === 1 &&              typeof o.nodeName === 'string';};exports.isEl = exports.isElement;exports.isNode = function(o) {    return typeof Node === 'object'        ? o instanceof Node        : o &&              typeof o === 'object' &&              typeof o.nodeType === 'number' &&              typeof o.nodeName === 'string';};exports.isNodeList = function(o) {    //var result = Object.prototype.toString.call(o);    if (        (typeof o === 'object' || typeof o === 'function') /*Phantom hack*/ &&        o.length !== undefined    ) {        return true;    } else {        return false;    }};exports.swapToggle = function(o) {    // var result = ''//Object.prototype.toString.call(o);    if (typeof o === 'object' && o.length !== undefined) {        return true;    }};exports.toggleCls = function(element, className, condition) {    if (condition !== false || condition === undefined) {        if (element.classList) {            element.classList.toggle(className);        } else {            var classes = element.className.split(' ');            var existingIndex = classes.indexOf(className);            if (existingIndex >= 0) {                classes.splice(existingIndex, 1);            } else {                classes.push(className);            }            element.className = classes.join(' ');        }    }};exports.toggleClass = exports.toggleCls;exports.isVisible = function(element) {    if (!element) {        return false;    }    return !!(        element.offsetWidth ||        element.offsetHeight ||        element.getClientRects().length    );};exports.bindEvent = function(element, evt, callback) {    if (element.addEventListener) {        element.addEventListener(evt, callback, false);    } else if (element.attachEvent) {        element.attachEvent('on' + evt, callback);    }};},{"ja-utils":17}],15:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');function VirtualAssistantManager(target, chatWindowClass, teaserWindowClass) {    if (!(this instanceof VirtualAssistantManager))        return new VirtualAssistantManager(target);    var virtualAssistantManager = this;    virtualAssistantManager.target = target;    virtualAssistantManager.teaserWindowClass = teaserWindowClass;    virtualAssistantManager.chatWindowClass = chatWindowClass;    virtualAssistantManager.isToggleEventSet = false;    virtualAssistantManager.isMultiGadget = true;    virtualAssistantManager.appliedZIndex = 0;    virtualAssistantManager.appliedHeight = 0;    return virtualAssistantManager;}VirtualAssistantManager.prototype.initialize = function () {    this.applyChanges(this);    this.createObserver();    this.observe();};VirtualAssistantManager.prototype.observe = function () {    this.observer.observe(document, {        childList: true,        subtree: true,    });};VirtualAssistantManager.prototype.createObserver = function () {    var self = this;    this.observer = new MutationObserver(function (mutations, me) {        self.applyChanges(self);    });};VirtualAssistantManager.prototype.isGadgetMinimized = function () {    return this.teaserWindowClass ? this.target.querySelector('.th-chat-window.hidden') : this.target.querySelector('.th-chat-window.minimized');};VirtualAssistantManager.prototype.isGadgetAppeared = function (    teaserWindow,    chatWindow) {    return (!this.teaserWindowClass || teaserWindow) && chatWindow;};VirtualAssistantManager.prototype.applyChanges = function (self) {    var teaserWindow = self.target.querySelector(self.teaserWindowClass);    var chatWindow = self.target.querySelector(self.chatWindowClass);    if (self.isGadgetAppeared(teaserWindow, chatWindow)) {        if (!self.isToggleEventSet && self.isMultiGadget) {            if (self.isMultiGadgetState()) {                self.isToggleEventSet = self.eventToggleChat(chatWindow);            } else {                self.isMultiGadget = false;            }        }        if (self.isGadgetMinimized()) {            var resultData = self.checkGadgetOverlapped(                self.teaserWindowClass                    ? teaserWindow.querySelector('.image').getBoundingClientRect()                    : chatWindow.getBoundingClientRect()            );            if (resultData.IsOverlapped) {                self.setStyles(                    teaserWindow,                    chatWindow,                    resultData.Height,                    resultData.ZIndex                );            }        }    }};VirtualAssistantManager.prototype.checkGadgetOverlapped = function (    visibleRect) {    var pageElements = document.body.querySelectorAll(        'body > div:not(.' +            this.target.className.split(' ')[0] +            '), span:not(.badge):not(.name), center, center > div'    );    var maxHeight = 0;    var maxZIndex = 0;    var isOverlapped = false;    for (let i = 0; i < pageElements.length; ++i) {        var zindex = this.getZIndex(pageElements[i]);        if (zindex > 0) {            var elementRect = pageElements[i].getBoundingClientRect();            if (                elementRect.bottom == window.innerHeight ||                (visibleRect && this.isOverlapped(visibleRect, elementRect))            ) {                isOverlapped = true;                maxHeight = Math.max(elementRect.height, maxHeight, this.appliedHeight);                maxZIndex = Math.max(zindex, maxZIndex, this.appliedZIndex);            }        }    }    return {        IsOverlapped: isOverlapped,        Height: maxHeight,        ZIndex: maxZIndex,    };};VirtualAssistantManager.prototype.setStyles = function (    teaserWindow,    chatWindow,    height,    zIndex) {    if (teaserWindow) {        var teaserRect = teaserWindow.getBoundingClientRect();        if ((height + teaserRect.height) * 2 < window.innerHeight) {            teaserWindow.style.cssText = 'bottom: ' + height + 'px!important';        } else {            teaserWindow.style.cssText = 'z-index: ' + ++zIndex + '!important';        }    }    chatWindow.style.cssText =        'z-index: ' +        ++zIndex +        '!important; bottom: ' +        height +        'px!important';    this.appliedZIndex = ++zIndex;    this.appliedHeight = height;};VirtualAssistantManager.prototype.isOverlapped = function (element1, element2) {    return !(        element1.right < element2.left ||        element1.left > element2.right ||        element1.bottom < element2.top ||        element1.top > element2.bottom    );};VirtualAssistantManager.prototype.getZIndex = function (element) {    if (this.isElement(element)) {        var computedStyle = getComputedStyle(element);        if (computedStyle) {            var value = computedStyle.getPropertyValue('z-index');            if (isNaN(value)) return this.getZIndex(element.parentNode);            return value;        }    }    return 0;};VirtualAssistantManager.prototype.isMultiGadgetState = function () {    var headers = document.getElementsByClassName('th-chat-header');    return headers.length > 1;};VirtualAssistantManager.prototype.eventToggleChat = function (chatWindow) {    var toggleButton = chatWindow.querySelector('.toggle-button');    if (toggleButton) {        toggleButton.addEventListener('click', function (e) {            e.view.chatView.chatWindow.header.trigger('toggleChat');        });        return true;    }    return false;};VirtualAssistantManager.prototype.isElement = function (o) {    return (      typeof HTMLElement === "object" ? o instanceof HTMLElement :      o && typeof o === "object" && o.nodeType === 1 && typeof o.nodeName==="string"    );}module.exports = VirtualAssistantManager;utils.mixin(VirtualAssistantManager, events);},{"ja-event":82,"ja-utils":17}],16:[function(require,module,exports){module.exports = {    fireImagePixel: function (url, config) {        if (!url || typeof (url) !== 'string') return;        config = config || {};        var comparison = config.partialMatching ? '*=' : '=';        var target = config.target && config.target.nodeType ? config.target : document.querySelector(config.target || 'body')        if (config.once && document.querySelector('img[src' + comparison + '"' + url + '"]') !== null) return;        var img = document.createElement('img');        img.src = url;        img.className = 'ja-pixel';        target.appendChild(img);        return img;    },    isBot: function (userAgent) {        return /bot|slurp|crawl|spider|robot/i.test(userAgent || window.navigator.userAgent);    }}},{}],17:[function(require,module,exports){/** * Some base Utility functions * @module Utils */var lflatten = require('lodash.flatten');var lcompose = require('lodash.compose');var lassign = require('lodash.assign');var lcurry = require('lodash.curry');var lchunk = require('lodash.chunk');var lIsEmpty = require('lodash.isempty');var lequal = require('is-equal');var Utils = {    toString: function(el) { return typeof el},    hasOwnProperty: Object.prototype.hasOwnProperty,    //lodash functions    compose: lcompose,    curry: lcurry,    chunk: lchunk,    flatten: lflatten,    assign: lassign,    extend:lassign,    mixin:lassign,    inherit:lassign,    //isEqual:lequal,    isEmpty:lIsEmpty,    // isObject:lIsObject,    isEqual:function(a,b){      if (a === b) {        return true      } else {        return lequal(a,b)      }    },    isArray: function(obj) {        return ('isArray' in Array) ? Array.isArray(obj) : (obj instanceof Array);    },    isString: function(obj) {        return typeof obj === 'string';    },    isFunction: function(obj) {        return typeof obj === 'function';    },    isObject: function(obj) {        return typeof obj === 'object';    },    capitaliseString: function(str) {        return str.charAt(0).toUpperCase() + str.slice(1);    },    isEmpty: function(obj) {        if (!obj) {            return true;        }        if (typeof obj.length === 'number') {            return obj.length < 1;        } else {            for (var i in obj) {                return false            }            return true        }    },    has: function(obj, key) {        return obj[key] //hasOwnProperty.call(obj, key);    },    mixin: function(target, source) {        if (!(source && target)) {            return target;        }        this.extend(            this.isFunction(target) && target.prototype || target,            this.isFunction(source) && source.prototype || source        );        return target;    },    extend: function(to, from) {        for (var key in from) {            to[key] = from[key];        }        return to;    }};module.exports = Utils;},{"is-equal":66,"lodash.assign":89,"lodash.chunk":90,"lodash.compose":91,"lodash.curry":92,"lodash.flatten":93,"lodash.isempty":94}],18:[function(require,module,exports){'use strict';module.exports = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = (config.class || 'th-chat-cta') + ' hidden';    var marketingMessageText = config.marketingMessageText || '';    var ctaButtonText = config.ctaButtonText || 'Continue';    return (        html('div', {className: classString}, [            html('div', {className: "marketing-text"}, [marketingMessageText]),            html('button', {className: "cta-button ja-buttons ja-medium"}, [ctaButtonText])        ])    );}},{"ja-dom-element":80}],19:[function(require,module,exports){'use strict';var events = require('ja-event');var utils = require('ja-utils');var dom = require('ja-dom');var tmpl = require('./th-chat-cta-tmpl.js');module.exports = ChatCta;function ChatCta(el) {    if (!(this instanceof ChatCta)) return new ChatCta(el);    el = el && el.nodeType ? el : document.querySelector(el);    if (!el) return;    var self = this;    var ctaButtonElement = document.querySelector('.cta-button');    this.ctaElement = document.querySelector('.th-chat-cta');    ctaButtonElement.addEventListener('click', function() {    	self.trigger('cta_button_clicked');    });}utils.mixin(ChatCta, events);ChatCta.prototype.show = function() {	dom.removeClass(this.ctaElement, 'hidden');	this.trigger('cta_is_shown');}ChatCta.tmpl = function (config) {    return tmpl(config);};},{"./th-chat-cta-tmpl.js":18,"ja-dom":14,"ja-event":83,"ja-utils":17}],20:[function(require,module,exports){/* istanbul ignore file *//** * Copyright (c) 2010 by Gabriel Birke *  * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the 'Software'), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: *  * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */(function (root, factory) {    if (typeof define === 'function' && define.amd) {        // AMD. Register as an anonymous module.        define(factory);    } else if (typeof exports === 'object') {        // Support Node.js specific `module.exports` (which can be a function)        if (typeof module === 'object' && typeof module.exports === 'object') {            exports = module.exports = factory();        }    } else {        // Browser globals        root.Sanitize = factory();    }}(this, function () {var Sanitize = function (){  var options = arguments[0] || {};  this.config = {};  this.config.elements = options.elements ? options.elements : [];  this.config.attributes = options.attributes ? options.attributes : {};  this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];  this.config.allow_comments = options.allow_comments ? options.allow_comments : false;  this.allowed_elements = {};  this.config.protocols = options.protocols ? options.protocols : {};  this.config.add_attributes = options.add_attributes ? options.add_attributes  : {};  this.dom = options.dom ? options.dom : document;  for(var i=0;i<this.config.elements.length;i++) {    this.allowed_elements[this.config.elements[i]] = true;  }  this.config.remove_element_contents = {};  this.config.remove_all_contents = false;  if(options.remove_contents) {        if(options.remove_contents instanceof Array) {      for(var k=0;k<options.remove_contents.length;k++) {        this.config.remove_element_contents[options.remove_contents[k]] = true;      }    }    else {      this.config.remove_all_contents = true;    }  }  this.transformers = options.transformers ? options.transformers : [];};Sanitize.REGEX_PROTOCOL = /^([A-Za-z0-9\+\-\.\&\;\*\s]*?)(?:\:|&*0*58|&*x0*3a)/i;// emulate Ruby symbol with string constantSanitize.RELATIVE = '__RELATIVE__';Sanitize.ALL = '__ALL__';Sanitize.prototype.clean_node = function(container) {  var fragment = this.dom.createDocumentFragment();  this.current_element = fragment;  this.whitelist_nodes = [];    /**   * Utility function to check if an element exists in an array   */  function _array_index(needle, haystack) {    for(var i=0; i < haystack.length; i++) {      if(haystack[i] == needle)         return i;    }    return -1;  }    function _merge_arrays_uniq() {    var result = [];    var uniq_hash = {};    for(var i=0;i<arguments.length;i++) {      if(!arguments[i] || !arguments[i].length)        continue;      for(var j=0;j<arguments[i].length;j++) {        if(uniq_hash[arguments[i][j]])          continue;        uniq_hash[arguments[i][j]] = true;        result.push(arguments[i][j]);      }    }    return result;  }    /**   * Clean function that checks the different node types and cleans them up accordingly   * @param elem DOM Node to clean   */  function _clean(elem) {    var clone;    switch(elem.nodeType) {      // Element      case 1:        _clean_element.call(this, elem);        break;      // Text      case 3:        clone = elem.cloneNode(false);        this.current_element.appendChild(clone);        break;      // Entity-Reference (normally not used)      case 5:        clone = elem.cloneNode(false);        this.current_element.appendChild(clone);        break;      // Comment      case 8:        if(this.config.allow_comments) {          clone = elem.cloneNode(false);          this.current_element.appendChild(clone);        }        break;      default:        if (console && console.log) console.log("unknown node type", elem.nodeType);        break;    }   }    function _clean_element(elem) {    var attr, attr_node, protocols, del, attr_ok;    var transform = _transform_element.call(this, elem);        var elem = transform.node;    var name = elem.nodeName.toLowerCase();        // check if element itself is allowed    var parent_element = this.current_element;    if(this.allowed_elements[name] || transform.whitelist) {        this.current_element = this.dom.createElement(elem.nodeName);        parent_element.appendChild(this.current_element);              // clean attributes      var attrs = this.config.attributes;      var allowed_attributes = _merge_arrays_uniq(attrs[name], attrs[Sanitize.ALL], transform.attr_whitelist);      for(var i=0;i<allowed_attributes.length;i++) {        var attr_name = allowed_attributes[i];        attr = elem.attributes[attr_name];        if(attr) {            attr_ok = true;            // Check protocol attributes for valid protocol            if(this.config.protocols[name] && this.config.protocols[name][attr_name]) {              protocols = this.config.protocols[name][attr_name];              del = attr.value.toLowerCase().match(Sanitize.REGEX_PROTOCOL);              if(del) {                attr_ok = (_array_index(del[1], protocols) != -1);              }              else {                attr_ok = (_array_index(Sanitize.RELATIVE, protocols) != -1);              }            }            if(attr_ok) {              attr_node = document.createAttribute(attr_name);              attr_node.value = attr.value;              this.current_element.setAttributeNode(attr_node);            }        }      }            // Add attributes      if(this.config.add_attributes[name]) {        for(attr_name in this.config.add_attributes[name]) {          attr_node = document.createAttribute(attr_name);          attr_node.value = this.config.add_attributes[name][attr_name];          this.current_element.setAttributeNode(attr_node);        }      }    } // End checking if element is allowed    // If this node is in the dynamic whitelist array (built at runtime by    // transformers), let it live with all of its attributes intact.    else if(_array_index(elem, this.whitelist_nodes) != -1) {      this.current_element = elem.cloneNode(true);      // Remove child nodes, they will be sanitiazied and added by other code      while(this.current_element.childNodes.length > 0) {        this.current_element.removeChild(this.current_element.firstChild);      }      parent_element.appendChild(this.current_element);    }    // iterate over child nodes    if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {      for(var j=0;j<elem.childNodes.length;j++) {        _clean.call(this, elem.childNodes[j]);      }    }        // some versions of IE don't support normalize.    if(this.current_element.normalize) {      this.current_element.normalize();    }    this.current_element = parent_element;  } // END clean_element function    function _transform_element(node) {    var output = {      attr_whitelist:[],      node: node,      whitelist: false    };    var transform;    for(var i=0;i<this.transformers.length;i++) {      transform = this.transformers[i]({        allowed_elements: this.allowed_elements,        config: this.config,        node: node,        node_name: node.nodeName.toLowerCase(),        whitelist_nodes: this.whitelist_nodes,        dom: this.dom      });      if (transform == null)         continue;      else if(typeof transform == 'object') {        if(transform.whitelist_nodes && transform.whitelist_nodes instanceof Array) {          for(var j=0;j<transform.whitelist_nodes.length;j++) {            if(_array_index(transform.whitelist_nodes[j], this.whitelist_nodes) == -1) {              this.whitelist_nodes.push(transform.whitelist_nodes[j]);            }          }        }        output.whitelist = transform.whitelist ? true : false;        if(transform.attr_whitelist) {          output.attr_whitelist = _merge_arrays_uniq(output.attr_whitelist, transform.attr_whitelist);        }        output.node = transform.node ? transform.node : output.node;      }      else {        throw new Error("transformer output must be an object or null");      }    }    return output;  }        for(var z=0;z<container.childNodes.length;z++) {    _clean.call(this, container.childNodes[z]);  }    if(fragment.normalize) {    fragment.normalize();  }    return fragment;  };return Sanitize;}));},{}],21:[function(require,module,exports){var ChatTypingAnimation = require('th-chat-typing-animation');var HowItWorks = require('th-how-it-works/th-how-it-works-tmpl');module.exports = function(config) {    config = config || {};    config.assistantProfile = config.assistantProfile || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.class || 'th-chat-dialog';    var showHowItWorks = config.showHowItWorks || false;    var howJaWorks = config.howJaWorks || {};    var hiwSteps = howJaWorks.items || [];    var typingElement;    if (config.isGoogleReengagementChat) {        typingElement = ChatTypingAnimation.modernAnimation({            avatar: config.assistantProfile.avatar,            name: config.assistantProfile.name,            title: config.assistantProfile.title,            renderer: html        });    } else {        typingElement = ChatTypingAnimation.defaultAnimation({            isTypingText: config.isTypingText || '',            renderer: html        });    }    return (        html('div', {className: classString}, [            html('div', {className: "conversation-adjuster"}, [                html('div', {className: "conversation"}, [                    showHowItWorks ? (                        HowItWorks({                            renderer: html,                            className: "th-how-it-works chat hidden",                            steps: hiwSteps}                        )                    ) : null                ]),                typingElement            ])        ])    );};},{"ja-dom-element":80,"th-chat-typing-animation":34,"th-how-it-works/th-how-it-works-tmpl":104}],22:[function(require,module,exports){'use strict';var dom = require('ja-dom');var events = require('ja-event');var utils = require('ja-utils');var chatDialogTemplate = require('./th-chat-dialog-tmpl.js');var Sanitize = require('./sanitize.js');var TypingAnimation = require('th-chat-typing-animation');var chatMessage = require('th-chat-message');var cookie = require('js-cookie');var messageTemplate = chatMessage.message;var continueLinkTemplate = chatMessage.continueLink;var hiddenClass = 'hidden';module.exports = ChatDialog;function ChatDialog(target, config) {    if (!(this instanceof ChatDialog)) return new ChatDialog(target, config);    var self = this;    this.target = target && target.nodeType ? target : document.querySelector(target);    if (!this.target) return;    var elementClassSelector = '.' + (config.class || 'th-chat-dialog');    this.element = this.target.querySelector(elementClassSelector);    this.typingAnimation = TypingAnimation(this.element, config);    this.conversation = this.element.querySelector('.conversation');    this.howItWorks = this.element.querySelector('.th-how-it-works');    this.sanitizer = new Sanitize({        elements: ['a', 'div', 'span', 'b'],        attributes: {            a: ['href', 'target', 'id'],            span: ['class'],            div: ['class']        },        protocols: {            a: { href: ['http', 'https', 'mailto'] }        }    });    // In order to not break all usages of dialog animation    this.typingAnimation.on('start_typing_animation', function () {        self.trigger('start_typing_animation');    });    this.typingAnimation.on('stop_typing_animation', function () {        self.trigger('stop_typing_animation');    });    this.typingAnimation.on('show_is_typing', function () {        self.trigger('show_is_typing');    });    return this;}utils.mixin(ChatDialog, events);ChatDialog.tmpl = function (config) {    return chatDialogTemplate(config);};ChatDialog.prototype.showHowItWorks = function (chatLocationKey) {    dom.removeClass(this.howItWorks, 'hidden');    var storedHiwPosition = cookie.get('hiw_position_in_chat_' + chatLocationKey);    if (storedHiwPosition) {        this.moveHowItWorksBeforeLastMessage(storedHiwPosition);    } else {        var lastMessage = this.element.querySelector('.th-chat-message:last-child');        lastMessage.parentNode.insertBefore(this.howItWorks, lastMessage.nextSibling);        this.scrollToBottom();        var hiwPositionInChat = this.getMessagesCount();        cookie.set('hiw_position_in_chat_' + chatLocationKey, hiwPositionInChat, { expires: 60 * 60 * 1000 });        var self = this;        setTimeout(function () {            self.moveHowItWorksBeforeLastMessage(hiwPositionInChat);        }, 5000);    }};ChatDialog.prototype.moveHowItWorksBeforeLastMessage = function (hiwPositionInChat) {    var messageElement = this.element.querySelector('.th-chat-message:nth-child(' + hiwPositionInChat + ')');    if (messageElement) {        messageElement.parentNode.insertBefore(this.howItWorks, messageElement);    }};ChatDialog.prototype.clearMessages = function () {    this.conversation.innerHTML = '';};ChatDialog.prototype.postCustomerMessage = function (msg, config) {    config = config || {};    var message = msg.text || msg;    this.conversation.appendChild(messageTemplate(message, {        class: 'customer',        name: config.clientName || 'You'    }));    this.scrollToBottom();    this.trigger('postedCustomerMessage', msg, config);};ChatDialog.prototype.postExpertMessage = function (message, config) {    config = config || {};    var lastMessage = this.element.querySelector('.payment');    if (!lastMessage) {        var messageEl = document.createElement('div');        messageEl.innerHTML = message;        messageEl = this.sanitizer.clean_node(messageEl);        var messageConfig = { class: 'expert' };        utils.extend(messageConfig, config);        this.conversation.appendChild(messageTemplate(messageEl, messageConfig));    }    if (config.showContinueLink) {        lastMessage = this.element.querySelector('.payment');        var continueLink = lastMessage.querySelector('.continue-link');        if (!continueLink) {            lastMessage.querySelector('.text').appendChild(continueLinkTemplate({ continueLinkText: config.continueLinkText }));        }    }    this.scrollToBottom();    this.trigger('postedExpertMessage', message, config);};ChatDialog.prototype.scrollToBottom = function () {    this.element.scrollTop = this.element.scrollHeight;};ChatDialog.prototype.getMessagesCount = function () {    return this.conversation.getElementsByClassName('th-chat-message').length;};// In order to not break all usages of dialog animationChatDialog.prototype.startTypingAnimation = function (delayArr) {    this.typingAnimation.start(delayArr);};ChatDialog.prototype.stopTypingAnimation = function () {    this.typingAnimation.stop();};ChatDialog.prototype.startTypingAnimationWithMaxDuration = function (delayArr, maxDuration) {    this.typingAnimation.startWithMaxDuration(delayArr, maxDuration);};ChatDialog.prototype.showIsTyping = function (delayArr) {    this.typingAnimation.showIsTyping(delayArr);};},{"./sanitize.js":20,"./th-chat-dialog-tmpl.js":21,"ja-dom":14,"ja-event":83,"ja-utils":17,"js-cookie":86,"th-chat-message":24,"th-chat-typing-animation":34}],23:[function(require,module,exports){exports.message = function (message, config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var paymentLinkClass = config.showContinueLink ? ' payment' : '';    var classString = config.class || 'expert';    var avatar = config.avatar || 'https://secure.justanswer.com/fe-lib/components/th-chat-header/images/shirt.png';    var name = config.name || 'Pearl Wilson';    var title = config.title || 'Assistant';    var displayName = classString === 'expert' && !config.displayNameWithoutTitle ? name + ', ' + title : name;    var assistantAvatar;    if (classString === 'expert') {        assistantAvatar = html('img', {className: "va-avatar", src: avatar || '', alt: "Pearl", width: "24", height: "24"})    };    return (        html('div', {className: classString + paymentLinkClass + ' th-chat-message'}, [            assistantAvatar,            html('span', {className: "name", dangerouslySetInnerHTML: displayName}),            html('div', {className: "text"}, [message])        ])    );};exports.continueLink = function (config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var continueLinkText = config.continueLinkText || ' Continue >>';    var dataQualityClassName = 'dqt-continue ';    return (        html('a', {className: dataQualityClassName + 'continue-link'}, [continueLinkText.replace(/ /g, "\u00a0")])    );};},{"ja-dom-element":80}],24:[function(require,module,exports){module.exports = ModernChatMessage;var modernChatMessageTmpl = require('./th-chat-message-tmpl.js');function ModernChatMessage() {    if (!(this instanceof ModernChatMessage)) return new ModernChatMessage();}ModernChatMessage.message = function(message, config) {	return modernChatMessageTmpl.message(message, config);}ModernChatMessage.continueLink = function(config) {	return modernChatMessageTmpl.continueLink(config);}},{"./th-chat-message-tmpl.js":23}],25:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.classString || 'th-chat-mobile-header';    var expertProfile = config.expertProfile || {};    var expertName = expertProfile.expertName || 'Expert';    var avatar = expertProfile.expertAvatarUrl || 'https://secure.justanswer.com/fe-lib/components/th-chat-header/images/shirt.png';    var satisfiedCustomers = expertProfile.satisfiedCustomers        ? [expertProfile.satisfiedCustomers, expertProfile.satisfiedCustomersLabel || 'Satisfied Customers'].join(' ') : '';    var expertTitle = expertProfile.expertTitle || '';    return (        html('header', {className: classString}, [            html('div', {className: "close-button"}),            html('div', {className: "expert-avatar"}, [                html('img', {className: "expert-avatar", src: avatar, width: "53", height: "53"})            ]),            html('div', {className: "profile"}, [                html('div', {className: "expert-name"}, [expertName, ", ", expertTitle]),                html('div', {className: "satisfied-customers"}, [satisfiedCustomers])            ])        ])    );}},{"ja-dom-element":79}],26:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');var tmpl = require('./th-chat-mobile-header-tmpl.js');module.exports = ChatMobileHeader;function ChatMobileHeader(config) {    var self = this;    config = config || {};    if (!(this instanceof ChatMobileHeader)) return new ChatMobileHeader(config);    var elementClassSelector = '.' + (config.classString || 'th-chat-mobile-header');    this.closeButton = document.querySelector(elementClassSelector + ' .close-button');    if (!this.closeButton) return;    this.closeButton.addEventListener('click', function() {        self.trigger('closeChat');    });}ChatMobileHeader.tmpl = function(config) {    return tmpl(config);};utils.mixin(ChatMobileHeader, events);},{"./th-chat-mobile-header-tmpl.js":25,"ja-event":83,"ja-utils":17}],27:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    var cookie = require('js-cookie');    var classString = config.class || 'th-chat-mobile-question-box';    var placeholder = config.placeholder || 'Type your message...';    var sendButtonText = config.sendButtonText || 'Send';    var showHiwLink = config.showHiwLink || false;    var howJaWorks = config.howJaWorks || {};    var hiwLinkText = howJaWorks.linkText || '';    return (        html('div', {className: classString}, [                showHiwLink?                html('div', {className: "hiw-link"}, [hiwLinkText])                : null,            html('div', {className: "text-box"}, [                html('input', {className: "text-input", placeholder: placeholder})            ]),            html('input', {type: "button", className: "send-btn dqt-send disabled ja-button-orange ja-button-small", value: sendButtonText})        ])    );}},{"ja-dom-element":79,"js-cookie":86}],28:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');var dom = require('ja-dom');var tmpl = require('./th-chat-mobile-question-box-tmpl.js');var disabledClass = 'disabled';module.exports = ModernChatMobileQuestionBox;function ModernChatMobileQuestionBox(target, config) {	if (!(this instanceof ModernChatMobileQuestionBox)) return new ModernChatMobileQuestionBox(target, config);	    var self = this;    this.config = config || {};    this.target = target && target.nodeType ? target : document.querySelector(target);    if (!this.target) return;    var elementClassSelector = '.' + (this.config.class || 'th-chat-mobile-question-box');    this.element = this.target.querySelector(elementClassSelector);    if (!this.element) return;    this.inputField = this.element.querySelector('.text-input');    if (!this.inputField) return;    this.sendButton = this.element.querySelector('.send-btn');    if (!this.sendButton) return;    this.hiwLink = config.showHowItWorks ? this.element.querySelector('.hiw-link') : null;    if (this.hiwLink) {        this.hiwLink.addEventListener('click', function() {            self.trigger('chat_qbox_hiw_link_clicked');            self.element.removeChild(self.hiwLink);        });    }    self.sendButton.addEventListener('click', submit);    self.inputField.addEventListener('keydown', function(event) {        self.trigger('chat_qbox_key_down');        var keycode = (event.keyCode ? event.keyCode : event.which);        if (keycode == '13') {            submit();            event.preventDefault();        } else {            disableOrEnableSendButton();        }    });    function submit() {        if (self.inputField.value.trim() !== '') {            self.trigger('submit', { text: self.inputField.value.trim() });            self.inputField.value = '';            self.sendButton.classList.add(disabledClass);        }    }    function disableOrEnableSendButton() {        if (self.inputField.value.trim().length > 0 && dom.hasClass(self.sendButton, disabledClass)) {            self.sendButton.classList.remove(disabledClass);        } else if (self.inputField.value.trim().length === 0 && !dom.hasClass(self.sendButton, disabledClass)) {            self.sendButton.classList.add(disabledClass);        }    }}ModernChatMobileQuestionBox.tmpl = function(config) {    return tmpl(config);};ModernChatMobileQuestionBox.prototype.disable = function() {    var self = this;    self.sendButton = this.element.querySelector('.send-btn');    self.sendButton.classList.add(disabledClass);    self.inputField.setAttribute('disabled', 'disabled');    self.inputField.removeAttribute('placeholder');}ModernChatMobileQuestionBox.prototype.enable = function() {    var self = this;    if (self.inputField.hasAttribute('disabled')) {        self.inputField.removeAttribute('disabled');    }    if(!self.inputField.hasAttribute('placeholder')){        self.inputField.setAttribute('placeholder', self.config.placeholder);    }    self.inputField.focus();}ModernChatMobileQuestionBox.prototype.addFocus = function () {    if (!this.inputField.hasAttribute('disabled')) {        this.inputField.focus();    }}ModernChatMobileQuestionBox.prototype.getQuestionBoxLength = function () {    return this.inputField.value.length;}utils.mixin(ModernChatMobileQuestionBox, events);},{"./th-chat-mobile-question-box-tmpl.js":27,"ja-dom":14,"ja-event":83,"ja-utils":17}],29:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.class || 'th-chat-question-box';    var placeholder = config.placeholder || 'Type your message...';    var sendButtonText = config.sendButtonText || 'Send';    var dataQualityChatClassName = ' dqt-chat';    classString += dataQualityChatClassName;    return (        html('div', {className: classString}, [            html('div', {className: "text-box"}, [                html('textarea', {className: "text-area", placeholder: placeholder})            ]),            html('div', {className: "button-container"}, [                html('input', {type: "button", className: "send-btn dqt-send disabled ja-button-orange ja-medium", value: sendButtonText})            ]),                config.statsText                    ? html('span', {className: "online-now"}, [config.statsText]) : null        ])    );}},{"ja-dom-element":79}],30:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');var dom = require('ja-dom');var tmpl = require('./th-chat-question-box-tmpl.js');var disabledClass = 'disabled';module.exports = ModernChatQuestionBox;function ModernChatQuestionBox(target, config) {    if (!(this instanceof ModernChatQuestionBox)) return new ModernChatQuestionBox(target, config);    var self = this;    this.config = config || {};    this.target = target && target.nodeType ? target : document.querySelector(target);    if (!this.target) return;    var elementClassSelector = '.' + (config.class || 'th-chat-question-box');    this.element = this.target.querySelector(elementClassSelector);    this.inputField = this.element.querySelector('.text-area');    this.sendButton = this.element.querySelector('.send-btn');    self.sendButton.addEventListener('click', submit);    self.inputField.addEventListener("keydown", function (event) {        self.trigger('chat_qbox_key_down');        var keycode = (event.keyCode ? event.keyCode : event.which);        if (keycode == '13') {            submit();            event.preventDefault();        } else {            disableOrEnableSendButton();        }    });    self.inputField.addEventListener('click', function(event) {        self.trigger('chat_qbox_click');    });    function submit() {        if (self.inputField.value.trim() !== '') {            self.trigger('submit', {                text: self.inputField.value.trim()            });            self.inputField.value = '';            self.sendButton.classList.add(disabledClass);            if (self.config.sendButtonText && self.config.sendButtonText !== self.sendButton.value) {                self.sendButton.value = self.config.sendButtonText;            }        }    }    function disableOrEnableSendButton() {        if (self.inputField.value.trim().length > 0 && dom.hasClass(self.sendButton, disabledClass)) {            self.sendButton.classList.remove(disabledClass);        } else if (self.inputField.value.trim().length === 0 && !dom.hasClass(self.sendButton, disabledClass)) {            self.sendButton.classList.add(disabledClass);        }    }}ModernChatQuestionBox.tmpl = function (config) {    return tmpl(config);};ModernChatQuestionBox.prototype.disable = function () {    var self = this;    self.sendButton = this.element.querySelector('.send-btn');    self.sendButton.classList.add(disabledClass);    self.inputField.blur();    self.inputField.setAttribute('disabled', 'disabled');}ModernChatQuestionBox.prototype.enable = function (config) {    var config = config || {};    var noFocus = config.noFocus || false;    if (this.inputField.hasAttribute('disabled')) {        this.inputField.removeAttribute('disabled');    }    if (!noFocus) {        this.addFocus();    }}ModernChatQuestionBox.prototype.getQuestionBoxLength = function () {    return this.inputField.value.length;}ModernChatQuestionBox.prototype.addFocus = function () {    if (!this.inputField.hasAttribute('disabled')) {        this.inputField.focus();    }}ModernChatQuestionBox.prototype.hide = function () {    dom.addClass(this.element, 'hidden');}ModernChatQuestionBox.prototype.isEmpty = function () {    return this.inputField.value.trim() === '';}ModernChatQuestionBox.prototype.resizeQuestionBox = function () {    var textBox = this.element.querySelector('.text-box');    var outerHeight = parseInt(window.getComputedStyle(this.inputField).height, 10);    var fontSize = 14;    var lineHeight = 18;    var diff = outerHeight - this.inputField.clientHeight;    this.inputField.style.height = 0;    var newHeight = Math.max(fontSize, this.inputField.scrollHeight + diff);    if (newHeight <= lineHeight * 3) {        this.inputField.style.height = newHeight + 'px';        if (newHeight < lineHeight * 2) {            textBox.style.height = '50px';        } else if (newHeight == lineHeight * 2) {            textBox.style.height = '56px';        } else if (newHeight == lineHeight * 3) {            textBox.style.height = '70px';        }    } else {        this.inputField.style.height = '54px';    }}ModernChatQuestionBox.prototype.changePlaceholder = function(placeholder) {    this.inputField.placeholder = placeholder;};utils.mixin(ModernChatQuestionBox, events);},{"./th-chat-question-box-tmpl.js":29,"ja-dom":14,"ja-event":82,"ja-utils":17}],31:[function(require,module,exports){module.exports = ChatRevizely;function ChatRevizely(config){    if (!(this instanceof ChatRevizely)) return new ChatRevizely(config);    this.config = config || {};    this.config.experimentVariationDelimiter = this.config.experimentVariationDelimiter || ',';} ChatRevizely.prototype.getExperimentData = function(){    var revizelyTestExperience = [];    if (window && window.re && window.re.testExperience && window.re.testExperience.length) {        for (var i = 0; i < window.re.testExperience.length; i++) {            var testExperience = window.re.testExperience[i];            revizelyTestExperience.push({                experimentId: testExperience.experimentId,                variationId: testExperience.variationId            });        }    }    return revizelyTestExperience;};ChatRevizely.prototype.getExperimentDataString = function (){    var self = this;    var experimentData = this.getExperimentData();    if (experimentData && experimentData.length) {        return 'Revizely : ' + experimentData.map(function (item) { return item.variationId; })            .join(self.config.experimentVariationDelimiter);    }    return null;};},{}],32:[function(require,module,exports){'use strict';var Revizely = require('th-chat-revizely');module.exports = ChatTracking;function ChatTracking(config){    if (!(this instanceof ChatTracking)) return new ChatTracking(config);    this.config = config || {};    this.Revizely = new Revizely();}ChatTracking.prototype.getDeviceCategory = function(){    if (!window || !window.navigator || !window.navigator.userAgent) return 'not detected';    var isTablet = function () {        return /Tablet|Tab|Pad|Windows NT 6\.[23]; ARM;|Nexus (10|7|9)|GT-P[\d]{4}|GTN-N[\d]{4}|SM-P600|SM-P90[015]|SM-T[\d]{3}|SCH-I905|SCH-I(905|800|815|705|915)|SGH-I957|KF(((O|T)T)|JW(I|A)|S(O|A)W(I|A)|THW(A|I)|A(P|R|S)W(I|A))|PlayBook|Xoom|NOOK|BNTV|Dell Venue|Transformer/i.test(window.navigator.userAgent);    };    var isMobile = function () {        return (window.JA && window.JA.i && window.JA.i.isMobile) || (window.Prl && window.Prl.device && window.Prl.device.isMobile);    };    return isTablet() ? "tablet" : isMobile() ? "mobile" : "desktop";};ChatTracking.prototype.getExperimentDataString = function () {    return this.Revizely.getExperimentDataString();};},{"th-chat-revizely":31}],33:[function(require,module,exports){exports.modernAnimation = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = (config.class || 'typing-box') + ' modern';    var avatar = config.avatar || '/fe-lib/components/th-chat-message/images/pearl_30x30.jpg';    var name = config.name || 'Pearl Wilson';    var title = config.title || 'Assistant';    var displayName = name + ', ' + title;    return (        html('div', {className: classString}, [            html('div', {className: "typing-text hidden"}, [                html('img', {class: "va-avatar", src: avatar}),                html('span', {class: "name"}, [displayName]),                html('span', {class: "dot-bubble"}, [                    html('span', {class: "dot"}),                    html('span', {class: "dot"}),                    html('span', {class: "dot"})                ])            ])        ])    );};exports.defaultAnimation = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.class || 'typing-box';    var isTypingText = config.isTypingText || '';    return (        html('div', {className: classString}, [            html('div', {className: "typing-text hidden"}, [                isTypingText            ])        ])    );};},{"ja-dom-element":80}],34:[function(require,module,exports){var dom = require('ja-dom');var events = require('ja-event');var utils = require('ja-utils');var chatTypingAnimationTmpl = require('./th-chat-typing-animation-tmpl.js');var hiddenClass = 'hidden';module.exports = ChatTypingAnimation;function ChatTypingAnimation(target, config) {    if (!(this instanceof ChatTypingAnimation)) return new ChatTypingAnimation(target, config);    this.config = config || {};	this.target = target && target.nodeType ? target : document.querySelector(target);    if (!this.target) return;	var elementClassSelector = '.' + (this.config.class || 'typing-box');    this.element = this.target.querySelector(elementClassSelector);    this.typingText = this.element.querySelector('.typing-text');    this.isRunning = false;    this.typingAnimationTimeout = null;    this.stopAnimationTimeout = null;}utils.mixin(ChatTypingAnimation, events);ChatTypingAnimation.prototype.start = function (delayArr) {	var self = this;    if (self.isRunning) return;    self.isRunning = true;    self.trigger('start_typing_animation');    delayArr = delayArr || [];    var i = 0;    var animation = function (delay) {        if (!delay) {           i = 0;        }        self.typingAnimationTimeout = setTimeout(function () {            dom.toggleClass(self.typingText, hiddenClass);            i++;            return animation(delayArr[i]);        }, delay);    };    animation(delayArr[i]);}ChatTypingAnimation.prototype.stop = function () {	var self = this;    self.trigger('stop_typing_animation');    clearTimeout(self.typingAnimationTimeout);    clearTimeout(self.stopAnimationTimeout);    if (!dom.hasClass(self.typingText, hiddenClass))    {      dom.addClass(self.typingText, hiddenClass);    }    self.isRunning = false;}ChatTypingAnimation.prototype.startWithMaxDuration = function (delayArr, maxDuration) {    var self = this;    self.start(delayArr);    this.stopAnimationTimeout = setTimeout(function () {         self.stop();    }, maxDuration);}ChatTypingAnimation.prototype.showIsTyping = function (delayArr) {    var self = this;    delayArr = delayArr || [];    var i = 0;    var animation = function (delay) {        if (!delay) {            self.trigger('show_is_typing');            return;        }        setTimeout(function () {            dom.toggleClass(self.typingText, hiddenClass);            i++;            return animation(delayArr[i]);        },        delay);    };    animation(delayArr[i]);};ChatTypingAnimation.prototype.setAssistantName = function(assistantName) {    var name = this.typingText.querySelector('.name');    if(name) {        name.textContent = assistantName;    }};ChatTypingAnimation.modernAnimation = function(config) {	return chatTypingAnimationTmpl.modernAnimation(config);}ChatTypingAnimation.defaultAnimation = function(config) {	return chatTypingAnimationTmpl.defaultAnimation(config);}},{"./th-chat-typing-animation-tmpl.js":33,"ja-dom":14,"ja-event":83,"ja-utils":17}],35:[function(require,module,exports){'use strict';var ChatPopup = require('th-chat-view-popup');var ChatWithTeaser = require('th-chat-view-with-teaser');module.exports = isSmallScreen() ? ChatWithTeaser : ChatPopup;function isSmallScreen() {    return (window.screen.width <= 736 && window.screen.height <= 414)        || (window.screen.width <= 414 && window.screen.height <= 736);}},{"th-chat-view-popup":36,"th-chat-view-with-teaser":38}],36:[function(require,module,exports){'use strict';var utils = require('ja-utils');var BaseView = require('th-chat-view-base');var ChatWindow = require('th-chat-window');function ChatViewPopup(target) {    if (!(this instanceof ChatViewPopup)) return new ChatViewPopup(target);    this.target = target && target.nodeType ? target : document.querySelector(target);}module.exports = ChatViewPopup;utils.mixin(ChatViewPopup, BaseView);ChatViewPopup.prototype.render = function (config) {    this.config = config || {};    this.config.expertProfile.showMoreLink = false;    var windowNode = this.target.querySelector('.th-chat-window');    if (windowNode) windowNode.parentNode.removeChild(windowNode);    if (this.chatWindow) clearTimeout(this.chatWindow.appearanceTimeout);    this.target.appendChild(ChatWindow.tmpl(this.config));    this.chatWindow = new ChatWindow(this.target, this.config);    this.setupEvents();    this.setupHandlers();    this.disableInput();}ChatViewPopup.prototype.setupHandlers = function () {    var self = this;    self.chatWindow.header.on('toggleChat', function () {        if (self.chatWindow.minimized() || self.chatWindow.minimizedWithoutAnimation()) {            self.chatWindow.expand();        } else {            self.chatWindow.minimize();        }    });}ChatViewPopup.prototype.startChat = function () {    var self = this;    self.chatWindow.render();    self.chatWindow.once('show', function () {        self.chatWindow.chatDialog.showIsTyping(self.config.animationTimeIntervals);    });    var restartTimer = function () {        clearTimeout(self.chatWindow.appearanceTimeout);        setupIdleTimeout();    }    var setupIdleTimeout = function () {        self.chatWindow.appearanceTimeout = setTimeout(function () {            self.chatWindow.show();            handleInputEvents(inputObjects, inputEvents, restartTimer, true);        }, self.config.time);    }    if (self.config.disableTimer) {        var inputObjects = 'input, textarea';        var inputEvents = ['input', 'keydown', 'keyup'];        handleInputEvents(inputObjects, inputEvents, restartTimer, false);        setupIdleTimeout();    }}ChatViewPopup.prototype.continueChat = function () {    this.chatWindow.render();    this.chatWindow.show();}function handleInputEvents(elements, events, func, shouldBeRemoved) {    var elementArray = document.querySelectorAll(elements);    for (var i = elementArray.length - 1; i >= 0; i--) {        if (elementArray[i]) {            for (var j = events.length - 1; j >= 0; j--) {                if (shouldBeRemoved) {                    elementArray[i].removeEventListener(events[j], func);                } else {                    elementArray[i].addEventListener(events[j], func);                }            }        }    }}},{"ja-utils":17,"th-chat-view-base":103,"th-chat-window":40}],37:[function(require,module,exports){'use strict';module.exports = ChatViewRect;function ChatViewRect(settings) {    settings = settings || {};    this._offsetTop = settings.offsetTop;    this._windowHeight = settings.windowHeight;    this._windowWidth = settings.windowWidth;    this._chatHeaderHeight = settings.chatHeaderHeight;    this._chatQuestionBoxHeight = settings.chatQuestionBoxHeight;    this.smallChatHeight = settings.smallChatHeight;}ChatViewRect.prototype.isPortrait = function () {    var mediaQueryList = window.matchMedia('(orientation: portrait)');    return mediaQueryList && mediaQueryList.matches;};ChatViewRect.prototype.isLandscape = function () {    var mediaQueryList = window.matchMedia('(orientation: landscape)');    return mediaQueryList && mediaQueryList.matches;};},{}],38:[function(require,module,exports){'use strict';var dom = require('ja-dom');var utils = require('ja-utils');var BaseView = require('th-chat-view-base');var ChatWindow = require('th-chat-window');var Teaser = require('th-va-mobile-teaser');var cookie = require('ja-cookie');var ChatViewRect = require('./lib/chat-view-rect');var showMinimizedChatCookieName = 'showMinimizedChat';function ChatViewWithTeaser(target) {    if (!(this instanceof ChatViewWithTeaser)) return new ChatViewWithTeaser(target);    this.target = target && target.nodeType ? target : document.querySelector(target);}module.exports = ChatViewWithTeaser;utils.mixin(ChatViewWithTeaser, BaseView);ChatViewWithTeaser.prototype.render = function (config) {    this.config = config || {};    this.config.rememberChatMinimizedState = this.config.rememberChatMinimizedState || false;    this.config.closeChatOnClickOutside = this.config.closeChatOnClickOutside || false;    this.config.chatFullScreenMode = this.config.chatFullScreenMode || false;    this.windowHeight = window.innerHeight || window.screen.height;    var windowNode = this.target.querySelector('.th-chat-window');    var teaserNode = this.target.querySelector('.th-va-mobile-teaser');    if (windowNode) windowNode.parentNode.removeChild(windowNode);    if (teaserNode) teaserNode.parentNode.removeChild(teaserNode);    if (this.chatWindow) clearTimeout(this.chatWindow.appearanceTimeout);    clearTimeout(this.teaserShowTimeout);    this.target.appendChild(ChatWindow.tmpl(this.config));    this.chatWindow = new ChatWindow(this.target, this.config);    this.teaser = new Teaser(this.target, {        content: this.config.greeting || this.config.profile && this.config.profile.greeting,        pearlImg: this.config.mobile.iconImage,        timeouts: this.config.timeouts,        canCloseTeaser: this.config.canCloseTeaser    });    if (this.config.chatFullScreenMode) {        let chat = document.querySelector('.dqt-chat');        if (chat){            dom.addClass(chat, 'full-screen');        }        this.rect = null;    }    this.setupEvents();    this.setupHandlers();    this.disableInput();};ChatViewWithTeaser.prototype.setupHandlers = function () {    var self = this;    self.teaser.on('teaser-was-clicked', function () {       if (self.config.rememberChatMinimizedState) {            self.chatWindow.setCookieToShowExpanded();        }                self.chatWindow.show();                if (self.config.chatFullScreenMode) {                        var chatHeaderHeight = self.chatWindow.header.chatHeaderElement.offsetHeight;            var questionBoxHeight = self.chatWindow.questionBox.element.offsetHeight;                        var rectSettings = {                offsetTop: self.offsetTop(self.target),                windowHeight: window.innerHeight,                windowWidth: window.innerWidth,                chatHeaderHeight: chatHeaderHeight,                chatQuestionBoxHeight: questionBoxHeight,                smallChatHeight: self.chatWindow.getChatDialogMinHeight()            };            self.rect = new ChatViewRect(rectSettings);            self.resizeChat();            self.disableBodyScroll();        }        self.teaser.hideMessage();        self.teaser.hideTeaser();        self.chatWindow.questionBox.addFocus();        clearTimeout(self.teaserShowTimeout);    });    self.teaser.on('teaser-is-shown', function () {        self.chatWindow.trigger('appear');    });    self.teaser.on('message-is-changed', function () {        self.messageWasShown = true;    });    self.chatWindow.header.on('toggleChat', function () {       self.closeChat();    });    self.chatWindow.header.on('closeChat', function () {        self.closeChat();    });    self.on('customer-typing', function () {        var questionBoxElement = document.querySelector('.th-chat-question-box');        if (self.chatWindow.questionBox.getQuestionBoxLength() >= 85)             dom.addClass(questionBoxElement, 'expanded');        else             dom.removeClass(questionBoxElement, 'expanded');    }, self);    if (self.config.closeChatOnClickOutside) {        document.addEventListener('click', function(event) {            if (self.teaser.hidden() && self.chatWindow.expanded()) {                // close if click was not inside the chat view                if (event.target && !event.target.closest('.th-chat-window')) {                    self.closeChat();                }            }        });    }    if (self.config.chatFullScreenMode) {        window.addEventListener('scroll', function(event) {            document.documentElement.style.setProperty('--scroll-y', window.scrollY + 'px');        });                self.chatWindow.questionBox.inputField.addEventListener('focus', self.alignQBoxWhenKeyboardOpened.bind(self));        self.chatWindow.questionBox.on('submit', self.alignQBoxWhenKeyboardOpened.bind(self));                window.addEventListener("resize", self.resizeChat.bind(self));        window.addEventListener("onorientationchange ", self.resizeChat.bind(self));    }}ChatViewWithTeaser.prototype.disableBodyScroll = function() {    const scrollY = document.documentElement.style.getPropertyValue('--scroll-y');    const body = document.body;    body.style.position = 'fixed';    body.style.overflow = 'hidden';    body.style.top = '-' + scrollY;}ChatViewWithTeaser.prototype.enableBodyScroll = function() {    const body = document.body;    const scrollY = body.style.top;    body.style.position = '';    body.style.overflow = '';    body.style.top = '';    window.scrollTo(0, parseInt(scrollY || '0') * -1);}ChatViewWithTeaser.prototype.closeChat = function() {    if (this.config.chatFullScreenMode) {        this.enableBodyScroll();        this.rect = null;    }    if (this.config.rememberChatMinimizedState) {        this.chatWindow.setCookieToShowMinimized();    }    this.chatWindow.hide();    this.teaser.showTeaser();    this.teaser.showPearl();    this.teaser.hideBackground();};ChatViewWithTeaser.prototype.startChat = function () {    var self = this;    self.teaser.once('teaser-is-shown', function () {        self.chatWindow.chatDialog.showIsTyping(self.config.animationTimeIntervals);    });    if (self.config.rememberChatMinimizedState && cookie.get(showMinimizedChatCookieName) === '1') {        self.continueChat();    } else {        self.teaserShowTimeout = setTimeout(function () {            self.teaser.showTeaser();        }, self.config.mobile.time);    }}ChatViewWithTeaser.prototype.continueChat = function () {    var self = this;    self.teaser.hideMessage();    self.teaserShowTimeout = setTimeout(function () {        self.teaser.showTeaser();        setTimeout(function () {            self.teaser.showBadge();        }, self.config.mobile.time);    }, self.config.mobile.time);}ChatViewWithTeaser.prototype.resizeChat = function() {    if (dom.hasClass(this.chatWindow.chatComponent, 'hidden'))        return;    var screenHeight = window.innerHeight || window.screen.height;        var qBoxHeight = this.chatWindow.questionBox.element.offsetHeight || 150;    var headerHeight = this.chatWindow.header.chatHeaderElement.offsetHeight || 150;    var maxHeight = screenHeight - qBoxHeight - headerHeight;        var isLandscape = this.rect.isLandscape();        if (isLandscape) {        this.chatWindow.chatDialog.element.style.setProperty('max-height', maxHeight + 'px');        this.chatWindow.chatDialog.element.style.setProperty('min-height', maxHeight + 'px');        dom.addClass(this.chatWindow.chatDialog.element, 'chat-dialog-scroll');    }    else {        this.chatWindow.chatDialog.element.style.setProperty('max-height', maxHeight + 'px', 'important');        this.chatWindow.chatDialog.element.style.setProperty('min-height', maxHeight + 'px', 'important');    }}ChatViewWithTeaser.prototype.alignQBoxWhenKeyboardOpened = function() {    if (isIOS() && this.rect) {        // offset on Iphone        // on load address bar is bigger than when page is scrolled (it becomes smaller)        // so the viewport height is ~50px bigger after page was scrolled and address bar became smaller        var offset = (window.innerHeight - this.windowHeight > 50 ) ? 78 : 113;        var isPortrait = this.rect.isPortrait();        var isLandscape = this.rect.isLandscape();        // if IPhone X:        if (isPortrait && this.windowHeight <= 719) {             offset = -58;        }        // if IPhone 6:        if (isPortrait && this.windowHeight <= 553) {            offset = -16;        }        // if Iphone version <= 5        if (this.windowHeight <= 550) {            offset = 25;        }        // for landscape view. Seams this works for all iphone devices with landscape view        if (isLandscape) {            offset = 1000;        }        setTimeout(function() {                           window.scroll(0, this.windowHeight / 2 + offset);        }.bind(this), 50);    }    else {        setTimeout(function() {            window.scroll(0, this.windowHeight / 2 + 95);        }.bind(this), 50);    }}ChatViewWithTeaser.prototype.offsetTop = function(element) {    return element.getBoundingClientRect().top +        (window.pageYOffset || document.documentElement.scrollTop) -        (document.documentElement.clientTop || 0);};function isIOS() {    return navigator && navigator.userAgent.match(/(iPad|iPhone|iPod)/i);}},{"./lib/chat-view-rect":37,"ja-cookie":13,"ja-dom":14,"ja-utils":17,"th-chat-view-base":103,"th-chat-window":40,"th-va-mobile-teaser":46}],39:[function(require,module,exports){var ChatHeader = require('th-chat-header').tmpl;var ChatDialog = require('th-chat-dialog').tmpl;var ChatQuestionBox = require('th-chat-question-box').tmpl;var ChatNotification = require('th-chat-notification').tmpl;var ChatCta = require('th-chat-cta').tmpl;var ChatMobileHeader = require('th-chat-mobile-header').tmpl;var MobileQuestionBox = require('th-chat-mobile-question-box').tmpl;module.exports = function (config) {    config = config || {};    config.mobile = config.mobile || {};    config.googleReengagement = config.googleReengagement || {};    var html = config.renderer || require('ja-dom-element');    var classString = (config.class || 'th-chat-window') + ' hidden';    var modalClassName = config.modalClassName || 'modal bottom right';    var backgroundClassName = config.backgroundClassName || 'background';    var expertProfile = config.expertProfile || {};    var headingText = config.headingText || config.heading || '';    var moreLinkText = config.moreLinkText || '';    var lessLinkText = config.lessLinkText || '';    var assistantProfile = config.profile || {};    var showCopyright = config.showCopyright || false;    var showHowItWorks = config.showHowItWorks || false;    var howJaWorks = config.howJaWorks || {};    var showHiwLink = config.showHiwLink || false;    var copyright;    var dataQualityChatClassName = ' dqt-chat';    modalClassName += dataQualityChatClassName;    if (config.showBackground === false) backgroundClassName += ' hidden';    if (config.minimized) classString += ' minimized';    if (config.rightRail) classString += ' right-rail';    var SelectedChatHeader = ChatHeader;    var SelectedQuestionBox = ChatQuestionBox;    if (config.mobile && config.mobile.isMobile) {        SelectedChatHeader = ChatMobileHeader;        SelectedQuestionBox = MobileQuestionBox;    }    if (showCopyright) {        copyright = html('div', {className: "copyright"})        modalClassName += ' with-copyright';    }    return (        html('div', {className: classString}, [            html('div', {className: modalClassName}, [                html('div', {className: "th-chat-top-border"}),                SelectedChatHeader({heading: headingText, expertProfile: expertProfile, moreLinkText: moreLinkText, lessLinkText: lessLinkText}),                ChatNotification(),                ChatDialog({                    isTypingText: config.isTypingText,                    isGoogleReengagementChat: !config.mobile.isMobile && config.googleReengagement.enable,                    assistantProfile: assistantProfile,                    showHowItWorks: config.showHowItWorks,                    howJaWorks: howJaWorks}                ),                SelectedQuestionBox({                    placeholder: config.rightRail ? config.initialPlaceholder : config.placeholder,                    sendButtonText: config.sendButtonText,                    statsText: config.statsText,                    showHiwLink: showHiwLink,                    howJaWorks: howJaWorks} ),"                ", ChatCta({marketingMessageText: config.marketingMessageText, ctaButtonText: config.ctaButtonText}),                copyright            ]),            html('div', {className: backgroundClassName})        ])    );};},{"ja-dom-element":80,"th-chat-cta":19,"th-chat-dialog":22,"th-chat-header":99,"th-chat-mobile-header":26,"th-chat-mobile-question-box":28,"th-chat-notification":101,"th-chat-question-box":30}],40:[function(require,module,exports){'use strict';var dom = require('ja-dom');var events = require('ja-event');var utils = require('ja-utils');var cookie = require('ja-cookie');var ChatHeader = require('th-chat-header');var ChatDialog = require('th-chat-dialog');var ChatNotification = require('th-chat-notification');var QuestionBox = require('th-chat-question-box');var ChatMobileHeader = require('th-chat-mobile-header');var MobileQuestionBox = require('th-chat-mobile-question-box');var chatModalTemplate = require('./th-chat-window-tmpl.js');var ChatCta = require('th-chat-cta');var hiddenClass = 'hidden';var minimizedClass = 'minimized';var minimizedWithoutAnimationClass = 'minimized-no-animation';var chatClass = 'th-chat-window';var showMinimizedChatCookieName = 'showMinimizedChat';var EXPANDED_RIGHT_RAIL_CLASSNAME = 'expanded-right-rail';function Chat(target, config) {    var self = this;    this.config = config || {};    this.target = target && target.nodeType ? target : document.querySelector(target);    if (!(this instanceof Chat)) return new Chat(target, this.config);    var chatClassSelector = '.' + (this.config.class || chatClass);    this.config.class = ''; // clear the custom class so we do not pass it to child components    this.config.time = this.config.time || 15000;    this.config.enableOnExit = !!this.config.enableOnExit;    this.config.disableTimer = !!this.config.disableTimer;    this.config.mobile = this.config.mobile || {};    this.config.rememberChatMinimizedState = this.config.rememberChatMinimizedState || false;    this.chatComponent = this.target.querySelector(chatClassSelector);    if (this.config.mobile.isMobile) {        this.header = ChatMobileHeader(this.config);        this.questionBox = MobileQuestionBox(this.chatComponent, this.config);    } else {        this.header = ChatHeader(this.config);        this.questionBox = QuestionBox(this.chatComponent, this.config);    }    this.chatDialog = ChatDialog(this.chatComponent, this.config);    this.notification = ChatNotification(this.config);    this.cta = ChatCta(this.chatComponent);    if (config.rightRail) {        this.questionBox.once('chat_qbox_click', expandRightRail);        this.questionBox.once('chat_qbox_key_down', expandRightRail);        this.questionBox.on('submit', function() {            self.questionBox.changePlaceholder(self.config.placeholder);        });    }    function expandRightRail() {        self.chatComponent = document.querySelector(chatClassSelector);        self.chatComponent.classList.add(EXPANDED_RIGHT_RAIL_CLASSNAME);    }}utils.mixin(Chat, events);Chat.prototype.render = function () {    var self = this;    if (!self.config.disableTimer) {        self.appearanceTimeout = setTimeout(function () {            if (!self.config.disableTimer && !self.expanded()) {                self.show();                self.trigger('chat-shown-by-timeout');            }        }, this.config.time);    }    if (self.config.enableOnExit) {        // The usage of setTimeout() has a reason!        // There is a bug in Chrome (as of v68). When onmouseout is run synchronously        // sometimes it calls the handler righ away with incorrect parameters.        // Related defect: DE17664 [GQ&A] [Virtual Assistant] Chat expands right after page was loaded        // https://rally1.rallydev.com/#/4874452619/detail/defect/243101548624        setTimeout(function () {            document.onmouseout = function (e) {                if (e.clientY <= 0 && !self.expanded()) {                    self.show();                    self.trigger('chat-shown-on-mouseout');                }            };        }, 0);    }    if (self.config.mobile && self.config.mobile.isMobile && self.config.mobile.edgeObject) {        window.onscroll = function () {            var currentPosition = document.body.scrollTop;            var edgeObject = self.config.mobile.edgeObject;            var edgeElement = edgeObject.nodeType ? edgeObject : document.querySelector(edgeObject);            var edge = edgeElement.offsetHeight || 0;            if (currentPosition > edge) {                self.show();                self.trigger('chat-shown-on-scrolling');            }        }    }};Chat.prototype.show = function(opts) {    opts = opts || {};    if (!this.config.disabled && !this.expanded()) {        this.trigger('before-show');        dom.removeClass(this.chatComponent, hiddenClass);        this._expandRightRail(opts);        if (this.config.rememberChatMinimizedState && this.getCookieForMinimizedState() === '1') {            this.minimizeWithoutAnimation();        }        this.trigger('show');    }};Chat.prototype._expandRightRail = function(opts) {    if (this.config.rightRail && (opts && opts.triggeredByInteraction || this.chatDialog.getMessagesCount() > 1)) {        dom.addClass(this.chatComponent, EXPANDED_RIGHT_RAIL_CLASSNAME);        this.chatDialog.scrollToBottom();    }};Chat.prototype.hide = function () {    if (this.expanded()) {        dom.addClass(this.chatComponent, hiddenClass);        this.trigger('hide');    }}Chat.prototype.showError = function (errorHeader, errorMessage) {    if (this.expanded()) {        this.questionBox.disable();        this.notification.showError(errorHeader, errorMessage);    }}Chat.prototype.showWarning = function (warningHeader, warningMessage) {    if (this.expanded()) {        this.questionBox.disable();        this.notification.showWarning(warningHeader, warningMessage);    }}Chat.prototype.hideNotification = function () {    if (this.expanded()) {        this.questionBox.enable();        this.notification.hideNotification();    }}Chat.prototype.minimize = function () {    if (!this.minimized() && !this.minimizedWithoutAnimation()) {        dom.addClass(this.chatComponent, minimizedClass);        if (this.config.rememberChatMinimizedState) {            this.setCookieToShowMinimized();        }        this.trigger('minimize');    }}Chat.prototype.expand = function (opts) {    if (this.minimized() || this.minimizedWithoutAnimation()) {        this.trigger('before-expand');        if (this.config.rememberChatMinimizedState && this.getCookieForMinimizedState() === '1') {            this.setCookieToShowExpanded();        }        dom.removeClass(this.chatComponent, minimizedClass);        dom.removeClass(this.chatComponent, minimizedWithoutAnimationClass);        this._expandRightRail(opts);        this.trigger('expand');    }}Chat.prototype.minimizeWithoutAnimation = function () {    if (!this.minimized() && !this.minimizedWithoutAnimation()) {        dom.addClass(this.chatComponent, minimizedWithoutAnimationClass);    }}Chat.prototype.setCookieToShowMinimized = function () {    cookie.set(showMinimizedChatCookieName, 1, {        expires: 1 * 24 * 60 * 60    });}Chat.prototype.setCookieToShowExpanded = function () {    cookie.set(showMinimizedChatCookieName, 0, {        expires: 1 * 24 * 60 * 60    });}Chat.prototype.getCookieForMinimizedState = function () {    var minimizedCookieValue = cookie.get(showMinimizedChatCookieName);    return (minimizedCookieValue !== undefined) ? minimizedCookieValue : '0';}Chat.prototype.expanded = function () {    return !dom.hasClass(this.chatComponent, hiddenClass);}Chat.prototype.minimized = function () {    return dom.hasClass(this.chatComponent, minimizedClass);}Chat.prototype.minimizedWithoutAnimation = function () {    return dom.hasClass(this.chatComponent, minimizedWithoutAnimationClass);}Chat.prototype.getChatDialogMinHeight = function () {    var minHeight = this.chatDialog.element.style['min-height'];    return parseInt(minHeight.replace('px', ''), 10) || 0;};Chat.tmpl = function (config) {    return chatModalTemplate(config);};module.exports = Chat;},{"./th-chat-window-tmpl.js":39,"ja-cookie":13,"ja-dom":14,"ja-event":83,"ja-utils":17,"th-chat-cta":19,"th-chat-dialog":22,"th-chat-header":99,"th-chat-mobile-header":26,"th-chat-mobile-question-box":28,"th-chat-notification":101,"th-chat-question-box":30}],41:[function(require,module,exports){'use strict';var events = require('ja-event');var utils = require('ja-utils');module.exports = ChatMessageCollector;function ChatMessageCollector(config) {    if (!(this instanceof ChatMessageCollector)) return new ChatMessageCollector(config);    this.config = config || {};    this.config.separator = this.config.separator || ' ';    this.config.timeout = this.config.timeout || 4000;    this.messages = [];    this.timer = 0;}ChatMessageCollector.prototype.push = function (message) {    if(typeof message === 'string') {        this.messages.push({ text: message });    } else if (message && typeof message.text === 'string' ) {        this.messages.push(message);    } else {        return;    }    this.resetTimeout();}ChatMessageCollector.prototype.join = function (separator) {    return {        text: this.messages.map(function (message) {            return message.text;        }).join(separator || this.config.separator)    }}ChatMessageCollector.prototype.empty = function () {    clearTimeout(this.timer);    this.messages.length = 0;}ChatMessageCollector.prototype.length = function () {    return this.messages.length;}ChatMessageCollector.prototype.resetTimeout = function () {    var self = this;    if (self.length() > 0) {        clearTimeout(self.timer);        self.timer = setTimeout(function () {            self.trigger('timeout', { text: self.join() });        }, self.config.timeout);    }}ChatMessageCollector.prototype.clearTimeout = function () {    clearTimeout(this.timer);}utils.mixin(ChatMessageCollector, events);},{"ja-event":83,"ja-utils":17}],42:[function(require,module,exports){'use strict';var events = require('ja-event');var utils = require('ja-utils');var chatStorage = require('@justanswer/th-va-chat-storage');var cookie = require('ja-cookie');var ChatClient = require('ja-chat-client');var ChatTracking = require('th-chat-tracking');var MessageCollector = require('./lib/MessageCollector');var ajax = require('ja-ajax');var MAX_RETRY_COUNT = 3;var RETRY_AFTER_SECONDS = 5;var RequestType = {    GetAssistantProfile: 0,    CreateChat: 1,    PostMessage: 2,    CompleteChat: 3,    GetMessages: 4,    GetChat: 5,    RestoreChat: 6,};module.exports = VirtualAssistant;function VirtualAssistant(target, view, config) {    if (!(this instanceof VirtualAssistant)) {        return new VirtualAssistant(target, view, config);    }    this.target =        target && target.nodeType ? target : document.querySelector(target);    if (!this.target) {        console.log('error: there is no target');        return;    }    if (!view) {        console.log('error: View is missing');        return;    }    this.config = config || {};    fillDefaultValuesIfNeeded(this.config);    this.view = view;    this.chatClient = new ChatClient({        endpoint: this.config.endpoint,        partnerId: this.config.partnerId,        partner: this.config.partner    });    this.messageCollector = new MessageCollector({        separator: this.config.messagesSeparator,        timeout: this.config.customerIdleInMilliseconds    });    this.chatTracking = new ChatTracking();    this.enablePearlCategorization = config.enablePearlCategorization || false;}function fillDefaultValuesIfNeeded(config) {    config.proceedToCcTime = config.proceedToCcTime || 10000;    config.animationTimeIntervals = config.animationTimeIntervals || [        100,        300,        400,        500,        700,        1300,    ];    config.customerIdleInMilliseconds =        config.customerIdleInMilliseconds || 4000;    config.delayChatCompletionOnResponseAfterPaymentMessageInMilliseconds =        config            .delayChatCompletionOnResponseAfterPaymentMessageInMilliseconds ||        2000;    config.animationMaxDuration = config.animationMaxDuration || 4000;    config.messagesSeparator = config.messagesSeparator || ' ';    config.rParameter = config.rParameter || 'JAPPC';    config.addRParameterOnPayment = config.addRParameterOnPayment        ? config.addRParameterOnPayment        : false;    config.heading = config.heading || config.headingText;    config.showCta = config.showCta || false;    config.showCtaTime = config.showCtaTime || 5000;}utils.mixin(VirtualAssistant, events);VirtualAssistant.prototype.restoreChatFailureHandler = function (response) {    var self = this,        error = response ? response.error : undefined;    if (error && error.statusCode === 404) {        // existing chat not found, try to start a new one        cookie.expire(self.getChatIdCookieName());        chatStorage.removeChat(self.config.initialCategoryId);        self.initialize();    }};VirtualAssistant.prototype.initialize = function () {    var self = this,        cookieAssistantKey = self.getAssistantKeyFromCookie(),        virtualAssistantCookieConfigString = self.getVirtualAssistantConfigCookie(            self.config.categoryName        ),        virtualAssistantConfigObject = {            categoryId: self.config.initialCategoryId,            source: self.config.source,            botName: self.config.botName,            chatType: self.config.type        },        storedChat = chatStorage.getChat(self.config.initialCategoryId);    self.isFirstMessageSent = false;    self.setupConnectionHandlers();    if (virtualAssistantCookieConfigString) {        var cookieConfigObject = null;        try {            cookieConfigObject = JSON.parse(virtualAssistantCookieConfigString);            virtualAssistantConfigObject.categoryId =                cookieConfigObject.categoryId ||                virtualAssistantConfigObject.initialCategoryId;            virtualAssistantConfigObject.source =                cookieConfigObject.source ||                virtualAssistantConfigObject.source;            virtualAssistantConfigObject.botName =                self.getBotNameForRestoreChat(cookieConfigObject) ||                virtualAssistantConfigObject.botName;            virtualAssistantConfigObject.chatType =                cookieConfigObject.type || virtualAssistantConfigObject.type;        } catch (error) {            cookie.expire(                self.getVirtualAssistantConfigCookie(self.config.categoryName)            );            console.log(JSON.stringify(error));        }    }    if (storedChat && storedChat.messages        && storedChat.messages.length > 1 && storedChat.isHardcoded) {        self.processRequestWithHardcodedChat(RequestType.RestoreChat);    } else {        if (cookieAssistantKey) {            self.chatClient                .restoreChat(cookieAssistantKey, virtualAssistantConfigObject)                .thenSuccess(function (data) {                    self.initChat(data);                })                .thenFailure(function (response) {                    self.restoreChatFailureHandler(response);                });        } else {            self.chatClient.getAssistantProfile(                self.config.initialCategoryId,                self.config.type,                self.config.botName,                self.config.source,                self.config.partner)                .thenSuccess(function (data) {                    chatStorage.addAssistantProfile(self.config.initialCategoryId, data);                    self.initChat(data);                })                .thenFailure(function (data) {                    console.log(JSON.stringify(data));                });        }    }    reloadPageIfCached();};VirtualAssistant.prototype.initChat = function (data) {    this.config.profile = data.profile || data;    this.setupHandlers();    if (data.messages) {        this.restoreChat(data);        this.view.continueChat();    } else {        this.view.startChat();    }    this.initialized = true;    this.trigger('appear', data);}VirtualAssistant.prototype.setupConnectionHandlers = function () {    var self = this;    var retryCounter = 0;    self.chatClient.on('RequestFailure', function (e) {        if (retryCounter < MAX_RETRY_COUNT) {            self.trigger('chat-connection-retry');            setTimeout(function () {                e.request.retry();                retryCounter++;            }, RETRY_AFTER_SECONDS * 1000);        } else {            var failureMessage = getFailureMessageByRequestType(e.type) || 'Connection failure';            self.trigger('connectionFailure', failureMessage);            self.processRequestWithHardcodedChat(e.type);        }    });};VirtualAssistant.prototype.processRequestWithHardcodedChat = function (requestType) {    var self = this;    self.switchToHardcodedChat();    switch (requestType) {        case RequestType.GetAssistantProfile: {            self.chatClient.getAssistantProfile(                self.config.initialCategoryId,                self.config.type,                self.config.botName,                self.config.source,                self.config.partner            ).thenSuccess(function (data) {                chatStorage.addAssistantProfile(self.config.initialCategoryId, data);                self.initChat(data);            });            break;        }        case RequestType.CreateChat:        case RequestType.PostMessage: {            self.postMessage(self.lastMessage);            break;        }        case RequestType.RestoreChat: {            var storedChat = chatStorage.getChat(self.config.initialCategoryId);            self.initChat(storedChat);            break;        }        case RequestType.CompleteChat: {            var chat = chatStorage.getChat(self.config.initialCategoryId);            self.chatClient.completeChat(chat)                .thenSuccess(function (response) {                    chatStorage.removeChat();                    var paymentWindow = self.config.isNewPaymentWindow                        ? window.open(redirectUrl, '_blank') : null;                    self.completeChatPostAction(paymentWindow, response.data.RedirectUrl, 'Direct', {})                })                .thenFailure(function (response) {                    console.log(JSON.stringify(response.error));                });            break;        }    }};VirtualAssistant.prototype.switchToHardcodedChat = function () {    var self = this;    var chat = chatStorage.getChat(self.config.initialCategoryId);    self.chatClient = new ChatClient({        chat: chat,        endpoint: ChatClient.hardCodedEndpoint,        partnerId: self.config.partnerId,        partner: self.config.partner,        categoryId: self.config.initialCategoryId,        fallbackEndpoint: self.config.fallbackEndpoint,        fallbackConversationKey: self.config.fallbackConversationKey    });    chatStorage.markAsHardcoded(self.config.initialCategoryId);    self.trigger('switched-to-pearl-fallback');};function getFailureMessageByRequestType(type) {    var message = '';    switch (type) {        case RequestType.GetAssistantProfile:            message = 'Failed to get assistant profile.';            break;        case RequestType.CreateChat:            message = 'Failed to create chat.';            break;        case RequestType.PostMessage:            message = 'Failed to post message.';            break;        case RequestType.CompleteChat:            message = 'Failed to complete chat.';            break;        case RequestType.GetMessages:            message = 'Failed to get messages.';            break;        case RequestType.RestoreChat:            message = 'Failed to restore messages.';            break;        default:            message = '';            break;    }    return message;}VirtualAssistant.prototype.setupHandlers = function () {    var self = this;    self.config.isTypingText = (        self.config.isTypingText || '{0} is typing...'    ).replace('{0}', getAssistantName(self.config));    self.view.render(self.config);    self.view.on('customer-typing', function () {        self.messageCollector.resetTimeout();        if (self.isReadyForPayment) {            self.resetChatCompleteTimeout();        }    });    self.view.on('customer-replied', function (message) {        self.view.postCustomersMessage(message.text);        if (self.isReadyForPayment) {            if (                isChatCompleteAllowed(                    self.lastMessageTime,                    self.isReadyForPayment,                    self.config                        .delayChatCompletionOnResponseAfterPaymentMessageInMilliseconds                )            ) {                self.completeChat('Reply', message);            } else {                self.postMessage(message);            }            self.lastMessageTime = new Date();            return;        }        self.messageCollector.push(message);        self.trigger('submit');        self.view.assistantStartTyping();    });    self.messageCollector.on('timeout', function (message) {        var storageMessage = message.text;        storageMessage.attributes = self.getMessageAttributes();        chatStorage.addMessage(self.config.initialCategoryId, storageMessage, chatStorage.messageRoles.customer);        self.postMessage(message.text);        self.messageCollector.empty();    });    self.view.once('assistant-finished-typing', function () {        if (!self.isFirstMessageSent) {            var messageConfig = getAssistantMessageConfig(self.config);            messageConfig.isFirstMessage = true;            self.view.postAssistantsMessage(                self.config.welcomeMessageText || self.config.profile.greeting,                messageConfig            );        }        self.view.allowSendQuestions && self.view.allowSendQuestions();    });    self.view.on('pause', function () {        clearTimeout(self.ccTimeout);    });    self.view.on('resume', function () {        if (self.isReadyForPayment) {            if (self.isRedirectedToPaymentPage) clearTimeout(self.ccTimeout);            else self.resetChatCompleteTimeout();        }    });    self.view.on('cta-button-clicked', function () {        self.completeChat('Direct');    });    self.view.on('teaser-continue-link-was-clicked', function (event) {        self.completeChat('Direct');    });    self.chatClient.on('RequestPerformed', function (requestInfo) {        self.trigger('requestPerformed', requestInfo);    });    self.chatClient.on('RequestPerformed', function (requestInfo) {        var requestTime = requestInfo.time;        var methodName = requestInfo.name;        var options = {};        options.eventAction = 'request-details';        options.eventValue = Math.trunc(requestTime/1000);        var date = new Date().toISOString();        options.eventLabel = 'ExternalBotChatId=' + self.chatId + ';'                            + 'BotName=' + self.config.botName + ';'                             + 'BotCallDurationMs=' + requestTime + ';'                            + 'MethodType=' + methodName + ';'                            + 'InsertDateTime=' + date + ';'                                         self.trigger('request-details', options);    });};VirtualAssistant.prototype.resetChatCompleteTimeout = function () {    var self = this;    if (!self.isReadyForPayment) {        return;    }    clearTimeout(self.ccTimeout);    clearTimeout(self.ctaTimeout);    self.ccTimeout = setTimeout(function () {        self.completeChat('Timeout');    }, self.config.proceedToCcTime);    if (this.config.showCta) {        self.ctaTimeout = setTimeout(function () {            if (self.view.isInputEmpty()) self.view.showCta();        }, self.config.showCtaTime);    }};VirtualAssistant.prototype.handleResponse = function (response) {    var self = this;    if (!response || !response.chatId) return;    self.trigger('response-received', response);    if (self.chatId != response.chatId) {        // set cookie for persistency        var options = {            expires:                (isNaN(self.config.sessionExpirationHours)                    ? 7 * 24                    : self.config.sessionExpirationHours) *                60 *                60,            path: '/',        };        if (self.config.domain) {            options.domain = self.config.domain;        }        cookie.set(self.getChatIdCookieName(), response.chatId, options);        self.chatId = response.chatId;    }    if (response.paymentUrl) {        self.paymentUrl = response.paymentUrl;    }    if (self.isReadyForPayment) return;    var messageConfig = getAssistantMessageConfig(self.config);    if (response.attributes) {        if (response.attributes.action === 'payment') {            messageConfig.showContinueLink = true;            self.isReadyForPayment = true;            self.botVersion =                response.attributes.v || response.attributes.botName;            if (                response.attributes.paymentLanguage === 'paid_trial_membership'            ) {                if (response.chatId) {                    self.trigger(                        'paid-trial-membership-payment-message-received',                        response.chatId                    );                }            }        }        if (response.attributes.MessageCounter) {            self.messageCounter = response.attributes.MessageCounter;        }    }    if(response.attributes && response.attributes['chatScriptIntent'] == 'ANSWER_TAKING_TOO_LONG_NONE') {        self.markQuestionAsHighPriority();    }    else {        self.view.postAssistantsMessage(response.text, messageConfig);    }    if (messageConfig.showContinueLink) {        var continueLinkInterval = setInterval(function () {            var continueLink = self.target.querySelector('.continue-link');            if (continueLink) {                continueLink.addEventListener('click', function () {                    self.completeChat('Direct');                });                clearInterval(continueLinkInterval);            }        }, 100);        self.resetChatCompleteTimeout();    }};VirtualAssistant.prototype.completeChat = function (reason, message) {    var self = this;    // prevent chat complete by Timeout if in iframe    if (        window.self !== window.top &&        !self.config.isAmp &&        reason === 'Timeout'    )        return;    // prevent simultaneous multiple of chat completion:    if (self.isCompleting) return;    self.isCompleting = true;    clearTimeout(self.ccTimeout);    var redirectUrl = [        self.paymentUrl ||        'https://my-secure.justanswer.com/va/payment/' + self.chatId,        '?r=',        self.config.rParameter,        self.config.expertProfile && self.config.expertProfile.id            ? '&selectedexpertid=' + self.config.expertProfile.id            : '',    ].join('');    if (self.config.showCta) self.view.showCta();    var paymentWindow =        reason !== 'Timeout' && self.config.isNewPaymentWindow            ? window.open(redirectUrl, '_blank')            : null;    if (isWindowOpened(paymentWindow)) {        if (paymentWindow && paymentWindow.focus) paymentWindow.focus();        self.isRedirectedToPaymentPage = true;        self.view.completeChat();        self.trigger('complete');        setTimeout(function () {            // prevent accidental double-click            self.isCompleting = false; // allow repeated chat completion in case a separate tab is closed        }, 2000);    }    if (isTypeOfHardCodedClient(this.chatClient)) {        var chat = chatStorage.getChat(self.config.initialCategoryId);        this.chatClient.completeChat(chat)            .thenSuccess(function (response) {                chatStorage.removeChat();                self.completeChatPostAction(paymentWindow, response.data.RedirectUrl, reason, {})            })            .thenFailure(function (response) {                console.log(response);                self.isCompleting = false;            });    }    else {        this.chatClient            .completeChat(self.chatId, reason, message)            .thenSuccess(this.completeChatPostAction.bind(this, paymentWindow, redirectUrl, reason));    }};VirtualAssistant.prototype.completeChatPostAction = function (paymentWindow, redirectUrl, reason, data) {    var self = this;    var vanameParam = 'vaname=' + self.botVersion;    if (        (window.self === window.top || self.config.isAmp) &&        !isWindowOpened(paymentWindow)    ) {        if (data.paidTrialMembershipInfo) {            self.trigger('paid-trial-membership-chat-completed', {                paidTrialMembershipInfo: data.paidTrialMembershipInfo            });        }        var win = self.config.isAmp ? window.top : window;        var paymentUrl = data.redirectUrl            ? data.redirectUrl +            (/[?]/i.test(data.redirectUrl) ? '&' : '?') +            vanameParam            : data.paymentUrl                ? data.paymentUrl +                (self.config.addRParameterOnPayment                    ? (/[?]/i.test(data.paymentUrl) ? '&' : '?') +                    'r=' +                    self.config.rParameter                    : '')                : redirectUrl;        self.trigger('chat-controller-before-payment-redirect');        win.location = self.appendUrlWithAdditionalParams(paymentUrl);        self.isRedirectedToPaymentPage = true;        self.view.completeChat();        self.trigger('complete', reason);        self.trigger('redirect_to_payment');    }};VirtualAssistant.prototype.appendUrlWithAdditionalParams = function (url) {    if (!this.additionalPaymentUrlParams) {        return url;    }    var keys = Object.keys(this.additionalPaymentUrlParams),        queryString = '';    for (var i = 0; i < keys.length; i++) {        var key = keys[i] + '=';        queryString += url.indexOf(key) == -1 ? '&' + key + this.additionalPaymentUrlParams[keys[i]] : '';    }    url +=  url.indexOf('?') != -1 ? queryString : queryString.replace('&', '?');    return url};VirtualAssistant.prototype.setAdditionalPaymentUrlParams = function (object) {    this.additionalPaymentUrlParams = object;};VirtualAssistant.prototype.restoreChat = function (data) {    var self = this;    var isReadyForPayment = false;    self.chatId = data.chatId;    self.paymentUrl = data.paymentUrl;    self.isFirstMessageSent = true;    self.view.clearChat();    if (data.messages.length > 0 && self.config.welcomeMessageText) {        data.messages[0].text = self.config.welcomeMessageText;    }    self.messageCounter =        data.messages[data.messages.length - 1].attributes.MessageCounter;    data.messages.forEach(function (message) {        if (message.role === 'Assistant') {            var messageConfig = getAssistantMessageConfig(self.config);            if (message.attributes && message.attributes.action === 'payment') {                messageConfig.showContinueLink = true;                isReadyForPayment = true;            }            if(message.attributes && message.attributes['chatScriptIntent'] == 'ANSWER_TAKING_TOO_LONG_NONE') {                self.markQuestionAsHighPriority();            }            else {                self.view.postAssistantsMessage(message.text, messageConfig);            }            var continueLink = self.target.querySelector('.continue-link');            if (continueLink) {                continueLink.addEventListener('click', function () {                    self.botVersion =                        message.attributes &&                        (message.attributes.v || message.attributes.botName);                    self.completeChat('Direct');                });            }        } else {            self.view.postCustomersMessage(message.text);        }    });    if (isReadyForPayment) {        self.view.disableInput();        if (this.config.showCta) {            self.view.showCta();        }    } else {        self.view.enableInput();    }    self.view.allowSendQuestions && self.view.allowSendQuestions();    self.trigger('restore');};VirtualAssistant.prototype.postMessage = function (message) {    var self = this;    self.lastMessage = message;    var chatMessage = { text: message.text };    if (!self.config.disableAssistantTypingAfterCustomerTyping) {        self.view.assistantStartTyping();    }    if (!self.isFirstMessageSent) {        self.isFirstMessageSent = true;        var chatContext = {            categoryId: self.config.initialCategoryId,            locationUrl: window.location.href,            type: self.config.type,            attributes: {                source: self.config.source,                EnablePearlCategorization: self.enablePearlCategorization,            },            pricePolicy: self.config.pricePolicy,            dynamicAttributes: self.config.dynamicChatAttributes,        };        var chatAttributes = self.config.firstChatMessageAttributes || {};        if (this.config.addExpertCountAttribute) {            var exertsOnlineCount = getOnlineNowExpertsCount(this.target);            chatAttributes.expertsOnline = exertsOnlineCount;        }        if (this.config.contentUrl) {            chatAttributes.contentUrl = this.config.contentUrl;        }        utils.mixin(chatContext.attributes, chatAttributes);        var testExperience = self.chatTracking.getExperimentDataString();        if (testExperience && testExperience.length) {            chatContext.attributes.TestExperience = testExperience;        }        var deviceCategory = self.chatTracking.getDeviceCategory();        if (deviceCategory && deviceCategory.length) {            chatContext.attributes.DeviceCategory = deviceCategory;        }        self.chatClient            .createChat(chatContext, chatMessage, self.config.botName)            .thenSuccess(function (response) {                chatStorage.addMessage(self.config.initialCategoryId, response, chatStorage.messageRoles.assistant);                self.handleResponse(response);            });    } else {        chatMessage.attributes = self.getMessageAttributes();        self.chatClient            .postMessage(self.chatId, chatMessage, self.config.botName)            .thenSuccess(function (response) {                chatStorage.addMessage(self.config.initialCategoryId, response, chatStorage.messageRoles.assistant);                self.handleResponse(response);                self.lastMessageTime = new Date();            });    }};VirtualAssistant.prototype.getMessageAttributes = function () {    var self = this;    if (!self.isFirstMessageSent) {        return { MessageCounter: 1 };    }    if (self.messageCounter) {        return {            MessageCounter: self.messageCounter,            EnablePearlCategorization: self.enablePearlCategorization        };    }};VirtualAssistant.prototype.getChatIdCookieName = function () {    return this.config.chatIdCookieName || 'JustAnswerVirtualAssistant';};VirtualAssistant.prototype.getVirtualAssistantConfigCookie = function (    categoryName) {    return cookie.get('JustAnswerVirtualAssistantConfig' + categoryName);};/** * There is a possibility to send additional params to dialog player * if you just extend botName with additional parameters. BotName is a string and * we can generate something like this botName=Pearlv2&category=MyCategory&specialty=MySpecialty */VirtualAssistant.prototype.getBotNameForRestoreChat = function (    cookieConfigObject) {    var botName = cookieConfigObject.botName;    for (var property in cookieConfigObject) {        if (            cookieConfigObject.hasOwnProperty(property) &&            property !== 'botName' &&            property !== 'type'        ) {            botName += '&' + property + '=' + cookieConfigObject[property];        }    }    return botName;};VirtualAssistant.prototype.getAssistantKeyFromCookie = function () {    return cookie.get(this.getChatIdCookieName()) || null;};VirtualAssistant.prototype.markQuestionAsHighPriority = function(isChatRestore) {    var self = this;    var chatMessageConfig = getAssistantMessageConfig(self.config);    var questionPageUrl = 'https://my-secure' + self.config.domain + '/question/index/' + self.config.questionId;    var message = "Sorry there's no answer yet! I just marked your question as Urgent. As soon as it's ready, we'll notify you on <a id='question-index-link' href='"    + questionPageUrl    + "' target=' blank'>this page</a>, and by text and email. Thanks for your patience!";    if(!isChatRestore) {        var config = {            method: 'POST',            uri: '/dashboard/markashighpriority'        };        ajax(config, function(error, response, body) {            if (!response || response.statusCode !== 200) {                return;            }        });    }    self.view.postAssistantsMessage(message, chatMessageConfig);}function isChatCompleteAllowed(lastMessageTime, isReadyForPayment, delay) {    var timediff = new Date() - lastMessageTime;    return isReadyForPayment && timediff > delay;}function getAssistantName(config) {    return config.assistantName || config.profile.name || 'Pearl Wilson';}function getAssistantMessageConfig(config) {    return {        name: getAssistantName(config),        title:            config.assistantTitle ||            config.profile.title ||            "Expert's Assistant",        avatar: config.avatar || config.profile.avatar,        continueLinkText: config.continueLinkText,        displayNameWithoutTitle: config.displayNameWithoutTitle,    };}function isWindowOpened(win) {    return win && !win.closed && typeof win.closed !== 'undefined';}function reloadPageIfCached() {    window.onpageshow = (function (original) {        return function (event) {            if (original) {                original(event);            }            if (event.persisted) {                window.location.reload();            }        };    })(window.onpageshow);}function getOnlineNowExpertsCount(element) {    var onlineNowEl = element.querySelector('.online-now');    if (!onlineNowEl) {        return 0;    }    var onlineNowAmount = parseInt(onlineNowEl.textContent.split(' ')[0], 10);    return isNaN(onlineNowAmount) ? 0 : onlineNowAmount;}function isTypeOfHardCodedClient(client) {    return client.fallbackEndpoint ? true : false;}},{"./lib/MessageCollector":41,"@justanswer/th-va-chat-storage":44,"ja-ajax":1,"ja-chat-client":6,"ja-cookie":13,"ja-event":83,"ja-utils":17,"th-chat-tracking":32}],43:[function(require,module,exports){// Object.assign() polyfill for ie browserif (!Object.assign) {    Object.defineProperty(Object, 'assign', {        enumerable: false,        configurable: true,        writable: true,        value: function (target) {            'use strict';            if (target === undefined || target === null) {                throw new TypeError('Cannot convert first argument to object');            }            var to = Object(target);            for (var i = 1; i < arguments.length; i++) {                var nextSource = arguments[i];                if (nextSource === undefined || nextSource === null) {                    continue;                }                nextSource = Object(nextSource);                var keysArray = Object.keys(Object(nextSource));                for (                    var nextIndex = 0, len = keysArray.length;                    nextIndex < len;                    nextIndex++                ) {                    var nextKey = keysArray[nextIndex];                    var desc = Object.getOwnPropertyDescriptor(                        nextSource,                        nextKey                    );                    if (desc !== undefined && desc.enumerable) {                        to[nextKey] = nextSource[nextKey];                    }                }            }            return to;        },    });}},{}],44:[function(require,module,exports){'use strict';require('./lib/object-assign-polyfill');module.exports =   {    messageRoles : {        customer: "Customer",        assistant: "Assistant"    },    markAsHardcoded: function (categoryId) {        var existingChat = this.getChat(categoryId),            updatedChat = Object.assign({}, existingChat, { isHardcoded: true });        this.storeChat(categoryId, updatedChat);    },    addAssistantProfile: function (categoryId, data) {        if (!data) {            return;        }        var existingChat = this.getChat(categoryId),            isHardcoded = (existingChat && existingChat.isHardcoded) || false,            assistantProfile = data.profile || { name: data.name, greeting: data.greeting, title: data.title },            messages = [{                 text: assistantProfile.greeting,                role: this.messageRoles.assistant            }],            updatedChat = Object.assign({}, assistantProfile, { messages: messages, isHardcoded: isHardcoded });        this.storeChat(categoryId, updatedChat);    },        addMessage: function (categoryId, message, role){        var existingChat = this.getChat(categoryId),            newMessage = Object.assign({}, message, { role: role }),            chatMessages = (existingChat && existingChat.messages) || [];        chatMessages.push(newMessage);        var updatedChat = Object.assign({}, existingChat, { messages: chatMessages });        this.storeChat(categoryId, updatedChat);    },        getChat: function (categoryId) {        try {            return JSON.parse(localStorage[categoryId]);        } catch (e) {            return null;        }    },    storeChat: function (categoryId, chat) {        localStorage[categoryId] = JSON.stringify(chat);    },        removeChat: function (categoryId) {        localStorage.removeItem(categoryId);    }};},{"./lib/object-assign-polyfill":43}],45:[function(require,module,exports){module.exports = function(config) {    var self = this;    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.class || 'th-va-mobile-teaser';	var pearlImg = config.pearlImg || '../images/pearl.jpg';    var userInput = config.userInput || false;    var cta = config.cta || false;    var theme = config.theme || 'blue'; // blue, dark    var size = config.size || 'standard'; // standard, large    var place = config.place || 'right'; // right, left    var canCloseTeaser = config.canCloseTeaser || false;    return (        html('div', {className: classString, 'data-state-theme': theme, 'data-state-size': size, 'data-state-place': place}, [            html('div', {className: "teaser"}, [                html('div', {className: "message-cell"}, [                    html('div', {className: "welcome-message"}, [                        html('div', {className: "message ellipsis"}, [                            canCloseTeaser && html('div', {className: "close-message"}),                            html('div', {className: "message-content"}, [                                html('span', {className: "dot"}),                                html('span', {className: "dot"}),                                html('span', {className: "dot"})                            ]),                            userInput ?                                html('p', {className: "user-input"}, ["Type your reply here..."])                            : '',                            cta ?                                html('div', {className: "cta ja-buttons ja-button-tiny"}, ["Reply"])                            : ''                        ])                    ])                ]),                html('div', {className: "pearl"}, [                    html('div', {className: "image-cell"}, [                        html('div', {className: "image"}, [html('img', {className: "teaser-image", src: pearlImg, width: "62", height: "62"})])                    ]),                    html('span', {className: "badge"}, ["1"]),                    canCloseTeaser && html('span', {className: "close badge"})                ])            ]),            html('div', {className: "teaser-background"}),            html('div', {className: "trigger"}, ["Show"]),            html('div', {className: "trigger-maximize"}, ["Maximize"])        ])    );}},{"ja-dom-element":80}],46:[function(require,module,exports){var tmpl = require('./th-va-mobile-teaser-tmpl.js');var dom = require('ja-dom');var event = require('ja-event');var utils = require('ja-utils');module.exports = VaMobileTeaser;utils.mixin(VaMobileTeaser, event);var hiddenClass = 'hidden';function VaMobileTeaser(target, config) {    if (!(this instanceof VaMobileTeaser)) return new VaMobileTeaser(target, config);    var self = this;    config = config || {};    config.ignoreTmpl = config.ignoreTmpl || false;    this.userInput = config.userInput;    this.cta = config.cta;    this.content = config.content;    this.element = target.nodeType ? target : document.querySelector(target);    if (!this.element) return;    this.target = this.element; //for backward compatibility    if (!config.ignoreTmpl) this.element.appendChild(tmpl(config));    this.teaserElement = this.element.querySelector(config.class ? ('.' + config.class) : '.th-va-mobile-teaser');    if (!this.teaserElement) return;    this.timeouts = {        showTeaser: 500,        hideTeaser: 100,        showMessage: 1000,        showMessageContent: 3000,        showBadge: 1000    };    utils.extend(this.timeouts, config.timeouts);    this.pearlElement = this.teaserElement.querySelector('.pearl');    this.messageCellElement = this.teaserElement.querySelector('.message');    this.teaserBackgroundElement = this.teaserElement.querySelector('.teaser-background');    var ctaTrigger = this.teaserElement.querySelector('.cta');    if (ctaTrigger) {        ctaTrigger.addEventListener('click', function(e) {            self.hideTeaser();        });    }    this.messageCellElement.addEventListener('click', function(event) {        if (config.redirectTo) {            window.top.location = config.redirectTo();            return;        }        self.trigger('teaser-was-clicked', event);    });    this.pearlElement.addEventListener('click', function(event) {        if (config.redirectTo) {            window.top.location = config.redirectTo();            return;        }        self.trigger('teaser-was-clicked', event);    });    var closeMessage = this.teaserElement.querySelector('.close-message');    if (closeMessage) {        closeMessage.addEventListener('click', function(event) {            event.stopPropagation();            self.hideMessage();        });    }    var closeTeaser = this.teaserElement.querySelector('.close');    if (closeTeaser) {        closeTeaser.addEventListener('click', function(event) {             event.stopPropagation();            self.hideTeaser();        });    }};VaMobileTeaser.prototype.showTeaser = function() {    var self = this;    this.showBackground();    dom.removeClass(this.teaserElement, 'hidden');    setTimeout(function() {        self.showPearl();    }, self.timeouts.showTeaser);    self.trigger('teaser-is-shown');};VaMobileTeaser.prototype.hideTeaser = function() {    var self = this;    var welcomeMessageElement = this.teaserElement.querySelector('.welcome-message');    var pearlElement = this.pearlElement;    this.hideBackground();    if (!self.timeouts.hideTeaser) {        _hideTeaser();    } else {        setTimeout(_hideTeaser, self.timeouts.hideTeaser);    }    function _hideTeaser() {        dom.removeClass(welcomeMessageElement, 'zoomIn');        dom.addClass(welcomeMessageElement, 'zoomOutRight');        dom.addClass(pearlElement, 'zoomOutDown');        dom.addClass(pearlElement, hiddenClass);        dom.addClass(self.teaserElement, hiddenClass);    }    this.trigger('teaser-is-hidden');};VaMobileTeaser.prototype.showPearl = function() {    var self = this;    var imgCellElement = this.pearlElement;    dom.removeClass(imgCellElement, 'zoomOutDown');    dom.removeClass(imgCellElement, hiddenClass);    dom.addCls(imgCellElement, 'zoomInUp');    setTimeout(function() {        self.showMessage();    }, self.timeouts.showMessage);    self.trigger('icon-is-shown');};VaMobileTeaser.prototype.updateImage = function (source) {    var teaserImage = this.pearlElement.querySelector('.teaser-image');    teaserImage.setAttribute('src', source);};VaMobileTeaser.prototype.showBackground = function() {    dom.removeClass(this.teaserBackgroundElement, 'fadeOutDown');    dom.addClass(this.teaserBackgroundElement, 'fadeInUp');};VaMobileTeaser.prototype.hideBackground = function() {    dom.removeClass(this.teaserBackgroundElement, 'fadeInUp');    dom.addClass(this.teaserBackgroundElement, 'fadeOutDown');};VaMobileTeaser.prototype.showMessage = function() {    var self = this;    var welcomeMessageElement = this.teaserElement.querySelector('.welcome-message');    dom.removeClass(welcomeMessageElement, 'zoomOutRight');    dom.addClass(welcomeMessageElement, 'zoomIn');    if (this.content) {        setTimeout(function() {            self.changeMessage();            self.showInput();            self.showCta();        }, self.timeouts.showMessageContent);    }    self.trigger('message-is-shown');};VaMobileTeaser.prototype.changeMessage = function(silently) {    var self = this;    dom.removeCls(this.messageCellElement, 'ellipsis');    this.teaserElement.querySelector('.message-content').innerHTML = this.content;    self.trigger('message-is-changed');    if (!silently) {        setTimeout(function() {            self.showBadge();        }, self.timeouts.showBadge);    }};VaMobileTeaser.prototype.showInput = function() {    if (this.userInput) {        dom.addCls(this.teaserElement.querySelector('.user-input'), 'visible');    }};VaMobileTeaser.prototype.showCta = function() {    if (this.cta) {        dom.addCls(this.teaserElement.querySelector('.cta'), 'visible');    }};VaMobileTeaser.prototype.showBadge = function() {    dom.addCls(this.teaserElement.querySelector('.badge'), 'zoomIn');};VaMobileTeaser.prototype.hideMessage = function() {    dom.addCls(this.teaserElement.querySelector('.teaser .message-cell'), hiddenClass);    dom.addCls(this.teaserBackgroundElement, hiddenClass);};VaMobileTeaser.prototype.hideBadge = function() {    dom.removeCls(this.teaserElement.querySelector('.badge'), 'zoomIn');};VaMobileTeaser.prototype.hidden = function () {    return dom.hasClass(this.teaserElement, hiddenClass);}VaMobileTeaser.prototype.renderElement = function(config) {    return tmpl(config);}},{"./th-va-mobile-teaser-tmpl.js":45,"ja-dom":14,"ja-event":83,"ja-utils":17}],47:[function(require,module,exports){/* * Cookies.js - 1.2.3 * https://github.com/ScottHamper/Cookies * * This is free and unencumbered software released into the public domain. */(function (global, undefined) {    'use strict';    var factory = function (window) {        if (typeof window.document !== 'object') {            throw new Error('Cookies.js requires a `window` with a `document` object');        }        var Cookies = function (key, value, options) {            return arguments.length === 1 ?                Cookies.get(key) : Cookies.set(key, value, options);        };        // Allows for setter injection in unit tests        Cookies._document = window.document;        // Used to ensure cookie keys do not collide with        // built-in `Object` properties        Cookies._cacheKeyPrefix = 'cookey.'; // Hurr hurr, :)                Cookies._maxExpireDate = new Date('Fri, 31 Dec 9999 23:59:59 UTC');        Cookies.defaults = {            path: '/',            secure: false        };        Cookies.get = function (key) {            if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {                Cookies._renewCache();            }                        var value = Cookies._cache[Cookies._cacheKeyPrefix + key];            return value === undefined ? undefined : decodeURIComponent(value);        };        Cookies.set = function (key, value, options) {            options = Cookies._getExtendedOptions(options);            options.expires = Cookies._getExpiresDate(value === undefined ? -1 : options.expires);            Cookies._document.cookie = Cookies._generateCookieString(key, value, options);            return Cookies;        };        Cookies.expire = function (key, options) {            return Cookies.set(key, undefined, options);        };        Cookies._getExtendedOptions = function (options) {            return {                path: options && options.path || Cookies.defaults.path,                domain: options && options.domain || Cookies.defaults.domain,                expires: options && options.expires || Cookies.defaults.expires,                secure: options && options.secure !== undefined ?  options.secure : Cookies.defaults.secure            };        };        Cookies._isValidDate = function (date) {            return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());        };        Cookies._getExpiresDate = function (expires, now) {            now = now || new Date();            if (typeof expires === 'number') {                expires = expires === Infinity ?                    Cookies._maxExpireDate : new Date(now.getTime() + expires * 1000);            } else if (typeof expires === 'string') {                expires = new Date(expires);            }            if (expires && !Cookies._isValidDate(expires)) {                throw new Error('`expires` parameter cannot be converted to a valid Date instance');            }            return expires;        };        Cookies._generateCookieString = function (key, value, options) {            key = key.replace(/[^#$&+\^`|]/g, encodeURIComponent);            key = key.replace(/\(/g, '%28').replace(/\)/g, '%29');            value = (value + '').replace(/[^!#$&-+\--:<-\[\]-~]/g, encodeURIComponent);            options = options || {};            var cookieString = key + '=' + value;            cookieString += options.path ? ';path=' + options.path : '';            cookieString += options.domain ? ';domain=' + options.domain : '';            cookieString += options.expires ? ';expires=' + options.expires.toUTCString() : '';            cookieString += options.secure ? ';secure' : '';            return cookieString;        };        Cookies._getCacheFromString = function (documentCookie) {            var cookieCache = {};            var cookiesArray = documentCookie ? documentCookie.split('; ') : [];            for (var i = 0; i < cookiesArray.length; i++) {                var cookieKvp = Cookies._getKeyValuePairFromCookieString(cookiesArray[i]);                if (cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] === undefined) {                    cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] = cookieKvp.value;                }            }            return cookieCache;        };        Cookies._getKeyValuePairFromCookieString = function (cookieString) {            // "=" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`            var separatorIndex = cookieString.indexOf('=');            // IE omits the "=" when the cookie value is an empty string            separatorIndex = separatorIndex < 0 ? cookieString.length : separatorIndex;            var key = cookieString.substr(0, separatorIndex);            var decodedKey;            try {                decodedKey = decodeURIComponent(key);            } catch (e) {                if (console && typeof console.error === 'function') {                    console.error('Could not decode cookie with key "' + key + '"', e);                }            }                        return {                key: decodedKey,                value: cookieString.substr(separatorIndex + 1) // Defer decoding value until accessed            };        };        Cookies._renewCache = function () {            Cookies._cache = Cookies._getCacheFromString(Cookies._document.cookie);            Cookies._cachedDocumentCookie = Cookies._document.cookie;        };        Cookies._areEnabled = function () {            var testKey = 'cookies.js';            var areEnabled = Cookies.set(testKey, 1).get(testKey) === '1';            Cookies.expire(testKey);            return areEnabled;        };        Cookies.enabled = Cookies._areEnabled();        return Cookies;    };    var cookiesExport = (global && typeof global.document === 'object') ? factory(global) : factory;    // AMD support    if (typeof define === 'function' && define.amd) {        define(function () { return cookiesExport; });    // CommonJS/Node.js support    } else if (typeof exports === 'object') {        // Support Node.js specific `module.exports` (which can be a function)        if (typeof module === 'object' && typeof module.exports === 'object') {            exports = module.exports = cookiesExport;        }        // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)        exports.Cookies = cookiesExport;    } else {        global.Cookies = cookiesExport;    }})(typeof window === 'undefined' ? this : window);},{}],48:[function(require,module,exports){module.exports = function (arr) {    var e = {},        enumArr = arr;    if (!(arr instanceof Array)) {        // Use the arguments array if an array isn't passed in        enumArr = arguments    }    for (var i = enumArr.length - 1; i >= 0; i--) {        e[enumArr[i]] = enumArr[i];    };        return e;};},{}],49:[function(require,module,exports){'use strict';/* globals	Atomics,	SharedArrayBuffer,*/var undefined;var $TypeError = TypeError;var $gOPD = Object.getOwnPropertyDescriptor;if ($gOPD) {	try {		$gOPD({}, '');	} catch (e) {		$gOPD = null; // this is IE 8, which has a broken gOPD	}}var throwTypeError = function () { throw new $TypeError(); };var ThrowTypeError = $gOPD	? (function () {		try {			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties			arguments.callee; // IE 8 does not throw here			return throwTypeError;		} catch (calleeThrows) {			try {				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')				return $gOPD(arguments, 'callee').get;			} catch (gOPDthrows) {				return throwTypeError;			}		}	}())	: throwTypeError;var hasSymbols = require('has-symbols')();var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-protovar generator; // = function * () {};var generatorFunction = generator ? getProto(generator) : undefined;var asyncFn; // async function() {};var asyncFunction = asyncFn ? asyncFn.constructor : undefined;var asyncGen; // async function * () {};var asyncGenFunction = asyncGen ? getProto(asyncGen) : undefined;var asyncGenIterator = asyncGen ? asyncGen() : undefined;var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);var INTRINSICS = {	'%Array%': Array,	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,	'%ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer.prototype,	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,	'%ArrayPrototype%': Array.prototype,	'%ArrayProto_entries%': Array.prototype.entries,	'%ArrayProto_forEach%': Array.prototype.forEach,	'%ArrayProto_keys%': Array.prototype.keys,	'%ArrayProto_values%': Array.prototype.values,	'%AsyncFromSyncIteratorPrototype%': undefined,	'%AsyncFunction%': asyncFunction,	'%AsyncFunctionPrototype%': asyncFunction ? asyncFunction.prototype : undefined,	'%AsyncGenerator%': asyncGen ? getProto(asyncGenIterator) : undefined,	'%AsyncGeneratorFunction%': asyncGenFunction,	'%AsyncGeneratorPrototype%': asyncGenFunction ? asyncGenFunction.prototype : undefined,	'%AsyncIteratorPrototype%': asyncGenIterator && hasSymbols && Symbol.asyncIterator ? asyncGenIterator[Symbol.asyncIterator]() : undefined,	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,	'%Boolean%': Boolean,	'%BooleanPrototype%': Boolean.prototype,	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,	'%DataViewPrototype%': typeof DataView === 'undefined' ? undefined : DataView.prototype,	'%Date%': Date,	'%DatePrototype%': Date.prototype,	'%decodeURI%': decodeURI,	'%decodeURIComponent%': decodeURIComponent,	'%encodeURI%': encodeURI,	'%encodeURIComponent%': encodeURIComponent,	'%Error%': Error,	'%ErrorPrototype%': Error.prototype,	'%eval%': eval, // eslint-disable-line no-eval	'%EvalError%': EvalError,	'%EvalErrorPrototype%': EvalError.prototype,	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,	'%Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined : Float32Array.prototype,	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,	'%Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined : Float64Array.prototype,	'%Function%': Function,	'%FunctionPrototype%': Function.prototype,	'%Generator%': generator ? getProto(generator()) : undefined,	'%GeneratorFunction%': generatorFunction,	'%GeneratorPrototype%': generatorFunction ? generatorFunction.prototype : undefined,	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,	'%Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined : Int8Array.prototype,	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,	'%Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined : Int8Array.prototype,	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,	'%Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined : Int32Array.prototype,	'%isFinite%': isFinite,	'%isNaN%': isNaN,	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,	'%JSON%': typeof JSON === 'object' ? JSON : undefined,	'%JSONParse%': typeof JSON === 'object' ? JSON.parse : undefined,	'%Map%': typeof Map === 'undefined' ? undefined : Map,	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),	'%MapPrototype%': typeof Map === 'undefined' ? undefined : Map.prototype,	'%Math%': Math,	'%Number%': Number,	'%NumberPrototype%': Number.prototype,	'%Object%': Object,	'%ObjectPrototype%': Object.prototype,	'%ObjProto_toString%': Object.prototype.toString,	'%ObjProto_valueOf%': Object.prototype.valueOf,	'%parseFloat%': parseFloat,	'%parseInt%': parseInt,	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,	'%PromisePrototype%': typeof Promise === 'undefined' ? undefined : Promise.prototype,	'%PromiseProto_then%': typeof Promise === 'undefined' ? undefined : Promise.prototype.then,	'%Promise_all%': typeof Promise === 'undefined' ? undefined : Promise.all,	'%Promise_reject%': typeof Promise === 'undefined' ? undefined : Promise.reject,	'%Promise_resolve%': typeof Promise === 'undefined' ? undefined : Promise.resolve,	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,	'%RangeError%': RangeError,	'%RangeErrorPrototype%': RangeError.prototype,	'%ReferenceError%': ReferenceError,	'%ReferenceErrorPrototype%': ReferenceError.prototype,	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,	'%RegExp%': RegExp,	'%RegExpPrototype%': RegExp.prototype,	'%Set%': typeof Set === 'undefined' ? undefined : Set,	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),	'%SetPrototype%': typeof Set === 'undefined' ? undefined : Set.prototype,	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,	'%SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer.prototype,	'%String%': String,	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,	'%StringPrototype%': String.prototype,	'%Symbol%': hasSymbols ? Symbol : undefined,	'%SymbolPrototype%': hasSymbols ? Symbol.prototype : undefined,	'%SyntaxError%': SyntaxError,	'%SyntaxErrorPrototype%': SyntaxError.prototype,	'%ThrowTypeError%': ThrowTypeError,	'%TypedArray%': TypedArray,	'%TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined,	'%TypeError%': $TypeError,	'%TypeErrorPrototype%': $TypeError.prototype,	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,	'%Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array.prototype,	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,	'%Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray.prototype,	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,	'%Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array.prototype,	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,	'%Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array.prototype,	'%URIError%': URIError,	'%URIErrorPrototype%': URIError.prototype,	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,	'%WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined : WeakMap.prototype,	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,	'%WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined : WeakSet.prototype};var bind = require('function-bind');var $replace = bind.call(Function.call, String.prototype.replace);/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */var stringToPath = function stringToPath(string) {	var result = [];	$replace(string, rePropName, function (match, number, quote, subString) {		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : (number || match);	});	return result;};/* end adaptation */var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {	if (!(name in INTRINSICS)) {		throw new SyntaxError('intrinsic ' + name + ' does not exist!');	}	// istanbul ignore if // hopefully this is impossible to test :-)	if (typeof INTRINSICS[name] === 'undefined' && !allowMissing) {		throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');	}	return INTRINSICS[name];};module.exports = function GetIntrinsic(name, allowMissing) {	if (typeof name !== 'string' || name.length === 0) {		throw new TypeError('intrinsic name must be a non-empty string');	}	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {		throw new TypeError('"allowMissing" argument must be a boolean');	}	var parts = stringToPath(name);	var value = getBaseIntrinsic('%' + (parts.length > 0 ? parts[0] : '') + '%', allowMissing);	for (var i = 1; i < parts.length; i += 1) {		if (value != null) {			if ($gOPD && (i + 1) >= parts.length) {				var desc = $gOPD(value, parts[i]);				if (!allowMissing && !(parts[i] in value)) {					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');				}				value = desc ? (desc.get || desc.value) : value[parts[i]];			} else {				value = value[parts[i]];			}		}	}	return value;};},{"function-bind":54,"has-symbols":57}],50:[function(require,module,exports){'use strict';var bind = require('function-bind');var GetIntrinsic = require('../GetIntrinsic');var $apply = GetIntrinsic('%Function.prototype.apply%');var $call = GetIntrinsic('%Function.prototype.call%');var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);module.exports = function callBind() {	return $reflectApply(bind, $call, arguments);};module.exports.apply = function applyBind() {	return $reflectApply(bind, $apply, arguments);};},{"../GetIntrinsic":49,"function-bind":54}],51:[function(require,module,exports){'use strict';var GetIntrinsic = require('../GetIntrinsic');var callBind = require('./callBind');var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));module.exports = function callBoundIntrinsic(name, allowMissing) {	var intrinsic = GetIntrinsic(name, !!allowMissing);	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.')) {		return callBind(intrinsic);	}	return intrinsic;};},{"../GetIntrinsic":49,"./callBind":50}],52:[function(require,module,exports){(function (process){'use strict';/* eslint global-require: 0 */// the code is structured this way so that bundlers can// alias out `has-symbols` to `() => true` or `() => false` if your target// environments' Symbol capabilities are known, and then use// dead code elimination on the rest of this module.//// Similarly, `isarray` can be aliased to `Array.isArray` if// available in all target environments.var isArguments = require('is-arguments');if (require('has-symbols')() || require('has-symbols/shams')()) {	var $iterator = Symbol.iterator;	// Symbol is available natively or shammed	// natively:	//  - Chrome >= 38	//  - Edge 12-14?, Edge >= 15 for sure	//  - FF >= 36	//  - Safari >= 9	//  - node >= 0.12	module.exports = function getIterator(iterable) {		// alternatively, `iterable[$iterator]?.()`		if (iterable != null && typeof iterable[$iterator] !== 'undefined') {			return iterable[$iterator]();		}		if (isArguments(iterable)) {			// arguments objects lack Symbol.iterator			// - node 0.12			return Array.prototype[$iterator].call(iterable);		}	};} else {	// Symbol is not available, native or shammed	var isArray = require('isarray');	var isString = require('is-string');	var GetIntrinsic = require('es-abstract/GetIntrinsic');	var $Map = GetIntrinsic('%Map%', true);	var $Set = GetIntrinsic('%Set%', true);	var callBound = require('es-abstract/helpers/callBound');	var $arrayPush = callBound('Array.prototype.push');	var $charCodeAt = callBound('String.prototype.charCodeAt');	var $stringSlice = callBound('String.prototype.slice');	var advanceStringIndex = function advanceStringIndex(S, index) {		var length = S.length;		if ((index + 1) >= length) {			return index + 1;		}		var first = $charCodeAt(S, index);		if (first < 0xD800 || first > 0xDBFF) {			return index + 1;		}		var second = $charCodeAt(S, index + 1);		if (second < 0xDC00 || second > 0xDFFF) {			return index + 1;		}		return index + 2;	};	var getArrayIterator = function getArrayIterator(arraylike) {		var i = 0;		return {			next: function next() {				var done = i >= arraylike.length;				var value;				if (!done) {					value = arraylike[i];					i += 1;				}				return {					done: done,					value: value				};			}		};	};	var getNonCollectionIterator = function getNonCollectionIterator(iterable) {		if (isArray(iterable) || isArguments(iterable)) {			return getArrayIterator(iterable);		}		if (isString(iterable)) {			var i = 0;			return {				next: function next() {					var nextIndex = advanceStringIndex(iterable, i);					var value = $stringSlice(iterable, i, nextIndex);					i = nextIndex;					return {						done: nextIndex > iterable.length,						value: value					};				}			};		}	};	if (!$Map && !$Set) {		// the only language iterables are Array, String, arguments		// - Safari <= 6.0		// - Chrome < 38		// - node < 0.12		// - FF < 13		// - IE < 11		// - Edge < 11		module.exports = getNonCollectionIterator;	} else {		// either Map or Set are available, but Symbol is not		// - es6-shim on an ES5 browser		// - Safari 6.2 (maybe 6.1?)		// - FF v[13, 36)		// - IE 11		// - Edge 11		// - Safari v[6, 9)		var isMap = require('is-map');		var isSet = require('is-set');		// Firefox >= 27, IE 11, Safari 6.2 - 9, Edge 11, es6-shim in older envs, all have forEach		var $mapForEach = callBound('Map.prototype.forEach', true);		var $setForEach = callBound('Set.prototype.forEach', true);		if (typeof process === 'undefined' || !process.versions || !process.versions.node) { // "if is not node"			// Firefox 17 - 26 has `.iterator()`, whose iterator `.next()` either			// returns a value, or throws a StopIteration object. These browsers			// do not have any other mechanism for iteration.			var $mapIterator = callBound('Map.prototype.iterator', true);			var $setIterator = callBound('Set.prototype.iterator', true);			var getStopIterationIterator = function (iterator) {				var done = false;				return {					next: function next() {						try {							return {								done: done,								value: done ? undefined : iterator.next()							};						} catch (e) {							done = true;							return {								done: true,								value: undefined							};						}					}				};			};		}		// Firefox 27-35, and some older es6-shim versions, use a string "@@iterator" property		// this returns a proper iterator object, so we should use it instead of forEach.		// newer es6-shim versions use a string "_es6-shim iterator_" property.		var $mapAtAtIterator = callBound('Map.prototype.@@iterator', true) || callBound('Map.prototype._es6-shim iterator_', true);		var $setAtAtIterator = callBound('Set.prototype.@@iterator', true) || callBound('Set.prototype._es6-shim iterator_', true);		var getCollectionIterator = function getCollectionIterator(iterable) {			if (isMap(iterable)) {				if ($mapIterator) {					return getStopIterationIterator($mapIterator(iterable));				}				if ($mapAtAtIterator) {					return $mapAtAtIterator(iterable);				}				if ($mapForEach) {					var entries = [];					$mapForEach(iterable, function (v, k) {						$arrayPush(entries, [k, v]);					});					return getArrayIterator(entries);				}			}			if (isSet(iterable)) {				if ($setIterator) {					return getStopIterationIterator($setIterator(iterable));				}				if ($setAtAtIterator) {					return $setAtAtIterator(iterable);				}				if ($setForEach) {					var values = [];					$setForEach(iterable, function (v) {						$arrayPush(values, v);					});					return getArrayIterator(values);				}			}		};		module.exports = function getIterator(iterable) {			return getCollectionIterator(iterable) || getNonCollectionIterator(iterable);		};	}}}).call(this,require('_process'))},{"_process":97,"es-abstract/GetIntrinsic":49,"es-abstract/helpers/callBound":51,"has-symbols":57,"has-symbols/shams":58,"is-arguments":60,"is-map":70,"is-set":73,"is-string":74,"isarray":78}],53:[function(require,module,exports){'use strict';/* eslint no-invalid-this: 1 */var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';var slice = Array.prototype.slice;var toStr = Object.prototype.toString;var funcType = '[object Function]';module.exports = function bind(that) {    var target = this;    if (typeof target !== 'function' || toStr.call(target) !== funcType) {        throw new TypeError(ERROR_MESSAGE + target);    }    var args = slice.call(arguments, 1);    var bound;    var binder = function () {        if (this instanceof bound) {            var result = target.apply(                this,                args.concat(slice.call(arguments))            );            if (Object(result) === result) {                return result;            }            return this;        } else {            return target.apply(                that,                args.concat(slice.call(arguments))            );        }    };    var boundLength = Math.max(0, target.length - args.length);    var boundArgs = [];    for (var i = 0; i < boundLength; i++) {        boundArgs.push('$' + i);    }    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);    if (target.prototype) {        var Empty = function Empty() {};        Empty.prototype = target.prototype;        bound.prototype = new Empty();        Empty.prototype = null;    }    return bound;};},{}],54:[function(require,module,exports){'use strict';var implementation = require('./implementation');module.exports = Function.prototype.bind || implementation;},{"./implementation":53}],55:[function(require,module,exports){'use strict';var functionsHaveNames = function functionsHaveNames() {	return typeof function f() {}.name === 'string';};var gOPD = Object.getOwnPropertyDescriptor;if (gOPD) {	try {		gOPD([], 'length');	} catch (e) {		// IE 8 has a broken gOPD		gOPD = null;	}}functionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {	return functionsHaveNames() && gOPD && !!gOPD(function () {}, 'name').configurable;};var $bind = Function.prototype.bind;functionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {	return functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';};module.exports = functionsHaveNames;},{}],56:[function(require,module,exports){(function (global){var win;if (typeof window !== "undefined") {    win = window;} else if (typeof global !== "undefined") {    win = global;} else if (typeof self !== "undefined"){    win = self;} else {    win = {};}module.exports = win;}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{}],57:[function(require,module,exports){(function (global){'use strict';var origSymbol = global.Symbol;var hasSymbolSham = require('./shams');module.exports = function hasNativeSymbols() {	if (typeof origSymbol !== 'function') { return false; }	if (typeof Symbol !== 'function') { return false; }	if (typeof origSymbol('foo') !== 'symbol') { return false; }	if (typeof Symbol('bar') !== 'symbol') { return false; }	return hasSymbolSham();};}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{"./shams":58}],58:[function(require,module,exports){'use strict';/* eslint complexity: [2, 18], max-statements: [2, 33] */module.exports = function hasSymbols() {	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }	if (typeof Symbol.iterator === 'symbol') { return true; }	var obj = {};	var sym = Symbol('test');	var symObj = Object(sym);	if (typeof sym === 'string') { return false; }	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }	// temp disabled per https://github.com/ljharb/object.assign/issues/17	// if (sym instanceof Symbol) { return false; }	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4	// if (!(symObj instanceof Symbol)) { return false; }	// if (typeof Symbol.prototype.toString !== 'function') { return false; }	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }	var symVal = 42;	obj[sym] = symVal;	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }	var syms = Object.getOwnPropertySymbols(obj);	if (syms.length !== 1 || syms[0] !== sym) { return false; }	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }	if (typeof Object.getOwnPropertyDescriptor === 'function') {		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }	}	return true;};},{}],59:[function(require,module,exports){'use strict';var bind = require('function-bind');module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);},{"function-bind":54}],60:[function(require,module,exports){'use strict';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';var toStr = Object.prototype.toString;var isStandardArguments = function isArguments(value) {	if (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {		return false;	}	return toStr.call(value) === '[object Arguments]';};var isLegacyArguments = function isArguments(value) {	if (isStandardArguments(value)) {		return true;	}	return value !== null &&		typeof value === 'object' &&		typeof value.length === 'number' &&		value.length >= 0 &&		toStr.call(value) !== '[object Array]' &&		toStr.call(value.callee) === '[object Function]';};var supportsStandardArguments = (function () {	return isStandardArguments(arguments);}());isStandardArguments.isLegacyArguments = isLegacyArguments; // for testsmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;},{}],61:[function(require,module,exports){'use strict';var isCallable = require('is-callable');var fnToStr = Function.prototype.toString;var isNonArrowFnRegex = /^\s*function/;var isArrowFnWithParensRegex = /^\([^\)]*\) *=>/;var isArrowFnWithoutParensRegex = /^[^=]*=>/;module.exports = function isArrowFunction(fn) {	if (!isCallable(fn)) { return false; }	var fnStr = fnToStr.call(fn);	return fnStr.length > 0 &&		!isNonArrowFnRegex.test(fnStr) &&		(isArrowFnWithParensRegex.test(fnStr) || isArrowFnWithoutParensRegex.test(fnStr));};},{"is-callable":64}],62:[function(require,module,exports){'use strict';if (typeof BigInt === 'function') {	var bigIntValueOf = BigInt.prototype.valueOf;	var tryBigInt = function tryBigIntObject(value) {		try {			bigIntValueOf.call(value);			return true;		} catch (e) {		}		return false;	};	module.exports = function isBigInt(value) {		if (			value === null			|| typeof value === 'undefined'			|| typeof value === 'boolean'			|| typeof value === 'string'			|| typeof value === 'number'			|| typeof value === 'symbol'			|| typeof value === 'function'		) {			return false;		}		if (typeof value === 'bigint') { // eslint-disable-line valid-typeof			return true;		}		return tryBigInt(value);	};} else {	module.exports = function isBigInt(value) {		return false && value;	};}},{}],63:[function(require,module,exports){'use strict';var boolToStr = Boolean.prototype.toString;var tryBooleanObject = function booleanBrandCheck(value) {	try {		boolToStr.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var boolClass = '[object Boolean]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = function isBoolean(value) {	if (typeof value === 'boolean') {		return true;	}	if (value === null || typeof value !== 'object') {		return false;	}	return hasToStringTag && Symbol.toStringTag in value ? tryBooleanObject(value) : toStr.call(value) === boolClass;};},{}],64:[function(require,module,exports){'use strict';var fnToStr = Function.prototype.toString;var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;var badArrayLike;var isCallableMarker;if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {	try {		badArrayLike = Object.defineProperty({}, 'length', {			get: function () {				throw isCallableMarker;			}		});		isCallableMarker = {};	} catch (_) {		reflectApply = null;	}} else {	reflectApply = null;}var constructorRegex = /^\s*class\b/;var isES6ClassFn = function isES6ClassFunction(value) {	try {		var fnStr = fnToStr.call(value);		return constructorRegex.test(fnStr);	} catch (e) {		return false; // not a function	}};var tryFunctionObject = function tryFunctionToStr(value) {	try {		if (isES6ClassFn(value)) { return false; }		fnToStr.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var fnClass = '[object Function]';var genClass = '[object GeneratorFunction]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = reflectApply	? function isCallable(value) {		if (!value) { return false; }		if (typeof value !== 'function' && typeof value !== 'object') { return false; }		if (typeof value === 'function' && !value.prototype) { return true; }		try {			reflectApply(value, null, badArrayLike);		} catch (e) {			if (e !== isCallableMarker) { return false; }		}		return !isES6ClassFn(value);	}	: function isCallable(value) {		if (!value) { return false; }		if (typeof value !== 'function' && typeof value !== 'object') { return false; }		if (typeof value === 'function' && !value.prototype) { return true; }		if (hasToStringTag) { return tryFunctionObject(value); }		if (isES6ClassFn(value)) { return false; }		var strClass = toStr.call(value);		return strClass === fnClass || strClass === genClass;	};},{}],65:[function(require,module,exports){'use strict';var getDay = Date.prototype.getDay;var tryDateObject = function tryDateGetDayCall(value) {	try {		getDay.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var dateClass = '[object Date]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = function isDateObject(value) {	if (typeof value !== 'object' || value === null) {		return false;	}	return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;};},{}],66:[function(require,module,exports){'use strict';var whyNotEqual = require('./why');module.exports = function isEqual(value, other) {	return whyNotEqual(value, other) === '';};},{"./why":67}],67:[function(require,module,exports){'use strict';var ObjectPrototype = Object.prototype;var toStr = ObjectPrototype.toString;var booleanValue = Boolean.prototype.valueOf;var has = require('has');var isArray = require('isarray');var isArrowFunction = require('is-arrow-function');var isBoolean = require('is-boolean-object');var isDate = require('is-date-object');var isGenerator = require('is-generator-function');var isNumber = require('is-number-object');var isRegex = require('is-regex');var isString = require('is-string');var isSymbol = require('is-symbol');var isCallable = require('is-callable');var isBigInt = require('is-bigint');var getIterator = require('es-get-iterator');var whichCollection = require('which-collection');var whichBoxedPrimitive = require('which-boxed-primitive');var objectType = function (v) { return whichCollection(v) || whichBoxedPrimitive(v) || typeof v; };var isProto = Object.prototype.isPrototypeOf;var functionsHaveNames = require('functions-have-names')();var symbolValue = typeof Symbol === 'function' ? Symbol.prototype.valueOf : null;var bigIntValue = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;var getPrototypeOf = Object.getPrototypeOf;if (!getPrototypeOf) {	/* eslint-disable no-proto */	if (typeof 'test'.__proto__ === 'object') {		getPrototypeOf = function (obj) {			return obj.__proto__;		};	} else {		getPrototypeOf = function (obj) {			var constructor = obj.constructor,				oldConstructor;			if (has(obj, 'constructor')) {				oldConstructor = constructor;				// eslint-disable-next-line no-param-reassign				if (!(delete obj.constructor)) { // reset constructor					return null; // can't delete obj.constructor, return null				}				constructor = obj.constructor; // get real constructor				// eslint-disable-next-line no-param-reassign				obj.constructor = oldConstructor; // restore constructor			}			return constructor ? constructor.prototype : ObjectPrototype; // needed for IE		};	}	/* eslint-enable no-proto */}var normalizeFnWhitespace = function normalizeWhitespace(fnStr) {	// this is needed in IE 9, at least, which has inconsistencies here.	return fnStr.replace(/^function ?\(/, 'function (').replace('){', ') {');};module.exports = function whyNotEqual(value, other) {	if (value === other) { return ''; }	if (value == null || other == null) {		return value === other ? '' : String(value) + ' !== ' + String(other);	}	var valToStr = toStr.call(value);	var otherToStr = toStr.call(other);	if (valToStr !== otherToStr) {		return 'toStringTag is not the same: ' + valToStr + ' !== ' + otherToStr;	}	var valIsBool = isBoolean(value);	var otherIsBool = isBoolean(other);	if (valIsBool || otherIsBool) {		if (!valIsBool) { return 'first argument is not a boolean; second argument is'; }		if (!otherIsBool) { return 'second argument is not a boolean; first argument is'; }		var valBoolVal = booleanValue.call(value);		var otherBoolVal = booleanValue.call(other);		if (valBoolVal === otherBoolVal) { return ''; }		return 'primitive value of boolean arguments do not match: ' + valBoolVal + ' !== ' + otherBoolVal;	}	var valIsNumber = isNumber(value);	var otherIsNumber = isNumber(value);	if (valIsNumber || otherIsNumber) {		if (!valIsNumber) { return 'first argument is not a number; second argument is'; }		if (!otherIsNumber) { return 'second argument is not a number; first argument is'; }		var valNum = Number(value);		var otherNum = Number(other);		if (valNum === otherNum) { return ''; }		var valIsNaN = isNaN(value);		var otherIsNaN = isNaN(other);		if (valIsNaN && !otherIsNaN) {			return 'first argument is NaN; second is not';		} else if (!valIsNaN && otherIsNaN) {			return 'second argument is NaN; first is not';		} else if (valIsNaN && otherIsNaN) {			return '';		}		return 'numbers are different: ' + value + ' !== ' + other;	}	var valIsString = isString(value);	var otherIsString = isString(other);	if (valIsString || otherIsString) {		if (!valIsString) { return 'second argument is string; first is not'; }		if (!otherIsString) { return 'first argument is string; second is not'; }		var stringVal = String(value);		var otherVal = String(other);		if (stringVal === otherVal) { return ''; }		return 'string values are different: "' + stringVal + '" !== "' + otherVal + '"';	}	var valIsDate = isDate(value);	var otherIsDate = isDate(other);	if (valIsDate || otherIsDate) {		if (!valIsDate) { return 'second argument is Date, first is not'; }		if (!otherIsDate) { return 'first argument is Date, second is not'; }		var valTime = +value;		var otherTime = +other;		if (valTime === otherTime) { return ''; }		return 'Dates have different time values: ' + valTime + ' !== ' + otherTime;	}	var valIsRegex = isRegex(value);	var otherIsRegex = isRegex(other);	if (valIsRegex || otherIsRegex) {		if (!valIsRegex) { return 'second argument is RegExp, first is not'; }		if (!otherIsRegex) { return 'first argument is RegExp, second is not'; }		var regexStringVal = String(value);		var regexStringOther = String(other);		if (regexStringVal === regexStringOther) { return ''; }		return 'regular expressions differ: ' + regexStringVal + ' !== ' + regexStringOther;	}	var valIsArray = isArray(value);	var otherIsArray = isArray(other);	if (valIsArray || otherIsArray) {		if (!valIsArray) { return 'second argument is an Array, first is not'; }		if (!otherIsArray) { return 'first argument is an Array, second is not'; }		if (value.length !== other.length) {			return 'arrays have different length: ' + value.length + ' !== ' + other.length;		}		var index = value.length - 1;		var equal = '';		var valHasIndex, otherHasIndex;		while (equal === '' && index >= 0) {			valHasIndex = has(value, index);			otherHasIndex = has(other, index);			if (!valHasIndex && otherHasIndex) { return 'second argument has index ' + index + '; first does not'; }			if (valHasIndex && !otherHasIndex) { return 'first argument has index ' + index + '; second does not'; }			equal = whyNotEqual(value[index], other[index]);			index -= 1;		}		return equal;	}	var valueIsSym = isSymbol(value);	var otherIsSym = isSymbol(other);	if (valueIsSym !== otherIsSym) {		if (valueIsSym) { return 'first argument is Symbol; second is not'; }		return 'second argument is Symbol; first is not';	}	if (valueIsSym && otherIsSym) {		return symbolValue.call(value) === symbolValue.call(other) ? '' : 'first Symbol value !== second Symbol value';	}	var valueIsBigInt = isBigInt(value);	var otherIsBigInt = isBigInt(other);	if (valueIsBigInt !== otherIsBigInt) {		if (valueIsBigInt) { return 'first argument is BigInt; second is not'; }		return 'second argument is BigInt; first is not';	}	if (valueIsBigInt && otherIsBigInt) {		return bigIntValue.call(value) === bigIntValue.call(other) ? '' : 'first BigInt value !== second BigInt value';	}	var valueIsGen = isGenerator(value);	var otherIsGen = isGenerator(other);	if (valueIsGen !== otherIsGen) {		if (valueIsGen) { return 'first argument is a Generator; second is not'; }		return 'second argument is a Generator; first is not';	}	var valueIsArrow = isArrowFunction(value);	var otherIsArrow = isArrowFunction(other);	if (valueIsArrow !== otherIsArrow) {		if (valueIsArrow) { return 'first argument is an Arrow function; second is not'; }		return 'second argument is an Arrow function; first is not';	}	if (isCallable(value) || isCallable(other)) {		if (functionsHaveNames && whyNotEqual(value.name, other.name) !== '') {			return 'Function names differ: "' + value.name + '" !== "' + other.name + '"';		}		if (whyNotEqual(value.length, other.length) !== '') {			return 'Function lengths differ: ' + value.length + ' !== ' + other.length;		}		var valueStr = normalizeFnWhitespace(String(value));		var otherStr = normalizeFnWhitespace(String(other));		if (whyNotEqual(valueStr, otherStr) === '') { return ''; }		if (!valueIsGen && !valueIsArrow) {			return whyNotEqual(valueStr.replace(/\)\s*\{/, '){'), otherStr.replace(/\)\s*\{/, '){')) === '' ? '' : 'Function string representations differ';		}		return whyNotEqual(valueStr, otherStr) === '' ? '' : 'Function string representations differ';	}	if (typeof value === 'object' || typeof other === 'object') {		if (typeof value !== typeof other) { return 'arguments have a different typeof: ' + typeof value + ' !== ' + typeof other; }		if (isProto.call(value, other)) { return 'first argument is the [[Prototype]] of the second'; }		if (isProto.call(other, value)) { return 'second argument is the [[Prototype]] of the first'; }		if (getPrototypeOf(value) !== getPrototypeOf(other)) { return 'arguments have a different [[Prototype]]'; }		var valueIterator = getIterator(value);		var otherIterator = getIterator(other);		if (!!valueIterator !== !!otherIterator) {			if (valueIterator) { return 'first argument is iterable; second is not'; }			return 'second argument is iterable; first is not';		}		if (valueIterator && otherIterator) { // both should be truthy or falsy at this point			var valueNext, otherNext, nextWhy;			do {				valueNext = valueIterator.next();				otherNext = otherIterator.next();				if (!valueNext.done && !otherNext.done) {					nextWhy = whyNotEqual(valueNext, otherNext);					if (nextWhy !== '') {						return 'iteration results are not equal: ' + nextWhy;					}				}			} while (!valueNext.done && !otherNext.done);			if (valueNext.done && !otherNext.done) { return 'first ' + objectType(value) + ' argument finished iterating before second ' + objectType(other); }			if (!valueNext.done && otherNext.done) { return 'second ' + objectType(other) + ' argument finished iterating before first ' + objectType(value); }			return '';		}		var key, valueKeyIsRecursive, otherKeyIsRecursive, keyWhy;		for (key in value) {			if (has(value, key)) {				if (!has(other, key)) { return 'first argument has key "' + key + '"; second does not'; }				valueKeyIsRecursive = !!value[key] && value[key][key] === value;				otherKeyIsRecursive = !!other[key] && other[key][key] === other;				if (valueKeyIsRecursive !== otherKeyIsRecursive) {					if (valueKeyIsRecursive) { return 'first argument has a circular reference at key "' + key + '"; second does not'; }					return 'second argument has a circular reference at key "' + key + '"; first does not';				}				if (!valueKeyIsRecursive && !otherKeyIsRecursive) {					keyWhy = whyNotEqual(value[key], other[key]);					if (keyWhy !== '') {						return 'value at key "' + key + '" differs: ' + keyWhy;					}				}			}		}		for (key in other) {			if (has(other, key) && !has(value, key)) {				return 'second argument has key "' + key + '"; first does not';			}		}		return '';	}	return false;};},{"es-get-iterator":52,"functions-have-names":55,"has":59,"is-arrow-function":61,"is-bigint":62,"is-boolean-object":63,"is-callable":64,"is-date-object":65,"is-generator-function":69,"is-number-object":71,"is-regex":72,"is-string":74,"is-symbol":75,"isarray":78,"which-boxed-primitive":105,"which-collection":106}],68:[function(require,module,exports){module.exports = isFunctionvar toString = Object.prototype.toStringfunction isFunction (fn) {  if (!fn) {    return false  }  var string = toString.call(fn)  return string === '[object Function]' ||    (typeof fn === 'function' && string !== '[object RegExp]') ||    (typeof window !== 'undefined' &&     // IE8 and below     (fn === window.setTimeout ||      fn === window.alert ||      fn === window.confirm ||      fn === window.prompt))};},{}],69:[function(require,module,exports){'use strict';var toStr = Object.prototype.toString;var fnToStr = Function.prototype.toString;var isFnRegex = /^\s*(?:function)?\*/;var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';var getProto = Object.getPrototypeOf;var getGeneratorFunc = function () { // eslint-disable-line consistent-return	if (!hasToStringTag) {		return false;	}	try {		return Function('return function*() {}')();	} catch (e) {	}};var generatorFunc = getGeneratorFunc();var GeneratorFunction = generatorFunc ? getProto(generatorFunc) : {};module.exports = function isGeneratorFunction(fn) {	if (typeof fn !== 'function') {		return false;	}	if (isFnRegex.test(fnToStr.call(fn))) {		return true;	}	if (!hasToStringTag) {		var str = toStr.call(fn);		return str === '[object GeneratorFunction]';	}	return getProto(fn) === GeneratorFunction;};},{}],70:[function(require,module,exports){'use strict';var $Map = typeof Map === 'function' && Map.prototype ? Map : null;var $Set = typeof Set === 'function' && Set.prototype ? Set : null;var exported;if (!$Map) {	// eslint-disable-next-line no-unused-vars	exported = function isMap(x) {		// `Map` is not present in this environment.		return false;	};}var $mapHas = $Map ? Map.prototype.has : null;var $setHas = $Set ? Set.prototype.has : null;if (!exported && !$mapHas) {	// eslint-disable-next-line no-unused-vars	exported = function isMap(x) {		// `Map` does not have a `has` method		return false;	};}module.exports = exported || function isMap(x) {	if (!x || typeof x !== 'object') {		return false;	}	try {		$mapHas.call(x);		if ($setHas) {			try {				$setHas.call(x);			} catch (e) {				return true;			}		}		return x instanceof $Map; // core-js workaround, pre-v2.5.0	} catch (e) {}	return false;};},{}],71:[function(require,module,exports){'use strict';var numToStr = Number.prototype.toString;var tryNumberObject = function tryNumberObject(value) {	try {		numToStr.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var numClass = '[object Number]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = function isNumberObject(value) {	if (typeof value === 'number') {		return true;	}	if (typeof value !== 'object') {		return false;	}	return hasToStringTag ? tryNumberObject(value) : toStr.call(value) === numClass;};},{}],72:[function(require,module,exports){'use strict';var hasSymbols = require('has-symbols')();var hasToStringTag = hasSymbols && typeof Symbol.toStringTag === 'symbol';var regexExec;var isRegexMarker;var badStringifier;if (hasToStringTag) {	regexExec = Function.call.bind(RegExp.prototype.exec);	isRegexMarker = {};	var throwRegexMarker = function () {		throw isRegexMarker;	};	badStringifier = {		toString: throwRegexMarker,		valueOf: throwRegexMarker	};	if (typeof Symbol.toPrimitive === 'symbol') {		badStringifier[Symbol.toPrimitive] = throwRegexMarker;	}}var toStr = Object.prototype.toString;var regexClass = '[object RegExp]';module.exports = hasToStringTag	// eslint-disable-next-line consistent-return	? function isRegex(value) {		if (!value || typeof value !== 'object') {			return false;		}		try {			regexExec(value, badStringifier);		} catch (e) {			return e === isRegexMarker;		}	}	: function isRegex(value) {		// In older browsers, typeof regex incorrectly returns 'function'		if (!value || (typeof value !== 'object' && typeof value !== 'function')) {			return false;		}		return toStr.call(value) === regexClass;	};},{"has-symbols":57}],73:[function(require,module,exports){'use strict';var $Map = typeof Map === 'function' && Map.prototype ? Map : null;var $Set = typeof Set === 'function' && Set.prototype ? Set : null;var exported;if (!$Set) {	// eslint-disable-next-line no-unused-vars	exported = function isSet(x) {		// `Set` is not present in this environment.		return false;	};}var $mapHas = $Map ? Map.prototype.has : null;var $setHas = $Set ? Set.prototype.has : null;if (!exported && !$setHas) {	// eslint-disable-next-line no-unused-vars	exported = function isSet(x) {		// `Set` does not have a `has` method		return false;	};}module.exports = exported || function isSet(x) {	if (!x || typeof x !== 'object') {		return false;	}	try {		$setHas.call(x);		if ($mapHas) {			try {				$mapHas.call(x);			} catch (e) {				return true;			}		}		return x instanceof $Set; // core-js workaround, pre-v2.5.0	} catch (e) {}	return false;};},{}],74:[function(require,module,exports){'use strict';var strValue = String.prototype.valueOf;var tryStringObject = function tryStringObject(value) {	try {		strValue.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var strClass = '[object String]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = function isString(value) {	if (typeof value === 'string') {		return true;	}	if (typeof value !== 'object') {		return false;	}	return hasToStringTag ? tryStringObject(value) : toStr.call(value) === strClass;};},{}],75:[function(require,module,exports){'use strict';var toStr = Object.prototype.toString;var hasSymbols = require('has-symbols')();if (hasSymbols) {	var symToStr = Symbol.prototype.toString;	var symStringRegex = /^Symbol\(.*\)$/;	var isSymbolObject = function isRealSymbolObject(value) {		if (typeof value.valueOf() !== 'symbol') {			return false;		}		return symStringRegex.test(symToStr.call(value));	};	module.exports = function isSymbol(value) {		if (typeof value === 'symbol') {			return true;		}		if (toStr.call(value) !== '[object Symbol]') {			return false;		}		try {			return isSymbolObject(value);		} catch (e) {			return false;		}	};} else {	module.exports = function isSymbol(value) {		// this environment does not support Symbols.		return false && value;	};}},{"has-symbols":57}],76:[function(require,module,exports){'use strict';var $WeakMap = typeof WeakMap === 'function' && WeakMap.prototype ? WeakMap : null;var $WeakSet = typeof WeakSet === 'function' && WeakSet.prototype ? WeakSet : null;var exported;if (!$WeakMap) {	// eslint-disable-next-line no-unused-vars	exported = function isWeakMap(x) {		// `WeakMap` is not present in this environment.		return false;	};}var $mapHas = $WeakMap ? $WeakMap.prototype.has : null;var $setHas = $WeakSet ? $WeakSet.prototype.has : null;if (!exported && !$mapHas) {	// eslint-disable-next-line no-unused-vars	exported = function isWeakMap(x) {		// `WeakMap` does not have a `has` method		return false;	};}module.exports = exported || function isWeakMap(x) {	if (!x || typeof x !== 'object') {		return false;	}	try {		$mapHas.call(x, $mapHas);		if ($setHas) {			try {				$setHas.call(x, $setHas);			} catch (e) {				return true;			}		}		return x instanceof $WeakMap; // core-js workaround, pre-v3	} catch (e) {}	return false;};},{}],77:[function(require,module,exports){'use strict';var $WeakMap = typeof WeakMap === 'function' && WeakMap.prototype ? WeakMap : null;var $WeakSet = typeof WeakSet === 'function' && WeakSet.prototype ? WeakSet : null;var exported;if (!$WeakMap) {	// eslint-disable-next-line no-unused-vars	exported = function isWeakSet(x) {		// `WeakSet` is not present in this environment.		return false;	};}var $mapHas = $WeakMap ? $WeakMap.prototype.has : null;var $setHas = $WeakSet ? $WeakSet.prototype.has : null;if (!exported && !$setHas) {	// eslint-disable-next-line no-unused-vars	module.exports = function isWeakSet(x) {		// `WeakSet` does not have a `has` method		return false;	};}module.exports = exported || function isWeakSet(x) {	if (!x || typeof x !== 'object') {		return false;	}	try {		$setHas.call(x, $setHas);		if ($mapHas) {			try {				$mapHas.call(x, $mapHas);			} catch (e) {				return true;			}		}		return x instanceof $WeakSet; // core-js workaround, pre-v3	} catch (e) {}	return false;};},{}],78:[function(require,module,exports){var toString = {}.toString;module.exports = Array.isArray || function (arr) {  return toString.call(arr) == '[object Array]';};},{}],79:[function(require,module,exports){/* THIS COMPONENT MUST BE OPTIMIZED FOR SPEED */module.exports = html;function html(type, attr, content) {    var type = type || 'div';    var attr = attr || {};    var content = content || [];    var fragment = document.createDocumentFragment();    var el = document.createElement(type);    // add atrributes    for (var i in attr) {        if (i === 'className') {            el.setAttribute('class', attr[i]);        } else if (i === 'style' && typeof(attr[i]) === 'object') {            var styles = attr[i];            for (var property in styles) {                if (!styles.hasOwnProperty(property)) {                    continue;                }                if (typeof(styles[property]) === 'number') {                    styles[property] = styles[property] + 'px';                }                el.style[property] = styles[property];            }        } else if (i === 'dangerouslySetInnerHTML' && typeof(attr[i]) === 'string') {            el.innerHTML = attr[i];        } else {            el.setAttribute(i, attr[i]);        }    }    //add content    for (var j = 0; j < content.length; j++) {        var cont = content[j];        if (cont) {            addEl(el, cont);        }    }    return el;}function addEl(el, cont) {    //if array, add all elements one by one    if (cont.constructor === Array) {        for (var k = 0; k < cont.length; k++) {            addEl(el, cont[k]);        }        return;    }    if (typeof cont === 'string' || typeof cont === 'number') {        el.appendChild(document.createTextNode(cont));        return;    }    el.appendChild(cont);}},{}],80:[function(require,module,exports){/* THIS COMPONENT MUST BE OPTIMIZED FOR SPEED */module.exports = html;function html(type, attr, content) {    type = type || 'div';    attr = attr || {};    content = content || [];    var el = document.createElement(type);    // add atrributes    for (var i in attr) {        if (i === 'className') {            el.setAttribute('class', attr[i]);        } else if (i === 'style' && typeof(attr[i]) === 'object') {            var styles = attr[i];            for (var property in styles) {                if (!styles.hasOwnProperty(property)) {                    continue;                }                if (typeof(styles[property]) === 'number') {                    styles[property] = styles[property] + 'px';                }                el.style[property] = styles[property];            }        } else if (i === 'dangerouslySetInnerHTML' && (typeof attr[i] === 'string' || attr[i] && typeof attr[i].__html === 'string')) {            el.innerHTML = typeof attr[i] === 'string' ? attr[i] : attr[i].__html;        } else {            el.setAttribute(i, attr[i]);        }    }    //add content    for (var j = 0; j < content.length; j++) {        var cont = content[j];        if (cont) {            addEl(el, cont);        }    }    return el;}function addEl(el, cont) {    //if array, add all elements one by one    if (cont.constructor === Array) {        for (var k = 0; k < cont.length; k++) {            addEl(el, cont[k]);        }        return;    }    if (typeof cont === 'string' || typeof cont === 'number') {        el.appendChild(document.createTextNode(cont));        return;    }    el.appendChild(cont);}},{}],81:[function(require,module,exports){var utils = require('ja-utils');exports.append = function(to, el) {    var tempNode;    if (!to) {        return null;    }    if (utils.isString(to)) {        to = document.querySelector(to);    }    if (exports.isNodeList(to)) {        to = to[0];    }    if (utils.isString(el)) {        if (exports.isElement(to)) {            el = to.insertAdjacentHTML('beforeend', el);        } else {            tempNode = document.createElement('div');            tempNode.innerHTML = el;            while (tempNode.firstChild) {                to.appendChild(tempNode.firstChild);            }            el = to;        }    } else {        if (utils.isArray(el) || exports.isNodeList(el)) {            var elAr = [];            for (var i = 0; i < el.length; i++) {                elAr.push(exports.append(to, el[i]));            }            el = elAr;        } else {            el = to.appendChild(el);        }    }    return el;};exports.createEl = function(el, options /*, content*/) {    var el = document.createElement(el),        text = options.text,        html = options.html;    if (text || text === '') {        el.textContent = text;        delete options.text;    }    if (html || html === '') {        el.innerHTML = html;        delete options.html;    }    for (var i in options) {        i === 'className' ? el.setAttribute('class', options[i]) : el.setAttribute(i, options[i]);    }    return el;};exports.h = exports.createEl;exports.html = exports.createEl;exports.createElement = exports.createEl;exports.addCls = function(el, cls) {    if (!(el && cls)) return false;    if (!exports.hasClass(el, cls)) {        el.className += ' ' + cls;    }    return el;}exports.addClass = exports.addCls;exports.removeCls = function(el, cls) {    if (!(el && cls)) return false    if (el.classList) {        el.classList.remove(cls);    } else {        el.className = el.className.replace(new RegExp('(^|\\b)' + cls.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');    }    return el;}exports.removeClass = exports.removeCls;exports.hasCls = function(el, cls) {    if (!(el && cls)) {        return false;    }    if (el.classList) {        return el.classList.contains(cls);    } else if (el.className) {        var res = el.className.split(' ').filter(function(clss) {            return cls === clss        })        return !!res.length === 0;    }};exports.hasClass = exports.hasCls;exports.isElement = function(o) {    return (typeof HTMLElement === 'object' ? o instanceof HTMLElement :        o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string');};exports.isEl = exports.isElement;exports.isNode = function(o) {    return (typeof Node === 'object' ? o instanceof Node :        o && typeof o === 'object' && typeof o.nodeType === 'number' && typeof o.nodeName === 'string');};exports.isNodeList = function(o) {    //var result = Object.prototype.toString.call(o);    if ((typeof (o) === 'object' || typeof (o) === 'function' /*Phantom hack*/) && o.length !== undefined) {        return true;    } else {        return false;    }};exports.swapToggle = function(o) {    // var result = ''//Object.prototype.toString.call(o);    if ((typeof (o) === 'object' && o.length !== undefined)) {        return true;    }};exports.toggleCls = function(element, className, condition) {    if (condition !== false || condition === undefined) {        if (element.classList) {            element.classList.toggle(className);        } else {            var classes = element.className.split(' ');            var existingIndex = classes.indexOf(className);            if (existingIndex >= 0) {                classes.splice(existingIndex, 1);            } else {                classes.push(className);            }            element.className = classes.join(' ');        }    }}exports.toggleClass = exports.toggleCls;},{"ja-utils":84}],82:[function(require,module,exports){    module.exports = Event;    function Event() {        if (!(this instanceof Event)) return new Event();        this._name_ = 'event';        //this.events = {}    }    Event.prototype.events =  {};    Event.prototype.addEventListener = Event.prototype.on = function(event, fn, scope, single) {        var me = this;        var fns;        fns = me.events[event] || undefined;        scope = scope || me;        single = single || false;        if (fns) {            fns.push({                fn: fn,                scope: scope,                single: single            });            return;        }        me.events[event] = [{            fn: fn,            scope: scope,            single: single        }];    };    Event.prototype.once = function(event, fn, scope) {        return this.on(event, fn, scope, true)    };    Event.prototype.fireEvent =  Event.prototype.trigger = function(event) {        var me = this,            args = Array.prototype.slice.call(arguments, 1),            fns;        me.events = me.events || {};        fns = me.events[event];        //console.log('fns:',fns.length, event, this);        if (fns) {            for (var j = 0; j < fns.length; j++) {                if (this !== fns[j].scope) continue;                fns[j].fn.apply(fns[j].scope, args);                if (fns[j].single) {                    fns.splice(j, 1);                    j--;                }            }        }    };    Event.prototype.removeEventListener = Event.prototype.off = function(event, fn) {        var me = this,            fns;        me.events = me.events || {};        fns = me.events[event];        fn = fn || false;        if (fns) {            if (!fn) {                return delete me.events[event];            }            for (var j = 0; j < fns.length; j++) {                if (fns[j].fn === fn) {                    fns.splice(j, 1);                    j--;                }            }        }    };    Event.prototype.removeAllEventListeners = Event.prototype.offAll = function(event, fn) {        this.events = {};        fn();    }},{}],83:[function(require,module,exports){arguments[4][82][0].apply(exports,arguments)},{"dup":82}],84:[function(require,module,exports){arguments[4][17][0].apply(exports,arguments)},{"dup":17,"is-equal":66,"lodash.assign":89,"lodash.chunk":90,"lodash.compose":91,"lodash.curry":92,"lodash.flatten":93,"lodash.isempty":94}],85:[function(require,module,exports){/** * Some base Utility functions * @module Utils */var lflatten = require('lodash.flatten');var lcompose = require('lodash.compose');var lassign = require('lodash.assign');var lcurry = require('lodash.curry');var lchunk = require('lodash.chunk');var lIsEmpty = require('lodash.isempty');var lequal = require('is-equal');var Utils = {    toString: function(el) { return typeof el},    hasOwnProperty: Object.prototype.hasOwnProperty,    //lodash functions    compose: lcompose,    curry: lcurry,    chunk: lchunk,    flatten: lflatten,    assign: lassign,    extend:lassign,    mixin:lassign,    inherit:lassign,    mixin:lassign,    //isEqual:lequal,    isEmpty:lIsEmpty,    // isObject:lIsObject,    isEqual:function(a,b){      if (a === b) {        return true      } else {        return lequal(a,b)      }    },    isArray: function(obj) {        return ('isArray' in Array) ? Array.isArray(obj) : (obj instanceof Array);    },    isString: function(obj) {        return typeof obj === 'string';    },    isFunction: function(obj) {        return typeof obj === 'function';    },    isObject: function(obj) {        return typeof obj === 'object';    },    capitaliseString: function(str) {        return str.charAt(0).toUpperCase() + str.slice(1);    },    isEmpty: function(obj) {        if (!obj) {            return true;        }        if (typeof obj.length === 'number') {            return obj.length < 1;        } else {            for (var i in obj) {                return false            }            return true        }    },    has: function(obj, key) {        return obj[key] //hasOwnProperty.call(obj, key);    },    mixin: function(target, source) {        if (!(source && target)) {            return target;        }        this.extend(            this.isFunction(target) && target.prototype || target,             this.isFunction(source) && source.prototype || source        );        return target;    },    extend: function(to, from) {        for (var key in from) {            to[key] = from[key];        }        return to;    }};module.exports = Utils;},{"is-equal":66,"lodash.assign":89,"lodash.chunk":90,"lodash.compose":91,"lodash.curry":92,"lodash.flatten":93,"lodash.isempty":94}],86:[function(require,module,exports){/*! * JavaScript Cookie v2.2.1 * https://github.com/js-cookie/js-cookie * * Copyright 2006, 2015 Klaus Hartl & Fagner Brack * Released under the MIT license */;(function (factory) {	var registeredInModuleLoader;	if (typeof define === 'function' && define.amd) {		define(factory);		registeredInModuleLoader = true;	}	if (typeof exports === 'object') {		module.exports = factory();		registeredInModuleLoader = true;	}	if (!registeredInModuleLoader) {		var OldCookies = window.Cookies;		var api = window.Cookies = factory();		api.noConflict = function () {			window.Cookies = OldCookies;			return api;		};	}}(function () {	function extend () {		var i = 0;		var result = {};		for (; i < arguments.length; i++) {			var attributes = arguments[ i ];			for (var key in attributes) {				result[key] = attributes[key];			}		}		return result;	}	function decode (s) {		return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);	}	function init (converter) {		function api() {}		function set (key, value, attributes) {			if (typeof document === 'undefined') {				return;			}			attributes = extend({				path: '/'			}, api.defaults, attributes);			if (typeof attributes.expires === 'number') {				attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);			}			// We're using "expires" because "max-age" is not supported by IE			attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';			try {				var result = JSON.stringify(value);				if (/^[\{\[]/.test(result)) {					value = result;				}			} catch (e) {}			value = converter.write ?				converter.write(value, key) :				encodeURIComponent(String(value))					.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);			key = encodeURIComponent(String(key))				.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)				.replace(/[\(\)]/g, escape);			var stringifiedAttributes = '';			for (var attributeName in attributes) {				if (!attributes[attributeName]) {					continue;				}				stringifiedAttributes += '; ' + attributeName;				if (attributes[attributeName] === true) {					continue;				}				// Considers RFC 6265 section 5.2:				// ...				// 3.  If the remaining unparsed-attributes contains a %x3B (";")				//     character:				// Consume the characters of the unparsed-attributes up to,				// not including, the first %x3B (";") character.				// ...				stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];			}			return (document.cookie = key + '=' + value + stringifiedAttributes);		}		function get (key, json) {			if (typeof document === 'undefined') {				return;			}			var jar = {};			// To prevent the for loop in the first place assign an empty array			// in case there are no cookies at all.			var cookies = document.cookie ? document.cookie.split('; ') : [];			var i = 0;			for (; i < cookies.length; i++) {				var parts = cookies[i].split('=');				var cookie = parts.slice(1).join('=');				if (!json && cookie.charAt(0) === '"') {					cookie = cookie.slice(1, -1);				}				try {					var name = decode(parts[0]);					cookie = (converter.read || converter)(cookie, name) ||						decode(cookie);					if (json) {						try {							cookie = JSON.parse(cookie);						} catch (e) {}					}					jar[name] = cookie;					if (key === name) {						break;					}				} catch (e) {}			}			return key ? jar[key] : jar;		}		api.set = set;		api.get = function (key) {			return get(key, false /* read as raw */);		};		api.getJSON = function (key) {			return get(key, true /* read as json */);		};		api.remove = function (key, attributes) {			set(key, '', extend(attributes, {				expires: -1			}));		};		api.defaults = {};		api.withConverter = init;		return api;	}	return init(function () {});}));},{}],87:[function(require,module,exports){/** * lodash 3.2.0 (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <https://lodash.com/license> */var root = require('lodash._root');/** Used to compose bitmasks for wrapper metadata. */var BIND_FLAG = 1,    BIND_KEY_FLAG = 2,    CURRY_BOUND_FLAG = 4,    CURRY_FLAG = 8,    CURRY_RIGHT_FLAG = 16,    PARTIAL_FLAG = 32,    PARTIAL_RIGHT_FLAG = 64,    ARY_FLAG = 128,    FLIP_FLAG = 512;/** Used as the `TypeError` message for "Functions" methods. */var FUNC_ERROR_TEXT = 'Expected a function';/** Used as references for various `Number` constants. */var INFINITY = 1 / 0,    MAX_SAFE_INTEGER = 9007199254740991,    MAX_INTEGER = 1.7976931348623157e+308,    NAN = 0 / 0;/** Used as the internal argument placeholder. */var PLACEHOLDER = '__lodash_placeholder__';/** `Object#toString` result references. */var funcTag = '[object Function]',    genTag = '[object GeneratorFunction]';/** Used to match leading and trailing whitespace. */var reTrim = /^\s+|\s+$/g;/** Used to detect bad signed hexadecimal string values. */var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;/** Used to detect binary string values. */var reIsBinary = /^0b[01]+$/i;/** Used to detect octal string values. */var reIsOctal = /^0o[0-7]+$/i;/** Used to detect unsigned integer values. */var reIsUint = /^(?:0|[1-9]\d*)$/;/** Built-in method references without a dependency on `root`. */var freeParseInt = parseInt;/** * A faster alternative to `Function#apply`, this function invokes `func` * with the `this` binding of `thisArg` and the arguments of `args`. * * @private * @param {Function} func The function to invoke. * @param {*} thisArg The `this` binding of `func`. * @param {...*} args The arguments to invoke `func` with. * @returns {*} Returns the result of `func`. */function apply(func, thisArg, args) {  var length = args.length;  switch (length) {    case 0: return func.call(thisArg);    case 1: return func.call(thisArg, args[0]);    case 2: return func.call(thisArg, args[0], args[1]);    case 3: return func.call(thisArg, args[0], args[1], args[2]);  }  return func.apply(thisArg, args);}/** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */function isIndex(value, length) {  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;  length = length == null ? MAX_SAFE_INTEGER : length;  return value > -1 && value % 1 == 0 && value < length;}/** * Replaces all `placeholder` elements in `array` with an internal placeholder * and returns an array of their indexes. * * @private * @param {Array} array The array to modify. * @param {*} placeholder The placeholder to replace. * @returns {Array} Returns the new array of placeholder indexes. */function replaceHolders(array, placeholder) {  var index = -1,      length = array.length,      resIndex = -1,      result = [];  while (++index < length) {    if (array[index] === placeholder) {      array[index] = PLACEHOLDER;      result[++resIndex] = index;    }  }  return result;}/** Used for built-in method references. */var objectProto = Object.prototype;/** * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeMax = Math.max,    nativeMin = Math.min;/** * The base implementation of `_.create` without support for assigning * properties to the created object. * * @private * @param {Object} prototype The object to inherit from. * @returns {Object} Returns the new object. */var baseCreate = (function() {  function object() {}  return function(prototype) {    if (isObject(prototype)) {      object.prototype = prototype;      var result = new object;      object.prototype = undefined;    }    return result || {};  };}());/** * Creates an array that is the composition of partially applied arguments, * placeholders, and provided arguments into a single array of arguments. * * @private * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to prepend to those provided. * @param {Array} holders The `partials` placeholder indexes. * @returns {Array} Returns the new array of composed arguments. */function composeArgs(args, partials, holders) {  var holdersLength = holders.length,      argsIndex = -1,      argsLength = nativeMax(args.length - holdersLength, 0),      leftIndex = -1,      leftLength = partials.length,      result = Array(leftLength + argsLength);  while (++leftIndex < leftLength) {    result[leftIndex] = partials[leftIndex];  }  while (++argsIndex < holdersLength) {    result[holders[argsIndex]] = args[argsIndex];  }  while (argsLength--) {    result[leftIndex++] = args[argsIndex++];  }  return result;}/** * This function is like `composeArgs` except that the arguments composition * is tailored for `_.partialRight`. * * @private * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to append to those provided. * @param {Array} holders The `partials` placeholder indexes. * @returns {Array} Returns the new array of composed arguments. */function composeArgsRight(args, partials, holders) {  var holdersIndex = -1,      holdersLength = holders.length,      argsIndex = -1,      argsLength = nativeMax(args.length - holdersLength, 0),      rightIndex = -1,      rightLength = partials.length,      result = Array(argsLength + rightLength);  while (++argsIndex < argsLength) {    result[argsIndex] = args[argsIndex];  }  var offset = argsIndex;  while (++rightIndex < rightLength) {    result[offset + rightIndex] = partials[rightIndex];  }  while (++holdersIndex < holdersLength) {    result[offset + holders[holdersIndex]] = args[argsIndex++];  }  return result;}/** * Copies the values of `source` to `array`. * * @private * @param {Array} source The array to copy values from. * @param {Array} [array=[]] The array to copy values to. * @returns {Array} Returns `array`. */function copyArray(source, array) {  var index = -1,      length = source.length;  array || (array = Array(length));  while (++index < length) {    array[index] = source[index];  }  return array;}/** * Creates a function that wraps `func` to invoke it with the optional `this` * binding of `thisArg`. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {*} [thisArg] The `this` binding of `func`. * @returns {Function} Returns the new wrapped function. */function createBaseWrapper(func, bitmask, thisArg) {  var isBind = bitmask & BIND_FLAG,      Ctor = createCtorWrapper(func);  function wrapper() {    var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;    return fn.apply(isBind ? thisArg : this, arguments);  }  return wrapper;}/** * Creates a function that produces an instance of `Ctor` regardless of * whether it was invoked as part of a `new` expression or by `call` or `apply`. * * @private * @param {Function} Ctor The constructor to wrap. * @returns {Function} Returns the new wrapped function. */function createCtorWrapper(Ctor) {  return function() {    // Use a `switch` statement to work with class constructors.    // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist    // for more details.    var args = arguments;    switch (args.length) {      case 0: return new Ctor;      case 1: return new Ctor(args[0]);      case 2: return new Ctor(args[0], args[1]);      case 3: return new Ctor(args[0], args[1], args[2]);      case 4: return new Ctor(args[0], args[1], args[2], args[3]);      case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);      case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);      case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);    }    var thisBinding = baseCreate(Ctor.prototype),        result = Ctor.apply(thisBinding, args);    // Mimic the constructor's `return` behavior.    // See https://es5.github.io/#x13.2.2 for more details.    return isObject(result) ? result : thisBinding;  };}/** * Creates a function that wraps `func` to enable currying. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {number} arity The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createCurryWrapper(func, bitmask, arity) {  var Ctor = createCtorWrapper(func);  function wrapper() {    var length = arguments.length,        index = length,        args = Array(length),        fn = (this && this !== root && this instanceof wrapper) ? Ctor : func,        placeholder = wrapper.placeholder;    while (index--) {      args[index] = arguments[index];    }    var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)      ? []      : replaceHolders(args, placeholder);    length -= holders.length;    return length < arity      ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length)      : apply(fn, this, args);  }  return wrapper;}/** * Creates a function that wraps `func` to invoke it with optional `this` * binding of `thisArg`, partial application, and currying. * * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to the new function. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [partialsRight] The arguments to append to those provided to the new function. * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {  var isAry = bitmask & ARY_FLAG,      isBind = bitmask & BIND_FLAG,      isBindKey = bitmask & BIND_KEY_FLAG,      isCurry = bitmask & CURRY_FLAG,      isCurryRight = bitmask & CURRY_RIGHT_FLAG,      isFlip = bitmask & FLIP_FLAG,      Ctor = isBindKey ? undefined : createCtorWrapper(func);  function wrapper() {    var length = arguments.length,        index = length,        args = Array(length);    while (index--) {      args[index] = arguments[index];    }    if (partials) {      args = composeArgs(args, partials, holders);    }    if (partialsRight) {      args = composeArgsRight(args, partialsRight, holdersRight);    }    if (isCurry || isCurryRight) {      var placeholder = wrapper.placeholder,          argsHolders = replaceHolders(args, placeholder);      length -= argsHolders.length;      if (length < arity) {        return createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, thisArg, args, argsHolders, argPos, ary, arity - length);      }    }    var thisBinding = isBind ? thisArg : this,        fn = isBindKey ? thisBinding[func] : func;    if (argPos) {      args = reorder(args, argPos);    } else if (isFlip && args.length > 1) {      args.reverse();    }    if (isAry && ary < args.length) {      args.length = ary;    }    if (this && this !== root && this instanceof wrapper) {      fn = Ctor || createCtorWrapper(fn);    }    return fn.apply(thisBinding, args);  }  return wrapper;}/** * Creates a function that wraps `func` to invoke it with the optional `this` * binding of `thisArg` and the `partials` prepended to those provided to * the wrapper. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {*} thisArg The `this` binding of `func`. * @param {Array} partials The arguments to prepend to those provided to the new function. * @returns {Function} Returns the new wrapped function. */function createPartialWrapper(func, bitmask, thisArg, partials) {  var isBind = bitmask & BIND_FLAG,      Ctor = createCtorWrapper(func);  function wrapper() {    var argsIndex = -1,        argsLength = arguments.length,        leftIndex = -1,        leftLength = partials.length,        args = Array(leftLength + argsLength),        fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;    while (++leftIndex < leftLength) {      args[leftIndex] = partials[leftIndex];    }    while (argsLength--) {      args[leftIndex++] = arguments[++argsIndex];    }    return apply(fn, isBind ? thisArg : this, args);  }  return wrapper;}/** * Creates a function that wraps `func` to continue currying. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {Function} wrapFunc The function to create the `func` wrapper. * @param {*} placeholder The placeholder to replace. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to the new function. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {  var isCurry = bitmask & CURRY_FLAG,      newArgPos = argPos ? copyArray(argPos) : undefined,      newsHolders = isCurry ? holders : undefined,      newHoldersRight = isCurry ? undefined : holders,      newPartials = isCurry ? partials : undefined,      newPartialsRight = isCurry ? undefined : partials;  bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);  bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);  if (!(bitmask & CURRY_BOUND_FLAG)) {    bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);  }  var result = wrapFunc(func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, arity);  result.placeholder = placeholder;  return result;}/** * Creates a function that either curries or invokes `func` with optional * `this` binding and partially applied arguments. * * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask of wrapper flags. *  The bitmask may be composed of the following flags: *     1 - `_.bind` *     2 - `_.bindKey` *     4 - `_.curry` or `_.curryRight` of a bound function *     8 - `_.curry` *    16 - `_.curryRight` *    32 - `_.partial` *    64 - `_.partialRight` *   128 - `_.rearg` *   256 - `_.ary` * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to be partially applied. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {  var isBindKey = bitmask & BIND_KEY_FLAG;  if (!isBindKey && typeof func != 'function') {    throw new TypeError(FUNC_ERROR_TEXT);  }  var length = partials ? partials.length : 0;  if (!length) {    bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);    partials = holders = undefined;  }  ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);  arity = arity === undefined ? arity : toInteger(arity);  length -= holders ? holders.length : 0;  if (bitmask & PARTIAL_RIGHT_FLAG) {    var partialsRight = partials,        holdersRight = holders;    partials = holders = undefined;  }  var newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];  func = newData[0];  bitmask = newData[1];  thisArg = newData[2];  partials = newData[3];  holders = newData[4];  arity = newData[9] = newData[9] == null    ? (isBindKey ? 0 : func.length)    : nativeMax(newData[9] - length, 0);  if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) {    bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG);  }  if (!bitmask || bitmask == BIND_FLAG) {    var result = createBaseWrapper(func, bitmask, thisArg);  } else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) {    result = createCurryWrapper(func, bitmask, arity);  } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) {    result = createPartialWrapper(func, bitmask, thisArg, partials);  } else {    result = createHybridWrapper.apply(undefined, newData);  }  return result;}/** * Reorder `array` according to the specified indexes where the element at * the first index is assigned as the first element, the element at * the second index is assigned as the second element, and so on. * * @private * @param {Array} array The array to reorder. * @param {Array} indexes The arranged array indexes. * @returns {Array} Returns `array`. */function reorder(array, indexes) {  var arrLength = array.length,      length = nativeMin(indexes.length, arrLength),      oldArray = copyArray(array);  while (length--) {    var index = indexes[length];    array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;  }  return array;}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8 which returns 'object' for typed array constructors, and  // PhantomJS 1.9 which returns 'function' for `NodeList` instances.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Converts `value` to an integer. * * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger). * * @static * @memberOf _ * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toInteger(3); * // => 3 * * _.toInteger(Number.MIN_VALUE); * // => 0 * * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * * _.toInteger('3'); * // => 3 */function toInteger(value) {  if (!value) {    return value === 0 ? value : 0;  }  value = toNumber(value);  if (value === INFINITY || value === -INFINITY) {    var sign = (value < 0 ? -1 : 1);    return sign * MAX_INTEGER;  }  var remainder = value % 1;  return value === value ? (remainder ? value - remainder : value) : 0;}/** * Converts `value` to a number. * * @static * @memberOf _ * @category Lang * @param {*} value The value to process. * @returns {number} Returns the number. * @example * * _.toNumber(3); * // => 3 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 * * _.toNumber(Infinity); * // => Infinity * * _.toNumber('3'); * // => 3 */function toNumber(value) {  if (isObject(value)) {    var other = isFunction(value.valueOf) ? value.valueOf() : value;    value = isObject(other) ? (other + '') : other;  }  if (typeof value != 'string') {    return value === 0 ? value : +value;  }  value = value.replace(reTrim, '');  var isBinary = reIsBinary.test(value);  return (isBinary || reIsOctal.test(value))    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)    : (reIsBadHex.test(value) ? NAN : +value);}module.exports = createWrapper;},{"lodash._root":88}],88:[function(require,module,exports){(function (global){/** * lodash 3.0.1 (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <https://lodash.com/license> *//** Used to determine if values are of the language type `Object`. */var objectTypes = {  'function': true,  'object': true};/** Detect free variable `exports`. */var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType)  ? exports  : undefined;/** Detect free variable `module`. */var freeModule = (objectTypes[typeof module] && module && !module.nodeType)  ? module  : undefined;/** Detect free variable `global` from Node.js. */var freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global);/** Detect free variable `self`. */var freeSelf = checkGlobal(objectTypes[typeof self] && self);/** Detect free variable `window`. */var freeWindow = checkGlobal(objectTypes[typeof window] && window);/** Detect `this` as the global object. */var thisGlobal = checkGlobal(objectTypes[typeof this] && this);/** * Used as a reference to the global object. * * The `this` value is used if it's the global object to avoid Greasemonkey's * restricted `window` object, otherwise the `window` object is used. */var root = freeGlobal ||  ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) ||    freeSelf || thisGlobal || Function('return this')();/** * Checks if `value` is a global object. * * @private * @param {*} value The value to check. * @returns {null|Object} Returns `value` if it's a global object, else `null`. */function checkGlobal(value) {  return (value && value.Object === Object) ? value : null;}module.exports = root;}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{}],89:[function(require,module,exports){/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *//** Used as references for various `Number` constants. */var MAX_SAFE_INTEGER = 9007199254740991;/** `Object#toString` result references. */var argsTag = '[object Arguments]',    funcTag = '[object Function]',    genTag = '[object GeneratorFunction]';/** Used to detect unsigned integer values. */var reIsUint = /^(?:0|[1-9]\d*)$/;/** * A faster alternative to `Function#apply`, this function invokes `func` * with the `this` binding of `thisArg` and the arguments of `args`. * * @private * @param {Function} func The function to invoke. * @param {*} thisArg The `this` binding of `func`. * @param {Array} args The arguments to invoke `func` with. * @returns {*} Returns the result of `func`. */function apply(func, thisArg, args) {  switch (args.length) {    case 0: return func.call(thisArg);    case 1: return func.call(thisArg, args[0]);    case 2: return func.call(thisArg, args[0], args[1]);    case 3: return func.call(thisArg, args[0], args[1], args[2]);  }  return func.apply(thisArg, args);}/** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */function baseTimes(n, iteratee) {  var index = -1,      result = Array(n);  while (++index < n) {    result[index] = iteratee(index);  }  return result;}/** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */function overArg(func, transform) {  return function(arg) {    return func(transform(arg));  };}/** Used for built-in method references. */var objectProto = Object.prototype;/** Used to check objects for own properties. */var hasOwnProperty = objectProto.hasOwnProperty;/** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/** Built-in value references. */var propertyIsEnumerable = objectProto.propertyIsEnumerable;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeKeys = overArg(Object.keys, Object),    nativeMax = Math.max;/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');/** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */function arrayLikeKeys(value, inherited) {  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.  // Safari 9 makes `arguments.length` enumerable in strict mode.  var result = (isArray(value) || isArguments(value))    ? baseTimes(value.length, String)    : [];  var length = result.length,      skipIndexes = !!length;  for (var key in value) {    if ((inherited || hasOwnProperty.call(value, key)) &&        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {      result.push(key);    }  }  return result;}/** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */function assignValue(object, key, value) {  var objValue = object[key];  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||      (value === undefined && !(key in object))) {    object[key] = value;  }}/** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */function baseKeys(object) {  if (!isPrototype(object)) {    return nativeKeys(object);  }  var result = [];  for (var key in Object(object)) {    if (hasOwnProperty.call(object, key) && key != 'constructor') {      result.push(key);    }  }  return result;}/** * The base implementation of `_.rest` which doesn't validate or coerce arguments. * * @private * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @returns {Function} Returns the new function. */function baseRest(func, start) {  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);  return function() {    var args = arguments,        index = -1,        length = nativeMax(args.length - start, 0),        array = Array(length);    while (++index < length) {      array[index] = args[start + index];    }    index = -1;    var otherArgs = Array(start + 1);    while (++index < start) {      otherArgs[index] = args[index];    }    otherArgs[start] = array;    return apply(func, this, otherArgs);  };}/** * Copies properties of `source` to `object`. * * @private * @param {Object} source The object to copy properties from. * @param {Array} props The property identifiers to copy. * @param {Object} [object={}] The object to copy properties to. * @param {Function} [customizer] The function to customize copied values. * @returns {Object} Returns `object`. */function copyObject(source, props, object, customizer) {  object || (object = {});  var index = -1,      length = props.length;  while (++index < length) {    var key = props[index];    var newValue = customizer      ? customizer(object[key], source[key], key, object, source)      : undefined;    assignValue(object, key, newValue === undefined ? source[key] : newValue);  }  return object;}/** * Creates a function like `_.assign`. * * @private * @param {Function} assigner The function to assign values. * @returns {Function} Returns the new assigner function. */function createAssigner(assigner) {  return baseRest(function(object, sources) {    var index = -1,        length = sources.length,        customizer = length > 1 ? sources[length - 1] : undefined,        guard = length > 2 ? sources[2] : undefined;    customizer = (assigner.length > 3 && typeof customizer == 'function')      ? (length--, customizer)      : undefined;    if (guard && isIterateeCall(sources[0], sources[1], guard)) {      customizer = length < 3 ? undefined : customizer;      length = 1;    }    object = Object(object);    while (++index < length) {      var source = sources[index];      if (source) {        assigner(object, source, index, customizer);      }    }    return object;  });}/** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */function isIndex(value, length) {  length = length == null ? MAX_SAFE_INTEGER : length;  return !!length &&    (typeof value == 'number' || reIsUint.test(value)) &&    (value > -1 && value % 1 == 0 && value < length);}/** * Checks if the given arguments are from an iteratee call. * * @private * @param {*} value The potential iteratee value argument. * @param {*} index The potential iteratee index or key argument. * @param {*} object The potential iteratee object argument. * @returns {boolean} Returns `true` if the arguments are from an iteratee call, *  else `false`. */function isIterateeCall(value, index, object) {  if (!isObject(object)) {    return false;  }  var type = typeof index;  if (type == 'number'        ? (isArrayLike(object) && isIndex(index, object.length))        : (type == 'string' && index in object)      ) {    return eq(object[index], value);  }  return false;}/** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */function isPrototype(value) {  var Ctor = value && value.constructor,      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;  return value === proto;}/** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */function eq(value, other) {  return value === other || (value !== value && other !== other);}/** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, *  else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */function isArguments(value) {  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);}/** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */var isArray = Array.isArray;/** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */function isArrayLike(value) {  return value != null && isLength(value.length) && !isFunction(value);}/** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, *  else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */function isArrayLikeObject(value) {  return isObjectLike(value) && isArrayLike(value);}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8-9 which returns 'object' for typed array and other constructors.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */function isLength(value) {  return typeof value == 'number' &&    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;}/** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */function isObjectLike(value) {  return !!value && typeof value == 'object';}/** * Assigns own enumerable string keyed properties of source objects to the * destination object. Source objects are applied from left to right. * Subsequent sources overwrite property assignments of previous sources. * * **Note:** This method mutates `object` and is loosely based on * [`Object.assign`](https://mdn.io/Object/assign). * * @static * @memberOf _ * @since 0.10.0 * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @see _.assignIn * @example * * function Foo() { *   this.a = 1; * } * * function Bar() { *   this.c = 3; * } * * Foo.prototype.b = 2; * Bar.prototype.d = 4; * * _.assign({ 'a': 0 }, new Foo, new Bar); * // => { 'a': 1, 'c': 3 } */var assign = createAssigner(function(object, source) {  if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {    copyObject(source, keys(source), object);    return;  }  for (var key in source) {    if (hasOwnProperty.call(source, key)) {      assignValue(object, key, source[key]);    }  }});/** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { *   this.a = 1; *   this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */function keys(object) {  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);}module.exports = assign;},{}],90:[function(require,module,exports){/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *//** Used as references for various `Number` constants. */var INFINITY = 1 / 0,    MAX_SAFE_INTEGER = 9007199254740991,    MAX_INTEGER = 1.7976931348623157e+308,    NAN = 0 / 0;/** `Object#toString` result references. */var funcTag = '[object Function]',    genTag = '[object GeneratorFunction]',    symbolTag = '[object Symbol]';/** Used to match leading and trailing whitespace. */var reTrim = /^\s+|\s+$/g;/** Used to detect bad signed hexadecimal string values. */var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;/** Used to detect binary string values. */var reIsBinary = /^0b[01]+$/i;/** Used to detect octal string values. */var reIsOctal = /^0o[0-7]+$/i;/** Used to detect unsigned integer values. */var reIsUint = /^(?:0|[1-9]\d*)$/;/** Built-in method references without a dependency on `root`. */var freeParseInt = parseInt;/** Used for built-in method references. */var objectProto = Object.prototype;/** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeCeil = Math.ceil,    nativeMax = Math.max;/** * The base implementation of `_.slice` without an iteratee call guard. * * @private * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */function baseSlice(array, start, end) {  var index = -1,      length = array.length;  if (start < 0) {    start = -start > length ? 0 : (length + start);  }  end = end > length ? length : end;  if (end < 0) {    end += length;  }  length = start > end ? 0 : ((end - start) >>> 0);  start >>>= 0;  var result = Array(length);  while (++index < length) {    result[index] = array[index + start];  }  return result;}/** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */function isIndex(value, length) {  length = length == null ? MAX_SAFE_INTEGER : length;  return !!length &&    (typeof value == 'number' || reIsUint.test(value)) &&    (value > -1 && value % 1 == 0 && value < length);}/** * Checks if the given arguments are from an iteratee call. * * @private * @param {*} value The potential iteratee value argument. * @param {*} index The potential iteratee index or key argument. * @param {*} object The potential iteratee object argument. * @returns {boolean} Returns `true` if the arguments are from an iteratee call, *  else `false`. */function isIterateeCall(value, index, object) {  if (!isObject(object)) {    return false;  }  var type = typeof index;  if (type == 'number'        ? (isArrayLike(object) && isIndex(index, object.length))        : (type == 'string' && index in object)      ) {    return eq(object[index], value);  }  return false;}/** * Creates an array of elements split into groups the length of `size`. * If `array` can't be split evenly, the final chunk will be the remaining * elements. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to process. * @param {number} [size=1] The length of each chunk * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the new array of chunks. * @example * * _.chunk(['a', 'b', 'c', 'd'], 2); * // => [['a', 'b'], ['c', 'd']] * * _.chunk(['a', 'b', 'c', 'd'], 3); * // => [['a', 'b', 'c'], ['d']] */function chunk(array, size, guard) {  if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {    size = 1;  } else {    size = nativeMax(toInteger(size), 0);  }  var length = array ? array.length : 0;  if (!length || size < 1) {    return [];  }  var index = 0,      resIndex = 0,      result = Array(nativeCeil(length / size));  while (index < length) {    result[resIndex++] = baseSlice(array, index, (index += size));  }  return result;}/** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */function eq(value, other) {  return value === other || (value !== value && other !== other);}/** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */function isArrayLike(value) {  return value != null && isLength(value.length) && !isFunction(value);}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8-9 which returns 'object' for typed array and other constructors.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */function isLength(value) {  return typeof value == 'number' &&    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;}/** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */function isObjectLike(value) {  return !!value && typeof value == 'object';}/** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */function isSymbol(value) {  return typeof value == 'symbol' ||    (isObjectLike(value) && objectToString.call(value) == symbolTag);}/** * Converts `value` to a finite number. * * @static * @memberOf _ * @since 4.12.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted number. * @example * * _.toFinite(3.2); * // => 3.2 * * _.toFinite(Number.MIN_VALUE); * // => 5e-324 * * _.toFinite(Infinity); * // => 1.7976931348623157e+308 * * _.toFinite('3.2'); * // => 3.2 */function toFinite(value) {  if (!value) {    return value === 0 ? value : 0;  }  value = toNumber(value);  if (value === INFINITY || value === -INFINITY) {    var sign = (value < 0 ? -1 : 1);    return sign * MAX_INTEGER;  }  return value === value ? value : 0;}/** * Converts `value` to an integer. * * **Note:** This method is loosely based on * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toInteger(3.2); * // => 3 * * _.toInteger(Number.MIN_VALUE); * // => 0 * * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * * _.toInteger('3.2'); * // => 3 */function toInteger(value) {  var result = toFinite(value),      remainder = result % 1;  return result === result ? (remainder ? result - remainder : result) : 0;}/** * Converts `value` to a number. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to process. * @returns {number} Returns the number. * @example * * _.toNumber(3.2); * // => 3.2 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 * * _.toNumber(Infinity); * // => Infinity * * _.toNumber('3.2'); * // => 3.2 */function toNumber(value) {  if (typeof value == 'number') {    return value;  }  if (isSymbol(value)) {    return NAN;  }  if (isObject(value)) {    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;    value = isObject(other) ? (other + '') : other;  }  if (typeof value != 'string') {    return value === 0 ? value : +value;  }  value = value.replace(reTrim, '');  var isBinary = reIsBinary.test(value);  return (isBinary || reIsOctal.test(value))    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)    : (reIsBadHex.test(value) ? NAN : +value);}module.exports = chunk;},{}],91:[function(require,module,exports){/** * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> * Build: `lodash modularize modern exports="npm" -o ./npm/` * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <http://lodash.com/license> */var isFunction = require('lodash.isfunction');/** * Creates a function that is the composition of the provided functions, * where each function consumes the return value of the function that follows. * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`. * Each function is executed with the `this` binding of the composed function. * * @static * @memberOf _ * @category Functions * @param {...Function} [func] Functions to compose. * @returns {Function} Returns the new composed function. * @example * * var realNameMap = { *   'pebbles': 'penelope' * }; * * var format = function(name) { *   name = realNameMap[name.toLowerCase()] || name; *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase(); * }; * * var greet = function(formatted) { *   return 'Hiya ' + formatted + '!'; * }; * * var welcome = _.compose(greet, format); * welcome('pebbles'); * // => 'Hiya Penelope!' */function compose() {  var funcs = arguments,      length = funcs.length;  while (length--) {    if (!isFunction(funcs[length])) {      throw new TypeError;    }  }  return function() {    var args = arguments,        length = funcs.length;    while (length--) {      args = [funcs[length].apply(this, args)];    }    return args[0];  };}module.exports = compose;},{"lodash.isfunction":95}],92:[function(require,module,exports){/** * lodash 3.1.1 (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <https://lodash.com/license> */var createWrapper = require('lodash._createwrapper');/** Used to compose bitmasks for wrapper metadata. */var CURRY_FLAG = 8;/** * Creates a function that accepts arguments of `func` and either invokes * `func` returning its result, if at least `arity` number of arguments have * been provided, or returns a function that accepts the remaining `func` * arguments, and so on. The arity of `func` may be specified if `func.length` * is not sufficient. * * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, * may be used as a placeholder for provided arguments. * * **Note:** This method doesn't set the "length" property of curried functions. * * @static * @memberOf _ * @category Function * @param {Function} func The function to curry. * @param {number} [arity=func.length] The arity of `func`. * @param- {Object} [guard] Enables use as an iteratee for functions like `_.map`. * @returns {Function} Returns the new curried function. * @example * * var abc = function(a, b, c) { *   return [a, b, c]; * }; * * var curried = _.curry(abc); * * curried(1)(2)(3); * // => [1, 2, 3] * * curried(1, 2)(3); * // => [1, 2, 3] * * curried(1, 2, 3); * // => [1, 2, 3] * * // Curried with placeholders. * curried(1)(_, 3)(2); * // => [1, 2, 3] */function curry(func, arity, guard) {  arity = guard ? undefined : arity;  var result = createWrapper(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);  result.placeholder = curry.placeholder;  return result;}// Assign default placeholders.curry.placeholder = {};module.exports = curry;},{"lodash._createwrapper":87}],93:[function(require,module,exports){(function (global){/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *//** Used as references for various `Number` constants. */var MAX_SAFE_INTEGER = 9007199254740991;/** `Object#toString` result references. */var argsTag = '[object Arguments]',    funcTag = '[object Function]',    genTag = '[object GeneratorFunction]';/** Detect free variable `global` from Node.js. */var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;/** Detect free variable `self`. */var freeSelf = typeof self == 'object' && self && self.Object === Object && self;/** Used as a reference to the global object. */var root = freeGlobal || freeSelf || Function('return this')();/** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */function arrayPush(array, values) {  var index = -1,      length = values.length,      offset = array.length;  while (++index < length) {    array[offset + index] = values[index];  }  return array;}/** Used for built-in method references. */var objectProto = Object.prototype;/** Used to check objects for own properties. */var hasOwnProperty = objectProto.hasOwnProperty;/** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/** Built-in value references. */var Symbol = root.Symbol,    propertyIsEnumerable = objectProto.propertyIsEnumerable,    spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;/** * The base implementation of `_.flatten` with support for restricting flattening. * * @private * @param {Array} array The array to flatten. * @param {number} depth The maximum recursion depth. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. * @param {Array} [result=[]] The initial result value. * @returns {Array} Returns the new flattened array. */function baseFlatten(array, depth, predicate, isStrict, result) {  var index = -1,      length = array.length;  predicate || (predicate = isFlattenable);  result || (result = []);  while (++index < length) {    var value = array[index];    if (depth > 0 && predicate(value)) {      if (depth > 1) {        // Recursively flatten arrays (susceptible to call stack limits).        baseFlatten(value, depth - 1, predicate, isStrict, result);      } else {        arrayPush(result, value);      }    } else if (!isStrict) {      result[result.length] = value;    }  }  return result;}/** * Checks if `value` is a flattenable `arguments` object or array. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. */function isFlattenable(value) {  return isArray(value) || isArguments(value) ||    !!(spreadableSymbol && value && value[spreadableSymbol]);}/** * Flattens `array` a single level deep. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.flatten([1, [2, [3, [4]], 5]]); * // => [1, 2, [3, [4]], 5] */function flatten(array) {  var length = array ? array.length : 0;  return length ? baseFlatten(array, 1) : [];}/** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, *  else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */function isArguments(value) {  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);}/** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */var isArray = Array.isArray;/** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */function isArrayLike(value) {  return value != null && isLength(value.length) && !isFunction(value);}/** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, *  else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */function isArrayLikeObject(value) {  return isObjectLike(value) && isArrayLike(value);}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8-9 which returns 'object' for typed array and other constructors.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */function isLength(value) {  return typeof value == 'number' &&    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;}/** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */function isObjectLike(value) {  return !!value && typeof value == 'object';}module.exports = flatten;}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{}],94:[function(require,module,exports){(function (global){/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *//** Used as references for various `Number` constants. */var MAX_SAFE_INTEGER = 9007199254740991;/** `Object#toString` result references. */var argsTag = '[object Arguments]',    funcTag = '[object Function]',    genTag = '[object GeneratorFunction]',    mapTag = '[object Map]',    objectTag = '[object Object]',    promiseTag = '[object Promise]',    setTag = '[object Set]',    weakMapTag = '[object WeakMap]';var dataViewTag = '[object DataView]';/** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;/** Used to detect host constructors (Safari). */var reIsHostCtor = /^\[object .+?Constructor\]$/;/** Detect free variable `global` from Node.js. */var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;/** Detect free variable `self`. */var freeSelf = typeof self == 'object' && self && self.Object === Object && self;/** Used as a reference to the global object. */var root = freeGlobal || freeSelf || Function('return this')();/** Detect free variable `exports`. */var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;/** Detect free variable `module`. */var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;/** Detect the popular CommonJS extension `module.exports`. */var moduleExports = freeModule && freeModule.exports === freeExports;/** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */function getValue(object, key) {  return object == null ? undefined : object[key];}/** * Checks if `value` is a host object in IE < 9. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a host object, else `false`. */function isHostObject(value) {  // Many host objects are `Object` objects that can coerce to strings  // despite having improperly defined `toString` methods.  var result = false;  if (value != null && typeof value.toString != 'function') {    try {      result = !!(value + '');    } catch (e) {}  }  return result;}/** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */function overArg(func, transform) {  return function(arg) {    return func(transform(arg));  };}/** Used for built-in method references. */var funcProto = Function.prototype,    objectProto = Object.prototype;/** Used to detect overreaching core-js shims. */var coreJsData = root['__core-js_shared__'];/** Used to detect methods masquerading as native. */var maskSrcKey = (function() {  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');  return uid ? ('Symbol(src)_1.' + uid) : '';}());/** Used to resolve the decompiled source of functions. */var funcToString = funcProto.toString;/** Used to check objects for own properties. */var hasOwnProperty = objectProto.hasOwnProperty;/** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/** Used to detect if a method is native. */var reIsNative = RegExp('^' +  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');/** Built-in value references. */var Buffer = moduleExports ? root.Buffer : undefined,    propertyIsEnumerable = objectProto.propertyIsEnumerable;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,    nativeKeys = overArg(Object.keys, Object);/* Built-in method references that are verified to be native. */var DataView = getNative(root, 'DataView'),    Map = getNative(root, 'Map'),    Promise = getNative(root, 'Promise'),    Set = getNative(root, 'Set'),    WeakMap = getNative(root, 'WeakMap');/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');/** Used to detect maps, sets, and weakmaps. */var dataViewCtorString = toSource(DataView),    mapCtorString = toSource(Map),    promiseCtorString = toSource(Promise),    setCtorString = toSource(Set),    weakMapCtorString = toSource(WeakMap);/** * The base implementation of `getTag`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */function baseGetTag(value) {  return objectToString.call(value);}/** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, *  else `false`. */function baseIsNative(value) {  if (!isObject(value) || isMasked(value)) {    return false;  }  var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;  return pattern.test(toSource(value));}/** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */function getNative(object, key) {  var value = getValue(object, key);  return baseIsNative(value) ? value : undefined;}/** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */var getTag = baseGetTag;// Fallback for data views, maps, sets, and weak maps in IE 11,// for data views in Edge < 14, and promises in Node.js.if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||    (Map && getTag(new Map) != mapTag) ||    (Promise && getTag(Promise.resolve()) != promiseTag) ||    (Set && getTag(new Set) != setTag) ||    (WeakMap && getTag(new WeakMap) != weakMapTag)) {  getTag = function(value) {    var result = objectToString.call(value),        Ctor = result == objectTag ? value.constructor : undefined,        ctorString = Ctor ? toSource(Ctor) : undefined;    if (ctorString) {      switch (ctorString) {        case dataViewCtorString: return dataViewTag;        case mapCtorString: return mapTag;        case promiseCtorString: return promiseTag;        case setCtorString: return setTag;        case weakMapCtorString: return weakMapTag;      }    }    return result;  };}/** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */function isMasked(func) {  return !!maskSrcKey && (maskSrcKey in func);}/** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */function isPrototype(value) {  var Ctor = value && value.constructor,      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;  return value === proto;}/** * Converts `func` to its source code. * * @private * @param {Function} func The function to process. * @returns {string} Returns the source code. */function toSource(func) {  if (func != null) {    try {      return funcToString.call(func);    } catch (e) {}    try {      return (func + '');    } catch (e) {}  }  return '';}/** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, *  else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */function isArguments(value) {  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);}/** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */var isArray = Array.isArray;/** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */function isArrayLike(value) {  return value != null && isLength(value.length) && !isFunction(value);}/** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, *  else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */function isArrayLikeObject(value) {  return isObjectLike(value) && isArrayLike(value);}/** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */var isBuffer = nativeIsBuffer || stubFalse;/** * Checks if `value` is an empty object, collection, map, or set. * * Objects are considered empty if they have no own enumerable string keyed * properties. * * Array-like values such as `arguments` objects, arrays, buffers, strings, or * jQuery-like collections are considered empty if they have a `length` of `0`. * Similarly, maps and sets are considered empty if they have a `size` of `0`. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is empty, else `false`. * @example * * _.isEmpty(null); * // => true * * _.isEmpty(true); * // => true * * _.isEmpty(1); * // => true * * _.isEmpty([1, 2, 3]); * // => false * * _.isEmpty({ 'a': 1 }); * // => false */function isEmpty(value) {  if (isArrayLike(value) &&      (isArray(value) || typeof value == 'string' ||        typeof value.splice == 'function' || isBuffer(value) || isArguments(value))) {    return !value.length;  }  var tag = getTag(value);  if (tag == mapTag || tag == setTag) {    return !value.size;  }  if (nonEnumShadows || isPrototype(value)) {    return !nativeKeys(value).length;  }  for (var key in value) {    if (hasOwnProperty.call(value, key)) {      return false;    }  }  return true;}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8-9 which returns 'object' for typed array and other constructors.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */function isLength(value) {  return typeof value == 'number' &&    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;}/** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */function isObjectLike(value) {  return !!value && typeof value == 'object';}/** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */function stubFalse() {  return false;}module.exports = isEmpty;}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{}],95:[function(require,module,exports){/** * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> * Build: `lodash modularize modern exports="npm" -o ./npm/` * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <http://lodash.com/license> *//** * Checks if `value` is a function. * * @static * @memberOf _ * @category Objects * @param {*} value The value to check. * @returns {boolean} Returns `true` if the `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true */function isFunction(value) {  return typeof value == 'function';}module.exports = isFunction;},{}],96:[function(require,module,exports){var trim = function(string) {  return string.replace(/^\s+|\s+$/g, '');}  , isArray = function(arg) {      return Object.prototype.toString.call(arg) === '[object Array]';    }module.exports = function (headers) {  if (!headers)    return {}  var result = {}  var headersArr = trim(headers).split('\n')  for (var i = 0; i < headersArr.length; i++) {    var row = headersArr[i]    var index = row.indexOf(':')    , key = trim(row.slice(0, index)).toLowerCase()    , value = trim(row.slice(index + 1))    if (typeof(result[key]) === 'undefined') {      result[key] = value    } else if (isArray(result[key])) {      result[key].push(value)    } else {      result[key] = [ result[key], value ]    }  }  return result}},{}],97:[function(require,module,exports){// shim for using process in browservar process = module.exports = {};// cached from whatever global is present so that test runners that stub it// don't break things.  But we need to wrap it in a try catch in case it is// wrapped in strict mode code which doesn't define any globals.  It's inside a// function because try/catches deoptimize in certain engines.var cachedSetTimeout;var cachedClearTimeout;function defaultSetTimout() {    throw new Error('setTimeout has not been defined');}function defaultClearTimeout () {    throw new Error('clearTimeout has not been defined');}(function () {    try {        if (typeof setTimeout === 'function') {            cachedSetTimeout = setTimeout;        } else {            cachedSetTimeout = defaultSetTimout;        }    } catch (e) {        cachedSetTimeout = defaultSetTimout;    }    try {        if (typeof clearTimeout === 'function') {            cachedClearTimeout = clearTimeout;        } else {            cachedClearTimeout = defaultClearTimeout;        }    } catch (e) {        cachedClearTimeout = defaultClearTimeout;    }} ())function runTimeout(fun) {    if (cachedSetTimeout === setTimeout) {        //normal enviroments in sane situations        return setTimeout(fun, 0);    }    // if setTimeout wasn't available but was latter defined    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {        cachedSetTimeout = setTimeout;        return setTimeout(fun, 0);    }    try {        // when when somebody has screwed with setTimeout but no I.E. maddness        return cachedSetTimeout(fun, 0);    } catch(e){        try {            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally            return cachedSetTimeout.call(null, fun, 0);        } catch(e){            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error            return cachedSetTimeout.call(this, fun, 0);        }    }}function runClearTimeout(marker) {    if (cachedClearTimeout === clearTimeout) {        //normal enviroments in sane situations        return clearTimeout(marker);    }    // if clearTimeout wasn't available but was latter defined    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {        cachedClearTimeout = clearTimeout;        return clearTimeout(marker);    }    try {        // when when somebody has screwed with setTimeout but no I.E. maddness        return cachedClearTimeout(marker);    } catch (e){        try {            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally            return cachedClearTimeout.call(null, marker);        } catch (e){            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.            // Some versions of I.E. have different rules for clearTimeout vs setTimeout            return cachedClearTimeout.call(this, marker);        }    }}var queue = [];var draining = false;var currentQueue;var queueIndex = -1;function cleanUpNextTick() {    if (!draining || !currentQueue) {        return;    }    draining = false;    if (currentQueue.length) {        queue = currentQueue.concat(queue);    } else {        queueIndex = -1;    }    if (queue.length) {        drainQueue();    }}function drainQueue() {    if (draining) {        return;    }    var timeout = runTimeout(cleanUpNextTick);    draining = true;    var len = queue.length;    while(len) {        currentQueue = queue;        queue = [];        while (++queueIndex < len) {            if (currentQueue) {                currentQueue[queueIndex].run();            }        }        queueIndex = -1;        len = queue.length;    }    currentQueue = null;    draining = false;    runClearTimeout(timeout);}process.nextTick = function (fun) {    var args = new Array(arguments.length - 1);    if (arguments.length > 1) {        for (var i = 1; i < arguments.length; i++) {            args[i - 1] = arguments[i];        }    }    queue.push(new Item(fun, args));    if (queue.length === 1 && !draining) {        runTimeout(drainQueue);    }};// v8 likes predictible objectsfunction Item(fun, array) {    this.fun = fun;    this.array = array;}Item.prototype.run = function () {    this.fun.apply(null, this.array);};process.title = 'browser';process.browser = true;process.env = {};process.argv = [];process.version = ''; // empty string to avoid regexp issuesprocess.versions = {};function noop() {}process.on = noop;process.addListener = noop;process.once = noop;process.off = noop;process.removeListener = noop;process.removeAllListeners = noop;process.emit = noop;process.prependListener = noop;process.prependOnceListener = noop;process.listeners = function (name) { return [] }process.binding = function (name) {    throw new Error('process.binding is not supported');};process.cwd = function () { return '/' };process.chdir = function (dir) {    throw new Error('process.chdir is not supported');};process.umask = function() { return 0; };},{}],98:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.classString || 'th-chat-header';    var expertProfile = config.expertProfile || {};    var expertName = expertProfile.expertName || 'Expert';    var avatar = expertProfile.expertAvatarUrl || 'https://secure.justanswer.com/fe-lib/components/th-chat-header/images/shirt.png';    var satisfiedCustomersText = expertProfile.satisfiedCustomers        ? [expertProfile.satisfiedCustomers, expertProfile.satisfiedCustomersLabel || 'Satisfied Customers'].join(' ') : '';    var expertTitle = expertProfile.expertTitle || '';    var experience = expertProfile.experience || '';    var moreLinkText = config.moreLinkText || '';    var lessLinkText = config.lessLinkText || '';    var showMoreLink = expertProfile.showMoreLink || false;    function renderExperience() {        return (showMoreLink) ?            html('div', {className: "experience-container"}, [                 html('div', {className: "experience short"}, [                    experience,                    html('div', {className: "less-link hidden"}, [lessLinkText])                ]),                html('div', {className: "more-link"}, [moreLinkText])            ])            : html('div', {className: "experience"}, [experience]);    }    return (        html('header', {className: classString}, [            html('div', {className: "toggle-button"}),            html('div', {className: "title"}, [                html('div', {className: "ja-logo"}),                html('div', {className: "heading"}, [config.heading])            ]),            html('div', {className: "expert-profile"}, [                html('div', {className: "expert-avatar-container"}, [                    html('img', {className: "expert-avatar", src: avatar, width: "60", height: "60"})                ]),                html('div', {className: "expert-name"}, [expertName, ", ", expertTitle]),                html('div', {className: "profile"}, [                    html('div', {className: "satisfied-customers"}, [satisfiedCustomersText]),                    renderExperience()                ])            ])        ])    );}},{"ja-dom-element":80}],99:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');var tmpl = require('./th-chat-header-tmpl.js');var dom = require('ja-dom');module.exports = ChatHeader;var shortClass = 'short';var longClass = 'long';var hiddenClass = 'hidden';function ChatHeader(config) {    var self = this;    config = config || {};    if (!(this instanceof ChatHeader)) return new ChatHeader(config);    this.chatHeaderElement = document.querySelector('.th-chat-header');    this.toggleButton = this.chatHeaderElement ? this.chatHeaderElement.querySelector('.toggle-button') : '';    this.experience = this.chatHeaderElement.querySelector('.experience');    this.experienceContainer = this.chatHeaderElement.querySelector('.experience-container');        if (!this.toggleButton) return;    this.toggleButton.addEventListener('click', function () {        self.trigger('toggleChat');    });    if (config.expertProfile && config.expertProfile.showMoreLink) {        this.moreLink = this.chatHeaderElement.querySelector('.more-link');        this.lessLink = this.chatHeaderElement.querySelector('.less-link');        this.moreLink.addEventListener('click', function(){            self.trigger('more-link-clicked');            self.showLongExperience();        });        this.lessLink.addEventListener('click', function(){            self.trigger('less-link-clicked');            self.showShortExperience();        });    }}ChatHeader.prototype.showLongExperience = function() {    if (!this.experience) return;    dom.toggleCls(this.experience, shortClass, dom.hasCls(this.experience, shortClass));    dom.toggleCls(this.moreLink, hiddenClass, !dom.hasCls(this.moreLink, hiddenClass));    dom.toggleCls(this.lessLink, hiddenClass, dom.hasCls(this.lessLink, hiddenClass));    this.trigger('show-experience');}ChatHeader.prototype.showShortExperience = function() {    if (!this.experience) return;    dom.toggleCls(this.experience, shortClass, !dom.hasCls(this.experience, shortClass));    dom.toggleCls(this.experienceContainer, longClass, dom.hasCls(this.experienceContainer, longClass));    dom.toggleCls(this.moreLink, hiddenClass, dom.hasCls(this.moreLink, hiddenClass));    dom.toggleCls(this.lessLink, hiddenClass, !dom.hasCls(this.lessLink, hiddenClass));    this.trigger('hide-experience');}ChatHeader.prototype.expandExperienceMinHeight = function() {    if (!this.experience) return;    dom.toggleCls(this.experienceContainer, longClass, !dom.hasCls(this.experienceContainer, longClass));}ChatHeader.tmpl = function (config) {    return tmpl(config);};utils.mixin(ChatHeader, events);},{"./th-chat-header-tmpl.js":98,"ja-dom":81,"ja-event":83,"ja-utils":84}],100:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    return (            html('div', {className: "th-chat-notification"}, [                html('span', {className: "th-chat-notification-header"}),                html('span', {className: "th-chat-notification-body"})            ])    );}},{"ja-dom-element":80}],101:[function(require,module,exports){//Static build with: browserify -r ./th-chat-notification.js:th-chat-notification -o build.jsvar dom = require('ja-dom');var tmpl = require('./th-chat-notification-tmpl.js');var activeClass = 'active';var errorClass = 'error';var warningClass = 'warning';var chatNotificationMessageClass = '.th-chat-notification';var chatNotificationHeaderMessageClass = '.th-chat-notification-header';var chatNotificationBodyMessageClass = '.th-chat-notification-body';module.exports = ChatNotification;function ChatNotification(config) {    config = config || {};    if (!(this instanceof ChatNotification)) return new ChatNotification(config);    this.notificationMessageComponent = document.querySelector(chatNotificationMessageClass);    this.notificationMessageHeaderComponent = document.querySelector(chatNotificationHeaderMessageClass);    this.notificationMessageBodyComponent = document.querySelector(chatNotificationBodyMessageClass);}ChatNotification.tmpl = function (config) {    return tmpl(config);};ChatNotification.prototype.showError = function (errorHeader, errorMessage) {    this.showNotification(errorHeader, errorMessage, errorClass);}ChatNotification.prototype.showWarning = function (warningHeader, warningMessage) {    this.showNotification(warningHeader, warningMessage, warningClass);}ChatNotification.prototype.showNotification = function (header, message, withClass) {    this.notificationMessageHeaderComponent.innerHTML = header;    this.notificationMessageBodyComponent.innerHTML = message;    dom.addClass(this.notificationMessageComponent, activeClass);    if (withClass === warningClass) {        dom.addClass(this.notificationMessageComponent, warningClass);        dom.removeClass(this.notificationMessageComponent, errorClass);    } else {        dom.addClass(this.notificationMessageComponent, errorClass);        dom.removeClass(this.notificationMessageComponent, warningClass);    }}ChatNotification.prototype.hideNotification = function () {    dom.removeClass(this.notificationMessageComponent, activeClass);    dom.removeClass(this.notificationMessageComponent, warningClass);    dom.removeClass(this.notificationMessageComponent, errorClass);    this.notificationMessageHeaderComponent.innerHTML = "";    this.notificationMessageBodyComponent.innerHTML = "";}},{"./th-chat-notification-tmpl.js":100,"ja-dom":81}],102:[function(require,module,exports){function dummy() {};module.exports = {    chatDialog: {        showIsTyping: dummy,        clearMessages: dummy,        stopTypingAnimation: dummy,        startTypingAnimationWithMaxDuration: dummy,        postCustomerMessage: dummy,        postExpertMessage: dummy,        on: dummy    },    questionBox: {        enable: dummy,        disable: dummy,        addFocus: dummy,        on: dummy    },    render: dummy,    on: dummy};},{}],103:[function(require,module,exports){'use strict';var event = require('ja-event');var utils = require('ja-utils');var enumy = require('enumy');var defaultChatWindow = require('./lib/chat-window-mock.js');function ChatViewBase() {    if (!(this instanceof ChatViewBase)) return new ChatViewBase();    this.chatWindow = defaultChatWindow;}module.exports = ChatViewBase;utils.mixin(ChatViewBase, event);ChatViewBase.prototype.setupEvents = function () {    this.propagate(this.chatWindow, { minimize: 'pause', hide: 'pause', expand: 'resume', show: 'resume' });    this.propagate(this.chatWindow.questionBox, { chat_qbox_key_down: 'customer-typing', submit: 'customer-replied', 'chat-text-area-clicked': 'text-area-clicked' });    this.propagate(this.chatWindow.chatDialog, { show_is_typing: 'assistant-finished-typing' });    if (this.chatWindow.cta) {        this.propagate(this.chatWindow.cta, { cta_button_clicked: 'cta-button-clicked' });    }    if (this.teaser) {                this.propagate(this.teaser, enumy([            'teaser-was-clicked',            'teaser-is-shown',            'teaser-is-hidden',            'icon-is-shown',            'message-is-shown',            'message-is-changed',        ]));    }};ChatViewBase.prototype.startChat = function () { }ChatViewBase.prototype.continueChat = function () { }ChatViewBase.prototype.completeChat = function () {    this.chatWindow.questionBox.disable();}ChatViewBase.prototype.clearChat = function () {    this.chatWindow.chatDialog.clearMessages();}ChatViewBase.prototype.assistantStartTyping = function () {    this.chatWindow.chatDialog.stopTypingAnimation();    this.chatWindow.chatDialog.startTypingAnimationWithMaxDuration(this.config.animationTimeIntervals, this.config.animationMaxDuration);}ChatViewBase.prototype.assistantStopTyping = function () {    this.chatWindow.chatDialog.stopTypingAnimation();}ChatViewBase.prototype.postCustomersMessage = function (text) {    this.chatWindow.chatDialog.postCustomerMessage(text, { clientName: this.config.clientName });    this.chatWindow.questionBox.addFocus();}ChatViewBase.prototype.postAssistantsMessage = function (text, config) {    this.chatWindow.chatDialog.stopTypingAnimation();    this.chatWindow.chatDialog.postExpertMessage(text, config);    this.chatWindow.questionBox.enable({ noFocus: this.config.noFocusOnStart && config.isFirstMessage });}ChatViewBase.prototype.enableInput = function () {    this.chatWindow.questionBox.enable();}ChatViewBase.prototype.disableInput = function () {    this.chatWindow.questionBox.disable();}ChatViewBase.prototype.isInputEmpty = function () {    return this.chatWindow.questionBox.isEmpty();}ChatViewBase.prototype.showCta = function () {    this.chatWindow.cta.show();    this.chatWindow.questionBox.hide();}ChatViewBase.prototype.showError = function(header, message) {    this.chatWindow.showError(header, message);}ChatViewBase.prototype.showWarning = function(header, message) {    this.chatWindow.showWarning(header, message);}ChatViewBase.prototype.hideNotification = function() {    if (this.chatWindow) this.chatWindow.hideNotification();}ChatViewBase.prototype.propagate = function (obj, events) {    var self = this;    Object.keys(events).forEach(function (event) {        obj.on(event, function (arg) {            self.trigger(events[event], arg);        });    });}},{"./lib/chat-window-mock.js":102,"enumy":48,"ja-event":83,"ja-utils":85}],104:[function(require,module,exports){'use strict';module.exports = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var className = config.className || 'th-how-it-works';    var title = config.title || '';    var steps = config.steps || [];    function renderSteps() {        return steps.map(function(step) {            return (                html('div', {className: "step"}, [                    html('img', {                        src: step.iconUrl,                        className: "step-image",                        alt: "step-image"}                    ),                    html('div', {className: "step-text"}, [                        html('span', null, [step.title]),                        step.description                    ])                ])            );        });    }    return (        html('div', {className: className}, [            title ? html('h3', null, [title]) : null,            renderSteps()        ])    );};},{"ja-dom-element":80}],105:[function(require,module,exports){'use strict';var isString = require('is-string');var isNumber = require('is-number-object');var isBoolean = require('is-boolean-object');var isSymbol = require('is-symbol');var isBigInt = require('is-bigint');// eslint-disable-next-line consistent-returnmodule.exports = function whichBoxedPrimitive(value) {	// eslint-disable-next-line eqeqeq	if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {		return null;	}	if (isString(value)) {		return 'String';	}	if (isNumber(value)) {		return 'Number';	}	if (isBoolean(value)) {		return 'Boolean';	}	if (isSymbol(value)) {		return 'Symbol';	}	if (isBigInt(value)) {		return 'BigInt';	}};},{"is-bigint":62,"is-boolean-object":63,"is-number-object":71,"is-string":74,"is-symbol":75}],106:[function(require,module,exports){'use strict';var isMap = require('is-map');var isSet = require('is-set');var isWeakMap = require('is-weakmap');var isWeakSet = require('is-weakset');module.exports = function whichCollection(value) {	if (value && typeof value === 'object') {		if (isMap(value)) {			return 'Map';		}		if (isSet(value)) {			return 'Set';		}		if (isWeakMap(value)) {			return 'WeakMap';		}		if (isWeakSet(value)) {			return 'WeakSet';		}	}	return false;};},{"is-map":70,"is-set":73,"is-weakmap":76,"is-weakset":77}],107:[function(require,module,exports){"use strict";var window = require("global/window")var isFunction = require("is-function")var parseHeaders = require("parse-headers")var xtend = require("xtend")module.exports = createXHR// Allow use of default import syntax in TypeScriptmodule.exports.default = createXHR;createXHR.XMLHttpRequest = window.XMLHttpRequest || noopcreateXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequestforEachArray(["get", "put", "post", "patch", "head", "delete"], function(method) {    createXHR[method === "delete" ? "del" : method] = function(uri, options, callback) {        options = initParams(uri, options, callback)        options.method = method.toUpperCase()        return _createXHR(options)    }})function forEachArray(array, iterator) {    for (var i = 0; i < array.length; i++) {        iterator(array[i])    }}function isEmpty(obj){    for(var i in obj){        if(obj.hasOwnProperty(i)) return false    }    return true}function initParams(uri, options, callback) {    var params = uri    if (isFunction(options)) {        callback = options        if (typeof uri === "string") {            params = {uri:uri}        }    } else {        params = xtend(options, {uri: uri})    }    params.callback = callback    return params}function createXHR(uri, options, callback) {    options = initParams(uri, options, callback)    return _createXHR(options)}function _createXHR(options) {    if(typeof options.callback === "undefined"){        throw new Error("callback argument missing")    }    var called = false    var callback = function cbOnce(err, response, body){        if(!called){            called = true            options.callback(err, response, body)        }    }    function readystatechange() {        if (xhr.readyState === 4) {            setTimeout(loadFunc, 0)        }    }    function getBody() {        // Chrome with requestType=blob throws errors arround when even testing access to responseText        var body = undefined        if (xhr.response) {            body = xhr.response        } else {            body = xhr.responseText || getXml(xhr)        }        if (isJson) {            try {                body = JSON.parse(body)            } catch (e) {}        }        return body    }    function errorFunc(evt) {        clearTimeout(timeoutTimer)        if(!(evt instanceof Error)){            evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") )        }        evt.statusCode = 0        return callback(evt, failureResponse)    }    // will load the data & process the response in a special response object    function loadFunc() {        if (aborted) return        var status        clearTimeout(timeoutTimer)        if(options.useXDR && xhr.status===undefined) {            //IE8 CORS GET successful response doesn't have a status field, but body is fine            status = 200        } else {            status = (xhr.status === 1223 ? 204 : xhr.status)        }        var response = failureResponse        var err = null        if (status !== 0){            response = {                body: getBody(),                statusCode: status,                method: method,                headers: {},                url: uri,                rawRequest: xhr            }            if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE                response.headers = parseHeaders(xhr.getAllResponseHeaders())            }        } else {            err = new Error("Internal XMLHttpRequest Error")        }        return callback(err, response, response.body)    }    var xhr = options.xhr || null    if (!xhr) {        if (options.cors || options.useXDR) {            xhr = new createXHR.XDomainRequest()        }else{            xhr = new createXHR.XMLHttpRequest()        }    }    var key    var aborted    var uri = xhr.url = options.uri || options.url    var method = xhr.method = options.method || "GET"    var body = options.body || options.data    var headers = xhr.headers = options.headers || {}    var sync = !!options.sync    var isJson = false    var timeoutTimer    var failureResponse = {        body: undefined,        headers: {},        statusCode: 0,        method: method,        url: uri,        rawRequest: xhr    }    if ("json" in options && options.json !== false) {        isJson = true        headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user        if (method !== "GET" && method !== "HEAD") {            headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user            body = JSON.stringify(options.json === true ? body : options.json)        }    }    xhr.onreadystatechange = readystatechange    xhr.onload = loadFunc    xhr.onerror = errorFunc    // IE9 must have onprogress be set to a unique function.    xhr.onprogress = function () {        // IE must die    }    xhr.onabort = function(){        aborted = true;    }    xhr.ontimeout = errorFunc    xhr.open(method, uri, !sync, options.username, options.password)    //has to be after open    if(!sync) {        xhr.withCredentials = !!options.withCredentials    }    // Cannot set timeout with sync request    // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly    // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent    if (!sync && options.timeout > 0 ) {        timeoutTimer = setTimeout(function(){            if (aborted) return            aborted = true//IE9 may still call readystatechange            xhr.abort("timeout")            var e = new Error("XMLHttpRequest timeout")            e.code = "ETIMEDOUT"            errorFunc(e)        }, options.timeout )    }    if (xhr.setRequestHeader) {        for(key in headers){            if(headers.hasOwnProperty(key)){                xhr.setRequestHeader(key, headers[key])            }        }    } else if (options.headers && !isEmpty(options.headers)) {        throw new Error("Headers cannot be set on an XDomainRequest object")    }    if ("responseType" in options) {        xhr.responseType = options.responseType    }    if ("beforeSend" in options &&        typeof options.beforeSend === "function"    ) {        options.beforeSend(xhr)    }    // Microsoft Edge browser sends "undefined" when send is called with undefined value.    // XMLHttpRequest spec says to pass null as body to indicate no body    // See https://github.com/naugtur/xhr/issues/100.    xhr.send(body || null)    return xhr}function getXml(xhr) {    // xhr.responseXML will throw Exception "InvalidStateError" or "DOMException"    // See https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseXML.    try {        if (xhr.responseType === "document") {            return xhr.responseXML        }        var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === "parsererror"        if (xhr.responseType === "" && !firefoxBugTakenEffect) {            return xhr.responseXML        }    } catch (e) {}    return null}function noop() {}},{"global/window":56,"is-function":68,"parse-headers":96,"xtend":108}],108:[function(require,module,exports){module.exports = extendvar hasOwnProperty = Object.prototype.hasOwnProperty;function extend() {    var target = {}    for (var i = 0; i < arguments.length; i++) {        var source = arguments[i]        for (var key in source) {            if (hasOwnProperty.call(source, key)) {                target[key] = source[key]            }        }    }    return target}},{}],"ja-gadget-virtual-assistant-hybrid":[function(require,module,exports){var tracking = require('ja-chat-affiliates-tracking');var VAChatController = require('th-va-chat-controller');var ChatView = require('th-chat-view-hybrid');var VirtualAssistantManager = require('ja-gadget-virtual-assistant-manager');function Gadget(target, config) {    this.config = config || {};    if (!config.rParameter.match(/^(ppc)/)) {        config.rParameter  = config.rParameter + '|va-expanded';     }    this.target = target && target.nodeType ? target : document.querySelector(target);    var size = config.size || '';    this.chatView = new ChatView(this.target);    var chat = new VAChatController(this.target, this.chatView, this.config);    tracking.track(chat, this.config, this.target);    var modalClassName = config.modalClassName || 'modal bottom right';    modalClassName += size ? ' size-' + size : '';    config.modalClassName = modalClassName;    var manager = new VirtualAssistantManager(this.target, '.dqt-chat');    manager.initialize();    return chat;}module.exports = Gadget;},{"ja-chat-affiliates-tracking":2,"ja-gadget-virtual-assistant-manager":15,"th-chat-view-hybrid":35,"th-va-chat-controller":42}]},{},["ja-gadget-virtual-assistant-hybrid"]);/*ja-gadget-virtual-assistant-config@1.20.0*/ 
;require=function e(t,a,n){function s(o,r){if(!a[o]){if(!t[o]){var c="function"==typeof require&&require;if(!r&&c)return c(o,!0);if(i)return i(o,!0);var l=new Error("Cannot find module '"+o+"'");throw l.code="MODULE_NOT_FOUND",l}var p=a[o]={exports:{}};t[o][0].call(p.exports,function(e){var a=t[o][1][e];return s(a||e)},p,p.exports,e,t,a,n)}return a[o].exports}for(var i="function"==typeof require&&require,o=0;o<n.length;o++)s(n[o]);return s}({1:[function(e,t,a){t.exports={settings:{US:{default:{endpoint:"https://va.justanswer.com/chat",partner:"US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",placeholderV2:"Describe your issue...",clientName:"You",sendButtonText:"Send",sendButtonTextForStartedChat:"Send",startChatText:"Start chat",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},messageMinLength:1,popup:{sendButtonText:"Start chat"}},rememberMinimized:{endpoint:"https://va.justanswer.com/chat",partner:"US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",startChatText:"Start chat",sendButtonTextForStartedChat:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}},disableAutoRedirectToCreditCardPage:{endpoint:"https://va.justanswer.com/chat",partner:"US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",startChatText:"Start chat",sendButtonTextForStartedChat:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},popup:{sendButtonText:"Start chat"},showCta:!0},disableAutoRedirectToCreditCardPageAndRememberMinimized:{endpoint:"https://va.justanswer.com/chat",partner:"US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",startChatText:"Start chat",sendButtonTextForStartedChat:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},showCta:!0},showTeaserIn15Seconds:{endpoint:"https://va.justanswer.com/chat",partner:"US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",startChatText:"Start chat",sendButtonTextForStartedChat:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:15e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}}},UK:{default:{endpoint:"https://va.justanswer.com/chat",partner:"UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.co.uk",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}},rememberMinimized:{endpoint:"https://va.justanswer.com/chat",partner:"UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}},disableAutoRedirectToCreditCardPage:{endpoint:"https://va.justanswer.com/chat",partner:"UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},showCta:!0},disableAutoRedirectToCreditCardPageAndRememberMinimized:{endpoint:"https://va.justanswer.com/chat",partner:"UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},showCta:!0},showTeaserIn15Seconds:{endpoint:"https://va.justanswer.com/chat",partner:"UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:15e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}}}},profiles:{US:{antiques:{forumId:976,initialCategoryId:"1172a83ad4a5494db1b4b82ca6d5b842",headingText:"Ask an Appraiser Now",doubleHeadingText:["Chat with an appraiser","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Appraiser's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Appraisers are online now",expertProfile:{headingText:"Chat with a appraiser now",id:"9fd3336972994265be78e72059a6c2f4",expertAvatarUrl:"https://www.justanswer.com/uploads/BL/blueflowers1063/2013-10-10_35834_KimHolidays1.64x64.jpg",expertName:"Kim D.",expertTitle:"Antiques Appraiser",satisfiedCustomers:"5090",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Appraisers request a deposit of about $38 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Appraiser online now? I can connect you ...",marketingMessageText:"Connect with an appraiser",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Appraiser's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Appraiser's Assistant."},legal:{forumId:7,initialCategoryId:"1ebeaa5271ce4cd48cbb0899bf229eca",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/legal",expertProfile:{headingText:"Chat with a lawyer now",id:"41f2d818e6ca412fb775d1e41984778b",expertAvatarUrl:"https://ww2-secure.justanswer.com/static/JA24424/images/legal_expert.jpg",expertName:"Dimitry K., Esq.",expertTitle:"Attorney",satisfiedCustomers:"17183",experience:"",popup:{experience:"Multiple jurisdictions, specialize in business/contract disputes, estate creation and administration."},showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"employment-law":{forumId:39,initialCategoryId:"6890ce0f77404179a3346abf5b8f5bc6",headingText:"Ask a Lawyer Now",doubleHeadingText:["Chat with a lawyer","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"e82959a435564172b4986cdf69ee58c4",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/PA/PaulmoJD/2013-10-10_195858_JAImage.64x64.jpg",expertName:"Law Educator, Esq.",expertTitle:"Attorney",satisfiedCustomers:"14581",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Employment Lawyers request a deposit of about $38 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant."},"immigration-law":{forumId:38,initialCategoryId:"a0032e858c1c4688925a0ec316d9694c",headingText:"Ask a Lawyer Now",doubleHeadingText:["Chat with a lawyer","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"539f2ade3bc341948766662cc67f1c8e",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RA/ratioscripta/2012-6-13_2955_foto3.64x64.jpg",expertName:"Ely",expertTitle:"Counselor at Law",satisfiedCustomers:"3625",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Immigration Lawyers request a deposit of about $38 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"real-estate-law":{forumId:52,initialCategoryId:"cefca8f2d3724901a6961661f860fa14",headingText:"Ask a Lawyer Now",doubleHeadingText:["Chat with a lawyer","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"8139d8d824f141b6906addc3b2df177b",expertAvatarUrl:"https://www.justanswer.com/uploads/IN/insearchoftheanswer/2013-8-16_0233_attorney.64x64.jpg",expertName:"Richard",expertTitle:"Real Estate Professional",satisfiedCustomers:"",experience:"32 years of legal experience, including real estate law",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Real Estate Lawyers request a deposit of about $38 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"traffic-law":{forumId:956,initialCategoryId:"7e48d33a6c654665a3f982329ee2673e",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Traffic Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"539f2ade3bc341948766662cc67f1c8e",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RA/ratioscripta/2012-6-13_2955_foto3.64x64.jpg",expertName:"Ely",expertTitle:"Attorney",experience:"Private practice",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Traffic Lawyers request a deposit of about $28 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"family-law":{forumId:37,initialCategoryId:"9d66542212de480abec27066bfaf3f1e",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"d305064653de4309b2ff5aec50a909e0",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/lawninvest/2008-05-26_115339_wethepeople.jpg",expertName:"Attorney & Mediator",expertTitle:"Lawyer",satisfiedCustomers:"7520"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"estate-law":{forumId:73,initialCategoryId:"26ca7f607ea0405d992837facc55ed9a",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"0f4c9ac75de24589a69fac362d9e8ceb",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/MC/mclemorelawyer/2011-9-21_193631_IMGP8718Version2.64x64.jpg",expertName:"Thomas McJD",expertTitle:"Estate Lawyer",experience:"Wills, Trusts, Probate & other Estate Matters",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"personal-injury-law":{forumId:57,initialCategoryId:"4be0484881294278ab0b312d2f5ae104",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"0a9ba3fce13e40459ca26e5731aac8e7",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/NY/nyclawyer/2012-6-7_22011_photo66139201112041.64x64.jpg",expertName:"Infolawyer",expertTitle:"Personal Injury Lawyer",experience:"Licensed attorney helping individuals and businesses.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"uk-law":{forumId:87,initialCategoryId:"cdde8daefe8b4d0f8d0d81697ebf2e48",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",assistantTitle:"Solicitor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Solicitors are online now",expertProfile:{headingText:"Chat with a solicitor now",id:"89da6df09d8d4f318bb2e8781ef066fb",expertAvatarUrl:"https://secure.justanswer.com/uploads/BE/benjones/2015-12-1_0437_ennew.64x64.jpg",expertName:"Ben Jones",expertTitle:"Solicitor",satisfiedCustomers:"9072",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Solicitors request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"criminal-law":{forumId:40,initialCategoryId:"972f21ffd40448c1aff213a41ebe1749",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"539f2ade3bc341948766662cc67f1c8e",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RA/ratioscripta/2012-6-13_2955_foto3.64x64.jpg",expertName:"Ely",expertTitle:"Criminal Lawyer",experience:"Private practice with focus on family, criminal, PI, consumer protection, and business consultation.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"bankruptcy-law":{forumId:83,initialCategoryId:"544ba40df74c4004b2635dcad58c7505",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"eed64a5a2aae4447857534c80d26ec7b",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/TL/tleeders/2012-6-13_204815_TSL1.64x64.jpg",expertName:"Terry L.",expertTitle:"Bankruptcy Lawyer",satisfiedCustomers:"2587"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"spanish-law":{forumId:1141,initialCategoryId:"1e812a699d154791bb5052962e273164",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"70dc3731ccda4948a255d9d35ee21381",expertAvatarUrl:"https://www.justanswer.com/uploads/JO/JoseMagadan/2013-6-27_16279_IMG6290copia.64x64.JPG",expertName:"Jose M.",expertTitle:"Spanish Law Attorney",experience:"Over 5 years of legal experience, including Spanish law.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"business-law":{forumId:1141,initialCategoryId:"39820f77e4384932a5c9ff90d14e0b37",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"0a9ba3fce13e40459ca26e5731aac8e7",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/NY/nyclawyer/2018-12-7_34450_.64x64.jpg",expertName:"Infolawyer",expertTitle:"Attorney",satisfiedCustomers:"2063"},greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"2063"}},vet:{forumId:103,initialCategoryId:"e48b2d65407e46f0a41cb2181a65a3b9",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",sipLandingPage:"https://www.justanswer.com/sip/vet",expertProfile:{headingText:"Chat with a veterinarian now",id:"0f293c593a8b4c549e05b5ba45840500",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/VE/vetforyou/2012-6-20_33122_PearlPhoto.64x64.jpg",expertName:"Dr. Andy",expertTitle:"Veterinarian",satisfiedCustomers:"",experience:"UC Davis graduate, Interests: Dermatology, Internal Medicine, Pain Management",showMoreLink:!0,popup:{satisfiedCustomers:"24026"}},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Veterinarians request a deposit of about $20 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant.",popup:{title:"Chat with a veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png"}},"dog-vet":{forumId:104,initialCategoryId:"f3bf7d0324cc4d48b62c391fe9e9cc48",headingText:"Ask a Dog Vet Now",assistantName:"Pearl Wilson",assistantTitle:"Dog Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Dog Veterinarians are online now",expertProfile:{headingText:"Chat with a dog vet now",id:"2c9d1d72cdc4408cbf6fe79388c31028",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RY/rydergar/2012-6-6_192240_IMG0328.64x64.JPG",expertName:"Dr. Gary",expertTitle:"Dog Veterinarian",satisfiedCustomers:"2893",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Dog Veterinarians request a deposit of about $19 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Dog Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a dog veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Dog Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Dog Veterinarian's Assistant.",popup:{title:"Chat with a dog veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png"}},"cat-vet":{forumId:105,initialCategoryId:"8c342ae4694d4634ab7d82f8c00ea532",headingText:"Ask a Cat Vet Now",assistantName:"Pearl Wilson",assistantTitle:"Cat Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Cat Veterinarians are online now",expertProfile:{headingText:"Chat with a cat vet now",id:"2c9d1d72cdc4408cbf6fe79388c31028",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RY/rydergar/2012-6-6_192240_IMG0328.64x64.JPG",expertName:"Dr. Gary",expertTitle:"Cat Veterinarian",satisfiedCustomers:"3742",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Cat Veterinarians request a deposit of about $22 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Cat Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a cat veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Cat Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Cat Veterinarian's Assistant.",popup:{title:"Chat with a cat veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png"}},"horse-health":{forumId:75,initialCategoryId:"6f5c1a45c084404dba454ed64c14f67c",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",sipLandingPage:"https://www.justanswer.com/sip/vet",expertProfile:{headingText:"Chat with a horse veterinarian now",id:"d70f6d76599640a5a10a811fe824c9b9",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/MU/Munchiemeadows74337/2013-10-14_18494_2013101413371411.64x64.jpg",expertName:"Dr. Linda",expertTitle:"Horse Veterinarian",satisfiedCustomers:"1205",experience:"",popup:{title:"Chat with a horse veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png",satisfiedCustomers:"1205"}},greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant.",popup:{title:"Chat with a veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png"}},"dog-training":{forumId:10340,initialCategoryId:"6e9e233343c34b98bd331ffbb81c6782",headingText:"Ask a Dog Trainer Now",assistantName:"Pearl Wilson",assistantTitle:"Dog Trainer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Dog Trainers are online now",expertProfile:{headingText:"Chat with a dog trainer now",id:"1256d562720c450a99b2566f41e8fb47",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/DA/DakotaSouthFive/2013-5-9_1460_1052240tdipearl25x5.64x64.jpg",expertName:"Sally G.",expertTitle:"Animal Behaviorist",satisfiedCustomers:"10,320",experience:""},greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a dog trainer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant.",popup:{title:"Chat with a veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png",satisfiedCustomers:"10,320"}},medical:{forumId:107,initialCategoryId:"8568c4cab98247c689d90982b6d84700",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",sipLandingPage:"https://www.justanswer.com/sip/medical",expertProfile:{headingText:"Chat with a doctor now",id:"a5492ee9eff34ba3a9bc43984d5358b1",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/DO/Doctor7860/2013-4-2_3633_Picture.JA280x1873.64x64.jpg",expertName:"Dr. Amir",expertTitle:"Doctor",experience:"Master of Internal medicine & Gastroenterology with six years of experience (London). MBBS",popup:{satisfiedCustomers:"8780"},showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Doctors request a deposit of about $34 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},medical2:{forumId:107,initialCategoryId:"8568c4cab98247c689d90982b6d84700",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",sipLandingPage:"https://www.justanswer.com/sip/medical",expertProfile:{headingText:"Chat with a doctor now",id:"e8cae442eaca4446a6000921c2bcc450",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/JA/jacustomerkiua/2018-7-18_4567_hoto.64x64.jpg",expertName:"Dr. Greg",expertTitle:"Board Certified MD",satisfiedCustomers:"1775"},greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"1775"}},dermatology:{forumId:117,initialCategoryId:"923a90e8c1b24b5d80d8189b620e10b2",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Dermatologist's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"387ae290d7174875b15697be2a82a71e",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/dermdoc19/2010-09-30_160749_Photo_122807_015.JPG",expertName:"dermdoc19",expertTitle:"Dermatologist",satisfiedCustomers:"",experience:"30 years practice in general and cosmetic dermatology",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Dermatologists request a deposit of about $34 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Dermatologist's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Dermatologist's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},health:{forumId:5,initialCategoryId:"e0df024bb18849f3b0a44ffbd8b6b0f7",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"ab7d782e6b3e470fb3f1728e133a4523",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/FA/FamilyPhysician/2013-8-31_191624_JA550x500Photo.64x64.jpg",expertName:"Family Physician",expertTitle:"Doctor (MD)",satisfiedCustomers:"",experience:"Emergency Medicine and Family Practice for over 26 years",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Health Professionals request a deposit of about $26 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},"mental-health":{forumId:93,initialCategoryId:"d870f9d2ecfe46b486cf0c85ecbe2431",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"5ce05cb4e027458aa3292021f44afae5",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/DR/Dr.Keane/2013-8-20_204325_drkeane.64x64.jpg",expertName:"Dr. Keane",expertTitle:"Therapist",satisfiedCustomers:"",experience:"Clinical Psychology PhD, Licensed Professional Counselor experienced in family psychology",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Mental Health Professionals request a deposit of about $26 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},"drug-testing":{forumId:93,initialCategoryId:"b950af9d37434ac38a0d04fd6f7f2a11",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"ab7d782e6b3e470fb3f1728e133a4523",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/FA/FamilyPhysician/2013-8-31_191624_JA550x500Photo.64x64.jpg",expertName:"Family Physician",expertTitle:"Board Certified MRO",experience:"",satisfiedCustomers:"2039"},greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"2039"}},car:{forumId:11,initialCategoryId:"c7847fa20e874eaab6b9c8391d2466e7",headingText:"Ask a Mechanic Now",doubleHeadingText:["Chat with a mechanic","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"a050340b455c4e97ac5230e54ac01b07",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.64x64.png",expertName:"Chris (aka- Moose)",expertTitle:"Technician",satisfiedCustomers:"",experience:"16 years experience",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Auto Mechanics request a deposit of about $24 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"home-improvement":{forumId:10,initialCategoryId:"262bc86475a74a25b66e370a5a86d06b",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Contractor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Contractors are online now",expertProfile:{headingText:"Chat with a contractor now",id:"442ef7ce30df45b4870881b0ab85e75f",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/BS/bshull17/2011-2-11_04125_japic.64x64.JPG",expertName:"Brian",expertTitle:"Contractor",satisfiedCustomers:"",experience:"Licensed Architect- 17 years, L.E.E.D. AP",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Home Improvement Experts request a deposit of about $28 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Contractor online now? I can connect you ...",marketingMessageText:"Connect with a contractor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Contractor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Contractor's Assistant."},appliance:{forumId:51,initialCategoryId:"d15d543ea7d6408b87f326ad2be52309",headingText:"Ask an Appliance Tech",assistantName:"Pearl Wilson",assistantTitle:"Appliance Tech's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Appliance Techs are online now",expertProfile:{headingText:"Chat with a appliance tech now",id:"3114fac0d37244f4b0c4d38d1a9e68cc",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/BR/bryanpaul52/2014-3-22_17133_APPLIANCELOGOS500.64x64.jpg",expertName:"Bryan",expertTitle:"Home Appliance Technician",satisfiedCustomers:"",experience:"15 yrs. experience as a certified appliance technician.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Appliance Technicians request a deposit of about $28 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Appliance Tech online now? I can connect you ...",marketingMessageText:"Connect with an appliance tech",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Appliance Tech's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Appliance Tech's Assistant."},computer:{forumId:6,initialCategoryId:"dadf77a8245b490ca3faa5bad774bf5f",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Tech Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"868803e7bb55417baebbe222c242a0ba",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/EN/Engineer1010/2012-6-9_132423_jaj12a.64x64.jpg",expertName:"Andy",expertTitle:"Computer Consultant",satisfiedCustomers:"",experience:"11yr exp, Comp Engg, Internet expert, Web developer, SEO",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Tech Support Specialists request a deposit of about $36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with a tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert's Assistant."},printers:{forumId:125,initialCategoryId:"bb3cc9faa2d14499a9325c5138018831",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Tech Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"868803e7bb55417baebbe222c242a0ba",expertAvatarUrl:"https://www.justanswer.com/uploads/EN/Engineer1010/2012-6-9_132423_jaj12a.64x64.jpg",expertName:"Andy",expertTitle:"Elec & Comp pro",satisfiedCustomers:"6858",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Tech Support Specialists request a deposit of about $36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with a tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert's Assistant."},"math-homework":{forumId:8338,initialCategoryId:"b113195997494a58a84064b1d558063c",headingText:"Ask a Math Tutor Now",assistantName:"Pearl Wilson",assistantTitle:"Math Tutor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Math Tutors are online now",expertProfile:{headingText:"Chat with a math tutor now",id:"c0ace0e2a9a84206a559320bc35896b2",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/ED/educatortech/2012-6-7_1256_williams4.64x64.jpg",expertName:"Mr. Gregory White",expertTitle:"Master's Degree",satisfiedCustomers:"",experience:"M.A., M.S. Education / Educational Administration",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Math Tutors request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Math Tutor online now? I can connect you ...",marketingMessageText:"Connect with a math tutor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Math Tutor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Math Tutor's Assistant."},finance:{forumId:14,initialCategoryId:"c697c4ed9b9d475ca00da432b6b4bb90",headingText:"Ask a Financial Expert",assistantName:"Pearl Wilson",assistantTitle:"Financial Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Financial Experts are online now",expertProfile:{headingText:"Chat with a financial expert now",id:"2bffd3ea39f040f9883361fb71752d31",expertAvatarUrl:"https://secure.justanswer.com/uploads/RA/rakhi.v/2012-7-3_14374_RakhiVasavadaL.64x64.jpeg",expertName:"Rakhi Vasavada",expertTitle:"Financial Expert",satisfiedCustomers:"",experience:"Law degree with emphasis on finance; over 12 years in financial sector",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Financial Professionals request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Financial Expert online now? I can connect you ...",marketingMessageText:"Connect with a financial professional",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Financial Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Financial Expert's Assistant."},relationship:{forumId:8,initialCategoryId:"de5a0b934ba445a692ef484573ba0835",headingText:"Ask a Counselor Now",assistantName:"Pearl Wilson",assistantTitle:"Counselor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Counselors are online now",expertProfile:{headingText:"Chat with a counselor now",id:"1f38ee1d17ad4387a3187b28b8faf0fa",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/formybunch/2010-12-06_191055_img_0975.jpg",expertName:"Kate McCoy",expertTitle:"Counselor",satisfiedCustomers:"1664"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Counselors request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Counselor online now? I can connect you ...",marketingMessageText:"Connect with a counselor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Counselor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Counselor's Assistant."},"cell-phones":{forumId:218,initialCategoryId:"0284e93caef348f88da4ddd5b6cabdff",headingText:"Ask a Phone Tech Now",doubleHeadingText:["Chat with a phone tech","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Phone Tech's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Phone Techs are online now",expertProfile:{headingText:"Chat with a phone tech now",id:"c22f8c4c4fec4840bba7f8bddcedb525",expertAvatarUrl:"https://www.justanswer.com/uploads/RI/RichieMe/2013-10-21_9435_1891752088969658025993880564n.64x64.jpg",expertName:"Richard",expertTitle:"Phone Tech",satisfiedCustomers:"3685"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Cell Phone Technicians request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Phone Tech online now? I can connect you ...",marketingMessageText:"Connect with a phone tech",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Phone Tech's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Phone Tech's Assistant."},"home-improvement-electrical":{forumId:64,initialCategoryId:"245821ba20514680a7c226b700f6304b",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Home Improvement Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Contractors are online now",expertProfile:{headingText:"Chat with a contractor now",id:"364f81cf6aac4a8eaf42db29154809d1",expertAvatarUrl:"https://www.justanswer.com/uploads/UR/urelectrician/2012-9-28_223652_JustAnswerPic.64x64.jpg",expertName:"Kevin",expertTitle:"Licensed Electrical Contractor",satisfiedCustomers:"3,862"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Electricians request a deposit of about 16$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Home Improvement Expert online now? I can connect you ...",marketingMessageText:"Connect with a home improvement expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Home Improvement Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Home Improvement Expert's Assistant."},"pet-reptile":{forumId:66,initialCategoryId:"ce81be08afcd413392d7caaa82c77856",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",expertProfile:{headingText:"Chat with a veterinarian now",id:"25d807a8aec54c2ebd1398e99c67055c",expertAvatarUrl:"https://www.justanswer.com/uploads/MS/MsAM/2012-6-9_16426_anna.64x64.jpeg",expertName:"Anna",expertTitle:"Reptile Expert",satisfiedCustomers:"10,034"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Reptile Experts request a deposit of about 18$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant."},"pet-bird":{forumId:65,initialCategoryId:"ea8a7cd722644051b9c2389abac5f19d",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",expertProfile:{headingText:"Chat with a veterinarian now",id:"e3845dafd03e4341b020a7dc07c0ff40",expertAvatarUrl:"https://www.justanswer.com/uploads/HE/hearetaker/2016-4-5_5519_ug.64x64.jpg",expertName:"August",expertTitle:"Certified Avian Specialist",satisfiedCustomers:"6,053"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Bird Specialists request a deposit of about 36$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant."},"home-improvement-plumbing":{forumId:77,initialCategoryId:"8eb91318df8e425db461d8cf024bf41e",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Home Improvement Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Contractors are online now",expertProfile:{headingText:"Chat with a contractor now",id:"ffce140c6c8b40ca96836c51de255834",expertAvatarUrl:"https://www.justanswer.com/uploads/VE/Veillplumb/2011-8-31_155028_IMG1104.64x64.JPG",expertName:"Marc",expertTitle:"Plumber",satisfiedCustomers:"1,590"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Plumbers request a deposit of about 32$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Home Improvement Expert online now? I can connect you ...",marketingMessageText:"Connect with a home improvement expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Home Improvement Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Home Improvement Expert's Assistant."},"medical-dental":{forumId:30,initialCategoryId:"8f393887064449e1aafdb74b45ed1dfc",headingText:"Ask a Dentist Now",assistantName:"Pearl Wilson",assistantTitle:"Dentist's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Dentists are online now",expertProfile:{headingText:"Chat with a dentist now",id:"92183398e46b45a287d5ec1133a393f7",expertAvatarUrl:"https://www.justanswer.com/uploads/HO/hoteego1/H.64x64.jpg",expertName:"Dr. Katz",expertTitle:"Dentist",satisfiedCustomers:"3,655"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Dentists request a deposit of about 22$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Dentist online now? I can connect you ...",marketingMessageText:"Connect with a dentist",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Dentist's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Dentist's Assistant."},"consumer-electronics-tv":{forumId:63,initialCategoryId:"c2ffcafbd939401d976106081cb8e945",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Electronics Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Technicians are online now",expertProfile:{headingText:"Chat with a technician now",id:"c22f8c4c4fec4840bba7f8bddcedb525",expertAvatarUrl:"https://www.justanswer.com/uploads/RI/RichieMe/2013-10-21_9435_1891752088969658025993880564n.64x64.jpg",expertName:"Richard",expertTitle:"TV Specialist",satisfiedCustomers:"4,742"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. TV Technicians request a deposit of about 28$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Electronics Technician online now? I can connect you ...",marketingMessageText:"Connect with a electronics technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Electronics Technician's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Electronics Technician's Assistant."},"home-improvement-hvac":{forumId:95,initialCategoryId:"2be9c961bc474e0db06d07fcd286e233",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Home Improvement Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Contractors are online now",expertProfile:{headingText:"Chat with a contractor now",id:"d5b33dbf2b5b4abd97de9ac9dd714797",expertAvatarUrl:"https://www.justanswer.com/uploads/AL/alumalite/2012-5-10_234018_shutterstock506249951forJA500.64x64.jpg",expertName:"Phil",expertTitle:"HVAC Contractor",satisfiedCustomers:"8,909"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. HVAC Technicians request a deposit of about 28$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Home Improvement Expert online now? I can connect you ...",marketingMessageText:"Connect with a home improvement expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Home Improvement Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Home Improvement Expert's Assistant."},homework:{forumId:13,initialCategoryId:"2ee797016d6f463ba877ba4d7faa0f5f",headingText:"Ask a Tutor Now",assistantName:"Pearl Wilson",assistantTitle:"Tutor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tutors are online now",expertProfile:{headingText:"Chat with a tutor now",id:"07a5005969e74225a51ca326dbfe9527",expertAvatarUrl:"https://www.justanswer.com/uploads/SP/spherrod/2012-6-6_174244_1000852.64x64.JPG",expertName:"Steve Harrod",expertTitle:"Engineer",satisfiedCustomers:"685"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Tutors request a deposit of about 60$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Tutor online now? I can connect you ...",marketingMessageText:"Connect with a tutor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tutor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tutor's Assistant."},firearms:{forumId:474,initialCategoryId:"a485f80c6ea14d22b9ab345fe7c20f82",headingText:"Ask a Consultant Now",assistantName:"Pearl Wilson",assistantTitle:"Consultant's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Consultants are online now",expertProfile:{headingText:"Chat with a consultant now",id:"25126a2185ce4a1899ffbcfd17518661",expertAvatarUrl:"https://www.justanswer.com/uploads/TR/Tritac1911/2014-1-23_21121_WP20140123011.64x64.jpg",expertName:"Jon",expertTitle:"Firearms Consultant",satisfiedCustomers:"978"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Firearms Experts request a deposit of about 34$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Consultant online now? I can connect you ...",marketingMessageText:"Connect with a consultant",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Consultant's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Consultant's Assistant."},"mechanics-rv":{forumId:34,initialCategoryId:"83248ed3ffbf40dab22eab8411fdbab5",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"285cc2e12e0b4494878a7ffe48faeddc",expertAvatarUrl:"https://www.justanswer.com/uploads/gmplus72/2008-12-9_2615_just_answer.jpg",expertName:"Robert",expertTitle:"RV Mechanic",satisfiedCustomers:"13,497"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. RV Mechanics request a deposit of about 29$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Auto Mechanic online now? I can connect you ...",marketingMessageText:"Connect with an auto mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"mechanics-boat":{forumId:56,initialCategoryId:"0aa858174dbc421eb784aad8230e3e38",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Marine Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"9d644b6e7fbe434a84efc704bab812f5",expertAvatarUrl:"https://www.justanswer.com/uploads/OL/oldnewenglandmarine/2012-9-8_15014_icon.64x64.jpg",expertName:"Jason",expertTitle:"Marine Mechanic",satisfiedCustomers:"16,331"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Marine Mechanics request a deposit of about 26$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Marine Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a marine mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Marine Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Marine Mechanic's Assistant."},"medical-eye":{forumId:116,initialCategoryId:"317e075594d544f297f7921b2a77f964",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"310f31ccc17c42559df7ad9784f02b83",expertAvatarUrl:"https://www.justanswer.com/uploads/WI/wieyedoc/2013-10-25_0457_new.64x64.jpg",expertName:"Dr. Rick",expertTitle:"Retina Specialist",satisfiedCustomers:"6,712"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Eye Doctors request a deposit of about 28$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant."},motorcycle:{forumId:11,initialCategoryId:"60f48c7c07374c83b4754401feb06d74",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"b03460704f3a48cbb165105f00ea33d8",expertAvatarUrl:"https://www.justanswer.com/uploads/PE/peterpete/2017-9-6_13441_.64x64.jpg",expertName:"Pete",expertTitle:"Technician",satisfiedCustomers:"26,418"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Motorcycle Mechanics request a deposit of about 24$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Auto Mechanic online now? I can connect you ...",marketingMessageText:"Connect with an auto mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"medium-heavy-truck":{forumId:11,initialCategoryId:"007c9a811e1d481c89f189f369cf724e",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"b03460704f3a48cbb165105f00ea33d8",expertAvatarUrl:"https://www.justanswer.com/uploads/PE/peterpete/2017-9-6_13441_.64x64.jpg",expertName:"Pete",expertTitle:"Technician",satisfiedCustomers:"26,418"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Technicians request a deposit of about 24$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Auto Mechanic online now? I can connect you ...",marketingMessageText:"Connect with an auto mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"home-improvement-landscaping":{forumId:null,initialCategoryId:"7aba0b8793654bba84bc53270b26fbe8",headingText:"Ask a Landscaper Now",assistantName:"Pearl Wilson",assistantTitle:"Landscaper's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Landscapers are online now",expertProfile:{id:"d454bd118d0e4c339c076ba951a47cab",expertAvatarUrl:"https://www.justanswer.com/uploads/QM/9qmpg2sg-/jacustomer-9qmpg2sg-_avatar.64x64.jpg",expertName:"Daniel Stover",expertTitle:"Landscaper",experience:"Golf Course Superintendent at Deering Bay Yacht and Country Club",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Landscapers request a deposit of about 48$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Home Improvement Expert online now? I can connect you ...",marketingMessageText:"Connect with a home improvement expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Home Improvement Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Home Improvement Expert's Assistant."},"medical-nutrition":{forumId:null,initialCategoryId:"d68f314183a544fea6ebd8942bca6956",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"26df5e2a9839415099e754296496123b",expertAvatarUrl:"https://www.justanswer.com/uploads/VA/VANP/2012-6-6_235535_Skye2.64x64.jpg",expertName:"A. Schuyler",expertTitle:"Nurse Practitioner",satisfiedCustomers:"16,360"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Health Professionals request a deposit of about 22$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant."},"job-career":{forumId:17,initialCategoryId:"f4b8017a3e184eedaf65cc5ac5271720",headingText:"Ask an Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Experts are online now",expertProfile:{headingText:"Chat with an expert now",id:"4634e32d52454fc281eb84d0346a4d22",expertAvatarUrl:"https://www.justanswer.com/uploads/ER/49erLBSU/2013-8-19_175446_michael.64x64.jpg",expertName:"Michael",expertTitle:"Employment Services",satisfiedCustomers:"3,373 "},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Career Counselors request a deposit of about 38$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},email:{forumId:7066,initialCategoryId:"f3503e45f39b41268e88fdda951d60e8",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Technicians are online now",expertProfile:{headingText:"Chat with a technician now",id:"eac35ac9b7494fb0a3e53ca14eefe56c",expertAvatarUrl:"https://www.justanswer.com/uploads/JE/jessmagz/2012-6-6_18129_jm.64x64.jpg",expertName:"Jess M.",expertTitle:"Bachelor's Degree",satisfiedCustomers:"2,278"},greeting:"Want to ask a Technician online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},appraisals:{forumId:5950,initialCategoryId:"7c53321238d84110ad4fe3ce325ef202",headingText:"Ask an Appraiser now",doubleHeadingText:["Chat with an appraiser","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Appraiser's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Appraisers are online now",expertProfile:{headingText:"Chat with an appraiser now",id:"28eb635e87d54ddb8bce6b0ae4211128",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RA/rarewares/2017-9-22_162132_o.64x64.jpg",expertName:"Rarewares",expertTitle:"Antiques and Collectibles Researcher",satisfiedCustomers:"11,895"},greeting:"Want to ask an Appraiser online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},apple:{forumId:84,initialCategoryId:"5f4b122e375c41aea2d88ac7c5ec699f",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Mac Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"c22f8c4c4fec4840bba7f8bddcedb525",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RI/RichieMe/2013-10-21_9435_1891752088969658025993880564n.64x64.jpg",expertName:"Richard",expertTitle:"Apple Software Engineer",satisfiedCustomers:"13,190"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"social-security":{forumId:3511,initialCategoryId:"01446bbfaff64568b35b083cbf74fd30",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Retirement Accountant's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"b88fdf9733024056abc0f64b88777eba",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/so/sojlaw/2013-8-22_1456_ResizedEDZII.64x64.jpg",expertName:"Stephanie O Joy",expertTitle:"Esq, Soc. Sec. Attorney",satisfiedCustomers:"3,257"},greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},electronics:{forumId:50,initialCategoryId:"5b32e024df944d7bb2181ae3431b4484",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a tech expert","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"ce5c54ec5cee4ffdae8b4de4d6bb8a0c",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/LO/LongTermTech/SMILE4LARGE500by500.64x64.GIF",expertName:"Russell H.",expertTitle:"Service Tech",satisfiedCustomers:"7,908"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"e-reader":{forumId:986,initialCategoryId:"e2ba626efcc44328808d8d2c076af8e3",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"E-Reader Specialist's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"5e55f616b35a4ccea924b529d1fdecd1",expertAvatarUrl:"https://www.justanswer.com/uploads/SI/simitpatel/2013-8-22_6857_simit.200x200.jpg",expertName:"Simit",expertTitle:"Engineer",satisfiedCustomers:"3,715"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"media-player":{forumId:985,initialCategoryId:"094f7ef4b9fd4ec48c1a9592ea5ce6d1",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Video Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"6a2ec8eb5ef24aeb888cc762f714993e",expertAvatarUrl:"https://www.justanswer.com/uploads/PL/pllinate/2017-4-23_64646_np.200x200.jpg",expertName:"Nathan",expertTitle:"Installer",satisfiedCustomers:"21,328"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"microsoft-office":{forumId:7067,initialCategoryId:"0b5d641beffa4173b9e7a2a5676a32ee",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Microsoft Office Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"eac35ac9b7494fb0a3e53ca14eefe56c",expertAvatarUrl:"https://www.justanswer.com/uploads/JE/jessmagz/2012-6-6_18129_jm.64x64.jpg",expertName:"Jess M.",expertTitle:"Computer Support Specialist",satisfiedCustomers:"801"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"farm-equipment":{forumId:8820,initialCategoryId:"17d96c7599ed45898fafce999ecbff49",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Heavy Equipment Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"0ebb9888cb284b818b459a0301ee9dd7",expertAvatarUrl:"https://www.justanswer.com/uploads/KO/koboma/2012-6-6_20917_DSCF1022.200x200.JPG",expertName:"Curtis B.",expertTitle:"service manager",satisfiedCustomers:"3,264"},greeting:"Want to ask a Mechanic online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},laptop:{forumId:7063,initialCategoryId:"9216a9eb8d0f44dfae49bb2bb934510b",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Laptop Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"6920f06244b0492ebb3e0f76588382fd",expertAvatarUrl:"https://www.justanswer.com/uploads/SH/Shefin/2012-6-6_17328_1.200x200.jpg",expertName:"Shefin",expertTitle:"Computer Support Specialist",satisfiedCustomers:"1,495"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},programming:{forumId:53,initialCategoryId:"dd088b8d9579427d81d3fe05adcf24e6",headingText:"Ask a Programmer Now",assistantName:"Pearl Wilson",assistantTitle:"Programmer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Programmers are online now",expertProfile:{headingText:"Chat with a programmer now",id:"e89a47681e0b4eba83eee8ed6ccec446",expertAvatarUrl:"https://www.justanswer.com/uploads/so/softwarepapa/2011-4-20_225131_ingo2.200x200.jpg",expertName:"Ingo U",expertTitle:"Software Engineer",satisfiedCustomers:"508"},greeting:"Want to ask a Programmer online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"android-devices":{forumId:6746,initialCategoryId:"d4f827790dc34ac5b44322f03dd1d969",headingText:"Ask an Android Expert",assistantName:"Pearl Wilson",assistantTitle:"Android Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Android Experts are online now",expertProfile:{headingText:"Chat with an android expert now",id:"d4a20012038e41d9a65005480a5acc74",expertAvatarUrl:"https://www.justanswer.com/uploads/MM/m7mflyvc-/jacustomer-m7mflyvc-_avatar.64x64.jpg",expertName:"Harry",expertTitle:"IT",satisfiedCustomers:"2,185"},greeting:"Want to ask an Android Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},homeopathy:{forumId:4121,initialCategoryId:"acca145ab4f747029ec2175155fde78c",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"0790e25d49ba4772854adc94c4feb831",expertAvatarUrl:"https://www.justanswer.com/uploads/Dr/Drzaheer/2011-6-7_122726_Dr.Zaheer.64x64.JPG",expertName:"Dr. Zaheer",expertTitle:"Doctor",satisfiedCustomers:"5,471"},greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},parenting:{forumId:18,initialCategoryId:"1fe0078c10fc4a5380d6e7d51e8209a4",headingText:"Ask a Counselor Now",assistantName:"Pearl Wilson",assistantTitle:"Counselor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Counselors are online now",expertProfile:{headingText:"Chat with a counselor now",id:"3075a2d4242d47ec93cd55b8da9571ad",expertAvatarUrl:"https://ww2-secure.justanswer.com//uploads/CE/Cerecita/2011-3-16_2565_JAPIC500x500.64x64.jpg",expertName:"Cher",expertTitle:"Teacher",satisfiedCustomers:"119",experience:""},greeting:"Want to ask a Counselor online now? I can connect you ...",marketingMessageText:"Connect with a counselor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Counselor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Counselor's Assistant.",popup:{title:"Chat with a counselor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"119"}},ford:{forumId:24,initialCategoryId:"3ea28da72a804df98e844834f3de3e89",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Ford Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Ford Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"5ce05cb4e027458aa3292021f44afae5",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/FO/fordguyu/2015-7-7_172556_onnieew.64x64.jpg",expertName:"Ron",expertTitle:"ASE Certified Technician",satisfiedCustomers:"25,584",experience:""},greeting:"Want to ask a Ford Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a Ford mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Ford Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Ford Mechanic's Assistant.",popup:{title:"Chat with a Ford mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"25,584"}},obgyn:{forumId:86,initialCategoryId:"055787be8c9847fdb0a70e65568d6a18",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"OB/GYN Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 OB/GYN Doctors are online now",expertProfile:{headingText:"Chat with a OB/GYN doctor now",id:"87c3534d323f425f85ad4445f7ed760f",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/drhearne/2009-11-8_74742_monika_hearne2.jpg",expertName:"Monika Hearne",expertTitle:"Board Certified OB/GYN",satisfiedCustomers:"5822",experience:""},greeting:"Want to ask a OB/GYN Doctor online now? I can connect you ...",marketingMessageText:"Connect with an OB/GYN doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the OB/GYN Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the OB/GYN Doctor's Assistant.",popup:{title:"Chat with a OB/GYN doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"5822"}},chevy:{forumId:26,initialCategoryId:"23c69c684f10441b8f0426fe41b54983",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Chevy Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Chevy Technicians are online now",expertProfile:{headingText:"Chat with a Chevy technician now",id:"3dd9287e78d74d38889d7dcf9b75808c",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/BL/Bluegorilla/2012-6-21_16298_cam.64x64.JPG",expertName:"GM Tech (Cam)",expertTitle:"Chevy Technician",satisfiedCustomers:"15,851",experience:""},greeting:"Want to ask a Chevy Technician online now? I can connect you ...",marketingMessageText:"Connect with a Chevy technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Chevy Technician's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Chevy Technician's Assistant.",popup:{title:"Chat with a Chevy technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"15,851"}},software:{forumId:7065,initialCategoryId:"459ef4a3a76e4e4891f29383ddf3250b",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Software Technicians are online now",expertProfile:{headingText:"Chat with a software technician now",id:"57c2a00b2d254363910176ac6d6b7d74",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/OM/omputerechaster/2016-10-27_224413_opyie.64x64.jpg",expertName:"Jason Jones",expertTitle:"Computer Technician",satisfiedCustomers:"11,546",experience:""},greeting:"Want to ask a Software Technician online now? I can connect you ...",marketingMessageText:"Connect with a software technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Software Technician's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Software Technician's Assistant.",popup:{title:"Chat with a software technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"11,546"}},"recorders-and-players":{forumId:985,initialCategoryId:"094f7ef4b9fd4ec48c1a9592ea5ce6d1",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Video Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Video Technicians are online now",expertProfile:{headingText:"Chat with a video technician now",id:"958e0ea8dc92408d8e7bfc7d8e10c3ea",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/benimur/2009-03-29_003401_id_2.jpg",expertName:"Louie",expertTitle:"Senior Technician",satisfiedCustomers:"10,824",experience:""},greeting:"Want to ask a Video Technician online now? I can connect you ...",marketingMessageText:"Connect with a video technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Video Technician's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Video Technician's Assistant.",popup:{title:"Chat with a video technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"10,824"}},reptiles:{forumId:66,initialCategoryId:"ce81be08afcd413392d7caaa82c77856",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",expertProfile:{headingText:"Chat with a veterinarian now",id:"25d807a8aec54c2ebd1398e99c67055c",expertAvatarUrl:"https://www.justanswer.com/uploads/MS/MsAM/2012-6-9_16426_anna.64x64.jpeg",expertName:"Anna",expertTitle:"Reptile Expert, Biologist",satisfiedCustomers:"4105"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Reptile Experts request a deposit of about 18$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant.",popup:{title:"Chat with a veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png",satisfiedCustomers:"4105"}},"dream-interpretation":{forumId:2778,initialCategoryId:"2116a37c94ec4b4c894ae9ad5b4e6ec5",headingText:"Ask an Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Dream Analyst's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Dream Analysts are online now",expertProfile:{headingText:"Chat with a dream analyst now",id:"a92a06ce9b244e849974fb368754a9de",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/LO/loucas7/2011-1-20_154741_vegasfull2.64x64.jpg",expertName:"Dream Symbolist",expertTitle:"Dream Expert",satisfiedCustomers:"669",experience:""},greeting:"Want to ask a Dream Analyst online now? I can connect you ...",marketingMessageText:"Connect with a dream analyst",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Dream Analyst's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Dream Analyst's Assistant.",popup:{title:"Chat with a dream analyst in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"669"}},general:{forumId:3,initialCategoryId:"3b34df8ec88042a5b93ce22187ad1a50",headingText:"Ask an Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Experts are online now",expertProfile:{headingText:"Chat with an expert now",id:"df1e15249e1a4ed7b65c8d80fe19a6b6",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/AN/andawyer/2015-3-18_192649_otolia.64x64.jpg",expertName:"FiveStarLaw",expertTitle:"Consultant",satisfiedCustomers:"109",experience:""},greeting:"Want to ask a Expert online now? I can connect you ...",marketingMessageText:"Connect with an Expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant.",popup:{title:"Chat with an expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"109"}},"heavy-equipment":{forumId:89,initialCategoryId:"38815056e479438c8e94531beffdb72b",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Heavy Equipment Mechanics are online now",expertProfile:{headingText:"Chat with a heavy equipment mechanic now",id:"a050340b455c4e97ac5230e54ac01b07",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris (aka - Moose)",expertTitle:"Technician",satisfiedCustomers:"119",experience:""},greeting:"Want to ask a Heavy Equipment Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a heavy equipment mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Heavy Equipment Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Heavy Equipment Mechanic's Assistant.",popup:{title:"Chat with a heavy equipment mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"119"}},weddings:{botName:"Pearl",initialCategoryId:"f9afa4b9a4614b9cb62c7d10729d4228",headingText:"Ask a Consultant Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Consultant","Get answers in minutes"],assistantTitle:"Wedding Planner's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Wedding Consultants are online now",sipLandingPage:"https://www.justanswer.com/sip/weddings",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/ER/49erLBSU/2013-8-19_175446_michael.200x200.jpg",expertName:"Michael",expertTitle:"Wedding Consultant",satisfiedCustomers:"7,533",experience:"Professional Wedding Consultant",showMoreLink:!0},messages:["Welcome! How can I help with your wedding question?"],greeting:"Want to ask a Wedding Consultant online now? I can connect you ...",marketingMessageText:"Connect with a wedding consultant",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Wedding Consultant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Wedding Consultant.",popup:{title:"Chat with a wedding consultant in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/general_bg.png"}},"digital-camera":{botName:"Pearl",initialCategoryId:"63a78a324eae4b6bb941f8154674291c",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Camera And Video Technicians are online now",sipLandingPage:"https://www.justanswer.com/sip/digital-camera",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/RU/RUSSTING/2012-1-19_1301_DSC08705a.200x200.JPG",expertName:"Russel A.",expertTitle:"Camera and Video Technician",satisfiedCustomers:"5,315",experience:"30 years experience as a TV station technician",showMoreLink:!0},messages:["Welcome! What's going on with your camera?"],greeting:"Want to ask a Camera Technician online now? I can connect you ...",marketingMessageText:"Connect with a camera technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Camera Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Camera Technician.",popup:{title:"Chat with a camera technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},tax:{botName:"Smarter_Tax_v2_US_25689.json",type:"FunnelQuestionPce",initialCategoryId:"c0539a14a3c84623a644042b8bfa029a",headingText:"Ask a Tax Advisor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Tax Advisor","Get answers in minutes"],assistantTitle:"Tax Advisor's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Tax Advisors are online now",sipLandingPage:"https://www.justanswer.com/sip/tax",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/TA/TaxRobin/2013-8-28_16186_femalebusinessprofessionalbinderhand11038485.200x200.jpg",expertName:"Robin D.",expertTitle:"Senior Accountant",satisfiedCustomers:"22,044",experience:"15 years as a Senior Accountant and Divisional Leader at H&R Block",showMoreLink:!0},messages:["Welcome! How can I help with your tax question?"],greeting:"Want to ask a Tax Advisor online now? I can connect you ...",marketingMessageText:"Connect with a tax advisor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Tax Advisor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Tax Advisor.",popup:{title:"Chat with a tax advisor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/tax_bg.png"}},"canada-law":{botName:"Pearl",initialCategoryId:"355f23b375464488a01c43fa06cdc630",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Canada Law Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/canada-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/AW/awro/2017-2-6_18577_stockphoto.200x200.jpg",expertName:"Mark A., JD",expertTitle:"Canada Law Expert",satisfiedCustomers:"263",experience:"Extensive experience with all types of Canadian Law",showMoreLink:!0},messages:["Welcome! How can I help with your legal question?"],greeting:"Want to ask a Canada Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a Canada lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Canada Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Canada Lawyer.",popup:{title:"Chat with a Canada lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},pharmacy:{botName:"Smarter_Medical_v1_US_Valhalla_26309.json",type:"FunnelQuestionPce",initialCategoryId:"4b93b2674f914141a6c3b6b212cd3ea8",headingText:"Ask a Pharmacist Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Pharmacist","Get answers in minutes"],assistantTitle:"Pharmacist's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Pharmacist's are online now",sipLandingPage:"https://www.justanswer.com/sip/pharmacy",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/DR/drbridgetpharmd/2019-10-27_19840_pharmacistpic.200x200.jpg",expertName:"Dr. Bridget, DP",expertTitle:"Clinical Pharmacist",satisfiedCustomers:"3,464",experience:"Specializing in the pharmacological treatment of diseases",showMoreLink:!0},messages:["Welcome! How can I help with your pharmacy question?"],greeting:"Want to ask a Pharmacist online now? I can connect you ...",marketingMessageText:"Connect with a pharmacist",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Pharmacist. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Pharmacist.",popup:{title:"Chat with a pharmacist in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/medical_bg.png"}},mac:{botName:"Pearl",initialCategoryId:"5f4b122e375c41aea2d88ac7c5ec699f",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Apple Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"6 Mac Specialists are online now",sipLandingPage:"https://www.justanswer.com/sip/mac",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/AS/ashiknasameen/2016-5-4_16537_justanswerprofile.200x200.jpg",expertName:"Ashik, MBA, BCA",expertTitle:"Mac Specialist",satisfiedCustomers:"16,395",experience:"10 years experience troubleshooting Macs, iPhones, iPads and more",showMoreLink:!0},messages:["Welcome! What's going on with your Apple device?"],greeting:"Want to ask an Apple Technician online now? I can connect you ...",marketingMessageText:"Connect with an Apple technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Apple Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Apple Technician.",popup:{title:"Chat with an Apple technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"game-systems":{botName:"Pearl",initialCategoryId:"bf2997b79e244d4f83d38281a2559b5b",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Game Systems Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/game-systems",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/SU/supercj21/2012-6-10_17444_IMG201206071852341.200x200.jpg",expertName:"Sijad H.",expertTitle:"Game Systems Expert",satisfiedCustomers:"1,836",experience:"5 years repairing all major Game Systems",showMoreLink:!0},messages:["Welcome! What's going on with your game system?"],greeting:"Want to ask a Game System Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Game System Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Game System Technician.",popup:{title:"Chat with a game system technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"home-security":{botName:"Pearl",initialCategoryId:"fed6a613d392437ea09442fc848daca2",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Home Security Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/home-security",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/GL/glenemoore/2011-9-28_194835_2011091915.43.22.200x200.jpg",expertName:"Glen Moore",expertTitle:"Home Security Expert",satisfiedCustomers:"263",experience:"20 years of experience in home and business security",showMoreLink:!0},messages:["Welcome! What's going on with your home security system?"],greeting:"Want to ask a Home Security Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Home Security Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Home Security Technician.",popup:{title:"Chat with a home security technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},smartphone:{botName:"Pearl",initialCategoryId:"f6f53fde5ba2437780c95bcb6e88b36e",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"4 Smartphone Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/smartphone",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/VI/vinodvmenon2005/1.200x200.jpg",expertName:"Vinod Menon",expertTitle:"Smartphone Expert",satisfiedCustomers:"3,064",experience:"Verified Smartphone Expert with a Master's Degree in Software Engineering",showMoreLink:!0},messages:["Welcome! What's going on with your smartphone?"],greeting:"Want to ask a Smartphone Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Smartphone Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Smartphone Technician.",popup:{title:"Chat with a smartphone technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},networking:{botName:"Pearl",initialCategoryId:"abd08bbdf67749608dec5a139d5c0264",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"12 Networking Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/networking1",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/SY/syseng/2013-11-6_12351_MyPicture.200x200.jpg",expertName:"David L.",expertTitle:"Networking Expert",satisfiedCustomers:"7,045",experience:"20 years experience as a Computer Engineer. Microsoft & Cisco Certified.",showMoreLink:!0},messages:["Welcome! How can I help with your networking question?"],greeting:"Want to ask a Network Technician online now? I can connect you ...",marketingMessageText:"Connect with a network technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Network Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Network Technician.",popup:{title:"Chat with a network technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},cardiology:{botName:"Smarter_Medical_v1_US_Valhalla_26309.json",type:"FunnelQuestionPce",initialCategoryId:"6d34325f9cfb4550a85f0c8dc20fa358",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Doctor","Get answers in minutes"],assistantTitle:"Cardiologists Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Cardiologists are online now",sipLandingPage:"https://www.justanswer.com/sip/cardiology",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/DO/DocPhilMD/2013-8-22_54848_2011122703212phil2.200x200.jpg",expertName:"Dr. Phil, MD",expertTitle:"Cardiologist",satisfiedCustomers:"37,642",experience:"Medical Director and Cardiologist with more than 25 years of experience",showMoreLink:!0},messages:["Welcome! How can I help with your cardiology question?"],greeting:"Want to ask a Cardiologist online now? I can connect you ...",marketingMessageText:"Connect with a cardiologist",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Cardiologist. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Cardiologist.",popup:{title:"Chat with a cardiologist in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/medical_bg.png"}},"electronic-musical-instruments":{botName:"Pearl",initialCategoryId:"c40acc90e29543ec8d754e27f3265868",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"12 Electronic Instruments Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/electronic-musical-instruments",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/AV/avtechnician/2019-3-15_165048_.200x200.jpg",expertName:"Aric",expertTitle:"Electronic Instruments Expert",satisfiedCustomers:"39,765",experience:"15 years of experience fixing consumer electronics equipment",showMoreLink:!0},messages:["Welcome! What's going on with your instrument?"],greeting:"Want to ask an Instrument Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Instrument Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Instrument Technician.",popup:{title:"Chat with an instrument technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"financial-software":{botName:"Smarter_Tax_v2_US_25689.json",type:"FunnelQuestionPce",initialCategoryId:"426edb91821442eb96497417bd917f13",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"9 Financial Software Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/financial-software",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/TA/TaxRobin/2013-8-28_16186_femalebusinessprofessionalbinderhand11038485.200x200.jpg",expertName:"Robin D.",expertTitle:"Financial Software Expert",satisfiedCustomers:"22,044",experience:"15 years as a Senior Accountant and Divisional Leader at H&R Block",showMoreLink:!0},messages:["Welcome! How can I help with your financial software question?"],greeting:"Want to ask a Financial Software Expert online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Financial Software Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Financial Software Expert.",popup:{title:"Chat with a financial software expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"republic-of-ireland-law":{botName:"Pearl",initialCategoryId:"4af5100adb964a3e8b8308e063807132",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Ireland Law Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/republic-of-ireland-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/BE/benjones/2015-12-1_0437_ennew.200x200.jpg",expertName:"Ben Jones",expertTitle:"Ireland Law Expert",satisfiedCustomers:"21,655",experience:"Solicitor and attorney with extensive legal experience",showMoreLink:!0},messages:["Welcome! How can I help with your legal question?"],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Lawyer.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},mercedes:{botName:"Pearl",initialCategoryId:"c6524ac0177b44c1ac25bd2947d6152c",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/mercedes",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Mercedes?"],greeting:"Want to ask a Mercedes Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Mercedes Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Mercedes Mechanic.",popup:{title:"Chat with a Mercedes mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},dodge:{botName:"Pearl",initialCategoryId:"6e24ecb66a33424c97adf806074ecff7",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/dodge",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Dodge?"],greeting:"Want to ask a Dodge Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Dodge Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Dodge Mechanic.",popup:{title:"Chat with a Dodge mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},volkswagen:{botName:"Pearl",initialCategoryId:"1fd53d052db645bc91473838146346b0",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/volkswagen",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your VW?"],greeting:"Want to ask a VW Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a VW Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a VW Mechanic.",popup:{title:"Chat with a VW mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},jeep:{botName:"Pearl",initialCategoryId:"f06844ad46dc4d9f8a200ddde68a635f",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/jeep",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Jeep?"],greeting:"Want to ask a Jeep Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Jeep Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Jeep Mechanic.",popup:{title:"Chat with a Jeep mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},nissan:{botName:"Pearl",initialCategoryId:"88550ebb7f0f46d58eb19b673db35854",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/nissan",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Nissan?"],greeting:"Want to ask a Nissan Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Nissan Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Nissan Mechanic.",popup:{title:"Chat with a Nissan mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},jaguar:{botName:"Pearl",initialCategoryId:"1c4cc748f8e5464aa00660a199fb0a50",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/jaguar",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Jaguar?"],greeting:"Want to ask a Jaguar Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Jaguar Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Jaguar Mechanic.",popup:{title:"Chat with a Jaguar mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},honda:{botName:"Pearl",initialCategoryId:"c91999e9333f45c8a3dc2cece4a972ad",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/honda",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Honda?"],greeting:"Want to ask a Honda Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Honda Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Honda Mechanic.",popup:{title:"Chat with a Honda mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},kia:{botName:"Pearl",initialCategoryId:"30944a1581b9422f8dfe52d56211534b",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/kia",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Kia?"],greeting:"Want to ask a Kia Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Kia Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Kia Mechanic.",popup:{title:"Chat with a Kia mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},toyota:{botName:"Pearl",initialCategoryId:"bfceb071a55b4a5b9ec9b768ff056c40",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/toyota",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Toyota?"],greeting:"Want to ask a Toyota Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Toyota Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Toyota Mechanic.",popup:{title:"Chat with a Toyota mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},buick:{botName:"Pearl",initialCategoryId:"1f03a2be902a4d64a15de7fe1c3363e6",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/buick",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Buick?"],greeting:"Want to ask a Buick Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Buick Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Buick Mechanic.",popup:{title:"Chat with a Buick mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},subaru:{botName:"Pearl",initialCategoryId:"530386a1f6e0470db8335ac53254248f",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/subaru",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Subaru?"],greeting:"Want to ask a Subaru Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Subaru Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Subaru Mechanic.",popup:{title:"Chat with a Subaru mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},saab:{botName:"Pearl",initialCategoryId:"d547cbf989f743f09aebcc708da4c80c",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/saab",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Saab?"],greeting:"Want to ask a Saab Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Saab Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Saab Mechanic.",popup:{title:"Chat with a Saab mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},hyundai:{botName:"Pearl",initialCategoryId:"5fc079453b5443cbaa57374fcec98f4b",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/hyundai",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Hyundai?"],greeting:"Want to ask a Hyundai Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Hyundai Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Hyundai Mechanic.",popup:{title:"Chat with a Hyundai mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},lexus:{botName:"Pearl",initialCategoryId:"7dd6350c946048c18cc79330563c7928",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/lexus",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Lexus?"],greeting:"Want to ask a Lexus Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Lexus Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Lexus Mechanic.",popup:{title:"Chat with a Lexus mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},chrysler:{botName:"Pearl",initialCategoryId:"cafd90a845cf45f7a825cd75af34125e",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/chrysler",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Chrysler?"],greeting:"Want to ask a Chrysler Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Chrysler Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Chrysler Mechanic.",popup:{title:"Chat with a Chrysler mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},pontiac:{botName:"Pearl",initialCategoryId:"b7e9584ffacf44d1ada1244f04d15af2",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/pontiac-vehicles",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Pontiac?"],greeting:"Want to ask a Pontiac Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Pontiac Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Pontiac Mechanic.",popup:{title:"Chat with a Pontiac mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},gmc:{botName:"Pearl",initialCategoryId:"b17d7c60cf754b2e9c1b882fb3807f27",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/gmc-vehicles",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your GMC?"],greeting:"Want to ask a GMC Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a GMC Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a GMC Mechanic.",popup:{title:"Chat with a GMC mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},acura:{botName:"Pearl",initialCategoryId:"2bfce5fc1d9d40e18e63ad688f74b723",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/acura-vehicles",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Acura?"],greeting:"Want to ask an Acura Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Acura Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Acura Mechanic.",popup:{title:"Chat with an Acura mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},cadillac:{botName:"Pearl",initialCategoryId:"63bec6b352994cda9f78ced3748b8310",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/cadillac",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Cadillac?"],greeting:"Want to ask a Cadillac Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Cadillac Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Cadillac Mechanic.",popup:{title:"Chat with a Cadillac mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},audi:{botName:"Pearl",initialCategoryId:"daff32d6d93f4a52b3f336b6e0f93684",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/audi-vehicles",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Audi?"],greeting:"Want to ask an Audi Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Audi Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Audi Mechanic.",popup:{title:"Chat with an Audi mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},bmw:{botName:"Pearl",initialCategoryId:"c6427b95c6264c2b8495e60962ead6b1",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/bmw-vehicles",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your BMW?"],greeting:"Want to ask a BMW Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a BMW Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a BMW Mechanic.",popup:{title:"Chat with a BMW mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"small-engine":{botName:"Pearl",initialCategoryId:"f2efe266298c494db4a3ad740a73d248",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Small Engine Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/small-engine",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! How can I help with your small engine question?"],greeting:"Want to ask a Small Engine Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Small Engine Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Small Engine Technician.",popup:{title:"Chat with a small engine technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"electric-vehicles":{botName:"Pearl",initialCategoryId:"08ff80925ed84118886bc1f9aadd3f21",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/electric-vehicles",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your electric car?"],greeting:"Want to ask an Electric Vehicles Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Electric Vehicles Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Electric Vehicles Mechanic.",popup:{title:"Chat with an electric vehicles mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"car-electronics":{botName:"Pearl",initialCategoryId:"0ee47073a21348929ad4f071da6261f4",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Master Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/car-electronics",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! How can I help with your car electronics question?"],greeting:"Want to ask an Automotive Electronics Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Automotive Electronics Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Automotive Electronics Mechanic.",popup:{title:"Chat with an automotive electronics mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"australia-law":{botName:"Pearl",initialCategoryId:"638a25fea83c44a395d9156368130280",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Solicitor And AU Law Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/australia-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/LR/lrizos/2017-12-21_234918_.200x200.jpg",expertName:"Leon, SAB",expertTitle:"Solicitor and AU Law Expert",satisfiedCustomers:"32,760",experience:"Solicitor and Australian Law Expert",showMoreLink:!0},messages:["Welcome! How can I help with your legal question?"],greeting:"Want to ask an Australian Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Australian Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Australian Lawyer.",popup:{title:"Chat with an Australian lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"consumer-law":{botName:"Pearl",initialCategoryId:"6d548d485bc6494d80fd28f89c8173e5",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Consumer Protection Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/consumer-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/RA/ratioscripta/2012-6-13_2955_foto3.200x200.jpg",expertName:"Ely, JD",expertTitle:"Consumer Protection Lawyer",satisfiedCustomers:"60,318",experience:"More than 20 years of experience in Consumer Protection Law",showMoreLink:!0},messages:["Welcome! How can I help with your consumer protection question?"],greeting:"Want to ask a Consumer Protection Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Consumer Protection Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Consumer Protection Lawyer.",popup:{title:"Chat with a consumer protection lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"new-zealand-law":{botName:"Pearl",initialCategoryId:"800352f2b4134ecdbd08698572b6989d",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 New Zealand Law Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/new-zealand-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/CH/christhelawyer/2016-7-21_23550_.200x200.jpg",expertName:"Chris",expertTitle:"New Zealand Law Expert",satisfiedCustomers:"20,320",experience:"38 years of experience as a Lawyer and Barrister",showMoreLink:!0},messages:["Welcome! How can I help with your legal question?"],greeting:"Want to ask a New Zealand Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a New Zealand Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a New Zealand Lawyer.",popup:{title:"Chat with a New Zealand lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"military-law":{botName:"Pearl",initialCategoryId:"49597491c7f746eea7f42afce5642518",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Military Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/military-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/PH/philip.simmons/2012-6-7_161915_BIGPhilipSimmons.200x200.jpg",expertName:"P. Simmons, JD",expertTitle:"Military Lawyer",satisfiedCustomers:"44,482",experience:"Ret. Marine Corps Lawyer and Veterans Services Officer (VSO)",showMoreLink:!0},messages:["Welcome! How can I help with your military law question?"],greeting:"Want to ask a Military Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Military Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Military Lawyer.",popup:{title:"Chat with a military lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"intellectual-property-law":{botName:"Pearl",initialCategoryId:"a4441e24bf85429298f6d461e8183855",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"IP Attorney's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Intellectual Property Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/intellectual-property-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/PL/PLCUSTOMER-6rv27irj-/plcustomer-6rv27irj-_avatar.200x200.jpg",expertName:"Gerald, JD",expertTitle:"Intellectual Property Lawyer",satisfiedCustomers:"5,955",experience:"30 years of experience in Intellectual Property Law",showMoreLink:!0},messages:["Welcome! How can I help with your intellectual property question?"],greeting:"Want to ask an Intellectual Property Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Intellectual Property Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Intellectual Property Lawyer.",popup:{title:"Chat with an intellectual property lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"german-law":{botName:"Pearl",initialCategoryId:"3f50637467f44501887055c23e3c704e",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 German Law Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/german-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/SC/schiesslclaudia/2020-2-11_111140_.200x200.jpg",expertName:"Legal Eagle, JD",expertTitle:"German Law Expert",satisfiedCustomers:"977",experience:"20 years of experience in all kinds of law, especially employment law and family law",showMoreLink:!0},messages:["Welcome! How can I help with your legal question?"],greeting:"Want to ask a German Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a German Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a German Lawyer.",popup:{title:"Chat with a German lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"canada-family-law":{botName:"Pearl",initialCategoryId:"355f23b375464488a01c43fa06cdc630",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Canada Law Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/canada-attorney",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/AW/awro/2017-2-6_18577_stockphoto.200x200.jpg",expertName:"Mark A., JD",expertTitle:"Canada Law Expert",satisfiedCustomers:"263",experience:"Extensive experience with all types of Canadian Law",showMoreLink:!0},messages:["Welcome! How can I help with your legal question?"],greeting:"Want to ask a Canada Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Canada Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Canada Lawyer.",popup:{title:"Chat with a Canada lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"fraud-examiner":{botName:"Pearl",initialCategoryId:"8b6cc54ab0334b7d9828cd40901da431",headingText:"Ask an Examiner Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an Examiner","Get answers in minutes"],assistantTitle:"Fraud Examiner's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Fraud Examiners are online now",sipLandingPage:"https://www.justanswer.com/sip/fraud-examiner",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/BE/benjones/2015-12-1_0437_ennew.200x200.jpg",expertName:"Ben Jones",expertTitle:"Fraud Examiner",satisfiedCustomers:"21,655",experience:"Solicitor and attorney with extensive legal experience",showMoreLink:!0},messages:["Welcome! How can I help with your fraud examiner question?"],greeting:"Want to ask a Fraud Examiner online now? I can connect you ...",marketingMessageText:"Connect with a fraud examiner",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Fraud Examiner. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Fraud Examiner.",popup:{title:"Chat with a fraud examiner in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},gps:{botName:"Pearl",initialCategoryId:"4becf599d73c474bb5ad2ca3201e567f",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"GPS Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 GPS Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/gps",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/SU/supercj21/2012-6-10_17444_IMG201206071852341.200x200.jpg",expertName:"Sijad H.",expertTitle:"GPS Expert",satisfiedCustomers:"1,836",experience:"5 years repairing all major GPS models",showMoreLink:!0},messages:["Welcome! What's going on with your GPS?"],greeting:"Want to ask a GPS Technician online now? I can connect you ...",marketingMessageText:"Connect with a gps technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a GPS Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a GPS Technician.",popup:{title:"Chat with a GPS technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"hiv-and-aids":{botName:"Smarter_Medical_v1_US_Valhalla_26309.json",type:"FunnelQuestionPce",initialCategoryId:"5b887cdaf7054e9c99e6f1006a0298cd",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Doctor","Get answers in minutes"],assistantTitle:"Doctor's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Infectious Diseases Doctors are online now",sipLandingPage:"https://www.justanswer.com/sip/hiv-and-aids",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/CO/commissure/2015-5-14_122816_r.aniel.200x200.jpg",expertName:"Dr. David, MD",expertTitle:"Infectious Diseases Doctor",satisfiedCustomers:"39,446",experience:"Board Certified Physician with Infectious Disease training",showMoreLink:!0},messages:["Welcome! How can I help with your hiv-aids question?"],greeting:"Want to ask an Infectious Diseases Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Infectious Diseases Doctor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Infectious Diseases Doctor.",popup:{title:"Chat with an infectious diseases doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/medical_bg.png"}},orthopedics:{botName:"Smarter_Medical_v1_US_Valhalla_26309.json",type:"FunnelQuestionPce",initialCategoryId:"6b09f2d3d85549d889134c8b6b328512",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Doctor","Get answers in minutes"],assistantTitle:"Doctor Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Orthopedic Surgeons are online now",sipLandingPage:"https://www.justanswer.com/sip/orthopedics",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/DR/Dr.Sawhney/2014-7-18_102625_DSC35796x81CROPPED.200x200.jpg",expertName:"Dr. Sawhney, MBBS, MS",expertTitle:"Orthopedic Surgeon",satisfiedCustomers:"10,845",experience:"Post-doctoral degree in orthopedics and over 15 years of experience",showMoreLink:!0},messages:["Welcome! How can I help with your orthopedics question?"],greeting:"Want to ask an Orthopedic Surgeon online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Orthopedic Surgeon. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Orthopedic Surgeon.",popup:{title:"Chat with an orthopedic surgeon in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/medical_bg.png"}},endocrinology:{botName:"Smarter_Medical_v1_US_Valhalla_26309.json",type:"FunnelQuestionPce",initialCategoryId:"5039378c121d42c69348c1fac4ef4d54",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Doctor","Get answers in minutes"],assistantTitle:"Endocrinologists Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Endocrinologists are online now",sipLandingPage:"https://www.justanswer.com/sip/endocrinology",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/CO/commissure/2015-5-14_122816_r.aniel.200x200.jpg",expertName:"Dr. David, MD",expertTitle:"Endocrinologist",satisfiedCustomers:"39,446",experience:"Chief Resident at NYU specializing in all areas of medicine",showMoreLink:!0},messages:["Welcome! How can I help with your endocrinology question?"],greeting:"Want to ask an Endocrinologists online now? I can connect you ...",marketingMessageText:"Connect with an endocrinologists",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Endocrinologists. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Endocrinologists.",popup:{title:"Chat with an endocrinologists in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/medical_bg.png"}},oncology:{botName:"Smarter_Medical_v1_US_Valhalla_26309.json",type:"FunnelQuestionPce",initialCategoryId:"89771656566b4b87a45cf61b5ad2922c",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Doctor","Get answers in minutes"],assistantTitle:"Oncologists Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Oncologists are online now",sipLandingPage:"https://www.justanswer.com/sip/oncology",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/CO/commissure/2015-5-14_122816_r.aniel.200x200.jpg",expertName:"Dr. David, MD",expertTitle:"Oncologist",satisfiedCustomers:"39,446",experience:"Chief Resident at NYU specializing in Oncology",showMoreLink:!0},messages:["Welcome! How can I help with your oncology question?"],greeting:"Want to ask an Oncologists online now? I can connect you ...",marketingMessageText:"Connect with an oncologists",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Oncologists. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Oncologists.",popup:{title:"Chat with an oncologists in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/medical_bg.png"}},mitsubishi:{botName:"Pearl",initialCategoryId:"c2ffcafbd939401d976106081cb8e945",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"TV Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 TV Repair Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/mitsubishi",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/PL/pllinate/2017-4-23_64646_np.200x200.jpg",expertName:"Nathan",expertTitle:"TV Repair Expert",satisfiedCustomers:"40,339",experience:"10 years of experience repairing all brands of TV",showMoreLink:!0},messages:["Welcome! What's going on with your TV?"],greeting:"Want to ask a TV Technician online now? I can connect you ...",marketingMessageText:"Connect with a tv technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a TV Technicianю Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a TV Technician.",popup:{title:"Chat with a TV technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"landlord-tenant":{botName:"Pearl",initialCategoryId:"dd3463e39967403f9dd1bde2532f87ac",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Landlord-Tenant Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/landlord-tenant",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/HS/hsw43y0z-/jacustomer-hsw43y0z-_avatar.200x200.jpg",expertName:"Judge Bill K.",expertTitle:"Landlord-Tenant Lawyer",satisfiedCustomers:"4,581",experience:"Retired Federal Judge and Attorney specializing in Landlord-Tenant issues",showMoreLink:!0},messages:["Welcome! How can I help with your landlord-tenant question?"],greeting:"Want to ask a Landlord-Tenant Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Landlord-Tenant Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Landlord-Tenant Lawyer.",popup:{title:"Chat with a landlord-tenant lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"fl-real-estate":{botName:"Pearl",initialCategoryId:"cefca8f2d3724901a6961661f860fa14",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Real Estate Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/fl-real-estate",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/IN/insearchoftheanswer/2013-8-16_0233_attorney.200x200.jpg",expertName:"Richard, JD, MBA",expertTitle:"Real Estate Lawyer",satisfiedCustomers:"9,501",experience:"32 years of experience as a Real Estate Lawyer and Developer",showMoreLink:!0},messages:["Welcome! How can I help with your Florida real estate question?"],greeting:"Want to ask a Real Estate Lawyer online now? I can connect you ...",marketingMessageText:"Connect with an lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Real Estate Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Real Estate Lawyer.",popup:{title:"Chat with a real estate lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"exercise-equipment":{botName:"Pearl",initialCategoryId:"ed3a62993a2f46fe84112be1c1840f26",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Fitness Equipment Technicians are online now",sipLandingPage:"https://www.justanswer.com/sip/exercise-equipment",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/kingcobra80/2010-3-3_02422_jim.jpg",expertName:"Treadmilltech",expertTitle:"Exercise Equipment Expert",satisfiedCustomers:"7,654",experience:"20 years experience repairing exercise equipment",showMoreLink:!0},messages:["Welcome! What's going on with your exercise equipment?"],greeting:"Want to ask a Fitness Equipment Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Fitness Equipment Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Fitness Equipment Technician.",popup:{title:"Chat with a fitness equipment technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"home-theater-stereo":{botName:"Pearl",initialCategoryId:"9515ff1e94bd47f5a75a161b38caff1e",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Home Theater Stereo Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/home-theater",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/benimur/2009-03-29_003401_id_2.jpg",expertName:"Louie",expertTitle:"Home Theater Stereo Expert",satisfiedCustomers:"14,212",experience:"25 years working with all major home theater systems",showMoreLink:!0},messages:["Welcome! What's going on with your speaker or sound system?"],greeting:"Want to ask a Home Theater Stereo Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Home Theater Stereo Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Home Theater Stereo Expert.",popup:{title:"Chat with a home theater stereo expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},saturn:{botName:"Pearl",initialCategoryId:"e64911b14053438ea5c8931afcfc2f82",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Saturn Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/saturn",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris",expertTitle:"Master Mechanic",satisfiedCustomers:"66,017",experience:"16 years repairing domestic, foreign and luxury cars",showMoreLink:!0},messages:["Welcome! What's going on with your Saturn?"],greeting:"Want to ask a Saturn Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Saturn Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Saturn Mechanic.",popup:{title:"Chat with a saturn mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"agriculture-and-farm-equipment":{botName:"Pearl",initialCategoryId:"38815056e479438c8e94531beffdb72b",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Heavy Equipment Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/farmtrac",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/KO/koboma/2012-6-6_20917_DSCF1022.200x200.JPG",expertName:"Curtis",expertTitle:"Heavy Equipment Expert",satisfiedCustomers:"14,717",experience:"30 years repairing diesel engines, heavy equipment and forklifts",showMoreLink:!0},messages:["Welcome! How can I help with your equipment question?"],greeting:"Want to ask a Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Technician.",popup:{title:"Chat with a technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"construction-equipment":{botName:"Pearl",initialCategoryId:"56b3510c7eb5478eaf5eae205a065b69",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Construction Equipment Mechanics are online now",sipLandingPage:"https://www.justanswer.com/sip/construction-equipment",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/KO/koboma/2012-6-6_20917_DSCF1022.200x200.JPG",expertName:"Curtis",expertTitle:"Heavy Equipment Expert",satisfiedCustomers:"14,717",experience:"30 years repairing diesel engines, heavy equipment and forklifts",showMoreLink:!0},messages:["Welcome! How can I help with your construction equipment question?"],greeting:"Want to ask a Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Technician.",popup:{title:"Chat with a technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"australia-whitegoods-repair":{botName:"Pearl",initialCategoryId:"f679487e5ea5423aa359d375ce8cba83",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Technician","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Whitegoods Technician are online now",sipLandingPage:"https://www.justanswer.com/sip/whitegoods-repair1",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/SM/smitty1486/2011-3-1_0145_Snapshotofme1.200x200.png",expertName:"Kelly, GMRS, NARDA",expertTitle:"Appliance Expert",satisfiedCustomers:"31,810",experience:"30 years of experience repairing all types of appliances",showMoreLink:!0},messages:["Welcome! How can I help with your whitegoods question?"],greeting:"Want to ask a Technician online now? I can connect you ...",marketingMessageText:"Connect with a technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Technician.",popup:{title:"Chat with a technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/homeinprovements_bg.png"}},"structural-engineering":{botName:"Pearl",initialCategoryId:"3a58cd1c63f647e391a5e73eae473e45",headingText:"Ask an Engineer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an Engineer","Get answers in minutes"],assistantTitle:"Engineer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Structural Engineers are online now",sipLandingPage:"https://www.justanswer.com/sip/structural-engineering",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/ST/StructuralEng/2013-9-10_61545_struct.200x200.jpg",expertName:"StructuralEng, PE",expertTitle:"Structural Engineer",satisfiedCustomers:"8,640",experience:"10 years experience as a structural engineer",showMoreLink:!0},messages:["Welcome! How can I help with your engineering question?"],greeting:"Want to ask a Structural Engineer online now? I can connect you ...",marketingMessageText:"Connect with an engineer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Structural Engineer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Structural Engineer.",popup:{title:"Chat with a structural engineers in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/homeinprovements_bg.png"}},calculus:{botName:"Pearl",initialCategoryId:"f592405d12134cd6a66058e5d76b404f",headingText:"Ask a Tutor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Tutor","Get answers in minutes"],assistantTitle:"Math Tutor's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Advanced Placement Teachers are online now",sipLandingPage:"https://www.justanswer.com/sip/calculus1",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/ED/educatortech/2012-6-7_1256_williams4.200x200.jpg",expertName:"Gregory White, MA, MS",expertTitle:"Advanced Placement Teacher",satisfiedCustomers:"4,311",experience:"Master's in Education and 15 years teaching advanced courses",showMoreLink:!0},messages:["Welcome! How can I help with your statistics question?"],greeting:"Want to ask an Advanced Math Tutor online now? I can connect you ...",marketingMessageText:"Connect with a math tutor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Advanced Math Tutor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Advanced Math Tutor.",popup:{title:"Chat with an advanced math tutor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"canada-copyrights":{botName:"Pearl",initialCategoryId:"a4441e24bf85429298f6d461e8183855",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"IP Attorney's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Intellectual Property Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/canada-copyrights",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/PL/PLCUSTOMER-6rv27irj-/plcustomer-6rv27irj-_avatar.200x200.jpg",expertName:"Gerald, JD",expertTitle:"Intellectual Property Lawyer",satisfiedCustomers:"5,955",experience:"30 years of experience in Intellectual Property Law",showMoreLink:!0},messages:["Welcome! How can I help with your Canada copyright question?"],greeting:"Want to ask an Intellectual Property Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Intellectual Property Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Intellectual Property Lawyer.",popup:{title:"Chat with an intellectual property lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},etiquette:{botName:"Pearl",initialCategoryId:"96f041d3a355478c97c77206dc59597e",headingText:"Ask an Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an Expert","Get answers in minutes"],assistantTitle:"Expert's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Etiquette Experts are online now",sipLandingPage:"https://www.justanswer.com/sip/etiquette",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/TH/thecaretaker/2020-8-21_233_erofile.200x200.jpg",expertName:"Dr. August Abbot",expertTitle:"Etiquette Expert",satisfiedCustomers:"9,501",experience:"40 years of experience with etiquette training",showMoreLink:!0},messages:["Welcome! How can I help with your etiquette question?"],greeting:"Want to ask an Etiquette Expert online now? I can connect you ...",marketingMessageText:"Connect with an etiquette expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Etiquette Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Etiquette Expert.",popup:{title:"Chat with an etiquette expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"instrument-appraisal":{botName:"appraisals_en_us.json",type:"FunnelQuestionPce",initialCategoryId:"b5a77474c1224689aeb8b124c3bd44d2",headingText:"Ask an Appraiser Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an Appraiser","Get answers in minutes"],assistantTitle:"Appraiser's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Certified Instrument Appraisers are online now",sipLandingPage:"https://www.justanswer.com/sip/instrument-appraisal",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/TY/TylerOrganist/2014-2-28_42014_DSC0959copy.200x200.jpg",expertName:"Tyler, MM, AAGO",expertTitle:"Certified Appraiser and Musician",satisfiedCustomers:"7,377",experience:"Master's degree in Music. Member, AOA.",showMoreLink:!0},messages:["Welcome! How can I help with your musical instrument question?"],greeting:"Want to ask an Instrument Appraiser online now? I can connect you ...",marketingMessageText:"Connect with an appraiser",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Instrument Appraiser. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Instrument Appraiser.",popup:{title:"Chat with an instrument appraiser in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"estate-law-1":{botName:"Pearl",initialCategoryId:"26ca7f607ea0405d992837facc55ed9a",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.com/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Estate Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/estate-law-1",expertProfile:{expertAvatarUrl:"https://secure.justanswer.com/uploads/LR/lrxdr3wl-/jacustomer-lrxdr3wl-_avatar.200x200.jpg",expertName:"Lori, JD",expertTitle:"Estate Lawyer",satisfiedCustomers:"14,976",experience:"25 years of experience in estate law",showMoreLink:!0},messages:["Welcome! How can I help with your estate law question?"],greeting:"Want to ask an Estate Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with an Estate Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with an Estate Lawyer.",popup:{title:"Chat with an estate lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}}},UK:{legal:{forumId:12175,initialCategoryId:"9c8484eb212e4e5a86ea9c59071d74d1",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",assistantTitle:"Solicitor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"a6cddf03f40146069bc32e2bb6a5148f",expertAvatarUrl:"https://www.justanswer.com/uploads/BE/benjones/2015-12-1_0437_ennew.64x64.jpg",expertName:"Ben Jones",expertTitle:"UK Solicitor",satisfiedCustomers:"",experience:"Qualified Solicitor in UK Law with Seven Years of Experience",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Solicitors request a deposit of about £36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor's Assistant."},medical:{forumId:12247,initialCategoryId:"eb56d576e96040069f477322a347a067",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"aadad43ee75649a5867c80bcbd2a09ce",expertAvatarUrl:"https://www.justanswer.com/uploads/Do/Doctor7860/2013-4-2_3633_Picture.JA280x1873.64x64.jpg",expertName:"Dr. Amir",expertTitle:"Doctor",satisfiedCustomers:"",experience:"Master of Internal Medicine & Gastroenterology with Eight Years of Experience (London) MBBS",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Doctors request a deposit of about £34 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant."},vet:{forumId:12262,initialCategoryId:"439b9fc114914f2794815343b699be54",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"85eb7325ebdd445c98904ec1d24978e1",expertAvatarUrl:"https://www.justanswer.co.uk/uploads/VE/VetAnswers/2013-4-5_8257_prof10.64x64.jpg",expertName:"Dr. Scott Nimmo",expertTitle:"Veterinarian",satisfiedCustomers:"",experience:"Royal College of Veterinary Surgeons with Nine Years of Experience (BVMS)",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Veterinarians request a deposit of about £20 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant."},car:{forumId:12203,initialCategoryId:"d6165649139f4dfaafa3bc19007ba569",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"0d62b67e42954f88ac2fd57ee6332238",expertAvatarUrl:"https://ww2.justanswer.co.uk/uploads/IN/indytech/2013-8-8_102717_SantoDomingo146598x6402.64x64.jpg",expertName:"Greg",expertTitle:"Technician",satisfiedCustomers:"",experience:"Automotive diagnostic tech",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Auto Mechanics request a deposit of about £24 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"home-improvement":{forumId:12292,initialCategoryId:"ff0c1187046c41999292833be3cfc69d",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Contractor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"a55bd612cb27406aa1cd605522ce2d94",expertAvatarUrl:"https://www.justanswer.co.uk/uploads/PL/Plumberpro/2014-6-23_6520_image.64x64.jpg",expertName:"Plumberpro",expertTitle:"Plumber",satisfiedCustomers:"",experience:"Fully qualified plumbing, heating and gas engineer 20 years experience",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Home Improvement Experts request a deposit of about £28 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Contractor online now? I can connect you ...",marketingMessageText:"Connect with a contractor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Contractor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Contractor's Assistant."},computer:{forumId:12299,initialCategoryId:"ab7a6d17831b4f43861c4171ccca7077",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Tech Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"486beb6283ce46b297a9a873a5ab4f1f",expertAvatarUrl:"https://www.justanswer.co.uk/uploads/JA/JACUSTOMERf8udkdxk/2013-8-3_15150_323738101505074393259301621172992o.64x64.jpg",expertName:"Kamil Anwar",expertTitle:"Computer Support Specialist",satisfiedCustomers:"",experience:"8+ Years of Experience. / CCNA (S), CCNA (W), CCNA (RS), MCTS, MBCs.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Tech Support Specialists request a deposit of about £36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with a tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert's Assistant."},finance:{forumId:12200,botName:"Pearl_33_12_bot",initialCategoryId:"4511d1d50dd149c692945ded45a75fef",headingText:"Ask a Financial Advisor",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Financial Advisor","Get answers in minutes"],assistantTitle:"Financial Advisor's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Financial Advisors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/finance/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/RA/rakhi.v/2012-7-3_14374_RakhiVasavadaL.64x64.jpeg",expertName:"Rakhi Vasavada",expertTitle:"Financial Advisor",satisfiedCustomers:"1,813",experience:"Attorney and Financial Expert. Have specialization in Financial Laws. Practice experience of over 13 years",showMoreLink:!0},messages:["Welcome! How can I help with your finance question?"],greeting:"Want to ask a Financial Advisor online now? I can connect you ...",marketingMessageText:"Connect with a financial professional",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Financial Advisor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Financial Advisor.",popup:{title:"Chat with a financial advisor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/tax_bg.png"}},"classic-cars":{forumId:12210,botName:"Pearl_33_12_bot",initialCategoryId:"19cd25073ba64fa9a20d7800f56ae0bb",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Expert's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Classic Car Mechanics are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/classic-cars/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/TE/techmachine/0601821347169_717372168_8940977_39623330_o.64x64.jpg",expertName:"Ross",expertTitle:"Diagnostic and repair technician",satisfiedCustomers:"473",experience:"Licensed diagnostic and repair technician",showMoreLink:!0},messages:["Welcome! What's going on with your car?"],greeting:"Want to ask a Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Mechanic.",popup:{title:"Chat with a mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"tenant-law":{forumId:12180,botName:"Pearl_33_12_bot",initialCategoryId:"cc9ec64bca0f48f088dc91e7bbd41610",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Solicitor","Get answers in minutes"],assistantTitle:"Property Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/tenant-law/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/EM/emus/2015-7-7_192327_bigstockportraitofconfidentfemale.64x64.jpg",expertName:"Remus2004",expertTitle:"Barrister",satisfiedCustomers:"2,532",experience:"Over 5 years in practice.",showMoreLink:!0},messages:["Welcome! How can I help with your property law question?"],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with a solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},tax:{forumId:12195,botName:"Pearl_33_12_bot",initialCategoryId:"862cac22aab342e5ad847c434eb61f59",headingText:"Ask a Tax Advisor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Tax Advisor","Get answers in minutes"],assistantTitle:"Accountant's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Tax Professionals are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/tax/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/bi/bigduckontax/2013-8-12_222058_1.64x64.jpg",expertName:"bigduckontax",expertTitle:"Accountant",satisfiedCustomers:"7,383",experience:"FCCA FCMA CGMA ACIS",showMoreLink:!0},messages:["Welcome! How can I help with your tax question?"],greeting:"Want to ask a Tax Advisor online now? I can connect you ...",marketingMessageText:"Connect with a tax advisor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tax Advisor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tax Advisor.",popup:{title:"Chat with a tax advisor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/tax_bg.png"}},business:{forumId:12195,botName:"Pearl_33_12_bot",initialCategoryId:"af75ae07b5ce4ed69406866a7e6a77ed",headingText:"Ask a Business Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Business Expert","Get answers in minutes"],assistantTitle:"Expert's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Business Experts are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/business/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/EM/emus/2015-7-7_192327_bigstockportraitofconfidentfemale.64x64.jpg",expertName:"Jo C.",expertTitle:"Barrister",satisfiedCustomers:"37,311",experience:"Over 5 years in practice",showMoreLink:!0},messages:["Welcome! How can I help with your legal question?"],greeting:"Want to ask a Business Expert online now? I can connect you ...",marketingMessageText:"Connect with a business expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Business Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Business Expert.",popup:{title:"Chat with a business expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},smartphone:{forumId:12290,botName:"Pearl_37_5_bot",initialCategoryId:"debf20eb44b145adb590bc90d9ca8277",headingText:"Ask a mobile phone Tech Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a mobile phone tech expert","Get answers in minutes"],assistantTitle:"Tech Expert's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Mobile Phone Tech Experts are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/smartphone/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/RI/RichieMe/2013-10-21_9435_1891752088969658025993880564n.64x64.jpg",expertName:"Richard",expertTitle:"Hardware Engineer",satisfiedCustomers:"69",experience:"Troubleshoot issues with smartphones.",showMoreLink:!0},messages:["Welcome! What's going on with your smartphone?"],greeting:"Want to ask a Smartphone Expert online now? I can connect you ...",marketingMessageText:"Connect with a mobile phone tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert.",popup:{title:"Chat with a mobile phone tech expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"online-counseling":{forumId:12247,botName:"Pearl_39_5_bot",initialCategoryId:"ccb231edd8d6499785ff51df8a045866",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a doctor","Get answers in minutes"],assistantTitle:"Doctor's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"8 Doctors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/online-counseling",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/FA/FamilyPhysician/2013-8-31_191624_JA550x500Photo.64x64.jpg",expertName:"Family Physician",expertTitle:"Doctor",satisfiedCustomers:"2,418",experience:"GP with over 27 years experience including emergency medicine",showMoreLink:!0},messages:["Hi! Thanks for using JustAnswer. You're just a couple of questions away from an expert answer from the Doctor. How can we help?"],greeting:"Want to ask a doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},"family-law":{forumId:12178,botName:"Pearl_33_12_bot",initialCategoryId:"a2acf328e2c14ce0b6befcf2ae30adf9",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Solicitor","Get answers in minutes"],assistantTitle:"Family Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/family-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/TO/touchwoodsden/2020-1-31_165149_itock.64x64.jpg",expertName:"Stuart J",expertTitle:"Solicitor",satisfiedCustomers:"1,435",experience:"Senior Partner at Berkson Wallace",showMoreLink:!0},messages:["Welcome! How can I help with your question?"],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with a solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"immigration-law":{forumId:12179,botName:"Pearl_33_12_bot",initialCategoryId:"3b69b0a8747841aaade49b229b2f85ef",headingText:"Ask an Immigration Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an Immigration Solicitor","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Immigration Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/immigration-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/TO/touchwoodsden/2020-1-31_165149_itock.64x64.jpg",expertName:"Stuart J",expertTitle:"Solicitor",satisfiedCustomers:"2",experience:"Senior Partner at Berkson Wallace",showMoreLink:!0},messages:["Welcome! How can I help with your immigration question?"],greeting:"Want to ask an Immigration Solicitor online now? I can connect you ...",marketingMessageText:"Connect with an immigration solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with an immigration solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"property-law":{forumId:12180,botName:"Pearl_33_12_bot",initialCategoryId:"cc9ec64bca0f48f088dc91e7bbd41610",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Solicitor","Get answers in minutes"],assistantTitle:"Property Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/property-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/EM/emus/2015-7-7_192327_bigstockportraitofconfidentfemale.64x64.jpg",expertName:"Remus2004",expertTitle:"Barrister",satisfiedCustomers:"2,532",experience:"Over 5 years in practice.",showMoreLink:!0},messages:["Welcome! How can I help with your property law question?"],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with a solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},electronics:{forumId:12269,botName:"Pearl_37_5_bot",initialCategoryId:"1db29e65f111432fa569b8c1c92e25f2",headingText:"Ask an electronics Tech Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an electronics tech expert","Get answers in minutes"],assistantTitle:"Tech Expert's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Electronics Tech Experts are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/electronics",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/RA/ratonxi/2012-1-3_151146_1.64x64.png",expertName:"Eng. Andres",expertTitle:"Engineer",satisfiedCustomers:"81",experience:"Electronic Eng. Electronics Specialist. Circuit designer",showMoreLink:!0},messages:["Welcome! How can I help with your electronics question?"],greeting:"Want to ask an Electronics Expert online now? I can connect you ...",marketingMessageText:"Connect with an electronics tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert.",popup:{title:"Chat with an electronics tech expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},antiques:{forumId:12342,botName:"uk_appraisals.json",type:"FunnelQuestionPce",initialCategoryId:"3e244f4639d146bca6f3d05624a4ad69",headingText:"Ask an Antique Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an antique expert","Get answers in minutes"],assistantTitle:"Appraiser's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Antique Experts are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/antiques",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/IN/InspiredKnowledge/Great_House.64x64.jpg",expertName:"Great House Antiques",expertTitle:"Appraiser/ Researcher/ Entrepreneur",satisfiedCustomers:"1,839",experience:"30+ years in all aspects of the Antiques and Decorative Arts Industry",showMoreLink:!0},messages:["Welcome! How can I help with your antiques question?"],greeting:"Want to ask an antique expert online now? I can connect you ...",marketingMessageText:"Connect with an antique expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Antique Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Antique Expert.",popup:{title:"Chat with an antique expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/general_bg.png"}},"employment-law":{forumId:12177,botName:"Pearl_33_12_bot",initialCategoryId:"00619a0e11994aa4ae0f85ba7dfc9f0f",headingText:"Ask an Employment Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an Employment Solicitor","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Employment Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/employment-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/BE/benjones/2015-12-1_0437_ennew.64x64.jpg",expertName:"Ben Jones",expertTitle:"UK Lawyer",satisfiedCustomers:"17,248",experience:"Qualified Employment Solicitor",showMoreLink:!0},messages:["Welcome! How can I help with your employment question?"],greeting:"Want to ask an Employment Solicitor online now? I can connect you ...",marketingMessageText:"Connect with an employment solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with an employment solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},appliance:{forumId:12293,botName:"Pearl_37_5_bot",initialCategoryId:"33ed33f70095458680839e2ad5b7aaeb",headingText:"Ask an Appliance Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with an appliance technician","Get answers in minutes"],assistantTitle:"Appliance Tech's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Appliance Technicians are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/appliance",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/RO/royzee1/2012-10-11_16153_serviceengineers.64x64.jpg",expertName:"Rob",expertTitle:"Home Appliance Technician",satisfiedCustomers:"420",experience:"20 yrs. experience with a major worldwide manufacturer.",showMoreLink:!0},messages:["Welcome! How can I help with your appliance question?"],greeting:"Want to ask an appliance technician online now? I can connect you ...",marketingMessageText:"Connect with an appliance technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Technician.",popup:{title:"Chat with an appliance technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/homeinprovements_bg.png"}},"traffic-law":{botName:"Pearl_33_12_bot",initialCategoryId:"226897120f5b4b6d9bccc0710d553484",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/traffic-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/EM/emus/2015-7-7_192327_bigstockportraitofconfidentfemale.64x64.jpg",expertName:"Jo C.",expertTitle:"Barrister",satisfiedCustomers:"4,099",experience:"Over 5 years in practice.",showMoreLink:!0},messages:["Welcome! How can I help with your traffic law question?"],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},ford:{botName:"Pearl_33_12_bot",initialCategoryId:"e544ab348fb54f7f8d49eeda871be631",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Mechanic","Get answers in minutes"],assistantTitle:"Mechanic's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Ford Mechanics are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/ford",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/FO/fordspec/DSC00877.64x64.JPG",expertName:"fordspec",expertTitle:"Ford Technician",satisfiedCustomers:"11",experience:"ford technician",showMoreLink:!0},messages:["Welcome! What's going on with your Ford?"],greeting:"Want to ask a Ford Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with a Ford Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with a Ford Mechanic.",popup:{title:"Chat with a ford mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}}}},size:{default:"","450x400":"450x400","300x600":"300x600","250x250":"250x250",small:"small"},showCopyright:{false:!1,true:!0}}},{}],"ja-gadget-virtual-assistant-config":[function(e,t,a){function n(e){if(!(this instanceof n))return new n(e);var e=e||{},t=e.partner||"US",a=s.settings[t][e.settings]||s.settings[t].default,i=s.profiles[t][e.profile]||s.profiles[t].legal,o=s.size[e.size]||s.size.default,r=i.messages,c=i.popup||{},l=a.messageMinLength||1,p=e.experts||[];return e.header={headlineText:e.headlineText,headlineSub1Text:e.headlineSub1Text,satisfiedCustomers:e.satisfiedCustomers||"",headerType:e.headerType,headerColor:e.headerColor},{rParameter:e.affiliateId||"affiliate",addRParameterOnPayment:!0,source:e.source||"affiliate",trackingPixels:e.trackingPixels||{},time:a.time,disableTimer:a.disableTimer,proceedToCcTime:a.proceedToCcTime,enableOnExit:a.enableOnExit,animationTimeIntervals:a.animationTimeIntervals,placeholder:e.placeholderText||a.placeholder,placeholderV2:a.placeholderV2,messageMinLength:l,clientName:a.clientName,sendButtonText:e.sendButtonText||a.sendButtonText,sendButtonTextForStartedChat:a.sendButtonTextForStartedChat,startChatText:a.startChatText,moreLinkText:a.moreLinkText,lessLinkText:a.lessLinkText,showBackground:a.showBackground,minimized:a.minimized,baseDomain:a.baseDomain,rememberChatMinimizedState:a.rememberChatMinimizedState,mobile:a.mobile,endpoint:e.endpoint||a.endpoint,partner:t,botName:i.botName||"",type:i.type||a.type,isNewPaymentWindow:a.isNewPaymentWindow,sessionExpirationHours:a.sessionExpirationHours,showCta:a.showCta,forumId:i.forumId,headingText:i.headingText,doubleHeadingText:i.doubleHeadingText,assistantName:e.assistantName||i.assistantName,assistantTitle:e.assistantTitle||i.assistantTitle,avatar:e.avatar||i.avatar,isTypingText:e.typingText||i.isTypingText,expertProfile:i.expertProfile,expertMessages:r,greeting:i.greeting,initialCategoryId:i.initialCategoryId,marketingMessageText:i.marketingMessageText,connectionRetryMessageHeader:i.connectionRetryMessageHeader,connectionRetryMessageBody:i.connectionRetryMessageBody,connectionFailureMessageHeader:i.connectionFailureMessageHeader,connectionFailureMessageBody:i.connectionFailureMessageBody,showCopyright:e.showCopyright,canCloseTeaser:e.canCloseTeaser,closeChatOnClickOutside:e.closeChatOnClickOutside,fullScreenOnMobile:e.fullScreenOnMobile,size:o,onlineNowText:i.onlineNowText,sipLandingPage:i.sipLandingPage,popup:{background:c.background,title:c.title,showOnTimeout:e.showOnTimeout,showOnMouseOut:e.showOnMouseOut,appearanceTimeout:e.appearanceTimeout},expertPictures:p,header:e.header,height:e.height,width:e.width,expertsOnlineText:e.expertsOnlineText,welcomeMessageText:e.welcomeMessageText}}var s=e("./presets.json");t.exports=n},{"./presets.json":1}]},{},["ja-gadget-virtual-assistant-config"]);