UNPKG

@optimizely/optimizely-sdk

Version:
1 lines 62.5 kB
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@optimizely/js-sdk-logging"),r=require("@optimizely/js-sdk-utils"),i=require("@optimizely/js-sdk-datafile-manager"),n=e(require("murmurhash")),o=require("@optimizely/js-sdk-event-processor"),a=e(require("http")),s=e(require("https")),u=e(require("url")),l=function(){return(l=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)};function E(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var i=Array(e),n=0;for(t=0;t<r;t++)for(var o=arguments[t],a=0,s=o.length;a<s;a++,n++)i[n]=o[a];return i}var f=Math.pow(2,53);var _={assign:function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(!e)return{};if("function"==typeof Object.assign)return Object.assign.apply(Object,E([e],t));for(var i=Object(e),n=0;n<t.length;n++){var o=t[n];if(null!=o)for(var a in o)Object.prototype.hasOwnProperty.call(o,a)&&(i[a]=o[a])}return i},currentTimestamp:function(){return Math.round((new Date).getTime())},isSafeInteger:function(e){return"number"==typeof e&&Math.abs(e)<=f},keyBy:function(e,t){return e?r.keyBy(e,(function(e){return e[t]})):{}},uuid:r.generateUUID,isNumber:function(e){return"number"==typeof e}},g={NOTSET:0,DEBUG:1,INFO:2,WARNING:3,ERROR:4},I={CONDITION_EVALUATOR_ERROR:"%s: Error evaluating audience condition of type %s: %s",DATAFILE_AND_SDK_KEY_MISSING:"%s: You must provide at least one of sdkKey or datafile. Cannot start Optimizely",EXPERIMENT_KEY_NOT_IN_DATAFILE:"%s: Experiment key %s is not in datafile.",FEATURE_NOT_IN_DATAFILE:"%s: Feature key %s is not in datafile.",IMPROPERLY_FORMATTED_EXPERIMENT:"%s: Experiment key %s is improperly formatted.",INVALID_ATTRIBUTES:"%s: Provided attributes are in an invalid format.",INVALID_BUCKETING_ID:"%s: Unable to generate hash for bucketing ID %s: %s",INVALID_DATAFILE:"%s: Datafile is invalid - property %s: %s",INVALID_DATAFILE_MALFORMED:"%s: Datafile is invalid because it is malformed.",INVALID_CONFIG:"%s: Provided Optimizely config is in an invalid format.",INVALID_JSON:"%s: JSON object is not valid.",INVALID_ERROR_HANDLER:'%s: Provided "errorHandler" is in an invalid format.',INVALID_EVENT_DISPATCHER:'%s: Provided "eventDispatcher" is in an invalid format.',INVALID_EVENT_TAGS:"%s: Provided event tags are in an invalid format.",INVALID_EXPERIMENT_KEY:"%s: Experiment key %s is not in datafile. It is either invalid, paused, or archived.",INVALID_EXPERIMENT_ID:"%s: Experiment ID %s is not in datafile.",INVALID_GROUP_ID:"%s: Group ID %s is not in datafile.",INVALID_LOGGER:'%s: Provided "logger" is in an invalid format.',INVALID_ROLLOUT_ID:"%s: Invalid rollout ID %s attached to feature %s",INVALID_USER_ID:"%s: Provided user ID is in an invalid format.",INVALID_USER_PROFILE_SERVICE:"%s: Provided user profile service instance is in an invalid format: %s.",NO_DATAFILE_SPECIFIED:"%s: No datafile specified. Cannot start optimizely.",NO_JSON_PROVIDED:"%s: No JSON object to validate against schema.",NO_VARIATION_FOR_EXPERIMENT_KEY:"%s: No variation key %s defined in datafile for experiment %s.",UNDEFINED_ATTRIBUTE:"%s: Provided attribute: %s has an undefined value.",UNRECOGNIZED_ATTRIBUTE:"%s: Unrecognized attribute %s provided. Pruning before sending event to Optimizely.",UNABLE_TO_CAST_VALUE:"%s: Unable to cast value %s to type %s, returning null.",USER_NOT_IN_FORCED_VARIATION:"%s: User %s is not in the forced variation map. Cannot remove their forced variation.",USER_PROFILE_LOOKUP_ERROR:'%s: Error while looking up user profile for user ID "%s": %s.',USER_PROFILE_SAVE_ERROR:'%s: Error while saving user profile for user ID "%s": %s.',VARIABLE_KEY_NOT_IN_DATAFILE:'%s: Variable with key "%s" associated with feature with key "%s" is not in datafile.',VARIATION_ID_NOT_IN_DATAFILE:"%s: No variation ID %s defined in datafile for experiment %s.",VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT:"%s: Variation ID %s is not in the datafile.",INVALID_INPUT_FORMAT:"%s: Provided %s is in an invalid format.",INVALID_DATAFILE_VERSION:"%s: This version of the JavaScript SDK does not support the given datafile version: %s",INVALID_VARIATION_KEY:"%s: Provided variation key is in an invalid format."},c={ACTIVATE_USER:"%s: Activating user %s in experiment %s.",DISPATCH_CONVERSION_EVENT:"%s: Dispatching conversion event to URL %s with params %s.",DISPATCH_IMPRESSION_EVENT:"%s: Dispatching impression event to URL %s with params %s.",DEPRECATED_EVENT_VALUE:"%s: Event value is deprecated in %s call.",EVENT_KEY_NOT_FOUND:"%s: Event key %s is not in datafile.",EXPERIMENT_NOT_RUNNING:"%s: Experiment %s is not running.",FEATURE_ENABLED_FOR_USER:"%s: Feature %s is enabled for user %s.",FEATURE_NOT_ENABLED_FOR_USER:"%s: Feature %s is not enabled for user %s.",FEATURE_HAS_NO_EXPERIMENTS:"%s: Feature %s is not attached to any experiments.",FAILED_TO_PARSE_VALUE:'%s: Failed to parse event value "%s" from event tags.',FAILED_TO_PARSE_REVENUE:'%s: Failed to parse revenue value "%s" from event tags.',FORCED_BUCKETING_FAILED:"%s: Variation key %s is not in datafile. Not activating user %s.",INVALID_OBJECT:"%s: Optimizely object is not valid. Failing %s.",INVALID_CLIENT_ENGINE:"%s: Invalid client engine passed: %s. Defaulting to node-sdk.",INVALID_VARIATION_ID:"%s: Bucketed into an invalid variation ID. Returning null.",NOTIFICATION_LISTENER_EXCEPTION:"%s: Notification listener for (%s) threw exception: %s",NO_ROLLOUT_EXISTS:"%s: There is no rollout of feature %s.",NOT_ACTIVATING_USER:"%s: Not activating user %s for experiment %s.",NOT_TRACKING_USER:"%s: Not tracking user %s.",PARSED_REVENUE_VALUE:'%s: Parsed revenue value "%s" from event tags.',PARSED_NUMERIC_VALUE:'%s: Parsed event value "%s" from event tags.',RETURNING_STORED_VARIATION:'%s: Returning previously activated variation "%s" of experiment "%s" for user "%s" from user profile.',ROLLOUT_HAS_NO_EXPERIMENTS:"%s: Rollout of feature %s has no experiments",SAVED_VARIATION:'%s: Saved variation "%s" of experiment "%s" for user "%s".',SAVED_VARIATION_NOT_FOUND:"%s: User %s was previously bucketed into variation with ID %s for experiment %s, but no matching variation was found.",SHOULD_NOT_DISPATCH_ACTIVATE:'%s: Experiment %s is not in "Running" state. Not activating user.',SKIPPING_JSON_VALIDATION:"%s: Skipping JSON schema validation.",TRACK_EVENT:"%s: Tracking event %s for user %s.",USER_ASSIGNED_TO_EXPERIMENT_BUCKET:"%s: Assigned bucket %s to user with bucketing ID %s.",USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP:"%s: User %s is in experiment %s of group %s.",USER_BUCKETED_INTO_TARGETING_RULE:"%s: User %s bucketed into targeting rule %s.",USER_IN_FEATURE_EXPERIMENT:"%s: User %s is in variation %s of experiment %s on the feature %s.",USER_IN_ROLLOUT:"%s: User %s is in rollout of feature %s.",USER_BUCKETED_INTO_EVERYONE_TARGETING_RULE:"%s: User %s bucketed into everyone targeting rule.",USER_NOT_BUCKETED_INTO_EVERYONE_TARGETING_RULE:"%s: User %s not bucketed into everyone targeting rule due to traffic allocation.",USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP:"%s: User %s is not in experiment %s of group %s.",USER_NOT_BUCKETED_INTO_ANY_EXPERIMENT_IN_GROUP:"%s: User %s is not in any experiment of group %s.",USER_NOT_BUCKETED_INTO_TARGETING_RULE:"%s User %s not bucketed into targeting rule %s due to traffic allocation. Trying everyone rule.",USER_NOT_IN_FEATURE_EXPERIMENT:"%s: User %s is not in any experiment on the feature %s.",USER_NOT_IN_ROLLOUT:"%s: User %s is not in rollout of feature %s.",USER_FORCED_IN_VARIATION:"%s: User %s is forced in variation %s.",USER_MAPPED_TO_FORCED_VARIATION:"%s: Set variation %s for experiment %s and user %s in the forced variation map.",USER_DOESNT_MEET_CONDITIONS_FOR_TARGETING_RULE:"%s: User %s does not meet conditions for targeting rule %s.",USER_MEETS_CONDITIONS_FOR_TARGETING_RULE:"%s: User %s meets conditions for targeting rule %s.",USER_HAS_VARIATION:"%s: User %s is in variation %s of experiment %s.",USER_HAS_FORCED_VARIATION:"%s: Variation %s is mapped to experiment %s and user %s in the forced variation map.",USER_HAS_NO_VARIATION:"%s: User %s is in no variation of experiment %s.",USER_HAS_NO_FORCED_VARIATION:"%s: User %s is not in the forced variation map.",USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT:"%s: No experiment %s mapped to user %s in the forced variation map.",USER_NOT_IN_ANY_EXPERIMENT:"%s: User %s is not in any experiment of group %s.",USER_NOT_IN_EXPERIMENT:"%s: User %s does not meet conditions to be in experiment %s.",USER_RECEIVED_DEFAULT_VARIABLE_VALUE:'%s: User "%s" is not in any variation or rollout rule. Returning default value for variable "%s" of feature flag "%s".',FEATURE_NOT_ENABLED_RETURN_DEFAULT_VARIABLE_VALUE:'%s: Feature "%s" is not enabled for user %s. Returning the default variable value "%s".',VARIABLE_NOT_USED_RETURN_DEFAULT_VARIABLE_VALUE:'%s: Variable "%s" is not used in variation "%s". Returning default value.',USER_RECEIVED_VARIABLE_VALUE:'%s: Got variable value "%s" for variable "%s" of feature flag "%s"',VALID_DATAFILE:"%s: Datafile is valid.",VALID_USER_PROFILE_SERVICE:"%s: Valid user profile service provided.",VARIATION_REMOVED_FOR_USER:"%s: Variation mapped to experiment %s has been removed for user %s.",VARIABLE_REQUESTED_WITH_WRONG_TYPE:'%s: Requested variable type "%s", but variable is of type "%s". Use correct API to retrieve value. Returning None.',VALID_BUCKETING_ID:'%s: BucketingId is valid: "%s"',BUCKETING_ID_NOT_STRING:"%s: BucketingID attribute is not a string. Defaulted to userId",EVALUATING_AUDIENCE:'%s: Starting to evaluate audience "%s" with conditions: %s.',EVALUATING_AUDIENCES_COMBINED:'%s: Evaluating audiences for %s "%s": %s.',AUDIENCE_EVALUATION_RESULT:'%s: Audience "%s" evaluated to %s.',AUDIENCE_EVALUATION_RESULT_COMBINED:"%s: Audiences for %s %s collectively evaluated to %s.",MISSING_ATTRIBUTE_VALUE:'%s: Audience condition %s evaluated to UNKNOWN because no value was passed for user attribute "%s".',UNEXPECTED_CONDITION_VALUE:"%s: Audience condition %s evaluated to UNKNOWN because the condition value is not supported.",UNEXPECTED_TYPE:'%s: Audience condition %s evaluated to UNKNOWN because a value of type "%s" was passed for user attribute "%s".',UNEXPECTED_TYPE_NULL:'%s: Audience condition %s evaluated to UNKNOWN because a null value was passed for user attribute "%s".',UNKNOWN_CONDITION_TYPE:"%s: Audience condition %s has an unknown condition type. You may need to upgrade to a newer release of the Optimizely SDK.",UNKNOWN_MATCH_TYPE:"%s: Audience condition %s uses an unknown match type. You may need to upgrade to a newer release of the Optimizely SDK.",UPDATED_OPTIMIZELY_CONFIG:"%s: Updated Optimizely config to revision %s (project id %s)",OUT_OF_BOUNDS:'%s: Audience condition %s evaluated to UNKNOWN because the number value for user attribute "%s" is not in the range [-2^53, +2^53].',UNABLE_TO_ATTACH_UNLOAD:'%s: unable to bind optimizely.close() to page unload event: "%s"'},p={REVENUE:"revenue",VALUE:"value"},d={BOT_FILTERING:"$opt_bot_filtering",BUCKETING_ID:"$opt_bucketing_id",STICKY_BUCKETING_KEY:"$opt_experiment_bucket_map",USER_AGENT:"$opt_user_agent"},N=["node-sdk","react-sdk","javascript-sdk"],R=r.NOTIFICATION_TYPES,O={AB_TEST:"ab-test",FEATURE:"feature",FEATURE_TEST:"feature-test",FEATURE_VARIABLE:"feature-variable",ALL_FEATURE_VARIABLES:"all-feature-variables"},T={FEATURE_TEST:"feature-test",ROLLOUT:"rollout",EXPERIMENT:"experiment"},h={RULE:"rule",EXPERIMENT:"experiment"},v={BOOLEAN:"boolean",DOUBLE:"double",INTEGER:"integer",STRING:"string",JSON:"json"},A={V2:"2",V3:"3",V4:"4"},y=Object.freeze({__proto__:null,LOG_LEVEL:g,ERROR_MESSAGES:I,LOG_MESSAGES:c,RESERVED_EVENT_KEYWORDS:p,CONTROL_ATTRIBUTES:d,JAVASCRIPT_CLIENT_ENGINE:"javascript-sdk",NODE_CLIENT_ENGINE:"node-sdk",REACT_CLIENT_ENGINE:"react-sdk",NODE_CLIENT_VERSION:"4.4.0",VALID_CLIENT_ENGINES:N,NOTIFICATION_TYPES:R,DECISION_NOTIFICATION_TYPES:O,DECISION_SOURCES:T,AUDIENCE_EVALUATION_TYPES:h,FEATURE_VARIABLE_TYPES:v,DATAFILE_VERSIONS:A}),U="CONFIG_VALIDATOR",L=[A.V2,A.V3,A.V4],m=function(e){if("object"==typeof e&&null!==e){if(e.errorHandler&&"function"!=typeof e.errorHandler.handleError)throw new Error(r.sprintf(I.INVALID_ERROR_HANDLER,U));if(e.eventDispatcher&&"function"!=typeof e.eventDispatcher.dispatchEvent)throw new Error(r.sprintf(I.INVALID_EVENT_DISPATCHER,U));if(e.logger&&"function"!=typeof e.logger.log)throw new Error(r.sprintf(I.INVALID_LOGGER,U));return!0}throw new Error(r.sprintf(I.INVALID_CONFIG,U))},V=function(e){if(!e)throw new Error(r.sprintf(I.NO_DATAFILE_SPECIFIED,U));if("string"==typeof e)try{e=JSON.parse(e)}catch(e){throw new Error(r.sprintf(I.INVALID_DATAFILE_MALFORMED,U))}if("object"==typeof e&&!Array.isArray(e)&&null!==e&&-1===L.indexOf(e.version))throw new Error(r.sprintf(I.INVALID_DATAFILE_VERSION,U,e.version));return e},S="PROJECT_CONFIG";var D=function(e,t){void 0===t&&(t=null);var i,n,o=(i=e,(n=_.assign({},i)).audiences=(i.audiences||[]).map((function(e){return _.assign({},e)})),n.experiments=(i.experiments||[]).map((function(e){return _.assign({},e)})),n.featureFlags=(i.featureFlags||[]).map((function(e){return _.assign({},e)})),n.groups=(i.groups||[]).map((function(e){var t=_.assign({},e);return t.experiments=(e.experiments||[]).map((function(e){return _.assign({},e)})),t})),n.rollouts=(i.rollouts||[]).map((function(e){var t=_.assign({},e);return t.experiments=(e.experiments||[]).map((function(e){return _.assign({},e)})),t})),n);return o.__datafileStr=null===t?JSON.stringify(e):t,(o.audiences||[]).forEach((function(e){e.conditions=JSON.parse(e.conditions)})),o.audiencesById=_.keyBy(o.audiences,"id"),_.assign(o.audiencesById,_.keyBy(o.typedAudiences,"id")),o.attributeKeyMap=_.keyBy(o.attributes,"key"),o.eventKeyMap=_.keyBy(o.events,"key"),o.groupIdMap=_.keyBy(o.groups,"id"),Object.keys(o.groupIdMap||{}).forEach((function(e){(o.groupIdMap[e].experiments||[]).forEach((function(t){o.experiments.push(_.assign(t,{groupId:e}))}))})),o.rolloutIdMap=_.keyBy(o.rollouts||[],"id"),r.objectValues(o.rolloutIdMap||{}).forEach((function(e){(e.experiments||[]).forEach((function(e){o.experiments.push(e),e.variationKeyMap=_.keyBy(e.variations,"key")}))})),o.experimentKeyMap=_.keyBy(o.experiments,"key"),o.experimentIdMap=_.keyBy(o.experiments,"id"),o.variationIdMap={},o.variationVariableUsageMap={},(o.experiments||[]).forEach((function(e){e.variationKeyMap=_.keyBy(e.variations,"key"),_.assign(o.variationIdMap,_.keyBy(e.variations,"id")),r.objectValues(e.variationKeyMap||{}).forEach((function(e){e.variables&&(o.variationVariableUsageMap[e.id]=_.keyBy(e.variables,"id"))}))})),o.experimentFeatureMap={},o.featureKeyMap=_.keyBy(o.featureFlags||[],"key"),r.objectValues(o.featureKeyMap||{}).forEach((function(e){e.variables.forEach((function(e){e.type===v.STRING&&e.subType===v.JSON&&(e.type=v.JSON,delete e.subType)})),e.variableKeyMap=_.keyBy(e.variables,"key"),(e.experimentIds||[]).forEach((function(t){o.experimentFeatureMap[t]?o.experimentFeatureMap[t].push(e.id):o.experimentFeatureMap[t]=[e.id];var r=o.experimentIdMap[t];r.groupId&&!e.groupId&&(e.groupId=r.groupId)}))})),o},P=function(e,t){var i=e.experimentKeyMap[t];if(!i)throw new Error(r.sprintf(I.INVALID_EXPERIMENT_KEY,S,t));return i.id},C=function(e,t){var i=e.experimentKeyMap[t];if(!i)throw new Error(r.sprintf(I.INVALID_EXPERIMENT_KEY,S,t));return i.status},b=function(e,t){return"Running"===C(e,t)},F=function(e,t,r){var i=e.experimentKeyMap[t];return i.variationKeyMap.hasOwnProperty(r)?i.variationKeyMap[r].id:null},M=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){var i=e.experimentKeyMap[t];if(i)return i}throw new Error(r.sprintf(I.EXPERIMENT_KEY_NOT_IN_DATAFILE,S,t))},k=function(e,t,i){if(e.featureKeyMap.hasOwnProperty(t)){var n=e.featureKeyMap[t];if(n)return n}return i.log(g.ERROR,r.sprintf(I.FEATURE_NOT_IN_DATAFILE,S,t)),null},B=function(e,t,i,n){var o=e.featureKeyMap[t];if(!o)return n.log(g.ERROR,r.sprintf(I.FEATURE_NOT_IN_DATAFILE,S,t)),null;var a=o.variableKeyMap[i];return a||(n.log(g.ERROR,r.sprintf(I.VARIABLE_KEY_NOT_IN_DATAFILE,S,i,t)),null)},x=function(e,t,i,n){if(!t||!i)return null;if(!e.variationVariableUsageMap.hasOwnProperty(i.id))return n.log(g.ERROR,r.sprintf(I.VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT,S,i.id)),null;var o=e.variationVariableUsageMap[i.id][t.id];return o?o.value:null},K=function(e,t,i){var n;switch(t){case v.BOOLEAN:"true"!==e&&"false"!==e?(i.log(g.ERROR,r.sprintf(I.UNABLE_TO_CAST_VALUE,S,e,t)),n=null):n="true"===e;break;case v.INTEGER:n=parseInt(e,10),isNaN(n)&&(i.log(g.ERROR,r.sprintf(I.UNABLE_TO_CAST_VALUE,S,e,t)),n=null);break;case v.DOUBLE:n=parseFloat(e),isNaN(n)&&(i.log(g.ERROR,r.sprintf(I.UNABLE_TO_CAST_VALUE,S,e,t)),n=null);break;case v.JSON:try{n=JSON.parse(e)}catch(o){i.log(g.ERROR,r.sprintf(I.UNABLE_TO_CAST_VALUE,S,e,t)),n=null}break;default:n=e}return n},G=function(e,t){return e.eventKeyMap.hasOwnProperty(t)},w=function(e,t){return e.experimentFeatureMap.hasOwnProperty(t)},j=function(e){return!!e.sendFlagDecisions},Y=P,H=function(e,t){var i=e.experimentIdMap[t];if(!i)throw new Error(r.sprintf(I.INVALID_EXPERIMENT_ID,S,t));return i.layerId},X=function(e,t,i){var n=e.attributeKeyMap[t],o=0===t.indexOf("$opt_");return n?(o&&i.log(g.WARN,r.sprintf("Attribute %s unexpectedly has reserved prefix %s; using attribute ID instead of reserved attribute name.",t,"$opt_")),n.id):o?t:(i.log(g.DEBUG,r.sprintf(I.UNRECOGNIZED_ATTRIBUTE,S,t)),null)},J=function(e,t){var r=e.eventKeyMap[t];return r?r.id:null},z=function(e,t){return"Running"===C(e,t)},Z=function(e,t){var i=e.experimentKeyMap[t];if(!i)throw new Error(r.sprintf(I.INVALID_EXPERIMENT_KEY,S,t));return i.audienceConditions||i.audienceIds},W=function(e,t){return e.variationIdMap.hasOwnProperty(t)?e.variationIdMap[t].key:null},q=F,$=M,Q=function(e,t){var i=e.experimentKeyMap[t];if(!i)throw new Error(r.sprintf(I.INVALID_EXPERIMENT_KEY,S,t));return i.trafficAllocation},ee=function(e,t,i){if(e.experimentIdMap.hasOwnProperty(t)){var n=e.experimentIdMap[t];if(n)return n}return i.log(g.ERROR,r.sprintf(I.INVALID_EXPERIMENT_ID,S,t)),null},te=function(e){return e.audiencesById},re=function(e){return e.__datafileStr},ie=function(e){var t;try{t=V(e.datafile)}catch(e){return{configObj:null,error:e}}if(e.jsonSchemaValidator)try{e.jsonSchemaValidator.validate(t),e.logger.log(g.INFO,r.sprintf(c.VALID_DATAFILE,S))}catch(e){return{configObj:null,error:e}}else e.logger.log(g.INFO,r.sprintf(c.SKIPPING_JSON_VALIDATION,S));var i=[t];return"string"==typeof e.datafile&&i.push(e.datafile),{configObj:D.apply(void 0,i),error:null}};function ne(e,t,r,i){var n=e.experimentFeatureMap[r],o={};if(n){var a=i[n],s=(t.variables||[]).reduce((function(e,t){return e[t.id]={id:t.id,value:t.value},e}),{});o=(a||[]).reduce((function(e,r){var i=s[r.id],n=t.featureEnabled&&i?i.value:r.defaultValue;return e[r.key]={id:r.id,key:r.key,type:r.type,value:n},e}),{})}return o}function oe(e,t){this.experimentsMap=function(e){var t=(e.rollouts||[]).reduce((function(e,t){return t.experiments.forEach((function(t){e[t.id]=!0})),e}),{}),r=(e.featureFlags||[]).reduce((function(e,t){return e[t.id]=t.variables,e}),{});return(e.experiments||[]).reduce((function(i,n){return t[n.id]||(i[n.key]={id:n.id,key:n.key,variationsMap:(n.variations||[]).reduce((function(t,i){return t[i.key]={id:i.id,key:i.key,variablesMap:ne(e,i,n.id,r)},w(e,n.id)&&(t[i.key].featureEnabled=i.featureEnabled),t}),{})}),i}),{})}(e),this.featuresMap=function(e,t){return(e.featureFlags||[]).reduce((function(r,i){return r[i.key]={id:i.id,key:i.key,experimentsMap:(i.experimentIds||[]).reduce((function(r,i){var n=e.experimentIdMap[i].key;return r[n]=t[n],r}),{}),variablesMap:(i.variables||[]).reduce((function(e,t){return e[t.key]={id:t.id,key:t.key,type:t.type,value:t.defaultValue},e}),{})},r}),{})}(e,this.experimentsMap),this.revision=e.revision,this.__datafile=t}oe.prototype.getDatafile=function(){return this.__datafile};var ae={OptimizelyConfig:oe},se=t.getLogger();function ue(e,t){return e instanceof Error?e.message:t||"Unknown error"}function le(e){try{this.__initialize(e)}catch(e){se.error(e),this.__updateListeners=[],this.__configObj=null,this.__optimizelyConfigObj=null,this.__readyPromise=Promise.resolve({success:!1,reason:ue(e,"Error in initialize")})}}le.prototype.__initialize=function(e){if(this.__updateListeners=[],this.jsonSchemaValidator=e.jsonSchemaValidator,!e.datafile&&!e.sdkKey){this.__configObj=null;var t=new Error(r.sprintf(I.DATAFILE_AND_SDK_KEY_MISSING,"PROJECT_CONFIG_MANAGER"));return this.__readyPromise=Promise.resolve({success:!1,reason:ue(t)}),void se.error(t)}var n;if(e.datafile?(n=this.__handleNewDatafile(e.datafile))&&(this.__configObj=null):this.__configObj=null,e.sdkKey){var o={sdkKey:e.sdkKey};this.__validateDatafileOptions(e.datafileOptions)&&_.assign(o,e.datafileOptions),this.__configObj&&(o.datafile=re(this.__configObj)),this.datafileManager=new i.HttpPollingDatafileManager(o),this.datafileManager.start(),this.__readyPromise=this.datafileManager.onReady().then(this.__onDatafileManagerReadyFulfill.bind(this),this.__onDatafileManagerReadyReject.bind(this)),this.datafileManager.on("update",this.__onDatafileManagerUpdate.bind(this))}else this.__configObj?this.__readyPromise=Promise.resolve({success:!0}):this.__readyPromise=Promise.resolve({success:!1,reason:ue(n,"Invalid datafile")})},le.prototype.__onDatafileManagerReadyFulfill=function(){var e=this.__handleNewDatafile(this.datafileManager.get());return e?{success:!1,reason:ue(e)}:{success:!0}},le.prototype.__onDatafileManagerReadyReject=function(e){return{success:!1,reason:ue(e,"Failed to become ready")}},le.prototype.__onDatafileManagerUpdate=function(){this.__handleNewDatafile(this.datafileManager.get())},le.prototype.__validateDatafileOptions=function(e){return void 0===e||"object"==typeof e&&null!==e},le.prototype.__handleNewDatafile=function(e){var t=ie({datafile:e,jsonSchemaValidator:this.jsonSchemaValidator,logger:se}),r=t.configObj,i=t.error;i?se.error(i):(this.__configObj?this.__configObj.revision:"null")!==r.revision&&(this.__configObj=r,this.__optimizelyConfigObj=new ae.OptimizelyConfig(this.__configObj,re(this.__configObj)),this.__updateListeners.forEach((function(e){e(r)})));return i},le.prototype.getConfig=function(){return this.__configObj},le.prototype.getOptimizelyConfig=function(){return this.__optimizelyConfigObj},le.prototype.onReady=function(){return this.__readyPromise},le.prototype.onUpdate=function(e){return this.__updateListeners.push(e),function(){var t=this.__updateListeners.indexOf(e);t>-1&&this.__updateListeners.splice(t,1)}.bind(this)},le.prototype.stop=function(){this.datafileManager&&this.datafileManager.stop(),this.__updateListeners=[]};function Ee(e){this.logger=e.logger,this.errorHandler=e.errorHandler,this.__notificationListeners={},r.objectValues(R).forEach(function(e){this.__notificationListeners[e]=[]}.bind(this)),this.__listenerId=1}Ee.prototype.addNotificationListener=function(e,t){try{if(!(r.objectValues(R).indexOf(e)>-1))return-1;this.__notificationListeners[e]||(this.__notificationListeners[e]=[]);var i=!1;if((this.__notificationListeners[e]||[]).forEach((function(e){if(e.callback===t)return i=!0,!1})),i)return-1;this.__notificationListeners[e].push({id:this.__listenerId,callback:t});var n=this.__listenerId;return this.__listenerId+=1,n}catch(e){return this.logger.log(g.ERROR,e.message),this.errorHandler.handleError(e),-1}},Ee.prototype.removeNotificationListener=function(e){try{var t,r;if(Object.keys(this.__notificationListeners).some(function(i){if((this.__notificationListeners[i]||[]).every((function(n,o){return n.id!==e||(t=o,r=i,!1)})),void 0!==t&&void 0!==r)return!0}.bind(this)),void 0!==t&&void 0!==r)return this.__notificationListeners[r].splice(t,1),!0}catch(e){this.logger.log(g.ERROR,e.message),this.errorHandler.handleError(e)}return!1},Ee.prototype.clearAllNotificationListeners=function(){try{r.objectValues(R).forEach(function(e){this.__notificationListeners[e]=[]}.bind(this))}catch(e){this.logger.log(g.ERROR,e.message),this.errorHandler.handleError(e)}},Ee.prototype.clearNotificationListeners=function(e){try{this.__notificationListeners[e]=[]}catch(e){this.logger.log(g.ERROR,e.message),this.errorHandler.handleError(e)}},Ee.prototype.sendNotifications=function(e,t){try{(this.__notificationListeners[e]||[]).forEach(function(i){var n=i.callback;try{n(t)}catch(t){this.logger.log(g.ERROR,r.sprintf(c.NOTIFICATION_LISTENER_EXCEPTION,"NOTIFICATION_CENTER",e,t.message))}}.bind(this))}catch(e){this.logger.log(g.ERROR,e.message),this.errorHandler.handleError(e)}};var fe=Math.pow(2,32),_e={bucket:function(e){var t=e.experimentKeyMap[e.experimentKey].groupId;if(t){var i=e.groupIdMap[t];if(!i)throw new Error(r.sprintf(I.INVALID_GROUP_ID,"BUCKETER",t));if("random"===i.policy){var n=this.bucketUserIntoExperiment(i,e.bucketingId,e.userId,e.logger);if(null===n){var o=r.sprintf(c.USER_NOT_IN_ANY_EXPERIMENT,"BUCKETER",e.userId,t);return e.logger.log(g.INFO,o),null}if(n!==e.experimentId){var a=r.sprintf(c.USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP,"BUCKETER",e.userId,e.experimentKey,t);return e.logger.log(g.INFO,a),null}var s=r.sprintf(c.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP,"BUCKETER",e.userId,e.experimentKey,t);e.logger.log(g.INFO,s)}}var u=r.sprintf("%s%s",e.bucketingId,e.experimentId),l=this._generateBucketValue(u),E=r.sprintf(c.USER_ASSIGNED_TO_EXPERIMENT_BUCKET,"BUCKETER",l,e.userId);e.logger.log(g.DEBUG,E);var f=this._findBucket(l,e.trafficAllocationConfig);if(!e.variationIdMap.hasOwnProperty(f)){if(f){var _=r.sprintf(c.INVALID_VARIATION_ID,"BUCKETER");e.logger.log(g.WARNING,_)}return null}return f},bucketUserIntoExperiment:function(e,t,i,n){var o=r.sprintf("%s%s",t,e.id),a=this._generateBucketValue(o);n.log(g.DEBUG,r.sprintf(c.USER_ASSIGNED_TO_EXPERIMENT_BUCKET,"BUCKETER",a,i));var s=e.trafficAllocation;return this._findBucket(a,s)},_findBucket:function(e,t){for(var r=0;r<t.length;r++)if(e<t[r].endOfRange)return t[r].entityId;return null},_generateBucketValue:function(e){try{var t=n.v3(e,1);return parseInt(1e4*(t/fe),10)}catch(t){throw new Error(r.sprintf(I.INVALID_BUCKETING_ID,"BUCKETER",e,t.message))}}},ge=["and","or","not"];function Ie(e,t){if(Array.isArray(e)){var r=e[0],i=e.slice(1);switch("string"==typeof r&&-1===ge.indexOf(r)&&(r="or",i=e),r){case"and":return function(e,t){var r=!1;if(Array.isArray(e)){for(var i=0;i<e.length;i++){var n=Ie(e[i],t);if(!1===n)return!1;null===n&&(r=!0)}return!r||null}return null}(i,t);case"not":return function(e,t){if(Array.isArray(e)&&e.length>0){var r=Ie(e[0],t);return null===r?null:!r}return null}(i,t);default:return function(e,t){var r=!1;if(Array.isArray(e)){for(var i=0;i<e.length;i++){var n=Ie(e[i],t);if(!0===n)return!0;null===n&&(r=!0)}return!!r&&null}return null}(i,t)}}return t(e)}var ce=t.getLogger();function pe(e){return/^\d+$/.test(e)}function de(e){var t=e.indexOf("-"),r=e.indexOf("+");return!(t<0)&&(r<0||t<r)}function Ne(e){var t=e.indexOf("-"),r=e.indexOf("+");return!(r<0)&&(t<0||r<t)}function Re(e){var t=e,r="";if(function(e){return/\s/.test(e)}(e))return ce.warn(c.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;if(de(e)?(t=e.substring(0,e.indexOf("-")),r=e.substring(e.indexOf("-")+1)):Ne(e)&&(t=e.substring(0,e.indexOf("+")),r=e.substring(e.indexOf("+")+1)),"string"!=typeof t||"string"!=typeof r)return null;var i=t.split(".").length-1;if(i>2)return ce.warn(c.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;var n=t.split(".");if(n.length!=i+1)return ce.warn(c.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;for(var o=0,a=n;o<a.length;o++){if(!pe(a[o]))return ce.warn(c.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null}return r&&n.push(r),n}var Oe="CUSTOM_ATTRIBUTE_CONDITION_EVALUATOR",Te=t.getLogger(),he=["exact","exists","gt","ge","lt","le","substring","semver_eq","semver_lt","semver_le","semver_gt","semver_ge"],ve={};function Ae(e){return"string"==typeof e||"boolean"==typeof e||_.isNumber(e)}function ye(e,t){var r=e.value,i=typeof r,n=e.name,o=t[n],a=typeof o;return!Ae(r)||_.isNumber(r)&&!_.isSafeInteger(r)?(Te.warn(c.UNEXPECTED_CONDITION_VALUE,Oe,JSON.stringify(e)),null):null===o?(Te.debug(c.UNEXPECTED_TYPE_NULL,Oe,JSON.stringify(e),n),null):Ae(o)&&i===a?_.isNumber(o)&&!_.isSafeInteger(o)?(Te.warn(c.OUT_OF_BOUNDS,Oe,JSON.stringify(e),n),null):r===o:(Te.warn(c.UNEXPECTED_TYPE,Oe,JSON.stringify(e),a,n),null)}function Ue(e,t){var r=e.name,i=t[r],n=typeof i,o=e.value;return null!==o&&_.isSafeInteger(o)?null===i?(Te.debug(c.UNEXPECTED_TYPE_NULL,Oe,JSON.stringify(e),r),!1):_.isNumber(i)?!!_.isSafeInteger(i)||(Te.warn(c.OUT_OF_BOUNDS,Oe,JSON.stringify(e),r),!1):(Te.warn(c.UNEXPECTED_TYPE,Oe,JSON.stringify(e),n,r),!1):(Te.warn(c.UNEXPECTED_CONDITION_VALUE,Oe,JSON.stringify(e)),!1)}function Le(e,t){var r=e.name,i=t[r],n=typeof i,o=e.value;return"string"!=typeof o?(Te.warn(c.UNEXPECTED_CONDITION_VALUE,Oe,JSON.stringify(e)),null):null===i?(Te.debug(c.UNEXPECTED_TYPE_NULL,Oe,JSON.stringify(e),r),null):"string"!=typeof i?(Te.warn(c.UNEXPECTED_TYPE,Oe,JSON.stringify(e),n,r),null):function(e,t){var r=Re(t),i=Re(e);if(!r||!i)return null;for(var n=r.length,o=0;o<i.length;o++){if(n<=o)return de(e)||Ne(e)?1:-1;if(pe(r[o])){var a=parseInt(r[o]),s=parseInt(i[o]);if(a>s)return 1;if(a<s)return-1}else{if(r[o]<i[o])return de(e)&&!de(t)?1:-1;if(r[o]>i[o])return!de(e)&&de(t)?-1:1}}return de(t)&&!de(e)?-1:0}(o,i)}ve.exact=ye,ve.exists=function(e,t){var r=t[e.name];return null!=r},ve.gt=function(e,t){var r=t[e.name],i=e.value;if(!Ue(e,t)||null===i)return null;return r>i},ve.ge=function(e,t){var r=t[e.name],i=e.value;if(!Ue(e,t)||null===i)return null;return r>=i},ve.lt=function(e,t){var r=t[e.name],i=e.value;if(!Ue(e,t)||null===i)return null;return r<i},ve.le=function(e,t){var r=t[e.name],i=e.value;if(!Ue(e,t)||null===i)return null;return r<=i},ve.substring=function(e,t){var r=e.name,i=t[e.name],n=typeof i,o=e.value;if("string"!=typeof o)return Te.warn(c.UNEXPECTED_CONDITION_VALUE,Oe,JSON.stringify(e)),null;if(null===i)return Te.debug(c.UNEXPECTED_TYPE_NULL,Oe,JSON.stringify(e),r),null;if("string"!=typeof i)return Te.warn(c.UNEXPECTED_TYPE,Oe,JSON.stringify(e),n,r),null;return-1!==i.indexOf(o)},ve.semver_eq=function(e,t){var r=Le(e,t);if(null===r)return null;return 0===r},ve.semver_gt=function(e,t){var r=Le(e,t);if(null===r)return null;return r>0},ve.semver_ge=function(e,t){var r=Le(e,t);if(null===r)return null;return r>=0},ve.semver_lt=function(e,t){var r=Le(e,t);if(null===r)return null;return r<0},ve.semver_le=function(e,t){var r=Le(e,t);if(null===r)return null;return r<=0};var me=Object.freeze({__proto__:null,evaluate:function(e,t){var r=e.match;if(void 0!==r&&-1===he.indexOf(r))return Te.warn(c.UNKNOWN_MATCH_TYPE,Oe,JSON.stringify(e)),null;var i=e.name;return t.hasOwnProperty(i)||"exists"==r?(r&&ve[r]||ye)(e,t):(Te.debug(c.MISSING_ATTRIBUTE_VALUE,Oe,JSON.stringify(e),i),null)}}),Ve=t.getLogger();function Se(e){this.typeToEvaluatorMap=_.assign({},e,{custom_attribute:me})}function De(e){return"string"==typeof e&&""!==e}Se.prototype.evaluate=function(e,t,i){if(!e||0===e.length)return!0;i||(i={});var n=function(e){var n=t[e];if(n){Ve.log(g.DEBUG,r.sprintf(c.EVALUATING_AUDIENCE,"AUDIENCE_EVALUATOR",e,JSON.stringify(n.conditions)));var o=Ie(n.conditions,this.evaluateConditionWithUserAttributes.bind(this,i)),a=null===o?"UNKNOWN":o.toString().toUpperCase();return Ve.log(g.DEBUG,r.sprintf(c.AUDIENCE_EVALUATION_RESULT,"AUDIENCE_EVALUATOR",e,a)),o}return null}.bind(this);return Ie(e,n)||!1},Se.prototype.evaluateConditionWithUserAttributes=function(e,t){var i=this.typeToEvaluatorMap[t.type];if(!i)return Ve.log(g.WARNING,r.sprintf(c.UNKNOWN_CONDITION_TYPE,"AUDIENCE_EVALUATOR",JSON.stringify(t))),null;try{return i.evaluate(t,e,Ve)}catch(e){Ve.log(g.ERROR,r.sprintf(I.CONDITION_EVALUATOR_ERROR,"AUDIENCE_EVALUATOR",t.type,e.message))}return null};var Pe="DECISION_SERVICE",Ce=I,be=g,Fe=c,Me=T,ke=h;function Be(e){this.audienceEvaluator=new Se(e.UNSTABLE_conditionEvaluators),this.forcedVariationMap={},this.logger=e.logger,this.userProfileService=e.userProfileService||null}Be.prototype.getVariation=function(e,t,i,n){var o=this._getBucketingId(i,n);if(!this.__checkIfExperimentIsActive(e,t))return null;var a=e.experimentKeyMap[t],s=this.getForcedVariation(e,t,i);if(s)return s;var u=this.__getWhitelistedVariation(a,i);if(u)return u.key;var l=this.__resolveExperimentBucketMap(i,n);if(u=this.__getStoredVariation(e,a,i,l))return this.logger.log(be.INFO,r.sprintf(Fe.RETURNING_STORED_VARIATION,Pe,u.key,t,i)),u.key;if(!this.__checkIfUserIsInAudience(e,t,ke.EXPERIMENT,i,n,"")){var E=r.sprintf(Fe.USER_NOT_IN_EXPERIMENT,Pe,i,t);return this.logger.log(be.INFO,E),null}var f=this.__buildBucketerParams(e,t,o,i),_=_e.bucket(f);if(!(u=e.variationIdMap[_])){var g=r.sprintf(Fe.USER_HAS_NO_VARIATION,Pe,i,t);return this.logger.log(be.DEBUG,g),null}var I=r.sprintf(Fe.USER_HAS_VARIATION,Pe,i,u.key,t);return this.logger.log(be.INFO,I),this.__saveUserProfile(a,u,i,l),u.key},Be.prototype.__resolveExperimentBucketMap=function(e,t){t=t||{};var r=this.__getUserProfile(e)||{},i=t[d.STICKY_BUCKETING_KEY];return _.assign({},r.experiment_bucket_map,i)},Be.prototype.__checkIfExperimentIsActive=function(e,t){if(!z(e,t)){var i=r.sprintf(Fe.EXPERIMENT_NOT_RUNNING,Pe,t);return this.logger.log(be.INFO,i),!1}return!0},Be.prototype.__getWhitelistedVariation=function(e,t){if(e.forcedVariations&&e.forcedVariations.hasOwnProperty(t)){var i=e.forcedVariations[t];if(e.variationKeyMap.hasOwnProperty(i)){var n=r.sprintf(Fe.USER_FORCED_IN_VARIATION,Pe,t,i);return this.logger.log(be.INFO,n),e.variationKeyMap[i]}var o=r.sprintf(Fe.FORCED_BUCKETING_FAILED,Pe,i,t);return this.logger.log(be.ERROR,o),null}return null},Be.prototype.__checkIfUserIsInAudience=function(e,t,i,n,o,a){var s=Z(e,t),u=te(e);this.logger.log(be.DEBUG,r.sprintf(Fe.EVALUATING_AUDIENCES_COMBINED,Pe,i,a||t,JSON.stringify(s)));var l=this.audienceEvaluator.evaluate(s,u,o);return this.logger.log(be.INFO,r.sprintf(Fe.AUDIENCE_EVALUATION_RESULT_COMBINED,Pe,i,a||t,l.toString().toUpperCase())),l},Be.prototype.__buildBucketerParams=function(e,t,r,i){var n={};return n.experimentKey=t,n.experimentId=Y(e,t),n.userId=i,n.trafficAllocationConfig=Q(e,t),n.experimentKeyMap=e.experimentKeyMap,n.groupIdMap=e.groupIdMap,n.variationIdMap=e.variationIdMap,n.logger=this.logger,n.bucketingId=r,n},Be.prototype.__getStoredVariation=function(e,t,i,n){if(n.hasOwnProperty(t.id)){var o=n[t.id],a=o.variation_id;if(e.variationIdMap.hasOwnProperty(a))return e.variationIdMap[o.variation_id];this.logger.log(be.INFO,r.sprintf(Fe.SAVED_VARIATION_NOT_FOUND,Pe,i,a,t.key))}return null},Be.prototype.__getUserProfile=function(e){var t={user_id:e,experiment_bucket_map:{}};if(!this.userProfileService)return t;try{return this.userProfileService.lookup(e)}catch(t){this.logger.log(be.ERROR,r.sprintf(Ce.USER_PROFILE_LOOKUP_ERROR,Pe,e,t.message))}},Be.prototype.__saveUserProfile=function(e,t,i,n){if(this.userProfileService)try{n[e.id]={variation_id:t.id},this.userProfileService.save({user_id:i,experiment_bucket_map:n}),this.logger.log(be.INFO,r.sprintf(Fe.SAVED_VARIATION,Pe,t.key,e.key,i))}catch(e){this.logger.log(be.ERROR,r.sprintf(Ce.USER_PROFILE_SAVE_ERROR,Pe,i,e.message))}},Be.prototype.getVariationForFeature=function(e,t,i,n){var o=this._getVariationForFeatureExperiment(e,t,i,n);if(null!==o.variation)return o;var a=this._getVariationForRollout(e,t,i,n);return null!==a.variation?(this.logger.log(be.DEBUG,r.sprintf(Fe.USER_IN_ROLLOUT,Pe,i,t.key)),a):(this.logger.log(be.DEBUG,r.sprintf(Fe.USER_NOT_IN_ROLLOUT,Pe,i,t.key)),a)},Be.prototype._getVariationForFeatureExperiment=function(e,t,i,n){var o=null,a=null;if(t.hasOwnProperty("groupId")){var s=e.groupIdMap[t.groupId];s&&(o=this._getExperimentInGroup(e,s,i))&&-1!==t.experimentIds.indexOf(o.id)&&(a=this.getVariation(e,o.key,i,n))}else t.experimentIds.length>0?(o=ee(e,t.experimentIds[0],this.logger))&&(a=this.getVariation(e,o.key,i,n)):this.logger.log(be.DEBUG,r.sprintf(Fe.FEATURE_HAS_NO_EXPERIMENTS,Pe,t.key));var u=null;return null!==a&&null!==o&&(u=o.variationKeyMap[a]),{experiment:o,variation:u,decisionSource:Me.FEATURE_TEST}},Be.prototype._getExperimentInGroup=function(e,t,i){var n=_e.bucketUserIntoExperiment(t,i,i,this.logger);if(n){this.logger.log(be.INFO,r.sprintf(Fe.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP,Pe,i,n,t.id));var o=ee(e,n,this.logger);if(o)return o}return this.logger.log(be.INFO,r.sprintf(Fe.USER_NOT_BUCKETED_INTO_ANY_EXPERIMENT_IN_GROUP,Pe,i,t.id)),null},Be.prototype._getVariationForRollout=function(e,t,i,n){if(!t.rolloutId)return this.logger.log(be.DEBUG,r.sprintf(Fe.NO_ROLLOUT_EXISTS,Pe,t.key)),{experiment:null,variation:null,decisionSource:Me.ROLLOUT};var o=e.rolloutIdMap[t.rolloutId];if(!o)return this.logger.log(be.ERROR,r.sprintf(Ce.INVALID_ROLLOUT_ID,Pe,t.rolloutId,t.key)),{experiment:null,variation:null,decisionSource:Me.ROLLOUT};if(0===o.experiments.length)return this.logger.log(be.ERROR,r.sprintf(Fe.ROLLOUT_HAS_NO_EXPERIMENTS,Pe,t.rolloutId)),{experiment:null,variation:null,decisionSource:Me.ROLLOUT};var a,s,u,l,E,f,_=this._getBucketingId(i,n),g=o.experiments.length-1;for(a=0;a<g;a++){if(s=e.experimentKeyMap[o.experiments[a].key],f=a+1,this.__checkIfUserIsInAudience(e,s.key,ke.RULE,i,n,f)){if(this.logger.log(be.DEBUG,r.sprintf(Fe.USER_MEETS_CONDITIONS_FOR_TARGETING_RULE,Pe,i,f)),u=this.__buildBucketerParams(e,s.key,_,i),l=_e.bucket(u),E=e.variationIdMap[l])return this.logger.log(be.DEBUG,r.sprintf(Fe.USER_BUCKETED_INTO_TARGETING_RULE,Pe,i,f)),{experiment:s,variation:E,decisionSource:Me.ROLLOUT};this.logger.log(be.DEBUG,r.sprintf(Fe.USER_NOT_BUCKETED_INTO_TARGETING_RULE,Pe,i,f));break}this.logger.log(be.DEBUG,r.sprintf(Fe.USER_DOESNT_MEET_CONDITIONS_FOR_TARGETING_RULE,Pe,i,f))}var I=e.experimentKeyMap[o.experiments[g].key];if(this.__checkIfUserIsInAudience(e,I.key,ke.RULE,i,n,"Everyone Else")){if(this.logger.log(be.DEBUG,r.sprintf(Fe.USER_MEETS_CONDITIONS_FOR_TARGETING_RULE,Pe,i,"Everyone Else")),u=this.__buildBucketerParams(e,I.key,_,i),l=_e.bucket(u),E=e.variationIdMap[l])return this.logger.log(be.DEBUG,r.sprintf(Fe.USER_BUCKETED_INTO_EVERYONE_TARGETING_RULE,Pe,i)),{experiment:I,variation:E,decisionSource:Me.ROLLOUT};this.logger.log(be.DEBUG,r.sprintf(Fe.USER_NOT_BUCKETED_INTO_EVERYONE_TARGETING_RULE,Pe,i))}return{experiment:null,variation:null,decisionSource:Me.ROLLOUT}},Be.prototype._getBucketingId=function(e,t){var i=e;return null!=t&&"object"==typeof t&&t.hasOwnProperty(d.BUCKETING_ID)&&("string"==typeof t[d.BUCKETING_ID]?(i=t[d.BUCKETING_ID],this.logger.log(be.DEBUG,r.sprintf(Fe.VALID_BUCKETING_ID,Pe,i))):this.logger.log(be.WARNING,r.sprintf(Fe.BUCKETING_ID_NOT_STRING,Pe))),i},Be.prototype.removeForcedVariation=function(e,t,i){if(!e)throw new Error(r.sprintf(Ce.INVALID_USER_ID,Pe));if(!this.forcedVariationMap.hasOwnProperty(e))throw new Error(r.sprintf(Ce.USER_NOT_IN_FORCED_VARIATION,Pe,e));delete this.forcedVariationMap[e][t],this.logger.log(be.DEBUG,r.sprintf(Fe.VARIATION_REMOVED_FOR_USER,Pe,i,e))},Be.prototype.__setInForcedVariationMap=function(e,t,i){this.forcedVariationMap.hasOwnProperty(e)||(this.forcedVariationMap[e]={}),this.forcedVariationMap[e][t]=i,this.logger.log(be.DEBUG,r.sprintf(Fe.USER_MAPPED_TO_FORCED_VARIATION,Pe,i,t,e))},Be.prototype.getForcedVariation=function(e,t,i){var n,o=this.forcedVariationMap[i];if(!o)return this.logger.log(be.DEBUG,r.sprintf(Fe.USER_HAS_NO_FORCED_VARIATION,Pe,i)),null;try{var a=$(e,t);if(!a.hasOwnProperty("id"))return this.logger.log(be.ERROR,r.sprintf(Ce.IMPROPERLY_FORMATTED_EXPERIMENT,Pe,t)),null;n=a.id}catch(e){return this.logger.log(be.ERROR,e.message),null}var s=o[n];if(!s)return this.logger.log(be.DEBUG,r.sprintf(Fe.USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT,Pe,t,i)),null;var u=W(e,s);return u?this.logger.log(be.DEBUG,r.sprintf(Fe.USER_HAS_FORCED_VARIATION,Pe,u,t,i)):this.logger.log(be.DEBUG,r.sprintf(Fe.USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT,Pe,t,i)),u},Be.prototype.setForcedVariation=function(e,t,i,n){if(null!=n&&!De(n))return this.logger.log(be.ERROR,r.sprintf(Ce.INVALID_VARIATION_KEY,Pe)),!1;var o;try{var a=$(e,t);if(!a.hasOwnProperty("id"))return this.logger.log(be.ERROR,r.sprintf(Ce.IMPROPERLY_FORMATTED_EXPERIMENT,Pe,t)),!1;o=a.id}catch(e){return this.logger.log(be.ERROR,e.message),!1}if(null==n)try{return this.removeForcedVariation(i,o,t,this.logger),!0}catch(e){return this.logger.log(be.ERROR,e.message),!1}var s=q(e,t,n);if(!s)return this.logger.log(be.ERROR,r.sprintf(Ce.NO_VARIATION_FOR_EXPERIMENT_KEY,Pe,n,t)),!1;try{return this.__setInForcedVariationMap(i,o,s),!0}catch(e){return this.logger.log(be.ERROR,e.message),!1}};var xe=p.REVENUE,Ke=p.VALUE;function Ge(e,t){if(e.hasOwnProperty(xe)){var i=e[xe],n=void 0;return"string"==typeof i?(n=parseInt(i),isNaN(n)?(t.log(g.INFO,r.sprintf(c.FAILED_TO_PARSE_REVENUE,"EVENT_TAG_UTILS",i)),null):(t.log(g.INFO,r.sprintf(c.PARSED_REVENUE_VALUE,"EVENT_TAG_UTILS",n)),n)):"number"==typeof i?(n=i,t.log(g.INFO,r.sprintf(c.PARSED_REVENUE_VALUE,"EVENT_TAG_UTILS",n)),n):null}return null}function we(e,t){if(e.hasOwnProperty(Ke)){var i=e[Ke],n=void 0;return"string"==typeof i?(n=parseFloat(i),isNaN(n)?(t.log(g.INFO,r.sprintf(c.FAILED_TO_PARSE_VALUE,"EVENT_TAG_UTILS",i)),null):(t.log(g.INFO,r.sprintf(c.PARSED_NUMERIC_VALUE,"EVENT_TAG_UTILS",n)),n)):"number"==typeof i?(n=i,t.log(g.INFO,r.sprintf(c.PARSED_NUMERIC_VALUE,"EVENT_TAG_UTILS",n)),n):null}return null}function je(e,t){return"string"==typeof e&&("string"==typeof t||"boolean"==typeof t||_.isNumber(t)&&_.isSafeInteger(t))}var Ye="https://logx.optimizely.com/v1/events";function He(e){var t=e.attributes,r=e.configObj,i=r.anonymizeIP,n=r.botFiltering;null==i&&(i=!1);var o={snapshots:[],visitor_id:e.userId,attributes:[]},a={account_id:r.accountId,project_id:r.projectId,visitors:[o],revision:r.revision,client_name:e.clientEngine,client_version:e.clientVersion,anonymize_ip:i,enrich_decisions:!0};return Object.keys(t||{}).forEach((function(r){if(je(r,t[r])){var i=X(e.configObj,r,e.logger);i&&a.visitors[0].attributes.push({entity_id:i,key:r,type:"custom",value:t[r]})}})),"boolean"==typeof n&&a.visitors[0].attributes.push({entity_id:d.BOT_FILTERING,key:d.BOT_FILTERING,type:"custom",value:n}),a}var Xe=function(e){var t={httpVerb:"POST"},r=He(e);t.url=Ye;var i=function(e,t,r,i,n,o){var a=null;null!==t&&(a=H(e,t));var s=W(e,r);return null===s&&(s=""),{decisions:[{campaign_id:a,experiment_id:t,variation_id:r,metadata:{flag_key:o,rule_key:i,rule_type:n,variation_key:s}}],events:[{entity_id:a,timestamp:_.currentTimestamp(),key:"campaign_activated",uuid:_.uuid()}]}}(e.configObj,e.experimentId,e.variationId,e.ruleKey,e.ruleType,e.flagKey);return r.visitors[0].snapshots.push(i),t.params=r,t},Je=function(e){var t={httpVerb:"POST"},r=He(e);t.url=Ye;var i=function(e,t,r,i){var n={events:[]},o={entity_id:J(e,t),timestamp:_.currentTimestamp(),uuid:_.uuid(),key:t};if(r){var a=Ge(r,i);null!==a&&(o[p.REVENUE]=a);var s=we(r,i);null!==s&&(o[p.VALUE]=s),o.tags=r}return n.events.push(o),n}(e.configObj,e.eventKey,e.eventTags,e.logger);return r.visitors[0].snapshots=[i],t.params=r,t};function ze(e){var t,r;return null!==(r=null===(t=e.experiment)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function Ze(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function We(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.featureEnabled)&&void 0!==r&&r}var qe=t.getLogger("EVENT_BUILDER");function $e(e,t){var r=[];return Object.keys(t||{}).forEach((function(i){if(je(i,t[i])){var n=X(e,i,qe);n&&r.push({entityId:n,key:i,value:t[i]})}})),r}var Qe={createEventProcessor:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return new(o.LogTierV1EventProcessor.bind.apply(o.LogTierV1EventProcessor,E([void 0],e)))},LocalStoragePendingEventsDispatcher:o.LocalStoragePendingEventsDispatcher};var et="USER_PROFILE_SERVICE_VALIDATOR";var tt=function(){function e(e){var t=this,i=e.clientEngine;-1===N.indexOf(i)&&(e.logger.log(g.INFO,r.sprintf(c.INVALID_CLIENT_ENGINE,"OPTIMIZELY",i)),i="node-sdk"),this.clientEngine=i,this.clientVersion=e.clientVersion||"4.4.0",this.errorHandler=e.errorHandler,this.eventDispatcher=e.eventDispatcher,this.isOptimizelyConfigValid=e.isValidInstance,this.logger=e.logger,this.projectConfigManager=function(e){return new le(e)}({datafile:e.datafile,datafileOptions:e.datafileOptions,jsonSchemaValidator:e.jsonSchemaValidator,sdkKey:e.sdkKey}),this.disposeOnUpdate=this.projectConfigManager.onUpdate((function(e){t.logger.log(g.INFO,r.sprintf(c.UPDATED_OPTIMIZELY_CONFIG,"OPTIMIZELY",e.revision,e.projectId)),t.notificationCenter.sendNotifications(R.OPTIMIZELY_CONFIG_UPDATE)}));var n=this.projectConfigManager.onReady(),o=null;if(e.userProfileService)try{(function(e){if("object"==typeof e&&null!==e){if("function"!=typeof e.lookup)throw new Error(r.sprintf(I.INVALID_USER_PROFILE_SERVICE,et,"Missing function 'lookup'"));if("function"!=typeof e.save)throw new Error(r.sprintf(I.INVALID_USER_PROFILE_SERVICE,et,"Missing function 'save'"));return!0}throw new Error(r.sprintf(I.INVALID_USER_PROFILE_SERVICE,et))})(e.userProfileService)&&(o=e.userProfileService,this.logger.log(g.INFO,r.sprintf(c.VALID_USER_PROFILE_SERVICE,"OPTIMIZELY")))}catch(e){this.logger.log(g.WARNING,e.message)}this.decisionService=new Be({userProfileService:o,logger:this.logger,UNSTABLE_conditionEvaluators:e.UNSTABLE_conditionEvaluators}),this.notificationCenter=function(e){return new Ee(e)}({logger:this.logger,errorHandler:this.errorHandler});var a={dispatcher:this.eventDispatcher,flushInterval:e.eventFlushInterval,batchSize:e.eventBatchSize,maxQueueSize:e.eventMaxQueueSize,notificationCenter:this.notificationCenter};this.eventProcessor=Qe.createEventProcessor(a);var s=this.eventProcessor.start();this.readyPromise=Promise.all([n,s]).then((function(e){return e[0]})),this.readyTimeouts={},this.nextReadyTimeoutId=0}return e.prototype.isValidInstance=function(){return this.isOptimizelyConfigValid&&!!this.projectConfigManager.getConfig()},e.prototype.activate=function(e,t,i){try{if(!this.isValidInstance())return this.logger.log(g.ERROR,r.sprintf(c.INVALID_OBJECT,"OPTIMIZELY","activate")),null;if(!this.validateInputs({experiment_key:e,user_id:t},i))return this.notActivatingExperiment(e,t);var n=this.projectConfigManager.getConfig();if(!n)return null;try{var o=this.getVariation(e,t,i);if(null===o)return this.notActivatingExperiment(e,t);if(!b(n,e)){var a=r.sprintf(c.SHOULD_NOT_DISPATCH_ACTIVATE,"OPTIMIZELY",e);return this.logger.log(g.DEBUG,a),o}var s=M(n,e),u={experiment:s,variation:s.variationKeyMap[o],decisionSource:T.EXPERIMENT};return this.sendImpressionEvent(u,"",t,i),o}catch(i){this.logger.log(g.ERROR,i.message);var l=r.sprintf(c.NOT_ACTIVATING_USER,"OPTIMIZELY",t,e);return this.logger.log(g.INFO,l),this.errorHandler.handleError(i),null}}catch(e){return this.logger.log(g.ERROR,e.message),this.errorHandler.handleError(e),null}},e.prototype.sendImpressionEvent=function(e,t,r,i){var n=this.projectConfigManager.getConfig();if(n){var o=function(e){var t=e.configObj,r=e.decisionObj,i=e.userId,n=e.flagKey,o=e.userAttributes,a=e.clientEngine,s=e.clientVersion,u=r.decisionSource,l=ze(r),E=Ze(r),f=null,g=null;""!==l&&""!==E&&(g=q(t,l,E)),""!==l&&(f=Y(t,l));var I=null;return null!==f&&(I=H(t,f)),{type:"impression",timestamp:_.currentTimestamp(),uuid:_.uuid(),user:{id:i,attributes:$e(t,o)},context:{accountId:t.accountId,projectId:t.projectId,revision:t.revision,clientName:a,clientVersion:s,anonymizeIP:t.anonymizeIP||!1,botFiltering:t.botFiltering},layer:{id:I},experiment:{id:f,key:l},variation:{id:g,key:E},ruleKey:l,flagKey:n,ruleType:u}}({decisionObj:e,flagKey:t,userId:r,userAttributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n});this.eventProcessor.process(o),this.emitNotificationCenterActivate(e,t,r,i)}},e.prototype.emitNotificationCenterActivate=function(e,t,r,i){var n=this.projectConfigManager.getConfig();if(n){var o=e.decisionSource,a=ze(e),s=Ze(e),u=null,l=null;""!==a&&""!==s&&(l=F(n,a,s),u=P(n,a));var E,f={attributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n,experimentId:u,ruleKey:a,flagKey:t,ruleType:o,userId:r,variationId:l,logger:this.logger},_=Xe(f),g=n.experimentKeyMap[a];g&&g.variationKeyMap&&""!==s&&(E=g.variationKeyMap[s]),this.notificationCenter.sendNotifications(R.ACTIVATE,{experiment:g,userId:r,attributes:i,variation:E,logEvent:_})}},e.prototype.track=function(e,t,i,n){try{if(!this.isValidInstance())return void this.logger.log(g.ERROR,r.sprintf(c.INVALID_OBJECT,"OPTIMIZELY","track"));if(!this.validateInputs({user_id:t,event_key:e},i,n))return;var o=this.projectConfigManager.getConfig();if(!o)return;if(!G(o,e))return this.logger.log(g.WARNING,r.sprintf(c.EVENT_KEY_NOT_FOUND,"OPTIMIZELY",e)),void this.logger.log(g.WARNING,r.sprintf(c.NOT_TRACKING_USER,"OPTIMIZELY",t));var a=function(e){var t=e.configObj,r=e.userId,i=e.userAttributes,n=e.clientEngine,o=e.clientVersion,a=e.eventKey,s=e.eventTags,u=J(t,a),l=null,E=null;return s&&(l=Ge(s,qe),E=we(s,qe)),{type:"conversion",timestamp:_.currentTimestamp(),uuid:_.uuid(),user:{id:r,attributes:$e(t,i)},context:{accountId:t.accountId,projectId:t.projectId,revision:t.revision,clientName:n,clientVersion:o,anonymizeIP:t.anonymizeIP||!1,botFiltering:t.botFiltering},event:{id:u,key:a},revenue:l,value:E,tags:s}}({eventKey:e,eventTags:n=this.filterEmptyValues(n),userId:t,userAttributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:o});this.logger.log(g.INFO,r.sprintf(c.TRACK_EVENT,"OPTIMIZELY",e,t)),this.eventProcessor.process(a),this.emitNotificationCenterTrack(e,t,i,n)}catch(e){this.logger.log(g.ERROR,e.message),this.errorHandler.handleError(e);var s=r.sprintf(c.NOT_TRACKING_USER,"OPTIMIZELY",t);this.logger.log(g.ERROR,s)}},e.prototype.emitNotificationCenterTrack=function(e,t,r,i){try{var n=this.projectConfigMana