{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./scripts/app/Configuration/Configuration.ts","webpack:///./scripts/app/Utils.ts","webpack:///./scripts/app/Constants.ts","webpack:///./scripts/app/Configuration/IInitOptions.ts","webpack:///src/Utils.ts","webpack:///src/Api/IFloodgateStorageProvider.ts","webpack:///src/Api/ISurvey.ts","webpack:///src/Api/ISurveyComponent.ts","webpack:///src/Constants.ts","webpack:///src/FloodgateEngine.ts","webpack:///index.ts","webpack:///src/Surveys/SurveyDataSource.ts","webpack:///src/Surveys/Survey.ts","webpack:///src/GovernedChannel.ts","webpack:///src/Campaign/CampaignDefinitionProvider.ts","webpack:///src/Api/Api.ts","webpack:///src/ISurveyInfo.ts","webpack:///src/StateProviderHelpers.ts","webpack:///src/SurveyComponents/CommentComponent.ts","webpack:///src/SurveyComponents/PromptComponent.ts","webpack:///src/SurveyComponents/RatingComponent.ts","webpack:///src/Campaign/CampaignStateProvider.ts","webpack:///src/SurveyStatCollectionActivation.ts","webpack:///src/SurveyStatCollection.ts","webpack:///src/SurveyComponents/CVSurveyComponent.ts","webpack:///src/GovernedChannelStateProvider.ts","webpack:///src/SurveyStatCollectionEventActivity.ts","webpack:///./scripts/app/thirdparty/html2canvas/html2canvas.js","webpack:///./scripts/app/Localization.ts","webpack:///./node_modules/es6-promise/auto.js","webpack:///lib/es6-promise/utils.js","webpack:///lib/es6-promise/asap.js","webpack:///lib/es6-promise/then.js","webpack:///lib/es6-promise/promise/resolve.js","webpack:///lib/es6-promise/-internal.js","webpack:///lib/es6-promise/enumerator.js","webpack:///lib/es6-promise/promise.js","webpack:///lib/es6-promise/promise/all.js","webpack:///lib/es6-promise/promise/race.js","webpack:///lib/es6-promise/promise/reject.js","webpack:///lib/es6-promise.js","webpack:///lib/es6-promise/polyfill.js","webpack:///src/Api/IActivityListener.ts","webpack:///src/Api/IFloodgateSettingIdMap.ts","webpack:///src/Campaign/CampaignManager.ts","webpack:///src/Campaign/CampaignSurveyFactory.ts","webpack:///src/SurveyEvents.ts","webpack:///src/ActivityTrackingData.ts","webpack:///src/ActivityTrackingSet.ts","webpack:///src/SurveyMetadata.ts","webpack:///src/Surveys/FpsSurvey.ts","webpack:///src/SurveyComponents/MultipleChoiceComponent.ts","webpack:///src/Surveys/GenericMessagingSurfaceSurvey.ts","webpack:///src/Surveys/InterceptSurvey.ts","webpack:///src/SurveyComponents/InterceptComponent.ts","webpack:///src/Surveys/NlqsSurvey.ts","webpack:///src/Surveys/NpsSurvey.ts","webpack:///src/FloodgateSettings.ts","webpack:///src/Governor.ts","webpack:///src/SurveyActivityListener.ts","webpack:///src/ActivityTracker.ts","webpack:///src/IndexedTracker.ts","webpack:///src/ActivityTrackingContract.ts","webpack:///src/GovernanceUtils.ts","webpack:///src/UserFact/UserFactHelper.ts","webpack:///src/UserFact/UserFact.ts","webpack:///./scripts/app/thirdparty/aria-webjs-compact-sdk-1.2.2.js","webpack:///./scripts/app/Window/Window.ts","webpack:///./scripts/app/Logging/Telemetry/Contracts.ts","webpack:///./scripts/app/Logging/Telemetry/Aria.ts","webpack:///./scripts/app/Logging/Telemetry/AriaTelemetryLogger.ts","webpack:///./scripts/app/Logging/Telemetry/TelemetryLoggerFactory.ts","webpack:///./scripts/app/FloodgateCore/FloodgateStorageProvider.ts","webpack:///./scripts/app/Logging/Constants.ts","webpack:///./scripts/app/TargetedMessaging/TargetedMessagingCache.ts","webpack:///./scripts/app/Configuration/DynamicConfiguration.ts","webpack:///./scripts/app/Logging/Logging.ts","webpack:///./scripts/app/UIStrings/UIStrings.ts","webpack:///./scripts/app/CommonApp.ts","webpack:///./scripts/app/Version.ts","webpack:///./scripts/app/UI/UiConstants.ts","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///./scripts/app/Screenshot.ts","webpack:///./scripts/app/CommonUI.ts","webpack:///./scripts/app/Window/DomUtils.ts","webpack:///./scripts/app/Theme.ts","webpack:///./scripts/app/Transport/Petrol.ts","webpack:///./scripts/app/Transport/Files/Screenshot.ts","webpack:///./scripts/app/Transport/Files/Manifest.ts","webpack:///./scripts/app/Transport/Transport.ts","webpack:///./scripts/app/UI/Utils.ts","webpack:///./scripts/app/UI/SpinnerControl.ts","webpack:///./scripts/app/UI/BellyBand/TabFocus.ts","webpack:///./scripts/app/UI/BellyBand/Events.ts","webpack:///./scripts/app/UI/BellyBand/FormTemplates/FormTemplateType.ts","webpack:///./scripts/app/UI/CategoriesDropdown.ts","webpack:///./scripts/app/UI/RatingControl.ts","webpack:///./scripts/app/UI/BellyBand/FormTemplates/BasicFormTemplate.ts","webpack:///./scripts/app/UI/BellyBand/FormTemplates/SingleFormTemplate.ts","webpack:///./scripts/app/UI/BellyBand/Layout.ts","webpack:///./scripts/app/UI/Renderer.ts","webpack:///./scripts/app/UI/BellyBand/PanelTemplates/ThanksPanelTemplate.ts","webpack:///./scripts/app/UI/BellyBand/FormTemplates/UserVoiceFormTemplate.ts","webpack:///./scripts/app/UI/BellyBand/FormTemplates/FeedbackPortalIdeaTemplate.ts","webpack:///./scripts/app/UI/BellyBand/BellyBand.ts","webpack:///./scripts/app/WindowProperties.ts","webpack:///./scripts/app/App_InAppFeedback.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","configuration","feedbackSubmitted","validateCategoryOptions","categories","show","customCategories","customCategory","length","getFeedbackSubmitted","this","setFeedbackSubmitted","getCommonInitOptions","commonInitOptions","getInAppFeedbackInitOptions","inAppFeedbackInitOptions","getInAppFeedbackLaunchOptions","inAppFeedbackLaunchOptions","getFloodgateInitOptions","floodgateInitOptions","getFloodgateSurvey","floodgateSurvey","getSdkSessionId","sdkSessionId","getEventSampling","eventSampling","setCommonInitOptions","passedInitOptions","initOptions","appId","applicationGroup","build","cid","environment","intlFilename","intlUrl","webSurfacesResourceBaseUrl","locale","onError","originalLocale","primaryColour","secondaryColour","sessionId","stylesUrl","telemetryGroup","userEmail","webGroup","petrolTimeout","isCommercialHost","customResourcesSetExternally","emailPolicyValue","screenshotPolicyValue","ageGroup","authenticationType","applicationSettings","webSurfacesSettings","expectedValues","Strings","Css","undefined","None","processSessionId","extendedManifestData","JSON","stringify","RegExp","test","officeBuild","hexColourRegex","err","Unauthenticated","Undefined","parseEventSamplingOption","commonPolicyAllowAADC","determineAADCPolicy","setInAppFeedbackInitOptions","bugForm","onDismiss","screenshot","showEmailAddress","userVoice","url","transitionEnabled","isShowThanks","sendFeedbackPolicyValue","feedbackForumUrl","myFeedbackForumUrl","submitted","setInAppFeedbackLaunchOptions","launchOptions","Configuration","setFloodgateInitOptions","autoDismiss","campaignDefinitions","campaignFlights","campaignQueryParameters","onSurveyActivatedCallback","settingStorageCallback","uIStringGetter","authTokenCallback","surveyEnabled","augLoopCallback","customerVoiceSurveyParams","governanceServiceEnabled","governanceServiceConfig","personalizerEnabled","campaignId","onSurveyActivated","launcher","survey","surveyParams","launch","str","parseGovernanceServiceConfig","cvFlights","isCVSurveyEnabled","productName","uiHost","setFloodgateSurvey","checkIfSurveysEnabled","isFeedbackSurveyEnabledByAADC","getCVSurveyFlights","getProductName","getUIHost","AAD","MinorWithParentalConsent","MinorWithoutParentalConsent","getUserConsentGroup","Adult","NotAdult","MinorNoParentalConsentRequired","samplingOptions","eventInitSampling","event","index","type","sampleRate","config","forceServicelessSurveyDisplay","retry","timeout","simpleRequestEnabled","validateFeedbackType","feedbackType","Smile","Frown","Bug","guid","overrideValues","isNOU","isBoolean","isString","isObject","isEnumValue","isNumber","expectObject","expectNumber","expectString","expectBoolean","expectArray","Array","isArray","expectEnum","enumType","checkCssSelectorToBeSet","cssSelector","sheetIndex","document","styleSheets","currentStyleSheet","rulesIndex","rules","currentRule","selectorText","includes","error","FeedbackType","WebSurfacesIntLink","WebSurfacesProdLink","TMSAppID","TULIPSAppID","SDK_VERSION_PREFIX","CustomResources","AgeGroup","AuthenticationType","isDate","input","toString","isNaN","getTime","subtractSecondsWithoutOverflow","date","seconds","addSecondsWithoutOverflow","milliseconds","MIN_DATE_MILLISECONDS","Date","interval","units","toLowerCase","Error","isFinite","MAX_DATE_MILLISECONDS","extractLanguageSubtag","language","matches","match","randomHex4","Math","floor","random","substring","subTag","extractedSubTag","substr","keys","sort","values","id","push","newDate","sourceObject","targetobject","result","field","pad","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","arrIn","lastNonShuffledElement","pickIndex","temp","serializedValue","defaultValue","parsedObject","parse","e","IFloodgateStorageProvider","FileType","ISurvey","Type","DOM_FEEDBACKSURVEY_TAGNAME","DOM_NPS_TAGNAME","DOM_PSAT_TAGNAME","DOM_BPS_TAGNAME","DOM_FPS_TAGNAME","DOM_NLQS_TAGNAME","DOM_INTERCEPT_TAGNAME","LAUNCHER_TYPE_DEFAULT","ISurveyComponent","DOM_PROMPT_TAGNAME","DOM_COMMENT_TAGNAME","DOM_RATING_TAGNAME","DOM_CVSURVEY_TAGNAME","DOM_MULTIPLECHOICE_TAGNAME","JSON_INTERCEPT_KEYNAME","JSON_INTERCEPTURL_KEYNAME","JSON_PROMPT_KEYNAME","JSON_PROMPTYESTEXT_KEYNAME","JSON_PROMPTNOTEXT_KEYNAME","JSON_COMMENT_KEYNAME","JSON_RATING_KEYNAME","JSON_CVSURVEY_KEYNAME","JSON_CVSURVEYFORMID_KEYNAME","JSON_CVSURVEYTHEME_KEYNAME","JSON_RATINGOPTIONS_KEYNAME","JSON_CVSURVEYPRODUCTNAME_KEYNAME","JSON_CVSURVEYUIHOST_KEYNAME","JSON_CVSURVEYPLATFORM_KEYNAME","JSON_TITLE_KEYNAME","JSON_QUESTION_KEYNAME","JSON_MULTIPLECHOICE_KEYNAME","JSON_APPLICATION_KEYNAME","JSON_EXTENDEDMANIFESTDATA_KEYNAME","JSON_SURVEYSTRINGS_KEYNAME","JSON_SURVEYSPECIFICDATA_KEYNAME","CampaignState","Deserialize","Failed","FileBasedCampaignStateProvider","Load","HostBasedCampaignStateProvider","GetStatesFromHost","Floodgate","Initialize","Start","Warning","SurveysDisabled","UserFactsLoad","UserFactsSpecDeserialization","UserFactsSpecIsAMatch","Mismatch","Summary","FloodgateEngine","Make","Common","StartAsync","Stopped","OnSurveyActivated","ActivationStatsSuppressedSurvey","ClosedChannelType","SurveyNotDefined","SessionSuppressedSurvey","ActivationExpiredSurvey","ActivationIrrelevantSurvey","CheckGovernanceServiceAndActivateSurvey","GovernanceServiceForceToDisplay","GovernanceServiceClientCompleted","GovernedChannelState","FileBasedGovernedChannelStateProvider","HostBasedGovernedChannelStateProvider","SurveyStatCollectionActivation","FromJson","ToJson","HostBasedSurveyActivationStatsProvider","GetSurveyStatsFromHost","SurveyStatCollectionEventActivity","SurveyActivity","LogActivity","EventsReprocessed","SurveysReprocessed","SetActivityTrackingContracts","DuplicateSurveyID","TelemetryEvent","log_TriggerMet","surveyId","surveyType","surveyActivityInfo","additionalSurveyInfo","log_UserSelected","log_CampaignLoad_Failed","errorMessage","log_Error","eventId","log_Event","properties","log_LocalError","message","defaultSurveyActivityListener","run","shouldAcceptActivity","activityName","globalSessionSurveyActivationCounts","surveyClient","activityListener","launcherFactory","storage","governor","surveyActivationStatsProvider","transporterFactory","governanceServiceClient","initializationStatus","candidateSurveys","launchedSurveys","launchedLaunchers","surveyEventSent","staleTriggeredSurveysQueue","loggedFirstStart","setPendingSurveys","clearSurveys","thisObj","setCallback","contextInfo","setTelemetryLogger","telemetryLogger","getTelemetryLogger","getTransportFactory","make","buildVersion","fileBasedStorageProvider","hostBasedStorageProvider","stringProvider","environmentProvider","campaignDefinitionProviders","userFactsProvider","governedChannelStateProvider","GovernedChannelStateProviderFactory","SurveyActivationStatsProviderFactory","campaignStateProvider","CampaignStateProviderFactory","FileSystemCampaignDefinitionProvider","CampaignManager","SurveyActivityListener","Governor","ErrorMessage","ErrorDetails","stack","mergeAndSave","saveSettings","saveSurveyActivationHistory","saveSurveyEventActivityHistory","saveCurrentState","saveChannelStates","start","setInitializationStatus","loadSettingsAndPriorEventCounts","channelTypes","getAvailableChannelTypes","refreshSurveyDefinitions","setPendingSurveysAndStartFloodgate","startAsync","Promise","resolve","reject","refreshSurveyDefinitionsAsync","then","stop","catch","updateActivityListenerWithCurrentSurveyDefinitions","getActivityListener","status","fileLock","FloodgateSettings","writeString","toJson","floodgateSettings","fileUnlock","previousSurveyActivationStats","load","previousSurveyEventActivityStats","fromJson","readString","SurveyEventActivityStats","stats","getStats","channels","getAvailableChannelData","forEach","channel","getType","getAppSurveys","logActivity","FloodgateStartActivityName","updateSurveyActivationStats","surveyInfo","getSurveyInfo","getId","SurveyActivationStats","ExpirationTimeUtc","getExpirationTimeUtc","ActivationTimeUtc","SurveyLaunchCount","addStats","statCollection","previousStats","updateCollection","accumulate","save","now","isActiveForDate","allActivities","getActivationEvent","getTrackingSet","getList","data","getIsAggregate","getActivity","Counts","moveSessionCountIntoBaseCount","activity","saveSessionTrackingActivity","pendingSurveys","AcceptsSurvey","getCurrentSurveyDefinitions","surveyList","allCampaignDefinitionIDs","getAllCampaignDefinitionIDs","allCandidateCampaignDefinitionIDs","getAllCandidateCampaignDefinitionIDs","allCampaignDefinitions","getCampaignDefinitions","isSurveyAllowed","isBusinessCriticalSurvey","surveyActivationStats","getBySurveyId","isMultiLaunchSurvey","hasSurveyReachedMaxLaunches","hasSurveyReachedMaxLaunchesPerSession","getBackEndId","indexOf","getAdditionalSurveyInfoForTelemetry","percentageNumerator","percentageDenominator","nominationPeriodNumber","cooldownPeriodNumber","correspondingCampaignDefinition","getCampaignId","nominationScheme","nominationPeriod","asTimeIntervalSeconds","cooldownPeriod","channelType","getGovernedChannelType","contextCount","surveyLauncherType","getLauncherType","businessLevel","getBusinessLevel","maxLaunches","getMaxLaunches","maxLaunchesPerSession","getMaxLaunchesPerSession","candidateSurvey","definitionsKey","definition","trackingContractList","trackingContract","ActivityTrackingContract","setCriticalPendingSurveysAndUpdateActivityListener","activeSurveys","isCriticalSurvey","tempSurvey","governedChannelType","isEnabled","checkGovernanceServiceAndActivateSurvey","activateSurvey","launchSurvey","refreshChannelData","isChannelOpen","CampaignId","SurveyId","triggeredSurvey","GovernedChannelType","activityTrackingString","getActivityTrackingInfo","governanceServiceClientState","getClientState","startChannelCooldown","isSurveyComplete","launchLauncher","campaignDefinition","campaignCooldown","channelCooldown","GetChannelCoolDown","checkGovernancePermitAsync","serviceResult","Message","createGorvernanceResponseTelemetry","shouldForceDisplay","permission","lastSurveyTriggerInfo","lastTriggerSurvey","lastTriggerSurveyTime","clearSurveyWithChannel","shift","fileType","read","write","makeSurveyLauncher","UpdateActivityTrackingContracts","FloodgateEngineStatus","GovernanceServiceResult","StaleTriggeredSurveysQueueCount","DefaultFloodgateTelemetryLogger","Api","Utils","getDistantFuture","getDistantPast","getDefault","expirationTimeUtc","activationEvent","backEndIdentifier","launcherType","getRawStartTimeUtc","startTimeUtc","getStartTimeUtc","parsed","getRawExpirationTimeUtc","getPreferredLaunchType","preferredLaunchType","isAdditionalDataRequested","additionalDataToCheck","additionalDataRequested","getMetadata","metadata","getDomElements","doc","typeElement","createElement","ISurveyInfo","DOM_TYPE_TAGNAME","appendChild","createTextNode","DOM_TYPE_VALUE","idElement","DOM_ID_TAGNAME","getJsonElements","surveyObject","JSON_ID_KEYNAME","JSON_SURVEY_KEYNAME","SurveyDataSource","SurveyDataSourceData","getClientFeedbackId","clientFeedbackId","submit","transporter","makeTransporter","setManifestValues","getPreGeneratedClientFeedbackId","Survey","Standard","cooldownSeconds","cooldownStartTime","setCooldownStartTime","cooldownEndTime","isOpen","isOpenAtDate","getName","getCooldownSeconds","getCooldownStartTime","getCooldownEndTime","GovernedChannel","isUtcDatetimeString","stringToDate","deserialize","CampaignLanguageRangeLanguageSubtag","validate","CampaignLanguageRange","languageSubTag","Value","isInRange","extractedLanguageSubTag","toLocaleUpperCase","isValidLanguageSubTag","CampaignScopeAny","CampaignScopeEnvironmentCrossProduct","CampaignScopeUserFactAny","CampaignScopeUserFactAll","CampaignScope","isInScope","languageRanges","Languages","readRange","setEnvironmentProvider","getLanguage","userFacts","deserializeUserFacts","setUserFactsProvider","some","userFact","rawUserFact","getUserFact","isAMatch","validateUserFacts","mismatchedFacts","filter","mismatchedNames","map","Count","CampaignDurationTimeInterval","CampaignDurationSingleBuildChange","CampaignDuration","intervalSeconds","IntervalSeconds","CampaignAdditionalDataRequested","additionalData","CampaignDistributionRamp","CampaignDistribution","maxDelaySeconds","MaxDelaySeconds","chunks","Chunks","CampaignNominationSchemeRatioPercentage","getActiveSurveyTimeIntervalSeconds","nominationTimIntervalSeconds","fallbackSurveyDurationSeconds","calculateSurveyStartTimeFromDate","soonestStartTime","calculateSurveyExpirationTimeFromSurveyStartTime","surveyStartTime","getCampaignCooldown","didUserActivateSurvey","CampaignNominationScheme","DistributionModel","distributionModel","CooldownPeriod","NominationPeriod","FallbackSurveyDurationSeconds","PercentageDenominator","PercentageNumerator","evaluateNominationRules","rand","CampaignSurveyEventCountedActivity","CampaignSurveyEventCountedActivitySequence","CampaignSurveyEvent","Activity","count","isAggregate","IsAggregate","sequence","Sequence","readActivity","optionalComponents","CampaignSurveyContent","prompt","CampaignSurveyContentPrompt","Prompt","rating","CampaignSurveyContentRating","Rating","comment","CampaignSurveyContentComment","Question","multipleChoice","CampaignSurveyContentMultipleChoice","MultipleChoice","intercept","CampaignSurveyContentIntercept","Intercept","cvSurvey","CampaignSurveyContentCVSurvey","CVSurveyParams","question","availableOptions","AvailableOptions","minNumberOfSelectedOptions","MinNumberOfSelectedOptions","maxNumberOfSelectedOptions","MaxNumberOfSelectedOptions","customerVoiceFormId","CustomerVoiceFormId","title","Title","yesLabel","YesLabel","noLabel","NoLabel","Url","isZeroBased","IsZeroBased","ratingValuesAscending","RatingValuesAscending","CampaignSurveyMetadata","contentMetadata","ContentMetadata","CampaignSurveyTemplateNps5PointStatic","CampaignSurveyTemplateNps11PointStatic","CampaignSurveyTemplateFps","CampaignSurveyTemplateNlqs","CampaignSurveyTemplateNps","CampaignSurveyTemplateGenericMessagingSurface","CampaignSurveyTemplateIntercept","CampaignSurveyTemplate","ActivationEvent","content","Content","Metadata","MaxLaunches","MaxLaunchesPerSession","PreferredLaunchType","CampaignDefinition","startTime","StartTimeUtc","endTime","EndTimeUtc","LauncherType","primaryPriority","PrimaryPriority","tags","Tags","AdditionalDataRequested","SurveyTemplate","surveyTemplate","NominationScheme","Scope","scope","BusinessLevel","FilterValidCampaignDefinitions","badIndexes","newDefinition","readDefinitions","definitionString","CampaignDefinitions","loadAsync","definitions","IActivityListener","IFloodgateSettingIdMap","items","itemCount","add","find","remove","item","ItemCollection","itemValue","beginPos","SETTING_DATA_OPEN_TAG","endPos","SETTING_DATA_CLOSE_TAG","previousStates","currentStates","stateCollections","mergedStates","toBeUpdatedStates","previousState","currentState","pos","splice","current","LastCooldownEndTimeUtc","getCooldownStartDate","LastNominationTimeUtc","currentStats","statsCollections","mergedStats","toBeUpdatedStats","previousStatsDictionary","currentStatsDictionary","currentActivationStats","toBeUpdatedStatsDictionary","toBeUpdated","userComment","CommentComponent","getQuestion","setSubmittedText","getSubmittedText","element","getComponentJson","CommentComponentData","yesButtonLabel","noButtonLabel","selectedButton","PromptComponent","getTitle","getYesButtonText","getNoButtonText","setButtonSelected","selected","getButtonSelected","promptButtonToString","PromptComponentData","selectedIndex","RatingComponent","getRatingValuesAscending","getSelectedRating","isRatingIndexValid","setSelectedRatingIndex","getSelectedRatingIndex","getNormalizedRatingScore","toFixed","RatingComponentData","lastNominationTime","lastNominationBuildNumber","deleteAfterSecondsWhenStale","ForceCandidacy","isCandidate","didCandidateTriggerSurvey","lastSurveyActivatedTime","lastSurveyId","lastSurveyStartTime","lastSurveyExpirationTime","lastCooldownEndTimeUtc","LastNominationBuildNumber","DeleteAfterSecondsWhenStale","IsCandidate","DidCandidateTriggerSurvey","LastSurveyActivatedTimeUtc","LastSurveyId","LastSurveyStartTimeUtc","LastSurveyExpirationTimeUtc","markCurrentSurveyTakenOnDate","fileBasedStorage","hostBasedStorage","fileBasedStateProvider","statesFromFile","statesFromHost","getStatesFromHost","StateProviderHelpers","MergeAndUpdateCampaignStates","campaignStates","StateCollections","state","stateValue","makeSettingItemValue","upsertSettingItem","CampaignStates","states","settings","readSettingList","dataString","extractSettingItemValueSubString","itemObject","newState","fileData","FileData","json","readStats","other","rawStats","Surveys","newStat","SurveyStatCollection","FileBasedSurveyActivationStatsProvider","surveyStatsFromHost","getSurveyStatsFromHost","surveyStatsFromFile","MergeAndUpdateSurveyActivationStats","statsFromHost","statsCollection","itemData","newStats","deleteSettingItem","surveyStatCollectionActivation","SurveyLaunchCountPerSession","CVSurveyComponent","getFormId","CVSurveyComponentData","ChannelType","CooldownStartTimeUtc","MergeAndUpdateGovernedChannelStates","GovernedChannelStates","String","ChannelStates","ourStats","resizedCounts","slice","val","extendStatics","b","setPrototypeOf","__proto__","__extends","__","constructor","__assign","assign","arguments","apply","__awaiter","thisArg","_arguments","P","generator","fulfilled","step","next","rejected","done","__generator","body","f","y","g","_","label","sent","trys","ops","verb","iterator","v","op","TypeError","pop","Bounds","x","w","h","left","top","width","height","fromClientRect","clientRect","parseBounds","node","getBoundingClientRect","toCodePoints","codePoints","charCodeAt","extra","fromCodePoint","_i","codeUnits","codePoint","fromCharCode","chars","lookup","Uint8Array","TokenType","slice16","view","end","Uint16Array","Trie","initialValue","errorValue","highStart","highValueIndex","ix","UTRIE2_DATA_BLOCK_LENGTH","UTRIE2_INDEX_1_OFFSET","UTRIE2_INDEX_2_BLOCK_LENGTH","SP","BA","HY","CL","CP","EX","IN","NS","OP","IS","NU","PO","PR","SY","AL","EB","EM","H2","H3","ID","JL","JV","JT","SA","UnicodeTrie","base64","buffer","encoded1","encoded2","encoded3","encoded4","bufferLength","len","ArrayBuffer","bytes","decode","view32","polyUint32Array","Uint32Array","view16","polyUint16Array","headerLength","ceil","createTrieFromBase64","ALPHABETICS","HARD_LINE_BREAKS","SPACE","PREFIX_POSTFIX","LINE_BREAKS","concat","KOREAN_SYLLABLE_BLOCK","HYPHEN","isAdjacentWithSpaceIgnored","a","currentIndex","classTypes","prev","previousNonSpaceClassType","_lineBreakAtIndex","indicies","forbiddenBreaks","beforeIndex","afterIndex","before","prevIndex","cssFormattedClasses","options","lineBreak","wordBreak","_a","types","classType","codePointsToCharacterClasses","isLetterNumber","letterNumber","Break","required","isDigit","isHex","isWhiteSpace","isNameStartCodePoint","isLowerCaseLetter","isUpperCaseLetter","isLetter","isNonASCIICodePoint","isNameCodePoint","isNonPrintableCodePoint","isValidEscape","c1","c2","isIdentifierStart","c3","isNumberStart","stringToNumber","sign","integers","int","parseInt","fraction","fracd","frac","expsign","exponent","exp","pow","LEFT_PARENTHESIS_TOKEN","RIGHT_PARENTHESIS_TOKEN","COMMA_TOKEN","SUFFIX_MATCH_TOKEN","PREFIX_MATCH_TOKEN","COLUMN_TOKEN","DASH_MATCH_TOKEN","INCLUDE_MATCH_TOKEN","LEFT_CURLY_BRACKET_TOKEN","RIGHT_CURLY_BRACKET_TOKEN","SUBSTRING_MATCH_TOKEN","BAD_URL_TOKEN","BAD_STRING_TOKEN","CDO_TOKEN","CDC_TOKEN","COLON_TOKEN","SEMICOLON_TOKEN","LEFT_SQUARE_BRACKET_TOKEN","RIGHT_SQUARE_BRACKET_TOKEN","WHITESPACE_TOKEN","EOF_TOKEN","Tokenizer","_value","chunk","tokens","token","consumeToken","consumeCodePoint","consumeStringToken","peekCodePoint","flags","consumeName","HASH_TOKEN","reconsumeCodePoint","consumeNumericToken","e1","e2","e3","consumeIdentLikeToken","a1","a2","a3","AT_KEYWORD_TOKEN","u1","u2","consumeUnicodeRangeToken","consumeWhiteSpace","DELIM_TOKEN","unshift","delta","digits","questionMarks","start_1","digit","UNICODE_RANGE_TOKEN","endDigits","consumeUrlToken","FUNCTION_TOKEN","IDENT_TOKEN","URL_TOKEN","stringToken","STRING_TOKEN","consumeBadUrlRemnants","consumeEscapedCodePoint","consumeStringSlice","amount","min","endingCodePoint","consumeNumber","repr","number","unit","DIMENSION_TOKEN","PERCENTAGE_TOKEN","NUMBER_TOKEN","hex","hexCodePoint","isSurrogateCodePoint","Parser","_tokens","tokenizer","parseValue","parseComponentValue","parseValues","parseComponentValues","SyntaxError","reconsumeToken","consumeComponentValue","consumeSimpleBlock","consumeFunction","block","isEndingTokenFor","functionToken","cssFunction","FUNCTION","isDimensionToken","isNumberToken","isIdentToken","isStringToken","isIdentWithValue","nonWhiteSpace","nonFunctionArgSeparator","parseFunctionArgs","args","arg","isLength","isLengthPercentage","parseLengthPercentageTuple","ZERO_LENGTH","FIFTY_PERCENT","HUNDRED_PERCENT","getAbsoluteValueForTuple","tuple","getAbsoluteValue","parent","angle","PI","isAngle","parseNamedSide","ident","join","deg","color","colorFunction","SUPPORTED_COLOR_FUNCTIONS","pack","namedColor","COLORS","toUpperCase","TRANSPARENT","isTransparent","asString","alpha","blue","green","red","round","getTokenColorValue","max","rgb","_b","hue2rgb","t1","t2","hue","PropertyDescriptorParsingType","BACKGROUND_CLIP","hsl","saturation","lightness","hsla","rgba","ALICEBLUE","ANTIQUEWHITE","AQUA","AQUAMARINE","AZURE","BEIGE","BISQUE","BLACK","BLANCHEDALMOND","BLUE","BLUEVIOLET","BROWN","BURLYWOOD","CADETBLUE","CHARTREUSE","CHOCOLATE","CORAL","CORNFLOWERBLUE","CORNSILK","CRIMSON","CYAN","DARKBLUE","DARKCYAN","DARKGOLDENROD","DARKGRAY","DARKGREEN","DARKGREY","DARKKHAKI","DARKMAGENTA","DARKOLIVEGREEN","DARKORANGE","DARKORCHID","DARKRED","DARKSALMON","DARKSEAGREEN","DARKSLATEBLUE","DARKSLATEGRAY","DARKSLATEGREY","DARKTURQUOISE","DARKVIOLET","DEEPPINK","DEEPSKYBLUE","DIMGRAY","DIMGREY","DODGERBLUE","FIREBRICK","FLORALWHITE","FORESTGREEN","FUCHSIA","GAINSBORO","GHOSTWHITE","GOLD","GOLDENROD","GRAY","GREEN","GREENYELLOW","GREY","HONEYDEW","HOTPINK","INDIANRED","INDIGO","IVORY","KHAKI","LAVENDER","LAVENDERBLUSH","LAWNGREEN","LEMONCHIFFON","LIGHTBLUE","LIGHTCORAL","LIGHTCYAN","LIGHTGOLDENRODYELLOW","LIGHTGRAY","LIGHTGREEN","LIGHTGREY","LIGHTPINK","LIGHTSALMON","LIGHTSEAGREEN","LIGHTSKYBLUE","LIGHTSLATEGRAY","LIGHTSLATEGREY","LIGHTSTEELBLUE","LIGHTYELLOW","LIME","LIMEGREEN","LINEN","MAGENTA","MAROON","MEDIUMAQUAMARINE","MEDIUMBLUE","MEDIUMORCHID","MEDIUMPURPLE","MEDIUMSEAGREEN","MEDIUMSLATEBLUE","MEDIUMSPRINGGREEN","MEDIUMTURQUOISE","MEDIUMVIOLETRED","MIDNIGHTBLUE","MINTCREAM","MISTYROSE","MOCCASIN","NAVAJOWHITE","NAVY","OLDLACE","OLIVE","OLIVEDRAB","ORANGE","ORANGERED","ORCHID","PALEGOLDENROD","PALEGREEN","PALETURQUOISE","PALEVIOLETRED","PAPAYAWHIP","PEACHPUFF","PERU","PINK","PLUM","POWDERBLUE","PURPLE","REBECCAPURPLE","RED","ROSYBROWN","ROYALBLUE","SADDLEBROWN","SALMON","SANDYBROWN","SEAGREEN","SEASHELL","SIENNA","SILVER","SKYBLUE","SLATEBLUE","SLATEGRAY","SLATEGREY","SNOW","SPRINGGREEN","STEELBLUE","TAN","TEAL","THISTLE","TOMATO","TURQUOISE","VIOLET","WHEAT","WHITE","WHITESMOKE","YELLOW","YELLOWGREEN","CSSImageType","CSSRadialShape","CSSRadialExtent","backgroundClip","prefix","LIST","PADDING_BOX","CONTENT_BOX","BORDER_BOX","backgroundColor","TYPE_VALUE","format","parseColorStop","color$1","processColorStops","stops","lineLength","first","last","processStops","previous","stop_1","absoluteValue","gapBegin","stop_2","gapLength","gapValue","calculateGradientDirection","radian","corner","centerX","centerY","atan2","getAngleFromCorner","abs","sin","cos","halfWidth","halfHeight","halfLineLength","yDiff","xDiff","distance","sqrt","findCorner","closest","reduce","stat","cx","cy","optimumDistance","optimumCorner","Infinity","prefixLinearGradient","angle$1","firstToken","colorStop","LINEAR_GRADIENT","isGreenPixel","createForeignObjectSVG","xmlns","svg","createElementNS","foreignObject","setAttributeNS","loadSerializedSVG","img","Image","onload","onerror","src","encodeURIComponent","XMLSerializer","serializeToString","FEATURES","createRange","range","testElement","style","TEST_HEIGHT","display","selectNode","rangeBounds","rangeHeight","removeChild","testRangeBounds","canvas","ctx","getContext","drawImage","toDataURL","testSVG","from","window","fetch","fillStyle","fillRect","greenImageSrc","getImageData","backgroundImage","size","testForeignObject","crossOrigin","XMLHttpRequest","responseType","Logger","enabled","debug","console","info","instances","destroy","getInstance","instance","CacheStorage","_caches","Cache","open","cache","getOrigin","link","_link","href","protocol","hostname","port","isSameOrigin","_origin","setContext","location","_current","attachInstance","detachInstance","_options","_cache","addImage","has","isBlobImage","isRenderable","loadImage","useCORS","useProxy","_this","isInlineImage","SUPPORT_CORS_IMAGES","proxy","SUPPORT_CORS_XHR","allowTaint","isInlineBase64Image","complete","setTimeout","imageTimeout","SUPPORT_RESPONSE_TYPE","xhr","response","reader_1","FileReader","addEventListener","readAsDataURL","timeout_1","ontimeout","send","INLINE_SVG","INLINE_BASE64","INLINE_IMG","SUPPORT_SVG_DRAWING","isSVG","prefixRadialGradient","shape","CIRCLE","FARTHEST_CORNER","position","isColorStop","acc","ELLIPSE","CLOSEST_SIDE","FARTHEST_SIDE","CLOSEST_CORNER","RADIAL_GRADIENT","BACKGROUND_REPEAT","image","image_1","URL","imageFunction","SUPPORTED_IMAGE_FUNCTIONS","isAtPosition_1","isSupportedImage","backgroundOrigin","backgroundPosition","BACKGROUND_SIZE","backgroundRepeat","parseBackgroundRepeat","NO_REPEAT","REPEAT_X","REPEAT_Y","REPEAT","BORDER_STYLE","backgroundSize","isBackgroundSizeInfoToken","borderColorForSide","side","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","borderRadiusForSide","borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius","FLOAT","borderStyleForSide","IDENT_VALUE","NONE","SOLID","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","borderWidthForSide","VALUE","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","bit","parseDisplayValue","LINE_BREAK","float","LEFT","RIGHT","INLINE_START","INLINE_END","letterSpacing","LIST_STYLE_POSITION","STRICT","NORMAL","lineHeight","TOKEN_VALUE","listStyleImage","LIST_STYLE_TYPE","listStylePosition","INSIDE","OUTSIDE","OVERFLOW","listStyleType","DISC","SQUARE","DECIMAL","CJK_DECIMAL","DECIMAL_LEADING_ZERO","LOWER_ROMAN","UPPER_ROMAN","LOWER_GREEK","LOWER_ALPHA","UPPER_ALPHA","ARABIC_INDIC","ARMENIAN","BENGALI","CAMBODIAN","CJK_EARTHLY_BRANCH","CJK_HEAVENLY_STEM","CJK_IDEOGRAPHIC","DEVANAGARI","ETHIOPIC_NUMERIC","GEORGIAN","GUJARATI","GURMUKHI","HEBREW","HIRAGANA","HIRAGANA_IROHA","JAPANESE_FORMAL","JAPANESE_INFORMAL","KANNADA","KATAKANA","KATAKANA_IROHA","KHMER","KOREAN_HANGUL_FORMAL","KOREAN_HANJA_FORMAL","KOREAN_HANJA_INFORMAL","LAO","LOWER_ARMENIAN","MALAYALAM","MONGOLIAN","MYANMAR","ORIYA","PERSIAN","SIMP_CHINESE_FORMAL","SIMP_CHINESE_INFORMAL","TAMIL","TELUGU","THAI","TIBETAN","TRAD_CHINESE_FORMAL","TRAD_CHINESE_INFORMAL","UPPER_ARMENIAN","DISCLOSURE_OPEN","DISCLOSURE_CLOSED","marginForSide","marginTop","marginRight","marginBottom","marginLeft","OVERFLOW_WRAP","overflow","HIDDEN","SCROLL","AUTO","VISIBLE","TEXT_ALIGN","overflowWrap","BREAK_WORD","paddingForSide","paddingTop","paddingRight","paddingBottom","paddingLeft","POSITION","textAlign","CENTER","TEXT_TRANSFORM","RELATIVE","ABSOLUTE","FIXED","STICKY","STATIC","textShadow","shadow","offsetX","offsetY","blur","VISIBILITY","textTransform","UPPERCASE","LOWERCASE","CAPITALIZE","transform","transformFunction","SUPPORTED_TRANSFORM_FUNCTIONS","matrix","matrix3d","b1","b2","a4","b4","DEFAULT_VALUE","DEFAULT","transformOrigin","origins","WORD_BREAK","visibility","COLLAPSE","FONT_STYLE","BREAK_ALL","KEEP_ALL","zIndex","auto","order","opacity","textDecorationColor","textDecorationLine","line","fontFamily","isStringToken$1","fontSize","fontWeight","fontVariant","PseudoElementType","fontStyle","OBLIQUE","ITALIC","contains","counterIncrement","increments","filtered","counter","increment","counterReset","resets","reset","quotes","open_1","close_1","close","getQuote","depth","quote","boxShadow","spread","inset","CSSParsedDeclaration","declaration","cssFloat","overflowTuple","overflowX","overflowY","isVisible","isTransformed","isPositioned","isPositionedWithZIndex","isFloating","isInlineLevel","CSSParsedPseudoDeclaration","CSSParsedCounterDeclaration","descriptor","parser","length_1","value_1","ElementContainer","styles","getComputedStyle","textNodes","elements","isHTMLElementNode","bounds","TextBounds","text","getWrapperBounds","ownerDocument","wrapper","cloneNode","parentNode","replaceChild","firstChild","getRangeBounds","offset","setStart","setEnd","breakText","breakWords","bk","breaker","forbiddenBreakpoints","lastEnd","nextIndex","LineBreaker","words","TextContainer","transform$1","textBounds","textList","trim","SUPPORT_RANGE_BOUNDS","replacementNode","splitText","parseTextBounds","replace","capitalize","p1","p2","ImageElementContainer","_super","currentSrc","intrinsicWidth","naturalWidth","intrinsicHeight","naturalHeight","CanvasElementContainer","SVGElementContainer","baseVal","LIElementContainer","OLElementContainer","reversed","CHECKBOX_BORDER_RADIUS","RADIO_BORDER_RADIUS","PASSWORD","InputElementContainer","checked","placeholder","SelectElementContainer","option","TextareaElementContainer","parseColor","IFrameElementContainer","iframe","contentWindow","documentElement","tree","parseTree","documentBackgroundColor","bodyBackgroundColor","LIST_OWNERS","parseNodeTree","root","childNode","nextNode","nextSibling","isTextNode","isElementNode","container","createContainer","createsRealStackingContext","createsStackingContext","tagName","isTextareaElement","isSVGElement","isSelectElement","isImageElement","isCanvasElement","isLIElement","isOLElement","isInputElement","isIFrameElement","isBodyElement","nodeType","Node","TEXT_NODE","ELEMENT_NODE","isStyleElement","isScriptElement","CounterState","counters","getCounterValue","getCounterValues","canReset","entry","counterNames","ROMAN_UPPER","createAdditiveCounter","symbols","fallback","suffix","createCounterText","string","integer","createCounterStyleWithSymbolResolver","codePointRangeLength","isNumeric","resolver","createCounterStyleFromRange","codePointRangeStart","codePointRangeEnd","createCounterStyleFromSymbols","createCJKCounter","numbers","multipliers","negativeSign","tmp","coefficient","appendSuffix","defaultSuffix","cjkSuffix","koreanSuffix","spaceSuffix","CJK_TEN_COEFFICIENTS","CJK_ZEROS","DocumentCloner","scrolledElements","referenceElement","quoteDepth","toIFrame","windowSize","createIFrameContainer","scrollX","defaultView","pageXOffset","scrollY","pageYOffset","cloneWindow","documentClone","iframeLoad","iframeLoader","onclone","restoreNodeScroll","scrollTo","navigator","userAgent","clonedReferenceElement","nodeName","fonts","ready","serializeDoctype","doctype","restoreOwnerScroll","adoptNode","createElementClone","createCanvasClone","createStyleClone","sheet","cssRules","css","rule","cssText","textContent","inlineImages","clonedCanvas","clonedCtx","putImageData","clone","styleBefore","styleAfter","createPseudoHideStyles","resolvePseudoContent","BEFORE","child","hasAttribute","ignoreElements","copyStyles","insertBefore","after","AFTER","copyCSSStyles","scrollTop","scrollLeft","pseudoElt","anonymousReplacedElement","attr","getAttribute","counterStyle","counterState","counterType","delim","counterStates","counterType_1","separator","className","PSEUDO_HIDE_ELEMENT_CLASS_BEFORE","PSEUDO_HIDE_ELEMENT_CLASS_AFTER","PathType","cloneIframeContainer","border","scrolling","setAttribute","onreadystatechange","setInterval","childNodes","readyState","clearInterval","target","setProperty","getPropertyValue","internalSubset","publicId","systemId","createStyles","CORNER","equalPath","Vector","VECTOR","deltaX","deltaY","lerp","BezierCurve","startControl","endControl","BEZIER_CURVE","subdivide","firstHalf","ab","bc","cd","abbc","bccd","dest","reverse","isBezierCurve","path","BoundCurves","tlh","tlv","trh","trv","_c","brh","brv","_d","blh","blv","factors","maxFactor","topWidth","rightHeight","bottomWidth","leftHeight","topLeftBorderBox","getCurvePoints","TOP_LEFT","topRightBorderBox","TOP_RIGHT","bottomRightBorderBox","BOTTOM_RIGHT","bottomLeftBorderBox","BOTTOM_LEFT","topLeftPaddingBox","topRightPaddingBox","bottomRightPaddingBox","bottomLeftPaddingBox","topLeftContentBox","topRightContentBox","bottomRightContentBox","bottomLeftContentBox","r1","r2","kappa","ox","oy","xm","ym","calculateBorderBoxPath","curves","calculatePaddingBoxPath","TransformEffect","ClipEffect","StackingContext","inlineLevel","nonInlineLevel","negativeZIndex","zeroOrAutoZIndexOrTransformedOrOpacity","positiveZIndex","nonPositionedFloats","nonPositionedInlineLevel","ElementPaint","parentStack","effects","borderBox","paddingBox","getParentEffects","parseStackTree","stackingContext","realStackingContext","listItems","treatAsRealStackingContext","paintContainer","listOwnerItems","order_1","index_1","index_2","processListItems","owner","numbering","listValue","createPathFromCurves","outer1","inner1","outer2","inner2","contentBox","calculateBackgroundRendering","intrinsicSize","backgroundPositioningArea","calculateBackgroundPositioningArea","getBackgroundValueForIndex","backgroundPaintingArea","calculateBackgroundPaintingArea","backgroundImageSize","calculateBackgroundSize","sizeWidth","sizeHeight","calculateBackgroundRepeatPath","isAuto","hasIntrinsicValue","intrinsicProportion","second","hasIntrinsicProportion","CONTAIN","COVER","hasIntrinsicWidth","hasIntrinsicHeight","hasIntrinsicDimensions","width_3","height_3","repeat","FontMetrics","_data","_document","parseMetrics","span","margin","padding","verticalAlign","baseline","offsetTop","middle","getMetrics","CanvasRenderer","_activeEffects","scale","fontMetrics","translate","textBaseline","applyEffects","popEffect","effect","applyEffect","isTransformEffect","isClipEffect","clip","restore","renderStack","globalAlpha","renderStackContent","renderNode","paint","renderNodeBackgroundAndBorders","renderNodeContent","renderTextWithLetterSpacing","fillText","letter","measureText","createFontStyle","variant","renderTextNode","font","textShadows","shadowColor","shadowOffsetX","shadowOffsetY","shadowBlur","renderReplacedElement","box","windowWidth","windowHeight","render","fill","beginPath","arc","isTextInputElement","canvasTextAlign","computeLineHeight","_e","_f","_g","_h","_j","_k","_l","_m","_o","_p","mask","paths","moveTo","lineTo","formatPath","closePath","point","bezierCurveTo","renderRepeat","pattern","resizeImage","renderBackgroundImage","_loop_1","this_1","x0","x1","y0","y1","gradient_1","top_1","rx","ry","radialGradient_1","midX","midY","invF","createPattern","createLinearGradient","addColorStop","background","isRadialGradient","gradient","calculateRadius","createRadialGradient","renderBorder","curvePoints","borderSide","parsePathForBorder","hasBackground","borders","borders_1","calculateBackgroundCurvedPaintingArea","deltaW","deltaH","borderBoxArea","maskOffset","shadowPaintingArea","calculateContentBoxPath","ForeignObjectRenderer","loadSerializedSVG$1","parseColor$1","renderElement","opts","instanceName","resourceOptions","defaultOptions","windowBounds","documentCloner","clonedElement","bgColor","defaultBackgroundColor","renderOptions","scrollWidth","offsetWidth","clientWidth","scrollHeight","offsetHeight","clientHeight","parseDocumentSize","logging","removeContainer","foreignObjectRendering","devicePixelRatio","innerWidth","innerHeight","factory","supportedLocales","localeVariantToSupportedlocaleMap","localeUpperCase","supportedLocale","localePartOne","split","polyfill","isFunction","vertxNext","customSchedulerFn","asap","callback","queue","flush","scheduleFlush","browserWindow","browserGlobal","BrowserMutationObserver","MutationObserver","WebKitMutationObserver","isNode","self","isWorker","Uint8ClampedArray","importScripts","MessageChannel","useSetTimeout","globalSetTimeout","iterations","observer","onFulfillment","onRejection","noop","PROMISE_ID","makePromise","_state","invokeCallback","_result","subscribe","promise","_resolve","nextTick","observe","characterData","port1","onmessage","port2","postMessage","vertx","Function","require","runOnLoop","runOnContext","attemptVertx","handleMaybeThenable","maybeThenable","originalThen","originalResolve","thenable","fulfill","reason","handleOwnThenable","sealed","fulfillmentHandler","rejectionHandler","tryThen","_label","handleForeignThenable","publishRejection","_onerror","publish","_subscribers","subscribers","settled","detail","hasCallback","succeeded","Enumerator","Constructor","_instanceConstructor","_remaining","_enumerate","_eachEntry","_then","didError","_settledAt","_willSettleAt","enumerator","needsResolver","initializePromise","needsNew","finally","all","entries","race","Resolve","_reject","_setScheduler","scheduleFn","_setAsap","asapFn","_asap","local","promiseToString","cast","AppLaunch","AppUsageTime","AppResume","ActivityName","RoamingSettingIdMap","stateProvider","definitionProviders","currentBuildNumber","currentDate","isStateUpForNomination","buildNumber","campaignCooldownDuration","hasBuildChangeDurationElapsed","hasTimeIntervalDurationElapsed","isDateInRange","startDate","endDate","duration","startBuild","isCampaignInScope","isDateInRangeWithDefinition","getActiveSurveys","surveys","prioritizedCampaigns","getPrioritizedCampaigns","CampaignSurveyFactory","makeSurvey","onCampaignSurveyActivated","takenDate","getCampaignStates","getUserFacts","refreshSurveyDefinitionsPrivate","refreshSurveyDefinitionsPrivateAsync","errReason","makeArrayFromObjectValuesSortedByKeyString","loadAndFilterCampaignData","evaluateCampaigns","thisCampaignManager","loadAndFilterCampaignDataAsync","loadedDefinitions","promises","userFactsPromise","provider","setUserFacts","FilterCampaignData","loadedDefinitionsMap","Critical","loadedStates","staleLoadedStates","shouldRemove","matchingTagCampaigns","tagId","mapKey","maxPriority","cur","currentPriority","dateToShortUtcString","surveyDataSource","makeSurveyDataSourceData","surveyModel","NpsSurvey","make5Point","make11Point","FpsSurvey","makeFps","NlqsSurvey","makeNlqs","makeCustom","GenericMessagingSurfaceSurvey","InterceptSurvey","makeIntercept","surveyData","makeEvent","makeMetadata","makeCountedActivityEventData","eventModel","eventData","CountedActivityEventData","makeCountedActivityEvent","CountedActivityEvent","makeCountedActivitySequenceEvent","sequenceEventData","CountedActivitySequenceEventData","CountedActivitySequenceEvent","metadataModel","SurveyMetadata","getCount","trackingDataList","ActivityTrackingData","ActivityTrackingSet","countedActivityEventData","getSequence","countedActivityEvent","setCount","isOrdered","list","getIsOrdered","activitiesInfoObject","Activities","IsListOrdered","trackingData","actualCount","tempActivities","ActualCount","IsDiscrete","getContentMetadata","baseData","promptData","commentData","ratingData","multipleChoiceData","MultipleChoiceComponent","cvSurveyData","sp","FpsSurveyData","getCustomString","customString","MultipleChoiceComponentData","Fps","getCommentComponent","getPromptComponent","getRatingComponent","getMultipleChoiceComponent","getCVSurveyComponent","getComponent","componentType","makeSurveyStrings","makeResponseString","getOptionSelectedStates","numberOfOptions","selectedRating","actualStrings","optionStates","getAvailableOptions","getMinNumberofSelectedOptions","getMaxNumberofSelectedOptions","setOptionSelectedStates","selectedStates","ValidateMinNumberofSelectedOptions","ValidateMaxNumberofSelectedOptions","GenericMessagingSurfaceSurveyData","GenericMessagingSurface","InterceptComponent","interceptData","InterceptSurveyData","InterceptComponentData","getInterceptComponent","getUrl","NlqsSurveyData","Nlqs","NpsSurveyData","loadStringResource","Nps","DEFAULT_TEACHING_MESSAGE_COOLDOWN","channelStateProvider","loadChannels","channelData","defaultChannelData","SetDefaultChannelCoolDown","channelStates","channelState","loadChannelStatesFromProvider","Number","defaultData","newChannel","minute","hour","day","DefaultChannelData","Urgent","Banner","TeachingMessage","queuedActivities","pendingActivityCount","previousTrackedActivityMap","loggerCallback","activityContext","trackedActivityMap","resetSessionActivity","context","logActivity_private","logActivityStartTime","logActivityStopTime","stopTime","activityTrackingContracts","duplicateCounter","newMap","trackedSurveyIds","activityTrackingContract","trackingSet","baselineStats","baselineCounts","currentIndexedTrackers","currentBaselineIndex","tracker","newTracker","ActivityTracker","initCounts","generateActivityIndexList","activityIndex","indexedTracker","IndexedTracker","copyObject","getOwnPropertyNames","getIndexedTracker","getSessionCount","getSurveyIds","indexedTrackers","resetQueuedActivities","logType","timestamp","MaxPendingActivitiesQueueSize","activityNames","queuedActivity","ActivityNames","Dropped","logActivity_core","indices","fyShuffle","trackerSurveyId","incrementActivity","executeCallback","source","trackedActivities","activationMask","currentActivationFlags","isActivationByInitPending","currentCounts","currentStartTimes","currentSessionCounts","isValidIndex","getStartTime","sessionCount","otherTrackers","wasAlreadyActivatedThisSession","hasCountCrossedThreshold","finishActivityAtIndex","isActivated","indexList","ActivityIndex","startedLessThanThreshold","isPermittedIndexForActivationByInit","commitActivation","diff","UserFacts","userFactInput","UserFact","commonComparatorTypes","rawUserFactSpec","Values","Name","validateUserFactType","LatencyType","validateLatencyType","LatencyDurationInSeconds","IntervalType","supportedComparatorTypes","getComparatorTypes","Comparator","comparator","isComparatorTypeSupported","userFactType","latency","factType","userFactValue","isLatencyAcceptable","userFactSpecValue","rawUserFactValueInBoolean","compareValues","compareBooleanValues","getValue","getComparator","rawUserFactValueInMilliseconds","isAValidNumber","userFactName","userFactSpecValueInMilliseconds","compareDateTimeUTCValues","rawUserFactValueInNumber","compareNumberValues","compareStringValues","intervalType","currentTimeInMilliseconds","currentDateDiff","TimeMilliseconds","compareTimeIntervalValues","getIntervalType","compareListValues","getLatencyType","getLatencyDurationInSeconds","latencyType","latencyDurationInSeconds","userFactTime","sourceDateTime","storageDateTime","clientIngestionDateTime","userFactTimeInMilliseconds","evaluateFactCandidacy","userFactRawValue","isFactValueInTargetItem","userFactTargetValues","specValue","numberValue","rawUserFactName","configurable","Int64","numberStr","low","high","Equals","UInt64","ToByte","ToUInt8","ToInt16","ToInt32","ToUInt32","AWTPiiKind","Bond","Enums_1","AWTBondSerializer","getPayloadBlob","requestDictionary","tokenCount","stream","IO","MemoryStream","writer","CompactBinaryProtocolWriter","WriteFieldBegin","BondDataType","BT_MAP","WriteMapContainerBegin","BT_STRING","BT_LIST","WriteString","dataPackage","WriteContainerBegin","BT_STRUCT","newGuid","BT_INT64","WriteInt64","numberToBondInt64","WriteBlob","WriteStructEnd","GetBuffer","getEventBlob","propsString","piiProps","pii","NotSet","BT_INT32","WriteInt32","base64Encode","Encoding","Base64","GetString","default","microsoft_bond_primitives_1","GuidRegex","bond_value","isPii","Version","FullVersionString","AWT_1","AWT","AWT_COLLECTOR_URL_UNITED_STATES","AWT_COLLECTOR_URL_GERMANY","AWT_COLLECTOR_URL_JAPAN","AWT_COLLECTOR_URL_AUSTRALIA","AWT_COLLECTOR_URL_EUROPE","Utf8","GetBytes","array","char","inArray","num","output","paddingBytes","charAt","temp2","Varint","Varint64","Zigzag","EncodeZigzag32","EncodeZigzag64","tmpH","tmpL","res","_buffer","WriteByte","byte","Write","bond_const_1","_stream","blob","elementType","WriteUInt8","WriteUInt32","keyType","valueType","WriteUInt64","isBase","BT_STOP_BASE","BT_STOP","AWTKillSwitch","_killedTokenDictionary","setKillSwitchTenants","killTokens","killDuration","killedTokens","durationMs_1","ex","isTenantKilled","tenantToken","AWTBondSerializer_1","AWTRecordBatcher","_maxRequestSize","_outboundQueue","_currentBatch","_currentBatchSize","addEventToBatch","serializedEvent","flushBatch","AWTRetryPolicy","shouldRetryForStatus","httpStatusCode","getMillisToBackoffForRetry","retriesSoFar","waitDuration","randomBackoff","BaseBackoff","AWTTransmissionManager_1","EventNameAndTypeRegex","EventNameDotRegex","PropertyNameRegex","initialize","_isInitialized","_defaultTenantToken","_overrideValuesFromConfig","_config","_isDestroyed","flushAndTeardown","_sanitizeProperty","_contextProperties","logEvent","typePrefix","_addContextIfAbsent","_setDefaultProperty","_getInitId","_getSequenceId","toISOString","sendEvent","collectorUrl","sendingTimer","_initIdMap","_sequenceIdMap","context_1","AWTRecordBatcher_1","AWTRetryPolicy_1","AWTKillSwitch_1","AWTTransmissionManager","_inboundQueues","_recordBatcher","_newEventsAllowed","_urlString","_sendingTimer","_running","_timeout","_isCurrentlyFlushing","_batchAndSendEvents","_flushQueue","_flush","isTeardown","_sendRequest","_retryRequestIfNeeded","conn","request","apikey","retryCount","shouldRetry","_killSwitch","getResponseHeader","_handleRequestFinished","conn_1","tokenCount_1","apikey_1","clearTimeout","_checkPrimaryInboundQueueEmpty","_checkOutboundQueueEmptyAndSent","officeBrowserFeedback","OfficeBrowserFeedback","floodgate","getGlobal","version","getPlatform","App","PLATFORM","getVersion","getLocale","getSessionId","Event","ID_DELIMITER","getSource","SOURCE","getSchemaVersion","SCHEMA_VERSION","getSampleRate","audienceGroup","getAudienceGroup","primaryIdentityHash","tenantId","primaryIdentitySpace","generatePrimaryIdentitySpace","getTenantId","getPrimaryIdentityHash","getPrimaryIdentitySpace","startsWith","aria","namespace","app","session","host","release","browser","device","user","oesApp","oesSession","oesHost","oesRelease","oesBrowser","oesDevice","oesUser","setApp","setSession","setHost","setEvent","setRelease","setBrowser","setDevice","setUser","eventName","customProperties","oesEvent","AriaTelemetryLogger","EVENT_NAME_DELIMITER","ariaProperties","CUSTOM_PROPERTIES_FIELD_PREFIX","fileTypeToKeyMap","TmsCache_CampaignContent","TmsCache_MessageMetadata","TmsCache_UserGovernance","Tms_DynamicSettings","LogLevelSettings","DebugOverrides","isStorageAvailable","localStorage","setItem","removeItem","DOMException","code","safeReadObject","storageKey","getItem","SURVEY_FLOODGATE_FILEREAD_FAILED","FileName","SURVEY_FLOODGATE_FILEWRITE_FAILED","InApp","UI","Picker","Shown","Form","Submit","SURVEY_FLOODGATE_CAMPAIGNLOAD_FAILED","SURVEY_FLOODGATE_TRIGGERMET","SURVEY_FLOODGATE_USERSELECTED","SURVEY_UI_FORM_SHOWN","SURVEY_UI_FORM_SUBMIT","SURVEY_UI_FORM_SECONDARY_SUBMIT","SURVEY_UI_FORM_SUBMIT_ERROR","SURVEY_UI_FORM_USERCLOSED","SURVEY_UI_FORM_NO_RETURN_TYPE","SURVEY_UI_PROMPT_AUTODISMISSED","SURVEY_UI_PROMPT_SHOWN","SURVEY_UI_PROMPT_USERCLOSED","SURVEY_UI_PROMPT_CLICKED","SURVEY_UI_REDIRECTIONFAILURE","GOVERNANCE_SERVICEFAILURE","GOVERNANCE_SERVICERESULT","DYNAMICTRANSPORT_POST_ERROR","FEEDBACK_SURVEYSDISABLED_AADC","SURVEY_UI_DISABLED_AADC","PERSONALIZER_SERVICEREWARDRESULT","PERSONALIZER_CLIENTFAILURE","Shared","Upload","Prevented","Screenshot","Render","Success","GetContent","DefaultImage","Returned","WebSurfaces","Info","Messaging","Requests","LocalFact","AugLoop","Provider","useLocalStorage","cachedItems","setContentItem","contentType","expiryTime","cacheItem","createItem","getItemContent","isItemExpired","expiryDate","lastRetrievedDate","updateItemInLocalStorage","floodgateStorage","initCachedItemsFromLocalStorage","contentKey","tempStorageItem","mapContentTypeToFloodgateProviderKey","tempCacheItem","parseObjectFromCache","tempItem","dynamicSettingsTmsgCache","logger","env","getLogger","uIStrings","initOptionsCommon","SAMPLING_RESULT","logSeverity","internalSampleRate","DEFAULT_SAMPLE_RATE","isEventSampled","getEventSamplingRate","isConsoleLogEnabled","log","EVENT_NAME","EVENT_ID","isLoggingEnabled","isEventTelemetryEnabled","logLocal","others","getUserSamplingRate","dynamicLogSettings","settingName","overrideSettings","inputLogLevel","logLevel","currentLogLevel","getCurrentLogLevel","urlParams","URLSearchParams","search","consoleLogParam","documentReferrer","referrer","logLevelParam","settingsObj","settingValue","returnValue","parseFloat","getDynamicSetting","parseObject","logSettings","consoleLog","getTenantToken","TokenManager","TENANT_TOKEN_PRODUCTION","TENANT_TOKEN_PRE_PRODUCTION","initialized","appName","appVersion","logSessionId","samplingOption","sdkVersion","Session","Host","Release","Browser","browserVersion","Device","deviceId","User","loggableUserId","Data","getUIStrings","Alt","AriaLabel","AriaSelected","AriaOrientation","AriaExpanded","AriaControls","AriaHasPopups","AriaModal","AriaLabelledBy","AriaDescribedBy","Class","DataHtml2CanvasIgnore","Disabled","Fill","For","Preview","Height","HRef","Id","MaxLength","Placeholder","Points","Rel","Role","Source","Stroke","TabIndex","Target","Transform","ViewBox","Width","xlinkHref","X","Y","BlankWindow","Button","Dialog","Tab","TabList","TabPanel","Checkbox","Checked","False","Zero","Polite","Radio","ScreenshotPreview","Text","TextAreaMaxLength","True","Unchecked","NoReferrer","AriaOrientationValueVertical","CLCID","AriaLiveTemplate","CheckBox","FontTitle","CloseButton","FontSubtitle","FontText","FontSubText","FontSubSubText","Hidden","Link","MarginLeft60px","MarginLeft180px","NarrowLayout","PrivacyStatementLinkDiv","Rtl","Spinner","SpinnerCircle","SubmitButton","CancelButton","TextInput","Visible","RatingGraphic","RatingGraphicFilled","ChoiceGroup","ChoiceGroupIcon","OverallAnchor","OverallAnchorActive","OverallImage","OverallText","SingleLayout","ShowRightBorder","SlideLeft","TextAlignLeft","FormContainer","FormWideContainer","ThanksPanelTitle","ThanksPanelMessage","FormQuestionMiddleText","FormMiddleText","FormCategoriesDropdown","FormComment","FormRatingContainer","FormRatingLabel","FormRating","FormEmailContainer","FormEmailInput","FormEmailTextBox","FormEmailCheckBox","FormEmailLabel","FormBottomContainer","FormSubmitButtonContainer","FormScreenshotContainer","FormScreenshotLabel","FormScreenshotCheckbox","FormScreenshotPreview","TFormEmailCheckbox","TFormEmailLabel","EmailCheckBoxLabel","Toast","ToastZoom","ColumnSeparatorDiv","OverallAnchorsContainer","OverallFrownAnchor","OverallFrownDiv","OverallFrownImage","OverallFrownText","OverallSmileAnchor","OverallSmileDiv","OverallSmileImage","OverallSmileText","OverallIdeaAnchor","OverallIdeaDiv","OverallIdeaImage","OverallIdeaText","OverallBugAnchor","OverallBugDiv","OverallBugImage","OverallBugText","QuestionLeftText","LeftFormContainer","LeftPanelContainer","MainContainer","MainContentHolder","MiddleFormContainer","OverlayBackground","PrivacyStatementLink","FirstTabbable","LastTabbable","EmailCheckBox","SingleFormContainer","SingleFormQuestionMiddleText","SingleFormCategoriesDropdown","SingleFormComment","SingleFormEmailInput","SingleFormRating","SingleFormScreenshotCheckbox","SingleFormScreenshotPreview","SingleFormSubmitButton","SingleFormCancelButton","SingleFormSubmitButtonSpinner","BasicFormContainer","BasicFormQuestionMiddleText","BasicFormCategoriesDropdown","BasicFormComment","BasicFormEmailInput","BasicFormRating","BasicFormScreenshotCheckbox","BasicFormScreenshotPreview","BasicFormSubmitButton","BasicFormCancelButton","BasicFormSubmitButtonSpinner","ThanksPanelContainer","ThanksPanelCloseButton","ThanksPanelDiscussion","ThanksPanelVerticalContainer","ThanksPanelInnerContainer","ThanksPanelParagraph","UserVoiceFormContainer","UserVoiceFormGoButton","FeedbackPortalIdeaContainer","OverallFeedbackPortalIdeaAnchor","ToastContainer","ToastCancel","TPromptContainer","TPromptTitle","TPromptText","TFormContainer","TFormTitle","TFormRating","TFormRatingQuestion","TFormComment","TFormEmailTextBox","TFormEmailCheckBox","TFormSubmitButton","TFormSubmitButtonSpinner","TFormSubmitButtonContainer","Esc","Anchor","Defs","Div","FieldSet","Img","Input","Label","Legend","Option","Polygon","Select","Span","Svg","TextArea","Use","No","Yes","html2canvas","createScreenshot","domElement","setUiStrings","selector","IDs","rel","getElementsByTagName","loadStylesheet","Classes","pageOrigin","origin","script","async","isProduction","manifest","diagnostics","method","requestBody","maxRetries","onLoad","makeRequest","httpTimeout","formData","FormData","append","responseText","retries","statusText","getContent","imgString","blobBin","atob","Blob","manifestType","submitTime","manifestData","application","telemetry","sanitizeType","web","getExtendedManifestData","setComment","setEmail","email","setCategory","category","featureArea","setAppData","appData","setExtendedManifestData","setClientFeedbackId","setComplianceInformation","sendSurveyPolicyValue","complianceChecks","policyAllowFeedback","policyAllowSurvey","policyAllowScreenshot","policyAllowContact","setValues","ocpsEnumToString","ocpsBooleanToString","setScreenshot","getManifest","manifestContent","screenshotContent","ClientFeedbackId","policyValue","setElementVisibility","vis","replaceClassesById","deleteElementById","getElementById","addClassById","newClass","oldClassName","newClassName","oldClass","deleteClassById","setAttributeOnHtmlElement","attriName","attriValue","htmlElement","addEventListenerHelper","listener","attachEvent","removeEventListenerHelper","removeEventListener","detachEvent","unregisterListener","getInternetExplorerVersion","rv","ua","exec","$1","isRightToLeft","direction","ScreenshotPreviewByCheckbox","screenshotCheckboxId","screenshotPreviewId","screenshotCheckBox","screenshotCheckBoxSelected","preview","performance","circleObjects","spinnerId","spinner","createCirclesAndArrange","initializeOpacities","fade","circleObject","circle","createCircle","parentSize","j","setOpacity","classList","cycleTabFocus","focusedElement","querySelectorAll","checkVisible","focus","parentElement","useNarrowLayout","selectedFeedbackType","selectedPanelType","setAriaSelectedAttributes","anchorID","AttributeName","AttributeValue","dismissAll","keyEventHandler","listenersList","removeListeners","FormTemplateType","addListener","registerCommon","ON_DISMISS","overlayBackgroundHandler","mainContainerHandler","tabKeyEventHandler","privacyStatementLinkHandler","emailCheckBoxHandler","basicFormInputHandler","singleFormInputHandler","keyCode","which","Keys","activeElement","shiftKey","stopPropagation","preventDefault","overallHandler","anchorId","PanelType","formTemplate","mainContentHolderSlideLeft","containerId","onSelect","panelType","overallSmileHandler","overallFrownHandler","overallIdeaHandler","Idea","overallBugHandler","SetVisibilityExceptFor","except","visible","feedbackPanes","children","currentFeedbackPane","submitButtonHandlerFactory","submitButtonId","commentInputId","emailInputId","categoriesDropdownId","commentElement","emailCheckBox","emailElement","isEmailIncluded","categoryElement","IsEmailIncluded","IsScreenshotIncluded","overallThanksHandler","UserVoiceFormGoButtonHandler","overallFeedbackPortalIdeaHandler","ScreenshotCheckboxClickHandler","CancelButtonHandler","emailTextBox","disabled","commentEntered","generate","attributes","innerText","CategoryPlaceholder","tag","starId","starDefinition","firstStar","secondStar","thirdStar","fourthStar","fifthStar","emptyStars","classes","oneFilledStar","twoFilledStar","threeFilledStar","fourFilledStar","fiveFilledStar","SingleForm","brs","CommentPlaceholder","RatingLabel","isEmailEnabled","EmailPlaceholder","isScreenshotEnabled","ScreenshotLabel","ScreenshotImgAltText","PrivacyLabel","PrivacyConsent","Urls","PrivacyStatement","Cancel","SmileForm","FrownForm","IdeaForm","BugForm","Basic","Single","generateMultiForms","formTemplates","pushedContainers","generateMultiPanels","panelTemplates","generateOverallAnchors","generateOverallAnchor","IdeaRedirect","overallAnchorID","overallImageID","svgImage","overallTextID","uiString","innerHTML","elementFromJson","schema","attribute","concatClasses","makeLinkText","GetThankYouPageText","thankYouPageText","ThanksPanel","AppreciateText","IInitOptions","MyFeedbackDescription","MyFeedbackLinkText","FeedbackPortalDescription","FeedbackPortalLinkText","primaryColor","Close","ariaLabel","role","Roles","UserVoiceForm","UserVoice","FeedbackPortalIdea","createMulti","onClose","FeedbackSubtitle","CloseLabel","useNarrowScreenLayout","createSingle","PANELTEMPLATES","userInterface","onMainContainerRender","opened","multiFeedback","IsBugEnabled","IsIdeaEnabled","singleFeedback","feedbackTypeEnum","getFeedbackStatus"],"mappings":"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A,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GAEJ32B,OAAQ,CACJ,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,MAGJ66C,GAAS,CACTlkB,SAAU,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GAEJ32B,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,MAGJ06C,GAAW,CACX/jB,SAAU,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GAEJ32B,OAAQ,CACJ,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,MAGJuqD,GAAwB,SAAU94D,EAAO8pC,EAAKwE,EAAKyqB,EAASC,EAAUC,GACtE,OAAIj5D,EAAQ8pC,GAAO9pC,EAAQsuC,EAChB4qB,GAA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AUA,IAAIC,EAA6B,CAChC,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,KACA,KACA,iBACA,WACA,KACA,KACA,KACA,KACA,KACA,QACA,KACA,QACA,KACA,KACA,KACA,KACA,MACA,KACA,QACA,KACA,KACA,KACA,KACA,aACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,KACA,KACA,QACA,KACA,KACA,KACA,MACA,QACA,QACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,aACA,aACA,aACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,aACA,KACA,UACA,WAGKC,EAA+D,CACpE,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,WAGH,SAASxpD,EAASvkB,GACxB,IAAIguE,EAAkBhuE,EAAO6kB,oBAG7B,GAAImpD,KAAmBD,EACtB,OAAOA,EAAkCC,GAI1C,IAA4B,UAAAF,EAAA,eAAkB,CAC7C,IADQG,EAAe,MACHxjC,gBAAkBujC,EACrC,OAAOC,EAMT,IAFA,IAAIC,EAAgBF,EAAgBG,MAAM,KAAK,GAEnB,MAAAL,EAAA,eAAkB,CAAzC,IAAIG,EACR,IADQA,EAAe,MACHxjC,gBAAkByjC,EACrC,OAAOD,EAKT,MAAO,O,6BC1IRtyE,EAAOD,QAAU,EAAQ,IAAM0yE,Y,kDCExB,SAASC,EAAW30C,GACzB,MAAoB,mBAANA,EAOhB,IASW9xB,EARPD,MAAMC,QACGD,MAAMC,QAEN,SAAU8xB,GACnB,MAA6C,mBAAtCp9B,OAAOkB,UAAU8L,SAASvN,KAAK29B,IClBtCsE,EAAM,EACNswC,OAAY,EACZC,OAAoB,EAEbC,EAAO,SAAcC,EAAUxlC,GACxCylC,EAAM1wC,GAAOywC,EACbC,EAAM1wC,EAAM,GAAKiL,EAEL,KADZjL,GAAO,KAKDuwC,EACFA,EAAkBI,GAElBC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","file":"officebrowserfeedback.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 57);\n","/**\r\n * Configuration.ts\r\n *\r\n * Module for logic relating to the sdk user configuration\r\n */\r\n\r\nimport * as Utils from \"./../Utils\";\r\nimport * as Constants from \"./../Constants\";\r\nimport * as Localization from \"./../Localization\";\r\nimport { ICategoryOptions } from \"./ICategoryOptions\";\r\nimport * as IInitOptions from \"./IInitOptions\";\r\nimport * as ILaunchOptions from \"./ILaunchOptions\";\r\nimport IUISurvey from \"./../FloodgateCore/UISurvey/IUISurvey\";\r\nimport { IOnSurveyActivatedCallback, ISurveyForm, ISurveyLauncher } from \"@ms-ofb/officefloodgatecore/dist/src/Api/Api\";\r\nimport { ISurveyParams } from \"@ms-ofb/officefloodgatecore/dist/src/Api/IOnSurveyActivatedCallback\";\r\n\r\nexport * from \"./IInitOptions\";\r\nexport * from \"./ILaunchOptions\";\r\n\r\n/**\r\n * Class representing a configuration (user provided options)\r\n */\r\n\r\nexport class Configuration {\r\n\t/**\r\n\t * Validate category options, default \"show\" to false if CategoryOptions is not provided.\r\n\t * @param categories Category options\r\n\t * @returns {ICategoryOptions} the validated CategoryOptions\r\n\t */\r\n\tprivate static validateCategoryOptions(categories?: ICategoryOptions): ICategoryOptions {\r\n\t\tif (!categories) {\r\n\t\t\treturn { show: false };\r\n\t\t}\r\n\r\n\t\tUtils.expectBoolean(categories.show, \"categories.show\");\r\n\t\tif (categories.customCategories) {\r\n\t\t\tUtils.expectArray(categories.customCategories, \"categories.customCategories\");\r\n\r\n\t\t\tfor (let customCategory of categories.customCategories) {\r\n\t\t\t\tUtils.expectString(customCategory, \"custom category '\" + customCategory + \"'\");\r\n\t\t\t\tif (customCategory.length > 20) {\r\n\t\t\t\t\tthrow \"custom category '\" + customCategory + \"' too long, max 20 characters.\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn categories;\r\n\t}\r\n\r\n\tprivate commonInitOptions: IInitOptions.IInitOptionsCommon;\r\n\r\n\tprivate inAppFeedbackInitOptions: IInitOptions.IInitOptionsInAppFeedback;\r\n\tprivate inAppFeedbackLaunchOptions: ILaunchOptions.ILaunchOptionsInAppFeedback;\r\n\r\n\tprivate floodgateInitOptions: IInitOptions.IInitOptionsFloodgate;\r\n\tprivate floodgateSurvey: IUISurvey;\r\n\r\n\tprivate sdkSessionId: string;\r\n\r\n\tprivate eventSampling: IInitOptions.ISamplingInitOption;\r\n\r\n\tprivate commonPolicyAllowAADC: boolean;\r\n\r\n\tprivate feedbackSubmitted: boolean = false;\r\n\r\n\tpublic getFeedbackSubmitted(): boolean {\r\n\t\treturn this.feedbackSubmitted;\r\n\t}\r\n\r\n\tpublic setFeedbackSubmitted(value: boolean): void {\r\n\t\tthis.feedbackSubmitted = value;\r\n\t}\r\n\r\n\tpublic getCommonInitOptions(): IInitOptions.IInitOptionsCommon {\r\n\t\treturn this.commonInitOptions;\r\n\t}\r\n\r\n\tpublic getInAppFeedbackInitOptions(): IInitOptions.IInitOptionsInAppFeedback {\r\n\t\treturn this.inAppFeedbackInitOptions;\r\n\t}\r\n\r\n\tpublic getInAppFeedbackLaunchOptions(): ILaunchOptions.ILaunchOptionsInAppFeedback {\r\n\t\treturn this.inAppFeedbackLaunchOptions;\r\n\t}\r\n\r\n\tpublic getFloodgateInitOptions(): IInitOptions.IInitOptionsFloodgate {\r\n\t\treturn this.floodgateInitOptions;\r\n\t}\r\n\r\n\tpublic getFloodgateSurvey(): IUISurvey {\r\n\t\treturn this.floodgateSurvey;\r\n\t}\r\n\r\n\tpublic getSdkSessionId(): string {\r\n\t\tif (!this.sdkSessionId) {\r\n\t\t\tthis.sdkSessionId = Utils.guid();\r\n\t\t}\r\n\r\n\t\treturn this.sdkSessionId;\r\n\t}\r\n\r\n\tpublic getEventSampling(): IInitOptions.ISamplingInitOption {\r\n\t\treturn this.eventSampling;\r\n\t}\r\n\r\n\t/**\r\n\t * Set initOptions for common functionality.\r\n\t */\r\n\tpublic setCommonInitOptions(passedInitOptions: IInitOptions.IInitOptionsCommon) {\r\n\t\tUtils.expectObject(passedInitOptions, \"passedInitOptions\");\r\n\t\tlet initOptions: IInitOptions.IInitOptionsCommon = {\r\n\t\t\tappId: passedInitOptions.appId,\r\n\t\t\tapplicationGroup: passedInitOptions.applicationGroup || {},\r\n\t\t\tbuild: passedInitOptions.build,\r\n\t\t\tcid: passedInitOptions.cid,\r\n\t\t\tenvironment: passedInitOptions.environment,\r\n\t\t\tintlFilename: passedInitOptions.intlFilename,\r\n\t\t\tintlUrl: passedInitOptions.intlUrl,\r\n\t\t\twebSurfacesResourceBaseUrl: passedInitOptions.webSurfacesResourceBaseUrl,\r\n\t\t\tlocale: passedInitOptions.locale,\r\n\t\t\tonError: passedInitOptions.onError,\r\n\t\t\toriginalLocale: passedInitOptions.locale,\r\n\t\t\tprimaryColour: passedInitOptions.primaryColour,\r\n\t\t\tsecondaryColour: passedInitOptions.secondaryColour,\r\n\t\t\tsessionId: passedInitOptions.sessionId,\r\n\t\t\tstylesUrl: passedInitOptions.stylesUrl,\r\n\t\t\ttelemetryGroup: passedInitOptions.telemetryGroup || {},\r\n\t\t\tuserEmail: passedInitOptions.userEmail,\r\n\t\t\twebGroup: passedInitOptions.webGroup || {},\r\n\t\t\teventSampling: passedInitOptions.eventSampling,\r\n\t\t\tpetrolTimeout: passedInitOptions.petrolTimeout,\r\n\t\t\tisCommercialHost: passedInitOptions.isCommercialHost,\r\n\t\t\tcustomResourcesSetExternally: passedInitOptions.customResourcesSetExternally,\r\n\t\t\temailPolicyValue: passedInitOptions.emailPolicyValue,\r\n\t\t\tscreenshotPolicyValue: passedInitOptions.screenshotPolicyValue,\r\n\t\t\tageGroup: passedInitOptions.ageGroup,\r\n\t\t\tauthenticationType: passedInitOptions.authenticationType,\r\n\t\t\tapplicationSettings: passedInitOptions.applicationSettings,\r\n\t\t\twebSurfacesSettings: passedInitOptions.webSurfacesSettings,\r\n\t\t};\r\n\r\n\t\tUtils.expectNumber(initOptions.appId, \"initOptions.appId\");\r\n\t\tif (!(initOptions.appId % 1 === 0 && initOptions.appId > 0)) {\r\n\t\t\tthrow \"initOptions.appId is not a positive integer: \" + initOptions.appId;\r\n\t\t}\r\n\r\n\t\t// tslint:disable-next-line: no-bitwise\r\n\t\tconst expectedValues = IInitOptions.CustomResources.Strings | IInitOptions.CustomResources.Css;\r\n\r\n\t\tif (initOptions.customResourcesSetExternally === undefined) {\r\n\t\t\tinitOptions.customResourcesSetExternally = IInitOptions.CustomResources.None;\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t} else if (typeof (initOptions.customResourcesSetExternally) !== \"number\" ||\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\t(initOptions.customResourcesSetExternally | expectedValues) !== expectedValues) {\r\n\t\t\tthrow \"initOptions.customResourcesSetExternally has an invalid value: \" + initOptions.customResourcesSetExternally;\r\n\t\t}\r\n\t\t// tslint:disable-next-line: no-bitwise\r\n\t\tif ((initOptions.customResourcesSetExternally & IInitOptions.CustomResources.Css) !== IInitOptions.CustomResources.Css) {\r\n\t\t\tUtils.expectString(initOptions.stylesUrl, \"initOptions.stylesUrl\");\r\n\t\t}\r\n\t\t// tslint:disable-next-line: no-bitwise\r\n\t\tif ((initOptions.customResourcesSetExternally & IInitOptions.CustomResources.Strings) !== IInitOptions.CustomResources.Strings) {\r\n\t\t\tUtils.expectString(initOptions.intlUrl, \"initOptions.intlUrl\");\r\n\t\t}\r\n\r\n\t\tif (initOptions.intlFilename !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.intlFilename, \"initOptions.intlFilename\");\r\n\t\t} else {\r\n\t\t\tinitOptions.intlFilename = \"officebrowserfeedbackstrings.js\";\r\n\t\t}\r\n\r\n\t\tUtils.expectNumber(initOptions.environment, \"initOptions.environment\");\r\n\t\tif (!(initOptions.environment === 1 || initOptions.environment === 0)) {\r\n\t\t\tthrow \"initOptions.environment has a bad value: \" + initOptions.environment;\r\n\t\t}\r\n\r\n\t\tif (initOptions.userEmail !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.userEmail, \"initOptions.userEmail\");\r\n\t\t} else {\r\n\t\t\tinitOptions.userEmail = \"\";\r\n\t\t}\r\n\r\n\t\tif (initOptions.sessionId !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.sessionId, \"initOptions.sessionId\");\r\n\t\t} else {\r\n\t\t\tinitOptions.sessionId = \"00000000-0000-0000-0000-000000000000\";\r\n\t\t}\r\n\r\n\t\t// Copy sessionID over to telemetryGroup\r\n\t\tinitOptions.telemetryGroup.processSessionId = initOptions.sessionId;\r\n\r\n\t\tif (initOptions.cid !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.cid, \"initOptions.cid\");\r\n\r\n\t\t\t// Copy cid over to extendedManifestData of applicationGroup\r\n\t\t\tinitOptions.applicationGroup.extendedManifestData = JSON.stringify({ cid: initOptions.cid });\r\n\t\t}\r\n\r\n\t\tif (initOptions.build !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.build, \"initOptions.build\");\r\n\t\t\tlet buildRegex = \"^[0-9]{1,9}(\\\\.[0-9]{1,9})?(\\\\.[0-9]{1,9})?(\\\\.[0-9]{1,9})?$\";\r\n\t\t\tif (!new RegExp(buildRegex).test(initOptions.build)) {\r\n\t\t\t\tinitOptions.build = \"0.0.0.0\";\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tinitOptions.build = \"0.0.0.0\";\r\n\t\t}\r\n\t\t// Copy build over to telemetryGroup\r\n\t\tinitOptions.telemetryGroup.officeBuild = initOptions.build;\r\n\r\n\t\tlet hexColourRegex = new RegExp(\"^#[0-9a-f]{3}([0-9a-f]{3})?$\", \"i\");\r\n\t\tif (initOptions.primaryColour !== undefined) {\r\n\t\t\tif (!hexColourRegex.test(initOptions.primaryColour)) {\r\n\t\t\t\tinitOptions.primaryColour = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (initOptions.secondaryColour !== undefined) {\r\n\t\t\tif (!hexColourRegex.test(initOptions.secondaryColour)) {\r\n\t\t\t\tinitOptions.secondaryColour = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (initOptions.locale !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.locale, \"initOptions.locale\");\r\n\t\t\tinitOptions.locale = Localization.validate(initOptions.locale);\r\n\t\t} else {\r\n\t\t\tinitOptions.locale = \"en\";\r\n\t\t}\r\n\r\n\t\tif (initOptions.onError === undefined) {\r\n\t\t\tinitOptions.onError = (err: string) => { return; };\r\n\t\t}\r\n\r\n\t\tif (initOptions.petrolTimeout !== undefined) {\r\n\t\t\tUtils.expectNumber(initOptions.petrolTimeout, \"initOptions.petrolTimeout\");\r\n\t\t}\r\n\r\n\t\tif (initOptions.authenticationType !== undefined) {\r\n\t\t\tUtils.expectEnum(initOptions.authenticationType, IInitOptions.AuthenticationType, \"initOptions.authenticationType\");\r\n\t\t} else {\r\n\t\t\tinitOptions.authenticationType = IInitOptions.AuthenticationType.Unauthenticated;\r\n\t\t}\r\n\r\n\t\t// For AAD or Unauthenticated, ageGroup value is unknown, so it's safe to only parse for MSA\r\n\t\tif (initOptions.ageGroup !== undefined) {\r\n\t\t\tUtils.expectEnum(initOptions.ageGroup, IInitOptions.AgeGroup, \"initOptions.ageGroup\");\r\n\t\t} else {\r\n\t\t\tinitOptions.ageGroup = IInitOptions.AgeGroup.Undefined;\r\n\t\t}\r\n\r\n\t\tthis.eventSampling = this.parseEventSamplingOption(initOptions.eventSampling);\r\n\r\n\t\tthis.commonInitOptions = initOptions;\r\n\t\tthis.commonPolicyAllowAADC = this.determineAADCPolicy(initOptions.authenticationType, initOptions.ageGroup);\r\n\r\n\t\tif (initOptions.isCommercialHost === undefined || initOptions.isCommercialHost == null) {\r\n\t\t\tinitOptions.isCommercialHost = false; // By default privacy consent is not shown. (From SDK's perspective)\r\n\t\t} else {\r\n\t\t\tUtils.expectBoolean(initOptions.isCommercialHost, \"initOptions.isCommercialHost\");\r\n\t\t}\r\n\r\n\t\tif (initOptions.emailPolicyValue === undefined) {\r\n\t\t\tinitOptions.emailPolicyValue = Constants.OCPSValues.NotConfigured;\r\n\t\t} else if (typeof (initOptions.emailPolicyValue) !== \"number\" ||\r\n\t\t\t(initOptions.emailPolicyValue !== Constants.OCPSValues.NotConfigured &&\r\n\t\t\t\tinitOptions.emailPolicyValue !== Constants.OCPSValues.Enabled &&\r\n\t\t\t\tinitOptions.emailPolicyValue !== Constants.OCPSValues.Disabled)) {\r\n\t\t\tthrow \"initOptions.emailPolicyValue has an invalid value: \" + initOptions.emailPolicyValue;\r\n\t\t}\r\n\r\n\t\tif (initOptions.screenshotPolicyValue === undefined) {\r\n\t\t\tinitOptions.screenshotPolicyValue = Constants.OCPSValues.NotConfigured;\r\n\t\t} else if (typeof (initOptions.screenshotPolicyValue) !== \"number\" ||\r\n\t\t\tinitOptions.screenshotPolicyValue !== Constants.OCPSValues.NotConfigured &&\r\n\t\t\tinitOptions.screenshotPolicyValue !== Constants.OCPSValues.Enabled &&\r\n\t\t\tinitOptions.screenshotPolicyValue !== Constants.OCPSValues.Disabled) {\r\n\t\t\tthrow \"initOptions.screenshotPolicyValue has an invalid value: \" + initOptions.screenshotPolicyValue;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Set init options for inAppFeedback\r\n\t */\r\n\tpublic setInAppFeedbackInitOptions(passedInitOptions: IInitOptions.IInitOptionsInAppFeedback) {\r\n\t\tUtils.expectObject(passedInitOptions, \"passedInitOptions\");\r\n\r\n\t\tlet initOptions: IInitOptions.IInitOptionsInAppFeedback = {\r\n\t\t\tbugForm: passedInitOptions.bugForm,\r\n\t\t\tonDismiss: passedInitOptions.onDismiss,\r\n\t\t\tscreenshot: passedInitOptions.screenshot,\r\n\t\t\tshowEmailAddress: passedInitOptions.showEmailAddress,\r\n\t\t\tuserEmail: passedInitOptions.userEmail,\r\n\t\t\tuserVoice: passedInitOptions.userVoice !== undefined ?\r\n\t\t\t\t{\r\n\t\t\t\t\turl: passedInitOptions.userVoice.url,\r\n\t\t\t\t} :\r\n\t\t\t\tundefined,\r\n\t\t\ttransitionEnabled: passedInitOptions.transitionEnabled,\r\n\t\t\tisShowThanks: passedInitOptions.isShowThanks,\r\n\t\t\tsendFeedbackPolicyValue: passedInitOptions.sendFeedbackPolicyValue,\r\n\t\t\tfeedbackForumUrl: passedInitOptions.feedbackForumUrl !== undefined ?\r\n\t\t\t\tpassedInitOptions.feedbackForumUrl :\r\n\t\t\t\tundefined,\r\n\t\t\tmyFeedbackForumUrl: passedInitOptions.myFeedbackForumUrl !== undefined ?\r\n\t\t\t\tpassedInitOptions.myFeedbackForumUrl :\r\n\t\t\t\tundefined,\r\n\t\t};\r\n\r\n\t\tif (initOptions.onDismiss === undefined) {\r\n\t\t\tinitOptions.onDismiss = function (submitted: boolean) { return; };\r\n\t\t}\r\n\r\n\t\tif (initOptions.bugForm !== undefined) {\r\n\t\t\tUtils.expectBoolean(initOptions.bugForm, \"initOptions.bugForm\");\r\n\t\t} else {\r\n\t\t\tinitOptions.bugForm = false;\r\n\t\t}\r\n\r\n\t\tif (initOptions.userEmail !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.userEmail, \"initOptions.userEmail\");\r\n\t\t}\r\n\r\n\t\tif (initOptions.screenshot !== undefined) {\r\n\t\t\tUtils.expectBoolean(initOptions.screenshot, \"initOptions.screenshot\");\r\n\t\t} else {\r\n\t\t\tinitOptions.screenshot = true;\r\n\t\t}\r\n\r\n\t\tif (initOptions.showEmailAddress !== undefined) {\r\n\t\t\tUtils.expectBoolean(initOptions.showEmailAddress, \"initOptions.showEmailAddress\");\r\n\t\t} else {\r\n\t\t\tinitOptions.showEmailAddress = true;\r\n\t\t}\r\n\r\n\t\tif (initOptions.userVoice !== undefined) {\r\n\t\t\tUtils.expectObject(initOptions.userVoice, \"initOptions.userVoice\");\r\n\t\t\tUtils.expectString(initOptions.userVoice.url, \"initOptions.userVoice.url\");\r\n\t\t}\r\n\r\n\t\tif (initOptions.feedbackForumUrl !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.feedbackForumUrl, \"initOptions.feedbackForumUrl\");\r\n\t\t} else {\r\n\t\t\tinitOptions.feedbackForumUrl = undefined;\r\n\t\t}\r\n\r\n\t\tif (initOptions.isShowThanks !== undefined) {\r\n\t\t\tUtils.expectBoolean(initOptions.isShowThanks, \"initOptions.isShowThanks\");\r\n\t\t} else {\r\n\t\t\tinitOptions.isShowThanks = true;\r\n\t\t}\r\n\r\n\t\tif (initOptions.myFeedbackForumUrl !== undefined) {\r\n\t\t\tUtils.expectString(initOptions.myFeedbackForumUrl, \"initOptions.myFeedbackForumUrl\");\r\n\t\t} else {\r\n\t\t\tinitOptions.myFeedbackForumUrl = undefined;\r\n\t\t}\r\n\r\n\t\tif (initOptions.transitionEnabled === undefined) {\r\n\t\t\tinitOptions.transitionEnabled = true;\r\n\t\t}\r\n\r\n\t\tif (initOptions.sendFeedbackPolicyValue === undefined) {\r\n\t\t\tinitOptions.sendFeedbackPolicyValue = Constants.OCPSValues.NotConfigured;\r\n\t\t} else if (typeof (initOptions.sendFeedbackPolicyValue) !== \"number\" ||\r\n\t\t\t(initOptions.sendFeedbackPolicyValue !== Constants.OCPSValues.NotConfigured &&\r\n\t\t\t\tinitOptions.sendFeedbackPolicyValue !== Constants.OCPSValues.Enabled &&\r\n\t\t\t\tinitOptions.sendFeedbackPolicyValue !== Constants.OCPSValues.Disabled)) {\r\n\t\t\tthrow \"initOptions.sendFeedbackPolicyValue has an invalid value: \" + initOptions.sendFeedbackPolicyValue;\r\n\t\t}\r\n\r\n\t\tthis.inAppFeedbackInitOptions = initOptions;\r\n\t}\r\n\r\n\t/**\r\n\t * Set launch options for inAppFeedback\r\n\t */\r\n\tpublic setInAppFeedbackLaunchOptions(launchOptions?: ILaunchOptions.ILaunchOptionsInAppFeedback) {\r\n\t\tif (!this.commonInitOptions) {\r\n\t\t\tthrow \"commonInitOptions not set\";\r\n\t\t}\r\n\r\n\t\tif (!launchOptions) {\r\n\t\t\tlaunchOptions = {};\r\n\t\t}\r\n\r\n\t\t// Override any setting done in LaunchOptions for the metadataGroups\r\n\t\tthis.commonInitOptions.applicationGroup = Utils.overrideValues(launchOptions.applicationGroup,\r\n\t\t\tthis.commonInitOptions.applicationGroup);\r\n\t\tthis.commonInitOptions.telemetryGroup = Utils.overrideValues(launchOptions.telemetryGroup,\r\n\t\t\tthis.commonInitOptions.telemetryGroup);\r\n\t\tthis.commonInitOptions.webGroup = Utils.overrideValues(launchOptions.webGroup,\r\n\t\t\tthis.commonInitOptions.webGroup);\r\n\r\n\t\tlaunchOptions.categories = Configuration.validateCategoryOptions(launchOptions.categories);\r\n\r\n\t\tthis.inAppFeedbackLaunchOptions = launchOptions;\r\n\t}\r\n\r\n\t/**\r\n\t * Set init options for floodgate\r\n\t */\r\n\tpublic setFloodgateInitOptions(passedInitOptions: IInitOptions.IInitOptionsFloodgate) {\r\n\t\tUtils.expectObject(passedInitOptions, \"passedInitOptions\");\r\n\r\n\t\tlet initOptions: IInitOptions.IInitOptionsFloodgate = {\r\n\t\t\tautoDismiss: passedInitOptions.autoDismiss,\r\n\t\t\tcampaignDefinitions: passedInitOptions.campaignDefinitions,\r\n\t\t\tcampaignFlights: passedInitOptions.campaignFlights,\r\n\t\t\tcampaignQueryParameters: passedInitOptions.campaignQueryParameters,\r\n\t\t\tonDismiss: passedInitOptions.onDismiss,\r\n\t\t\tonSurveyActivatedCallback: passedInitOptions.onSurveyActivatedCallback,\r\n\t\t\tsettingStorageCallback: passedInitOptions.settingStorageCallback,\r\n\t\t\tuIStringGetter: passedInitOptions.uIStringGetter,\r\n\t\t\tauthTokenCallback: passedInitOptions.authTokenCallback,\r\n\t\t\tsurveyEnabled: passedInitOptions.surveyEnabled,\r\n\t\t\tshowEmailAddress: passedInitOptions.showEmailAddress,\r\n\t\t\taugLoopCallback: passedInitOptions.augLoopCallback,\r\n\t\t\tcustomerVoiceSurveyParams: passedInitOptions.customerVoiceSurveyParams,\r\n\t\t\tgovernanceServiceEnabled: passedInitOptions.governanceServiceEnabled,\r\n\t\t\tgovernanceServiceConfig: passedInitOptions.governanceServiceConfig,\r\n\t\t\tpersonalizerEnabled: passedInitOptions.personalizerEnabled,\r\n\t\t};\r\n\r\n\t\tif (initOptions.autoDismiss === undefined) {\r\n\t\t\tinitOptions.autoDismiss = Constants.AutoDismissValues.NoAutoDismiss;\r\n\t\t}\r\n\r\n\t\tif (initOptions.onDismiss === undefined) {\r\n\t\t\tinitOptions.onDismiss = (campaignId: string, submitted: boolean) => { return; };\r\n\t\t}\r\n\r\n\t\tif (initOptions.onSurveyActivatedCallback === undefined) {\r\n\t\t\tlet defaultOnSurveyActivatedCallback: IOnSurveyActivatedCallback = {\r\n\t\t\t\tonSurveyActivated(launcher: ISurveyLauncher, survey?: ISurveyForm, surveyParams?: ISurveyParams): void {\r\n\t\t\t\t\tlauncher.launch();\r\n\t\t\t\t},\r\n\t\t\t};\r\n\r\n\t\t\tinitOptions.onSurveyActivatedCallback = defaultOnSurveyActivatedCallback;\r\n\t\t}\r\n\r\n\t\tif (initOptions.uIStringGetter === undefined) {\r\n\t\t\tinitOptions.uIStringGetter = (str: string) => str; // By default return the string as is.\r\n\t\t}\r\n\r\n\t\tif (initOptions.surveyEnabled === undefined) {\r\n\t\t\tinitOptions.surveyEnabled = true; // By default surveys are enabled. (From SDK's perspective)\r\n\t\t} else {\r\n\t\t\tUtils.expectBoolean(initOptions.surveyEnabled, \"surveyEnabled\");\r\n\t\t}\r\n\r\n\t\tif (initOptions.showEmailAddress !== undefined) {\r\n\t\t\tUtils.expectBoolean(initOptions.showEmailAddress, \"initOptionsFloodgate.showEmailAddress\");\r\n\t\t} else {\r\n\t\t\tinitOptions.showEmailAddress = true;  // By default email field and collection is enabled. (From SDK's perspective)\r\n\t\t}\r\n\r\n\t\tif (initOptions.governanceServiceEnabled !== undefined) {\r\n\t\t\tUtils.expectBoolean(initOptions.governanceServiceEnabled, \"initOptionsFloodgate.governanceServiceEnable\");\r\n\t\t} else {\r\n\t\t\tinitOptions.governanceServiceEnabled = false;  // By default governanceServiceEnable is disabled\r\n\t\t}\r\n\r\n\t\tif (initOptions.governanceServiceEnabled) {\r\n\t\t\tinitOptions.governanceServiceConfig = this.parseGovernanceServiceConfig(\r\n\t\t\t\tinitOptions.governanceServiceConfig !== undefined ?\r\n\t\t\t\t\tinitOptions.governanceServiceConfig :\r\n\t\t\t\t\t{});\r\n\t\t}\r\n\r\n\t\tif (initOptions.customerVoiceSurveyParams === undefined) {\r\n\t\t\tinitOptions.customerVoiceSurveyParams = { cvFlights: \"\", isCVSurveyEnabled: false, productName: \"\", uiHost: \"\" };\r\n\t\t}\r\n\r\n\t\tif (initOptions.personalizerEnabled !== undefined) {\r\n\t\t\tUtils.expectBoolean(initOptions.personalizerEnabled, \"initOptionsFloodgate.personalizerEnabled\");\r\n\t\t} else {\r\n\t\t\tinitOptions.personalizerEnabled = false;  // By default personalizerEnabled is disabled\r\n\t\t}\r\n\r\n\t\tthis.floodgateInitOptions = initOptions;\r\n\t}\r\n\r\n\t/**\r\n\t * Set the floodgate survey\r\n\t */\r\n\tpublic setFloodgateSurvey(survey: IUISurvey): void {\r\n\t\tthis.floodgateSurvey = survey;\r\n\t}\r\n\r\n\t// Checks if the surveyEnabled policy is true or false.\r\n\tpublic checkIfSurveysEnabled(): boolean {\r\n\t\t// If no floodgateInitOptions defined, return true for surveyEnabled\r\n\t\tconst policyAllowSurvey = this.floodgateInitOptions ? this.floodgateInitOptions.surveyEnabled : true;\r\n\t\treturn policyAllowSurvey && this.commonPolicyAllowAADC;\r\n\t}\r\n\r\n\t/**\r\n\t * Return the flag the Feedback and Survey enabled by AADC.\r\n\t */\r\n\tpublic isFeedbackSurveyEnabledByAADC(): boolean {\r\n\t\treturn this.commonPolicyAllowAADC;\r\n\t}\r\n\r\n\tpublic getCVSurveyFlights(): string | null {\r\n\t\treturn this.floodgateInitOptions && this.floodgateInitOptions.customerVoiceSurveyParams ?\r\n\t\t\tthis.floodgateInitOptions.customerVoiceSurveyParams.cvFlights : \"\";\r\n\t}\r\n\r\n\tpublic isCVSurveyEnabled(): boolean {\r\n\t\treturn this.floodgateInitOptions && this.floodgateInitOptions.customerVoiceSurveyParams ?\r\n\t\t\tthis.floodgateInitOptions.customerVoiceSurveyParams.isCVSurveyEnabled : false;\r\n\t}\r\n\r\n\tpublic getProductName(): string {\r\n\t\treturn this.floodgateInitOptions && this.floodgateInitOptions.customerVoiceSurveyParams ?\r\n\t\t\tthis.floodgateInitOptions.customerVoiceSurveyParams.productName : \"\";\r\n\t}\r\n\r\n\tpublic getUIHost(): string {\r\n\t\treturn this.floodgateInitOptions && this.floodgateInitOptions.customerVoiceSurveyParams ?\r\n\t\t\tthis.floodgateInitOptions.customerVoiceSurveyParams.uiHost : \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Check AADC rule at once since Configuration cannot be set again.\r\n\t * So that we don't need to repeat the same process over again.\r\n\t */\r\n\tpublic determineAADCPolicy(authenticationType: IInitOptions.AuthenticationType,\r\n\t\tageGroup: IInitOptions.AgeGroup): boolean {\r\n\t\t// Return Based on authentication first\r\n\t\tif (authenticationType === IInitOptions.AuthenticationType.Unauthenticated ||\r\n\t\t\tauthenticationType === IInitOptions.AuthenticationType.AAD) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t// Return based on AgeGroup\r\n\t\treturn ageGroup !== IInitOptions.AgeGroup.MinorWithParentalConsent &&\r\n\t\t\tageGroup !== IInitOptions.AgeGroup.MinorWithoutParentalConsent;\r\n\t}\r\n\r\n\t// Keep implementation in sync with %SRCROOT%\\privacy\\idconsentprovider\\IdentityBasedConsentGroupProvider.cpp\r\n\tpublic getUserConsentGroup(): IInitOptions.UserConsentGroup {\r\n\t\tconst authenticationType = this.commonInitOptions.authenticationType;\r\n\t\tif (authenticationType === IInitOptions.AuthenticationType.Unauthenticated ||\r\n\t\t\tauthenticationType === IInitOptions.AuthenticationType.AAD) {\r\n\t\t\treturn IInitOptions.UserConsentGroup.CanConsent;\r\n\t\t}\r\n\r\n\t\tconst ageGroup = this.commonInitOptions.ageGroup;\r\n\t\tswitch (ageGroup) {\r\n\t\t\tcase IInitOptions.AgeGroup.Undefined:\r\n\t\t\t\treturn IInitOptions.UserConsentGroup.CanConsent;\r\n\t\t\tcase IInitOptions.AgeGroup.MinorWithoutParentalConsent:\r\n\t\t\t\treturn IInitOptions.UserConsentGroup.CannotConsent;\r\n\t\t\tcase IInitOptions.AgeGroup.MinorWithParentalConsent:\r\n\t\t\t\treturn IInitOptions.UserConsentGroup.CannotConsent;\r\n\t\t\tcase IInitOptions.AgeGroup.Adult:\r\n\t\t\t\treturn IInitOptions.UserConsentGroup.CanConsent;\r\n\t\t\tcase IInitOptions.AgeGroup.NotAdult:\r\n\t\t\t\treturn IInitOptions.UserConsentGroup.PartialConsent;\r\n\t\t\tcase IInitOptions.AgeGroup.MinorNoParentalConsentRequired:\r\n\t\t\t\treturn IInitOptions.UserConsentGroup.CanConsent;\r\n\t\t\tdefault:\r\n\t\t\t\treturn IInitOptions.UserConsentGroup.CannotConsent;\r\n\t\t}\r\n\r\n\t\treturn IInitOptions.UserConsentGroup.CannotConsent;\r\n\t}\r\n\r\n\tprivate parseEventSamplingOption(samplingOptions: IInitOptions.ISamplingEvent[]): IInitOptions.ISamplingInitOption {\r\n\t\tlet eventInitSampling: IInitOptions.ISamplingInitOption = { event: {} };\r\n\t\tif (samplingOptions !== undefined) {\r\n\t\t\t// Iterating through init options\r\n\t\t\tfor (const index in samplingOptions) {\r\n\t\t\t\tif (samplingOptions.hasOwnProperty(index)) {\r\n\t\t\t\t\t// Check for correct Type\r\n\t\t\t\t\tswitch (samplingOptions[index].type) {\r\n\t\t\t\t\t\tcase \"Event\":\r\n\t\t\t\t\t\t\t// Parsing the Name and SampleRate\r\n\t\t\t\t\t\t\tlet sampleRate = samplingOptions[index].sampleRate;\r\n\t\t\t\t\t\t\tUtils.expectNumber(sampleRate, \"initOption.EventSampling.SampleRate\");\r\n\t\t\t\t\t\t\tUtils.expectString(samplingOptions[index].name, \"initOption.EventSampling.Name\");\r\n\t\t\t\t\t\t\t// check the range for sampling percentage\r\n\t\t\t\t\t\t\tif (sampleRate < 0 || sampleRate > 1) {\r\n\t\t\t\t\t\t\t\tthrow \"initOption.EventSampling.\" + samplingOptions[index].name + \".SampleRate is out of range\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// finally, save the sampling event\r\n\t\t\t\t\t\t\teventInitSampling.event[samplingOptions[index].name] = sampleRate;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\tthrow \"initOption.EventSampling.Type value is not recognized\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn eventInitSampling;\r\n\t}\r\n\r\n\tprivate parseGovernanceServiceConfig(config: IInitOptions.IGovernanceServiceConfig): IInitOptions.IGovernanceServiceConfig {\r\n\t\treturn {\r\n\t\t\t// by default, disable the trigger in failure\r\n\t\t\tforceServicelessSurveyDisplay: config.forceServicelessSurveyDisplay ?? false,\r\n\r\n\t\t\t// by default, no retry\r\n\t\t\tretry: config.retry ?? 1,\r\n\r\n\t\t\t// by default, timeout is 1000 miliseconds\r\n\t\t\ttimeout: config.timeout ?? 1000,\r\n\r\n\t\t\t// simple request is default to false\r\n\t\t\tsimpleRequestEnabled: config.simpleRequestEnabled ?? false,\r\n\t\t};\r\n\t}\r\n}\r\n\r\nlet configuration: Configuration = new Configuration();\r\n\r\n/**\r\n * Get the current configuration\r\n */\r\nexport function get(): Configuration {\r\n\treturn configuration;\r\n}\r\n\r\n/**\r\n * Validate feedbackType\r\n * @param feedbackType feedbackType\r\n * @returns {Constants.FeedbackType} the validated feedbackType\r\n */\r\nexport function validateFeedbackType(feedbackType: string): Constants.FeedbackType {\r\n\tUtils.expectString(feedbackType, \"feedbackType\");\r\n\r\n\tif (feedbackType === Constants.FeedbackType[Constants.FeedbackType.Smile]) {\r\n\t\treturn Constants.FeedbackType.Smile;\r\n\t} else if (feedbackType === Constants.FeedbackType[Constants.FeedbackType.Frown]) {\r\n\t\treturn Constants.FeedbackType.Frown;\r\n\t} else if (feedbackType === Constants.FeedbackType[Constants.FeedbackType.Bug]) {\r\n\t\treturn Constants.FeedbackType.Bug;\r\n\t} else {\r\n\t\tthrow \"feedbackType should be one of Smile, Frown or Bug\";\r\n\t}\r\n}\r\n","/*\r\n * Utils.ts\r\n *\r\n * Module for utility functions\r\n */\r\n\r\nimport { Utils } from \"@ms-ofb/officefloodgatecore\";\r\nconst { guid, overrideValues, isNOU, isBoolean, isString, isObject, isEnumValue } = Utils;\r\nexport { guid, overrideValues, isNOU, isBoolean }\r\n\r\n/**\r\n * Check if given value is a number\r\n * @param {any} value value\r\n */\r\nfunction isNumber(value: any): boolean {\r\n\treturn (typeof value === \"number\");\r\n}\r\n\r\n/**\r\n * Check if given value is an integer\r\n * @param {any} value value\r\n */\r\nexport function isInteger(value: any): boolean {\r\n\treturn typeof value === \"number\" &&\r\n\t\tisFinite(value) &&\r\n\t\tMath.floor(value) === value;\r\n}\r\n\r\n/**\r\n * Check if value is a valid guid\r\n * @param {any} value value\r\n */\r\nfunction isGuid(value: any): boolean {\r\n\treturn (isString(value) &&\r\n\t\t/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(value));\r\n}\r\n\r\n/**\r\n * Throw if not object\r\n */\r\nexport function expectObject(value: any, name: string): void {\r\n\tif (!isObject(value)) {\r\n\t\tthrow name + \" is not an object: \" + value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Throw if not number\r\n */\r\nexport function expectNumber(value: any, name: string): void {\r\n\tif (!isNumber(value)) {\r\n\t\tthrow name + \" is not a number: \" + value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Throw if not string\r\n */\r\nexport function expectString(value: any, name: string): void {\r\n\tif (!isString(value)) {\r\n\t\tthrow name + \" is not a string: \" + value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Throw if not boolean\r\n */\r\nexport function expectBoolean(value: any, name: string): void {\r\n\tif (!isBoolean(value)) {\r\n\t\tthrow name + \" is not a boolean: \" + value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Throw if not guid\r\n */\r\nexport function expectGuid(value: any, name: string): void {\r\n\tif (!isGuid(value)) {\r\n\t\tthrow name + \" is not a guid: \" + value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Throw if not array\r\n */\r\nexport function expectArray(value: any, name: string): void {\r\n\tif (!Array.isArray(value)) {\r\n\t\tthrow name + \" is not an array: \" + value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Throw if not valid enum\r\n * Note: this won't work with const enum\r\n */\r\nexport function expectEnum(value: any, enumType: any, name: string): void {\r\n\tif (!isNumber(value) || !isEnumValue(value, enumType)) {\r\n\t\tthrow name + \" is not an enum: \" + value;\r\n\t}\r\n}\r\n\r\n// Creates a promise that rejects in <ms> milliseconds and\r\n// returns the race between the created timeout promise and the passed in promise\r\nexport function createTimeoutPromise<T>(ms: number, promise: Promise<T>): Promise<T> {\r\n\t// Create a promise that rejects in <ms> milliseconds\r\n\tconst timeout = new Promise((resolve, reject) => {\r\n\t\tconst id = setTimeout(() => {\r\n\t\t\tclearTimeout(id);\r\n\t\t\treject(\"Timed out in \" + ms + \"ms.\");\r\n\t\t}, ms);\r\n\t});\r\n\r\n\t// Returns a race between our timeout and the passed in promise\r\n\treturn Promise.race([promise, timeout]) as Promise<T>;\r\n}\r\n\r\n/**\r\n * Checks to see if a passed CSS selector is set as a rule in one of the document's stylesheets.\r\n * \r\n * @param cssSelector : a Css selector string such as '#obf-TPromptTitle'\r\n */\r\nexport function checkCssSelectorToBeSet (cssSelector: string): boolean {\r\n\r\n\ttry {\r\n\t\tfor (let sheetIndex = 0; sheetIndex < document.styleSheets.length; sheetIndex++) {\r\n\t\t\tconst currentStyleSheet = document.styleSheets[sheetIndex];\r\n\r\n\t\t\tfor (let rulesIndex = 0; rulesIndex < currentStyleSheet.rules.length; rulesIndex++) {\r\n\t\t\t\tconst currentRule = currentStyleSheet.rules[rulesIndex] as CSSStyleRule;\r\n\r\n\t\t\t\tif (!isNOU(currentRule.selectorText) && currentRule.selectorText.includes(cssSelector)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t// tslint:disable-next-line: no-empty\r\n\t} catch (error) {}\r\n\r\n\treturn false;\r\n}\r\n","/**\r\n * Constants.ts\r\n *\r\n * A module for non-UI constants.\r\n */\r\n\r\n/**\r\n * Value for the Customer Voice Launcher Type\r\n */\r\nexport const customerVoiceLauncherType = \"customervoice\";\r\n\r\n/**\r\n * Value for the Customer Voice Survey text for adding to App data\r\n */\r\nexport const customerVoiceSurveyUX = \"Customer Voice Survey UX\";\r\n\r\n/**\r\n * Values for types of feedback that go into the json\r\n * Also used to determine the FormTemplate used on each one of the feedback types.\r\n */\r\nexport enum FeedbackType {\r\n\tSmile,\r\n\tFrown,\r\n\tIdea,\r\n\tBug,\r\n\tIdeaRedirect,\r\n}\r\n\r\n/**\r\n * Values for types of panels that go into the json\r\n * Also used to determine the PanelTemplate used on each one of the panel types.\r\n */\r\nexport const enum PanelType {\r\n\tThanks\r\n}\r\n\r\n/**\r\n * Values for the environment\r\n */\r\nexport const enum Environment {\r\n\tProduction,\r\n\tInt\r\n}\r\n\r\n/**\r\n * Values for autodismiss\r\n */\r\nexport const enum AutoDismissValues {\r\n\tNoAutoDismiss,\r\n\tSevenSeconds,\r\n\tFourteenSeconds,\r\n\tTwentyOneSeconds,\r\n\tTwentyEightSeconds,\r\n\tSixtySeconds,\r\n\tNinetySeconds,\r\n\tOneHundredAndTwentySeconds,\r\n\tOneHundredAndFiftySeconds,\r\n}\r\n\r\n/**\r\n * Dynamic scripts\r\n */\r\nexport class DynamicScriptUrls {\r\n\t/**\r\n\t * Link to the Office WebSurfaces UX package\r\n\t */\r\n\t/* tslint:disable:max-line-length */\r\n\tpublic static WebSurfacesIntLink: string = \"https://content.growth.office.net/mirrored/resources/programmablesurfaces/int/officewebsurfaces.core.min.js\";\r\n\tpublic static WebSurfacesProdLink: string = \"https://content.growth.office.net/mirrored/resources/programmablesurfaces/prod/officewebsurfaces.core.min.js\";\r\n}\r\n\r\n/**\r\n * Constant GUIDs\r\n */\r\nexport class GUIDs {\r\n\tpublic static TMSAppID: string = \"4c4f550b-42b2-4a16-93f9-fdb9e01bb6ed\";\r\n\tpublic static TULIPSAppID: string = \"05c88d91-956e-46b4-91b0-77a33cc21a4d\";\r\n}\r\n\r\nexport const enum OCPSValues {\r\n\tNotConfigured = 0,\r\n\tEnabled = 1,\r\n\tDisabled = 2\r\n}\r\n\r\nexport const enum FeedbackStatus {\r\n\tEnabled,\r\n\tDisabledByAdmin,\r\n\tDisabledByAgeGroup\r\n}\r\n\r\n/**\r\n * Prefix for SDK version string\r\n */\r\nexport const SDK_VERSION_PREFIX = \"Web SDK v\";\r\n","import * as Constants from \"./../Constants\";\r\nimport { IOnDismissDelegate } from \"./../IOnDismissDelegate\";\r\nimport * as UI from \"./../UI/UI\";\r\nimport { IAugLoopCallback, IFloodgateAuthTokenCallback, IFloodgateSettingStorageCallback, IOnSurveyActivatedCallback }\r\n\tfrom \"@ms-ofb/officefloodgatecore/dist/src/Api/Api\";\r\nimport { CampaignDefinition } from \"@ms-ofb/officefloodgatecore/dist/src/Campaign/CampaignDefinitionProvider\";\r\nimport { IManifestDataApplication, IManifestDataTelemetry, IManifestDataWeb } from \"./../Transport/Transport\";\r\nimport { ISession } from \"@augloop/runtime-client\";\r\nimport { ICVSurveyParams } from \"@ms-ofb/officefloodgatecore/dist/src/Api/ICVSurvey\";\r\n\r\n/**\r\n * Interface for common initialization options\r\n */\r\nexport interface IInitOptionsCommon {\r\n\t// An id uniquely identifying the host app in the OCV world\r\n\tappId: number;\r\n\t// The url at which the styles reside\r\n\tstylesUrl?: string;\r\n\t// The url at which the internationalization files reside\r\n\tintlUrl?: string;\r\n\t// The filename for the internationalization strings, if different than the default filename\r\n\tintlFilename?: string;\r\n\t// Base url where any ux assets reside. Mainly used by coaching ux\r\n\twebSurfacesResourceBaseUrl?: string;\r\n\t// Environment\r\n\tenvironment: Constants.Environment;\r\n\t// A string uniquely identifying the current session\r\n\tsessionId?: string;\r\n\t// cid string which is in-scope for GDPR compliance for export and deletion request\r\n\tcid?: string;\r\n\t// A build version for your app\r\n\tbuild?: string;\r\n\t// The primary colour in hex form #[0-9a-f]{6}\r\n\tprimaryColour?: string;\r\n\t// The secondary colour in hex form #[0-9a-f]{6}\r\n\tsecondaryColour?: string;\r\n\t// The UI locale name of the calling page\r\n\tlocale?: string;\r\n\t// System-Use only\r\n\toriginalLocale?: string;\r\n\t// A callback which will be called when the SDK encounters errors\r\n\tonError?: (err: string) => void;\r\n\t// Application related metadata\r\n\tapplicationGroup?: IManifestDataApplication;\r\n\t// Telemetry related metadata\r\n\ttelemetryGroup?: IManifestDataTelemetry;\r\n\t// Web related metadata\r\n\twebGroup?: IManifestDataWeb;\r\n\t// User Email \r\n\tuserEmail?: string;\r\n\t// The json string to define event sampling\r\n\teventSampling?: ISamplingEvent[];\r\n\t// The timeout for sending response in petrol\r\n\tpetrolTimeout?: number;\r\n\t// check to see if user is consumer/commercial to dynamically display UI\r\n\tisCommercialHost?: boolean;\r\n\t// Option to see if the host will be providing their own resources such as strings or CSS\r\n\tcustomResourcesSetExternally?: CustomResources;\r\n\t// the email policy value from OCPS to determines if the user can see an option to include their email when they submit feedback\r\n\temailPolicyValue?: Constants.OCPSValues;\r\n\t// the screenshot policy value from OCPS to determines if the user can see an option to include their screenshot when they submit feedback\r\n\tscreenshotPolicyValue?: Constants.OCPSValues;\r\n\t// AgeGroup enum which user is classfied as\r\n\tageGroup?: AgeGroup;\r\n\t// Authentication Type of user\r\n\tauthenticationType?: AuthenticationType;\r\n\t// Application settings\r\n\tapplicationSettings?: IApplicationSettings;\r\n\t// Package settings for the new web surfaces urls (after migration of the CDN)\r\n\twebSurfacesSettings?: IWebSurfacesSettings;\r\n}\r\n\r\n/**\r\n * Interface for package settings\r\n */\r\nexport interface IWebSurfacesSettings {\r\n\t// Internal web surfaces url\r\n\twebSurfacesIntUrl?: string;\r\n\t// Production web surfaces url \r\n\twebSurfacesProdUrl?: string;\r\n}\r\n\r\n/**\r\n * Interface for host application settings\r\n */\r\nexport interface IApplicationSettings {\r\n\treadonly [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Interface for inAppFeedback initialization options\r\n */\r\nexport interface IInitOptionsInAppFeedback {\r\n\t// Method called on feedback submission\r\n\tonDismiss?: IOnDismissDelegate;\r\n\t// Bug form toggle\r\n\tbugForm?: boolean;\r\n\t// email enabled\r\n\tshowEmailAddress?: boolean;\r\n\t// User email\r\n\tuserEmail?: string;\r\n\t// Screenshot toggle\r\n\tscreenshot?: boolean;\r\n\t// User voice related options.\r\n\tuserVoice?: UI.IUserVoiceInitOptions;\r\n\t// The switch to show a thank you panel\r\n\tisShowThanks?: boolean;\r\n\t// Flag to enable/disable transistion on the UI.\r\n\ttransitionEnabled?: boolean;\r\n\t// the feedback policy value from OCPS to determines if the user can submit feedback\r\n\tsendFeedbackPolicyValue?: Constants.OCPSValues;\r\n\t// Feedback Forum URL\r\n\tfeedbackForumUrl?: string;\r\n\t// My feedback Forum URL\r\n\tmyFeedbackForumUrl?: string;\r\n}\r\n\r\n/**\r\n * Interface for floodgate initialization options\r\n */\r\nexport interface IInitOptionsFloodgate {\r\n\t// Should the floodgate prompt automatically dismiss if not clicked? Default is false\r\n\tautoDismiss?: Constants.AutoDismissValues;\r\n\r\n\t// Campaign definitions\r\n\tcampaignDefinitions?: CampaignDefinition[];\r\n\r\n\t// Flights for TMS service\r\n\tcampaignFlights?: string;\r\n\r\n\t// Additional query parameters for TMS service\r\n\tcampaignQueryParameters?: string;\r\n\r\n\t// Delegate to be called when the floodgate UI is dismissed, whether on a submission or not\r\n\tonDismiss?: (campiagnId: string, submitted: boolean) => void;\r\n\r\n\t// The callback to be executed when a survey is activated\r\n\tonSurveyActivatedCallback?: IOnSurveyActivatedCallback;\r\n\r\n\t// The callback to be executed when host-based data operations are needed\r\n\tsettingStorageCallback?: IFloodgateSettingStorageCallback;\r\n\r\n\t// Optionally provide a method which will accept the custom strings in Campaign Definitions and return actual\r\n\t// strings that must be displayed. Used for localization.\r\n\tuIStringGetter?: (str: string) => string;\r\n\r\n\t// The callback to be executed when host-based auth token is needed\r\n\tauthTokenCallback?: IFloodgateAuthTokenCallback;\r\n\r\n\t// The boolean option to enforce if surveys are allowed by a policy, such as an OCPS policy for a tenant.\r\n\t// True: Surveys are enabled, floodgate works normally; False: Surveys are disabled\r\n\tsurveyEnabled?: boolean;\r\n\r\n\t// The boolean option to enforce if email address collection in a survey is allowed by a policy, such as an OCPS policy for a tenant.\r\n\t// True: email address collection is enabled, floodgate works normally; False: email address collection is disabled\r\n\tshowEmailAddress?: boolean;\r\n\r\n\t// Interface to enable/disable and pass augLoop host references\r\n\taugLoopCallback?: IAugLoopCallback<ISession>;\r\n\r\n\t// Interface to pass the params for the Customer Voice Survey\r\n\tcustomerVoiceSurveyParams?: ICVSurveyParams;\r\n\r\n\t// The boolean option to enabl the governance service\r\n\tgovernanceServiceEnabled?: boolean;\r\n\r\n\t// configuration for governance service\r\n\tgovernanceServiceConfig?: IGovernanceServiceConfig;\r\n\r\n\t// is personalizer enabled on client side.\r\n\tpersonalizerEnabled?: boolean;\r\n}\r\n\r\n/**\r\n * Interface for floodgate event sampling options\r\n */\r\nexport interface ISamplingEvent {\r\n\ttype: string;\r\n\tname: string;\r\n\tsampleRate: number;\r\n}\r\n\r\nexport interface ISamplingInitOption {\r\n\tevent?: Record<string, number>;\r\n}\r\n\r\nexport interface IGovernanceServiceConfig {\r\n\t// limit number of retry\r\n\tretry?: number;\r\n\r\n\t// timeout in second\r\n\ttimeout?: number;\r\n\r\n\t// In case of failure call, option to whether continue display survey or fall off\r\n\tforceServicelessSurveyDisplay?: boolean;\r\n\r\n\t// Option to use simple request\r\n\tsimpleRequestEnabled?: boolean;\r\n}\r\n\r\n// bit mask flag: values should be set 0,1,2,4,8,16, etc...\r\n// Example for Css and Strings both, use 3.\r\nexport enum CustomResources {\r\n\tNone = 0,\r\n\tCss = 1,\r\n\tStrings = 2,\r\n}\r\n\r\nexport enum AgeGroup {\r\n\tUndefined, // Unknown age\r\n\tMinorWithoutParentalConsent, // Minor under the age of consent\r\n\tMinorWithParentalConsent, // Minor under age of consent\r\n\tNotAdult, // Minor above age of consent\r\n\tAdult, // Adult\r\n\tMinorNoParentalConsentRequired, // Minor above age of consent\r\n}\r\n\r\nexport enum AuthenticationType {\r\n\tMSA,\r\n\tAAD,\r\n\tUnauthenticated\r\n}\r\n\r\n// Taken from %SRCROOT%\\privacy\\options\\public\\UserConsentGroup.h\r\n// Enum that describes the different consent categories of the user.\r\nexport const enum UserConsentGroup {\r\n\t// Unknown consent group, we do not have info to determine this\r\n\tUnknown = 0,\r\n\t// Can give consent to data collection, upsell messages\r\n\tCanConsent = 1,\r\n\t// Can still give consent but is only a limited consent.\r\n\t// As an example, upsell / cross sell should not be shown.\r\n\tPartialConsent = 2,\r\n\t// They cannot provide any form of consent. No consent dialogs / upsell should not be shown.\r\n\tCannotConsent = 3,\r\n};\r\n","/*\r\n * Utils.ts\r\n *\r\n * Module for utility functions\r\n */\r\n\r\n/**\r\n * Add time to a given date\r\n * Example, timeAdd(new Date(), 'minute', 5)  //returns 5 minutes from now\r\n * @param date  Date to start with\r\n * @param interval  One of: hour or h, minute or m, second or s\r\n * @param units  units of the given interval to add\r\n * @return date\r\n */\r\nexport function timeAdd(date: Date, interval: string, units: number): Date {\r\n\tswitch (interval.toLowerCase()) {\r\n\t\tcase \"h\":\r\n\t\tcase \"hour\":\r\n\t\t\treturn new Date(date.getTime() + (units * 3600000));\r\n\t\tcase \"m\":\r\n\t\tcase \"minute\":\r\n\t\t\treturn new Date(date.getTime() + (units * 60000));\r\n\t\tcase \"s\":\r\n\t\tcase \"second\":\r\n\t\t\treturn new Date(date.getTime() + (units * 1000));\r\n\t\tdefault:\r\n\t\t\tthrow new Error(\"Invalid interval value of \" + interval);\r\n\t}\r\n}\r\n\r\n/**\r\n * Check if an input value is a valid date, null or undefined return false.\r\n * @param input  input value\r\n * @return boolean\r\n */\r\nexport function isDate(input: any): boolean {\r\n\tif (Object.prototype.toString.call(input) === \"[object Date]\") {\r\n\t\t// it is a date\r\n\t\tif (!(isNaN(input.getTime()))) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * Check if an input value is a valid value in the input enum\r\n * @param value  input value\r\n * @param input  input enum\r\n * Returns true if value exists in the enum\r\n */\r\nexport function isEnumValue(value: any, input: any): boolean {\r\n\treturn (value in input);\r\n}\r\n\r\n/**\r\n * Check if an input value is a number\r\n * @param value: input value\r\n */\r\nexport function isNumber(value: any): boolean {\r\n\treturn (value !== null && !isNaN(value) && isFinite(value));\r\n}\r\n\r\n/**\r\n * Check if an input value is null or undefined\r\n * @param value: input value\r\n */\r\nexport function isNOU(value: any): boolean {\r\n\treturn (value === null || value === undefined);\r\n}\r\n\r\n/**\r\n * Check if an input value is an object\r\n * @param value: input value\r\n */\r\nexport function isObject(value: any): boolean {\r\n\treturn (value !== null && value !== undefined && (typeof value === \"object\"));\r\n}\r\n\r\n/**\r\n * Check if an input value is an array\r\n * @param value: input value\r\n */\r\nexport function isFunction(value: any): boolean {\r\n\treturn (value !== null && value !== undefined && (typeof value === \"function\"));\r\n}\r\n\r\n/**\r\n * Check if an input value is an array\r\n * @param value: input value\r\n */\r\nexport function isArray(value: any): boolean {\r\n\treturn (value !== null && value !== undefined && (Array.isArray(value)));\r\n}\r\n\r\n/**\r\n * Check if given value is a string\r\n * @param {any} value value\r\n */\r\nexport function isString(value: any): boolean {\r\n\treturn (typeof value === \"string\");\r\n}\r\n\r\n/**\r\n * Check if value is an object\r\n * @param {any} value value\r\n */\r\nexport function isBoolean(value: any): boolean {\r\n\treturn typeof (value) === \"boolean\";\r\n}\r\n\r\n/**\r\n * Returns a lower temporal boundary\r\n * @return date\r\n */\r\nexport function getDistantPast(): Date {\r\n\t// Corresponds to UTC 1601-01-01T00:00:00Z\r\n\treturn new Date(-11644473600000);\r\n}\r\n\r\n/**\r\n * Get an upper temporal boundary\r\n * @return date\r\n */\r\nexport function getDistantFuture(): Date {\r\n\t// Corresponds to UTC 4001-01-01T00:00:00Z\r\n\treturn new Date(64092211200000);\r\n}\r\n\r\nexport const MAX_DATE_MILLISECONDS: number = 8640000000000000;\r\nexport const MIN_DATE_MILLISECONDS: number = -8640000000000000;\r\n\r\n/**\r\n * Adds seconds to a date, if overflows returns Date(Number.Max_VALUE)\r\n *\r\n * @param date    date to add to\r\n * @param seconds seconds as number\r\n * @return Resulting date\r\n */\r\nexport function addSecondsWithoutOverflow(date: Date, seconds: number): Date {\r\n\tif (!date) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (seconds < 0) {\r\n\t\treturn subtractSecondsWithoutOverflow(date, -1 * seconds);\r\n\t} else {\r\n\t\tconst milliseconds: number = date.getTime() + seconds * 1000;\r\n\r\n\t\tif (milliseconds < MAX_DATE_MILLISECONDS) {\r\n\t\t\treturn new Date(milliseconds);\r\n\t\t} else {\r\n\t\t\treturn new Date(MAX_DATE_MILLISECONDS);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Subtracts seconds from a date, if overflows returns Date(Number.MIN_VALUE)\r\n *\r\n * @param date   date to subtract from\r\n * @param seconds seconds as number\r\n * @return Resulting date\r\n */\r\nexport function subtractSecondsWithoutOverflow(date: Date, seconds: number): Date {\r\n\tif (!date) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (seconds < 0) {\r\n\t\tseconds = -seconds;\r\n\t\treturn this.addSecondsWithoutOverflow(date, seconds);\r\n\t}\r\n\r\n\tconst milliseconds: number = date.getTime() - (seconds * 1000);\r\n\r\n\tif (milliseconds > MIN_DATE_MILLISECONDS) {\r\n\t\treturn new Date(milliseconds);\r\n\t} else {\r\n\t\treturn new Date(MIN_DATE_MILLISECONDS);\r\n\t}\r\n}\r\n\r\n// region Language related\r\n\r\n/**\r\n * Effectively un-anchored on the right side because tags can have many more trailing sub-parts than we care to extract\r\n * Refer to https://www.ietf.org/rfc/rfc5646.txt\r\n */\r\nconst LANGUAGE_AND_SCRIPT_TAG_PATTERN: string =\r\n\t\"^\" +\r\n\t// capture 1:language subtag\r\n\t\"(\" +\r\n\t\"(?:[a-zA-Z]{2,3}(?:-[a-zA-Z]{3}){0,3})\" +  // 2-3 Alpha chars, followed by up to three optional extension tags, each of format -AAA, A=Alpha char\r\n\t\"|\" +\r\n\t\"(?:[a-zA-Z]{4,8})\" +                       // 4-Alpha chars (reserved in standard) or 5-8 Alpha chars\r\n\t\")\" +\r\n\t\"(?:\" +\r\n\t\"-\" +\r\n\t// capture 2: optional script subtag (without leading dash), exactly 4 alpha chars\r\n\t\"([a-zA-Z]{4})\" +                           // 4-Alpha chars\r\n\t\")?\" +\r\n\t// capture 3: optional region subtag (without leading dash), exactly 2 alpha chars or 3 digits\r\n\t\"(?:-([a-zA-Z]{2}|[0-9]{3}))?\" +\r\n\t\"(\" +\r\n\t// capture 4: any left-overs, rejecting remainder strings that don't end here or lead with a dash.\r\n\t\"-.*\" +\r\n\t\")?\" +\r\n\t\"$\";\r\n\r\nexport function isValidLanguageSubTag(subTag: string): boolean {\r\n\tif (!subTag) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst extractedSubTag: string = extractLanguageSubtag(subTag);\r\n\tif (!extractedSubTag) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn extractedSubTag === subTag;\r\n}\r\n\r\nexport function extractLanguageSubtag(language: string): string {\r\n\tif (!language) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst matches = language.match(LANGUAGE_AND_SCRIPT_TAG_PATTERN);\r\n\tif (!matches || matches.length < 1 || !isNOU(matches[4])) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// return the first capture group which should be the original input if there is a match\r\n\t// For example, \"en-US\" input should return \"en-US\", and \"en\" input should return \"en\".\r\n\treturn matches[0];\r\n}\r\n\r\n// endregion\r\n\r\n/**\r\n * Create guid string\r\n */\r\nexport function guid(): string {\r\n\t// Stitch in '4' in the third group\r\n\treturn (randomHex4() + randomHex4() + \"-\" + randomHex4() + \"-4\" + randomHex4().substr(0, 3) + \"-\" + randomHex4() + \"-\"\r\n\t\t+ randomHex4() + randomHex4() + randomHex4()).toLowerCase();\r\n}\r\n\r\n/**\r\n * Create random Hex4 string\r\n */\r\nfunction randomHex4(): string {\r\n\treturn (Math.floor(((1 + Math.random()) * 0x10000))).toString(16).substring(1);\r\n}\r\n\r\n/**\r\n * Create an array from input object values sorted by object key\r\n * @param Object input object\r\n * @return array\r\n */\r\nexport function makeArrayFromObjectValuesSortedByKeyString(object: object): any[] {\r\n\tconst keys: string[] = Object.keys(object);\r\n\tkeys.sort();\r\n\r\n\tconst values: any[] = [];\r\n\tfor (const id in keys) {\r\n\t\tif (keys.hasOwnProperty(id)) {\r\n\t\t\tconst key: string = keys[id];\r\n\t\t\tvalues.push(object[key]);\r\n\t\t}\r\n\t}\r\n\r\n\treturn values;\r\n}\r\n\r\n/**\r\n * Create a date object from an input string\r\n * @param Object input string\r\n * @return date\r\n */\r\nexport function stringToDate(input: any): Date {\r\n\tif (!isString(input)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst newDate: Date = input ? new Date(input) : null;\r\n\treturn isDate(newDate) ? newDate : null;\r\n}\r\n\r\n/**\r\n * Takes two objects (source, target) and returns the target object with values in the source added to it.\r\n * It overwrites any source properties which already exist in target.\r\n */\r\nexport function overrideValues<T>(sourceObject: T, targetobject: T): T {\r\n\tif (!targetobject) {\r\n\t\treturn targetobject;\r\n\t}\r\n\r\n\tconst result: T = targetobject;\r\n\r\n\tif (sourceObject) {\r\n\t\tfor (const field in sourceObject) {\r\n\t\t\tif (sourceObject.hasOwnProperty(field)) {\r\n\t\t\t\t(result as any)[field] = (sourceObject as any)[field];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Test a string is in our supported ISO8601 UTC format of \"yyyy-MM-ddTHH:mm:ssZ\" and \"yyyy-MM-ddTHH:mm:ss.fffZ\"\r\n * @param input Input string to be evaluated.\r\n */\r\nexport function isUtcDatetimeString(input: any): boolean {\r\n\tif (!isString(input)) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst supportedUtcRegex = /^(\\d{4}\\-\\d\\d\\-\\d\\dT\\d\\d:\\d\\d:\\d\\d(\\.\\d\\d\\d)?Z)$/;\r\n\treturn supportedUtcRegex.test(input);\r\n}\r\n\r\n/**\r\n * Convert a date object to a string in ISO8601 UTC format supported by Floodgate (\"yyyy-MM-ddTHH:mm:ssZ\")\r\n * @param input Input date object\r\n */\r\nexport function dateToShortUtcString(input: Date): string {\r\n\tif (!isDate(input)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tfunction pad(n: number): string {\r\n\t\treturn (n < 10) ? (\"0\" + n) : n.toString();\r\n\t}\r\n\r\n\treturn input.getUTCFullYear() +\r\n\t\t\"-\" + pad(input.getUTCMonth() + 1) +\r\n\t\t\"-\" + pad(input.getUTCDate()) +\r\n\t\t\"T\" + pad(input.getUTCHours()) +\r\n\t\t\":\" + pad(input.getUTCMinutes()) +\r\n\t\t\":\" + pad(input.getUTCSeconds()) +\r\n\t\t\"Z\";\r\n}\r\n\r\n/*\r\nImplementing the Fisher-Yates Shuffle\r\n(Shuffles in situ)\r\n*/\r\nexport function fyShuffle(arrIn: number[]): number[] | undefined {\r\n\r\n\tif (isNOU(arrIn)) {\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t// If the array is empty or has one element, do nothing.\r\n\tif (arrIn.length === 0 || arrIn.length === 1) {\r\n\t\treturn arrIn;\r\n\t}\r\n\r\n\tlet lastNonShuffledElement = arrIn.length - 1;\r\n\r\n\t// While there is still a non shuffled element.\r\n\twhile (lastNonShuffledElement > 0) {\r\n\r\n\t\t// Pick one of the non shuffled elements (num range [0,lastNonShuffledElement+1))\r\n\t\tconst pickIndex = Math.floor(Math.random() * (lastNonShuffledElement + 1));\r\n\r\n\t\t// And swap it with the last non shuffled element\r\n\t\tconst temp = arrIn[lastNonShuffledElement];\r\n\t\tarrIn[lastNonShuffledElement] = arrIn[pickIndex];\r\n\t\tarrIn[pickIndex] = temp;\r\n\r\n\t\tlastNonShuffledElement--;\r\n\t}\r\n\r\n\treturn arrIn;\r\n}\r\n\r\n/**\r\n * Check if value is an valid user id\r\n * One or two character before colon, a colon, and some word after colon.\r\n * @param {any} value value\r\n */\r\nexport function isValidUserId(value: any): boolean {\r\n\tif (!isString(value)) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst supportedUserIdRegex = /^([a-z]{1,2}):\\w+/;\r\n\treturn supportedUserIdRegex.test(value);\r\n}\r\n\r\n/**\r\n * Safely read an object\r\n */\r\nexport function safeParseObject<T>(serializedValue: string, defaultValue?: T): T {\r\n\ttry {\r\n\t\tconst parsedObject = serializedValue && (serializedValue[0] === \"{\" || serializedValue[0] === \"[\")\r\n\t\t\t\t\t\t\t? JSON.parse(serializedValue)\r\n\t\t\t\t\t\t\t: undefined;\r\n\t\treturn parsedObject ?? defaultValue;\r\n\t} catch (e) {\r\n\t\t// ignore\r\n\t}\r\n\r\n\treturn defaultValue;\r\n}\r\n","/**\r\n * Interface for storing and retrieving floodgate-specific data from storage\r\n */\r\ninterface IFloodgateStorageProvider {\r\n\t/**\r\n\t * Lock the file to prevent access from another process.\r\n\t */\r\n\tfileLock(fileType: IFloodgateStorageProvider.FileType): void;\r\n\r\n\t/**\r\n\t * Unlock the file.\r\n\t */\r\n\tfileUnlock(fileType: IFloodgateStorageProvider.FileType): void;\r\n\r\n\t/**\r\n\t * Read the file\r\n\t */\r\n\tread(fileType: IFloodgateStorageProvider.FileType): string;\r\n\r\n\t/**\r\n\t * Write to the file\r\n\t */\r\n\twrite(fileType: IFloodgateStorageProvider.FileType, content: string): void;\r\n}\r\n\r\nmodule IFloodgateStorageProvider {\r\n\t/**\r\n\t * Enum for the files used by floodgate\r\n\t */\r\n\texport enum FileType {\r\n\t\tFloodgateSettings,\r\n\t\tSurveyActivationStats,\r\n\t\tSurveyEventActivityStats,\r\n\t\tCampaignDefinitions,\r\n\t\tCampaignStates,\r\n\t\tGovernedChannelStates,\r\n\t\tTmsCache_MessageMetadata,\r\n\t\tTmsCache_UserGovernance,\r\n\t\tTmsCache_CampaignContent,\r\n\t\tTms_DynamicSettings,\r\n\t\tLogLevelSettings,\r\n\t\tUserFacts,\r\n\t\tDebugOverrides,\r\n\t}\r\n}\r\n\r\nexport = IFloodgateStorageProvider;\r\n","import { ISurveyForm } from \"../Api/ISurveyForm\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport { ISurveyDomWriter } from \"./ISurveyDomWriter\";\r\nimport { ISurveyJsonWriter } from \"./ISurveyJsonWriter\";\r\n\r\n/**\r\n * The interface for all Surveys\r\n * A survey has a type, a globally unique id (otherwise opaque, but suitable for correlation with telemetry and for saving stats in the registry),\r\n * an expiration time to aid in cache cleanup, and an activation event to cause this survey to be triggered\r\n */\r\ninterface ISurvey extends ISurveyForm, ISurveyDomWriter, ISurveyJsonWriter {\r\n\t/**\r\n\t * Get the type of this survey.\r\n\t */\r\n\tgetType(): ISurvey.Type;\r\n\r\n\t/**\r\n\t * Get basic root-level information about this survey\r\n\t */\r\n\tgetSurveyInfo(): ISurveyInfo;\r\n}\r\n\r\nmodule ISurvey {\r\n\texport enum Type {\r\n\t\t// A Feedback survey. Contains a single question with a free-form text response\r\n\t\tFeedback = 0,\r\n\t\t// An NPS (net promoter score) survey. Asks user to rate \"whether or not they would recommend this product to family/friends\".\r\n\t\t// Contains a prompt, question, and rating\r\n\t\tNps = 1,\r\n\t\t// A PSAT (product satisfaction) survey. Asks user to rate \"overall, based on their experience, how satisifed are they with this app\"\r\n\t\t// Contains a prompt, question, and rating\r\n\t\tPsat = 2,\r\n\t\t// A BPS (build promotion) survey. Asks user to choose between Yes and No options of promoting the current build to the next audience ring\r\n\t\t// Contains a prompt, question, and rating (Yes/No)\r\n\t\tBps = 3,\r\n\t\t// A FPS (feature promotion) survey. Asks user to rate a given app feature.\r\n\t\t// Contains a prompt, question, and rating\r\n\t\tFps = 4,\r\n\t\t// A NLQS (net language quality score) survey. Asks user to rate the language quality.\r\n\t\t// Contains a prompt, question, and rating\r\n\t\tNlqs = 5,\r\n\t\t// An intercept survey. Asks user if they want to talk to a Microsoft engineer to give feedback.\r\n\t\t// User can dismiss it or click on it to go to the intercept website, where the experience continues.\r\n\t\tIntercept = 6,\r\n\t\t// A Generic surface survey that uses content metadata to render a surface.\r\n\t\t// As of 4th Feb 2019 there are 11 types defined in Mso hence giving a value of 12.\r\n\t\tGenericMessagingSurface = 12,\r\n\t}\r\n\r\n\texport const DOM_FEEDBACKSURVEY_TAGNAME = \"FeedbackSurvey\";\r\n\texport const DOM_NPS_TAGNAME = \"Nps\";\r\n\texport const DOM_PSAT_TAGNAME = \"Psat\";\r\n\texport const DOM_BPS_TAGNAME = \"Bps\";\r\n\texport const DOM_FPS_TAGNAME = \"Fps\";\r\n\texport const DOM_NLQS_TAGNAME = \"Nlqs\";\r\n\texport const DOM_INTERCEPT_TAGNAME = \"Intercept\";\r\n\r\n\t// If the launcher type is null or undefined in campaign definition then this value will be used as default\r\n\texport const LAUNCHER_TYPE_DEFAULT = \"survey\";\r\n}\r\n\r\nexport = ISurvey;\r\n","/**\r\n * Base interface for a SurveyComponent (i.e. a question/widget to show the user\r\n * in a survey form, and that typically requires a response value of some kind)\r\n */\r\ninterface ISurveyComponent {\r\n\tgetType(): ISurveyComponent.Type;\r\n}\r\n\r\nmodule ISurveyComponent {\r\n\texport const enum Type {\r\n\t\t// A quick pop-up requesting participation in a survey\r\n\t\tPrompt = \"Prompt\",\r\n\r\n\t\t// A question paired with a free-form text response\r\n\t\tComment = \"Comment\",\r\n\r\n\t\t// A question asking for a selection from a list of allowed values with numeric meaning\r\n\t\tRating = \"Rating\",\r\n\r\n\t\t// Information needed to pass into CVSurvey\r\n\t\tCVSurvey = \"CVSurvey\",\r\n\r\n\t\t// A question asking for one or more selections from a list of allowed values\r\n\t\tMultipleChoice = \"MultipleChoice\",\r\n\r\n\t\t// A pop-up dialog requesting participation in an Intercept session\r\n\t\tIntercept = \"Intercept\",\r\n\t}\r\n\r\n\texport const DOM_PROMPT_TAGNAME = \"Prompt\";\r\n\texport const DOM_COMMENT_TAGNAME = \"Comment\";\r\n\texport const DOM_RATING_TAGNAME = \"Rating\";\r\n\texport const DOM_CVSURVEY_TAGNAME = \"CVSurvey\";\r\n\texport const DOM_MULTIPLECHOICE_TAGNAME = \"MultipleChoice\";\r\n\texport const DOM_INTERCEPT_TAGNAME = \"Intercept\";\r\n\texport const JSON_INTERCEPT_KEYNAME = \"intercept\";\r\n\texport const JSON_INTERCEPTURL_KEYNAME = \"url\";\r\n\texport const JSON_PROMPT_KEYNAME = \"prompt\";\r\n\texport const JSON_PROMPTYESTEXT_KEYNAME = \"yesButtonText\";\r\n\texport const JSON_PROMPTNOTEXT_KEYNAME = \"noButtonText\";\r\n\texport const JSON_COMMENT_KEYNAME = \"comment\";\r\n\texport const JSON_RATING_KEYNAME = \"rating\";\r\n\texport const JSON_CVSURVEY_KEYNAME = \"cvSurvey\";\r\n\texport const JSON_CVSURVEYFORMID_KEYNAME = \"formId\";\r\n\texport const JSON_CVSURVEYTHEME_KEYNAME = \"theme\";\r\n\texport const JSON_RATINGOPTIONS_KEYNAME = \"options\";\r\n\texport const JSON_CVSURVEYPRODUCTNAME_KEYNAME = \"productName\";\r\n\texport const JSON_CVSURVEYUIHOST_KEYNAME = \"uiHost\";\r\n\texport const JSON_CVSURVEYPLATFORM_KEYNAME = \"platform\";\r\n\texport const JSON_TITLE_KEYNAME = \"title\";\r\n\texport const JSON_QUESTION_KEYNAME = \"question\";\r\n\texport const JSON_MULTIPLECHOICE_KEYNAME = \"multipleChoice\";\r\n\texport const JSON_APPLICATION_KEYNAME = \"application\";\r\n\texport const JSON_EXTENDEDMANIFESTDATA_KEYNAME = \"extendedManifestData\";\r\n\texport const JSON_SURVEYSTRINGS_KEYNAME = \"surveyStrings\";\r\n\texport const JSON_SURVEYSPECIFICDATA_KEYNAME = \"surveySpecificData\";\r\n}\r\n\r\nexport = ISurveyComponent;\r\n","/**\r\n * Constants.ts\r\n *\r\n * A module for all the constants.\r\n */\r\n\r\n/**\r\n * Telemetry events\r\n */\r\nexport class TelemetryEvent {\r\n\tpublic static CampaignState = class {\r\n\t\tpublic static Deserialize = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_CampaignState_Deserialize_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static FileBasedCampaignStateProvider = class {\r\n\t\tpublic static Load = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_FileBasedCampaignStateProvider_Load_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static HostBasedCampaignStateProvider = class {\r\n\t\tpublic static GetStatesFromHost = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_HostBasedCampaignStateProvider_GetStatesFromHost_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static Floodgate = class {\r\n\t\tpublic static Initialize = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_Floodgate_Initialize_Failed\";\r\n\t\t};\r\n\r\n\t\tpublic static Start = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_Floodgate_Start_Failed\";\r\n\t\t\tpublic static Warning: string = \"FloodgateCore_Floodgate_Start_Warning\";\r\n\t\t\tpublic static SurveysDisabled: string = \"FloodgateCore_Floodgate_Start_SurveysDisabled\";\r\n\t\t};\r\n\r\n\t\tpublic static UserFactsLoad = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_Floodgate_UserFactsLoad_Failed\";\r\n\t\t};\r\n\r\n\t\tpublic static UserFactsSpecDeserialization = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_Floodgate_UserFactsSpecDeserialization_Failed\";\r\n\t\t};\r\n\r\n\t\tpublic static UserFactsSpecIsAMatch = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_Floodgate_UserFactsSpecIsAMatch_Failed\";\r\n\t\t\tpublic static Mismatch: string = \"FloodgateCore_Floodgate_UserFactsSpecIsAMatch_Mismatch\";\r\n\t\t\tpublic static Summary: string = \"FloodgateCore_Floodgate_UserFactsSpecIsAMatch_Summary\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static FloodgateEngine = class {\r\n\t\tpublic static Make = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_FloodgateEngine_Make_Failed\";\r\n\t\t};\r\n\r\n\t\tpublic static Common = class {\r\n\t\t\tpublic static Error: string = \"FloodgateCore_FloodgateEngine_Common_Error\";\r\n\t\t};\r\n\r\n\t\tpublic static Start = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_FloodgateEngine_Start_Failed\";\r\n\t\t};\r\n\r\n\t\tpublic static StartAsync = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_FloodgateEngine_StartAsync_Failed\";\r\n\t\t\tpublic static Stopped: string = \"FloodgateCore_FloodgateEngine_StartAsync_Stopped\";\r\n\t\t};\r\n\r\n\t\tpublic static OnSurveyActivated = class {\r\n\t\t\tpublic static ActivationStatsSuppressedSurvey: string = \"FloodgateCore_FloodgateEngine_OnSurveyActivated_ActivationStatsSuppressedSurvey\";\r\n\t\t\tpublic static ClosedChannelType: string = \"FloodgateCore_FloodgateEngine_OnSurveyActivated_ClosedChannelType\";\r\n\t\t\tpublic static SurveyNotDefined: string = \"FloodgateCore_FloodgateEngine_OnSurveyActivated_SurveyNotDefined\";\r\n\t\t\tpublic static SessionSuppressedSurvey: string = \"FloodgateCore_FloodgateEngine_OnSurveyActivated_SessionSuppressedSurvey\";\r\n\t\t\tpublic static ActivationExpiredSurvey: string = \"FloodgateCore_FloodgateEngine_OnSurveyActivated_ActivationExpiredSurvey\";\r\n\t\t\tpublic static ActivationIrrelevantSurvey: string = \"FloodgateCore_FloodgateEngine_OnSurveyActivated_ActivationIrrelevantSurvey\";\r\n\t\t\tpublic static Error: string = \"FloodgateCore_FloodgateEngine_OnSurveyActivated_Error\";\r\n\t\t};\r\n\r\n\t\tpublic static CheckGovernanceServiceAndActivateSurvey = class {\r\n\t\t\tpublic static GovernanceServiceForceToDisplay: string = \"FloodgateCore_FloodgateEngine_GovernanceService_GovernanceServiceForceToDisplay\";\r\n\t\t\tpublic static GovernanceServiceClientCompleted: string = \"FloodgateCore_FloodgateEngine_GovernanceService_GovernanceServiceClientCompleted\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static GovernedChannelState = class {\r\n\t\tpublic static Deserialize = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_GovernedChannelState_Deserialize_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static FileBasedGovernedChannelStateProvider = class {\r\n\t\tpublic static Load = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_FileBasedGovernedChannelStateProvider_Load_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static HostBasedGovernedChannelStateProvider = class {\r\n\t\tpublic static GetStatesFromHost = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_HostBasedGovernedChannelStateProvider_GetStatesFromHost_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static SurveyStatCollectionActivation = class {\r\n\t\tpublic static FromJson = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_SurveyStatCollectionActivation_FromJson_Failed\";\r\n\t\t};\r\n\r\n\t\tpublic static ToJson = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_SurveyStatCollectionActivation_ToJson_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static HostBasedSurveyActivationStatsProvider = class {\r\n\t\tpublic static GetSurveyStatsFromHost = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_HostBasedSurveyActivationStatsProvider_GetSurveyStatsFromHost_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static SurveyStatCollectionEventActivity = class {\r\n\t\tpublic static FromJson = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_SurveyStatCollectionEventActivity_FromJson_Failed\";\r\n\t\t};\r\n\r\n\t\tpublic static ToJson = class {\r\n\t\t\tpublic static Failed: string = \"FloodgateCore_SurveyStatCollectionEventActivity_ToJson_Failed\";\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static SurveyActivity = class {\r\n\t\tpublic static LogActivity = class {\r\n\t\t\tpublic static EventsReprocessed: string = \"FloodgateCore_SurveyActivity_LogActivity_EventsReprocessed\";\r\n\t\t\tpublic static SurveysReprocessed: string = \"FloodgateCore_SurveyActivity_LogActivity_SurveysReprocessed\";\r\n\t\t};\r\n\r\n\t\tpublic static SetActivityTrackingContracts = class {\r\n\t\t\tpublic static DuplicateSurveyID: string = \"FloodgateCore_SurveyActivity_SetActivityTrackingContracts_DuplicateSurveyID\";\r\n\t\t};\r\n\t};\r\n}\r\n","import { ActivityTrackingSet } from \"./ActivityTrackingSet\";\r\nimport { ISurveyInfo, IUserFactProvider } from \"./Api/Api\";\r\nimport * as IActivityListener from \"./Api/IActivityListener\";\r\nimport { IFloodgateEnvironmentProvider } from \"./Api/IFloodgateEnvironmentProvider\";\r\nimport { IFloodgateSettingStorageCallback } from \"./Api/IFloodgateSettingStorageCallback\";\r\nimport * as IFloodgateStorageProvider from \"./Api/IFloodgateStorageProvider\";\r\nimport * as IFloodgateStringProvider from \"./Api/IFloodgateStringProvider\";\r\nimport { IFloodgateTelemetryLogger } from \"./Api/IFloodgateTelemetryLogger\";\r\nimport { GovernanceServiceClientState, IGovernanceServiceClient, IGovernanceServiceResult, IGovernanceSurveyInfo, IGovernanceSurveyResponse } from \"./Api/IGovernanceServiceClient\";\r\nimport { IContextData, IOnSurveyActivatedCallback } from \"./Api/IOnSurveyActivatedCallback\";\r\nimport * as ISurvey from \"./Api/ISurvey\";\r\nimport { ISurveyLauncher } from \"./Api/ISurveyLauncher\";\r\nimport { ISurveyLauncherFactory } from \"./Api/ISurveyLauncherFactory\";\r\nimport { ITelemetryProperties } from \"./Api/ITelemetryProperties\";\r\nimport { ITransporterFactory } from \"./Api/ITransporterFactory\";\r\nimport { CampaignDefinition,\r\n\t\tCampaignNominationSchemeRatioPercentage,\r\n\t\tFileSystemCampaignDefinitionProvider,\r\n\t\tICampaignDefinitionProvider } from \"./Campaign/CampaignDefinitionProvider\";\r\nimport { CampaignManager } from \"./Campaign/CampaignManager\";\r\nimport { CampaignStateProviderFactory, ICampaignStateProvider } from \"./Campaign/CampaignStateProvider\";\r\nimport { IDictionary } from \"./Common\";\r\nimport { TelemetryEvent } from \"./Constants\";\r\nimport { FloodgateSettings } from \"./FloodgateSettings\";\r\nimport { GovernedChannelType, IGovernedChannelData } from \"./GovernedChannel\";\r\nimport { GovernedChannelStateProviderFactory, IGovernedChannelStateProvider } from \"./GovernedChannelStateProvider\";\r\nimport { Governor, IGovernor } from \"./Governor\";\r\nimport { ISurveyClient } from \"./ISurveyClient\";\r\nimport * as SurveyActivityListener from \"./SurveyActivityListener\";\r\nimport { ISurveyActivationStatsProvider, SurveyActivationStats, SurveyActivationStatsProviderFactory,\r\n\tSurveyStatCollectionActivation } from \"./SurveyStatCollectionActivation\";\r\nimport { SurveyEventActivityStats, SurveyStatCollectionEventActivity } from \"./SurveyStatCollectionEventActivity\";\r\n\r\nimport FileType = IFloodgateStorageProvider.FileType;\r\nimport { ActivityTrackingContract } from \"./ActivityTrackingContract\";\r\nimport { hasSurveyReachedMaxLaunches, hasSurveyReachedMaxLaunchesPerSession, isBusinessCriticalSurvey, isCriticalSurvey, isMultiLaunchSurvey } from \"./GovernanceUtils\";\r\nimport { isNOU } from \"./Utils\";\r\n\r\n// Telemetry logger with no-op logger\r\nclass DefaultFloodgateTelemetryLogger implements IFloodgateTelemetryLogger {\r\n\t// @Override\r\n\tpublic log_TriggerMet(campaignId: string, surveyId: string, surveyType: ISurvey.Type, surveyActivityInfo: string,\r\n\t\tadditionalSurveyInfo: string): void {}\r\n\r\n\t// @Override\r\n\tpublic log_UserSelected(campaignId: string, surveyId: string, surveyType: ISurvey.Type,\r\n\t\tadditionalSurveyInfo: string): void {}\r\n\r\n\t// @Override\r\n\tpublic log_CampaignLoad_Failed(errorMessage: string): void {}\r\n\r\n\t// @Override\r\n\tpublic log_Error(eventId: string, errorMessage: string): void {}\r\n\r\n\t// @Override\r\n\tpublic log_Event(eventId: string, properties: ITelemetryProperties): void {}\r\n\r\n\t// @Override\r\n\tpublic log_LocalError(message: string, ...data: any[]): void {}\r\n}\r\n\r\nexport const enum InitializationStatus {\r\n\tNone = 0,\r\n\tError,\r\n\tInitializing,\r\n\tStarted,\r\n\tStopped,\r\n}\r\n\r\nconst defaultSurveyActivityListener: SurveyActivityListener.IActivityListenerCallback = {\r\n\trun(survey) {\r\n\t},\r\n\tshouldAcceptActivity(activityName) {\r\n\t\treturn true;\r\n\t},\r\n};\r\n\r\nconst globalSessionSurveyActivationCounts: IDictionary<number> = {};\r\n\r\n/**\r\n * Floodgate Engine class.  The main wiring hub and the brains responsible for\r\n * linking together the survey definitions, governance, activity tracking, and\r\n * survey launchers.  Only one-instance-at-a-time of these should be created\r\n * per app session.\r\n */\r\nexport class FloodgateEngine {\r\n\tpublic static setTelemetryLogger(telemetryLogger: IFloodgateTelemetryLogger): void {\r\n\t\tif (!telemetryLogger) {\r\n\t\t\tthrow new Error(\"telemetryLogger must not be null\");\r\n\t\t}\r\n\r\n\t\tFloodgateEngine.telemetryLogger = telemetryLogger;\r\n\t}\r\n\r\n\tpublic static getTelemetryLogger(): IFloodgateTelemetryLogger {\r\n\t\treturn FloodgateEngine.telemetryLogger;\r\n\t}\r\n\r\n\tpublic static getTransportFactory(): ITransporterFactory {\r\n\t\treturn FloodgateEngine.transporterFactory;\r\n\t}\r\n\r\n\tpublic static make(\r\n\t\tbuildVersion: string,\r\n\t\tlauncherFactory: ISurveyLauncherFactory,\r\n\t\tonSurveyActivatedCallback: IOnSurveyActivatedCallback,\r\n\t\tfileBasedStorageProvider: IFloodgateStorageProvider,\r\n\t\thostBasedStorageProvider: IFloodgateSettingStorageCallback,\r\n\t\tstringProvider: IFloodgateStringProvider,\r\n\t\tenvironmentProvider: IFloodgateEnvironmentProvider,\r\n\t\ttransporterFactory: ITransporterFactory,\r\n\t\tcampaignDefinitionProviders: ICampaignDefinitionProvider[],\r\n\t\tuserFactsProvider: IUserFactProvider,\r\n\t\tgovernanceServiceClient: IGovernanceServiceClient): FloodgateEngine {\r\n\r\n\t\ttry {\r\n\t\t\tconst governedChannelStateProvider: IGovernedChannelStateProvider\r\n\t\t\t\t= GovernedChannelStateProviderFactory.make(fileBasedStorageProvider, hostBasedStorageProvider);\r\n\r\n\t\t\tconst surveyActivationStatsProvider: ISurveyActivationStatsProvider\r\n\t\t\t\t= SurveyActivationStatsProviderFactory.make(fileBasedStorageProvider, hostBasedStorageProvider);\r\n\r\n\t\t\tconst campaignStateProvider: ICampaignStateProvider\r\n\t\t\t\t= CampaignStateProviderFactory.make(fileBasedStorageProvider, hostBasedStorageProvider);\r\n\r\n\t\t\tcampaignDefinitionProviders.push(new FileSystemCampaignDefinitionProvider(fileBasedStorageProvider));\r\n\r\n\t\t\treturn new FloodgateEngine(\r\n\t\t\t\tnew CampaignManager(\r\n\t\t\t\t\tcampaignStateProvider,\r\n\t\t\t\t\tcampaignDefinitionProviders,\r\n\t\t\t\t\tstringProvider,\r\n\t\t\t\t\tenvironmentProvider,\r\n\t\t\t\t\tbuildVersion,\r\n\t\t\t\t\tnew Date(),\r\n\t\t\t\t\tuserFactsProvider,\r\n\t\t\t\t),\r\n\t\t\t\tnew SurveyActivityListener(\r\n\t\t\t\t\tdefaultSurveyActivityListener,\r\n\t\t\t\t\tthis.getTelemetryLogger,\r\n\t\t\t\t),\r\n\t\t\t\tlauncherFactory,\r\n\t\t\t\tonSurveyActivatedCallback,\r\n\t\t\t\tfileBasedStorageProvider,\r\n\t\t\t\tnew Governor(\r\n\t\t\t\t\tgovernedChannelStateProvider,\r\n\t\t\t\t),\r\n\t\t\t\tsurveyActivationStatsProvider,\r\n\t\t\t\ttransporterFactory,\r\n\t\t\t\tgovernanceServiceClient,\r\n\t\t\t);\r\n\t\t} catch (e) {\r\n\t\t\tthis.telemetryLogger.log_Event(TelemetryEvent.FloodgateEngine.Make.Failed,\r\n\t\t\t\t{ ErrorMessage: e && e.toString(), ErrorDetails: e && e.stack });\r\n\t\t}\r\n\t}\r\n\r\n\t// Initialize telemetry logger with no-op logger\r\n\tprivate static telemetryLogger: IFloodgateTelemetryLogger = new DefaultFloodgateTelemetryLogger();\r\n\tprivate static transporterFactory: ITransporterFactory;\r\n\r\n\tprivate surveyClient: ISurveyClient;\r\n\tprivate activityListener: SurveyActivityListener;\r\n\tprivate onSurveyActivatedCallback: IOnSurveyActivatedCallback;\r\n\tprivate launcherFactory: ISurveyLauncherFactory;\r\n\tprivate storage: IFloodgateStorageProvider;\r\n\tprivate governor: IGovernor;\r\n\tprivate initializationStatus: InitializationStatus = InitializationStatus.None;\r\n\tprivate loggedFirstStart: boolean;\r\n\r\n\tprivate floodgateSettings: FloodgateSettings;\r\n\tprivate previousSurveyActivationStats: SurveyStatCollectionActivation;\r\n\tprivate previousSurveyEventActivityStats: SurveyStatCollectionEventActivity;\r\n\r\n\tprivate candidateSurveys: IDictionary<ISurvey> = {};\r\n\tprivate launchedSurveys: IDictionary<ISurvey> = {};\r\n\tprivate launchedLaunchers: ISurveyLauncher[] = [];\r\n\tprivate surveyEventSent: string[] = [];\r\n\r\n\tprivate surveyActivationStatsProvider: ISurveyActivationStatsProvider;\r\n\r\n\tprivate governanceServiceClient: IGovernanceServiceClient;\r\n\tprivate staleTriggeredSurveysQueue: ISurvey[] = [];\r\n\r\n\tpublic constructor(surveyClient: ISurveyClient, activityListener: SurveyActivityListener, launcherFactory: ISurveyLauncherFactory,\r\n\t\tonSurveyActivatedCallback: IOnSurveyActivatedCallback, storage: IFloodgateStorageProvider, governor: IGovernor,\r\n\t\tsurveyActivationStatsProvider: ISurveyActivationStatsProvider, transporterFactory: ITransporterFactory,\r\n\t\tgovernanceServiceClient: IGovernanceServiceClient) {\r\n\r\n\t\tif (!surveyClient) {\r\n\t\t\tthrow new Error(\"surveyClient must not be null\");\r\n\t\t}\r\n\t\tif (!activityListener) {\r\n\t\t\tthrow new Error(\"activityListener must not be null\");\r\n\t\t}\r\n\t\tif (!launcherFactory) {\r\n\t\t\tthrow new Error(\"launcherFactory must not be null\");\r\n\t\t}\r\n\t\tif (!onSurveyActivatedCallback) {\r\n\t\t\tthrow new Error(\"onSurveyActivatedCallback must not be null\");\r\n\t\t}\r\n\t\tif (!storage) {\r\n\t\t\tthrow new Error(\"storage must not be null\");\r\n\t\t}\r\n\t\tif (!governor) {\r\n\t\t\tthrow new Error(\"governor must not be null\");\r\n\t\t}\r\n\t\tif (!transporterFactory) {\r\n\t\t\tthrow new Error(\"transporterFactory must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.surveyClient = surveyClient;\r\n\t\tthis.activityListener = activityListener;\r\n\t\tthis.launcherFactory = launcherFactory;\r\n\t\tthis.onSurveyActivatedCallback = onSurveyActivatedCallback;\r\n\t\tthis.storage = storage;\r\n\t\tthis.governor = governor;\r\n\t\tthis.surveyActivationStatsProvider = surveyActivationStatsProvider;\r\n\t\tthis.governanceServiceClient = governanceServiceClient;\r\n\t\tFloodgateEngine.transporterFactory = transporterFactory;\r\n\r\n\t\tthis.loggedFirstStart = false;\r\n\r\n\t\t// Initialize our list to a valid, empty collection\r\n\t\tthis.setPendingSurveys(null);\r\n\r\n\t\t// If the listener was pre-configured with survey for some reason, clear it now\r\n\t\tthis.activityListener.clearSurveys();\r\n\r\n\t\t// Link ourselves with the listener\r\n\t\tconst thisObj = this; // Save current object in a variable to allow access from callback.\r\n\t\tthis.activityListener.setCallback({\r\n\t\t\trun(surveyId: string, contextInfo: IContextData[]) {\r\n\t\t\t\tthisObj.onSurveyActivated(surveyId, contextInfo);\r\n\t\t\t},\r\n\t\t\tshouldAcceptActivity(activityName: string) {\r\n\t\t\t\treturn thisObj.shouldAcceptActivity(activityName);\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Save all internal stats and floodgateSettings (merging with existing file contents), without stopping the engine.\r\n\t */\r\n\tpublic mergeAndSave(): void {\r\n\t\tthis.saveSettings();\r\n\t\tthis.saveSurveyActivationHistory();\r\n\t\tthis.saveSurveyEventActivityHistory();\r\n\r\n\t\t// Inform surveyClient to save its state\r\n\t\tthis.surveyClient.saveCurrentState();\r\n\r\n\t\t// Save governed channel states\r\n\t\tthis.governor.saveChannelStates();\r\n\t}\r\n\r\n\t/**\r\n\t * Start the engine.  Checks feature enable state, causes survey definitions to be read, and tracked activities to be set on the listener.\r\n\t */\r\n\tpublic start(): void {\r\n\t\tif (this.initializationStatus === InitializationStatus.Initializing ||\r\n\t\t\tthis.initializationStatus === InitializationStatus.Started) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tthis.setInitializationStatus(InitializationStatus.Initializing);\r\n\t\t\tthis.loadSettingsAndPriorEventCounts();\r\n\r\n\t\t\tconst channelTypes: GovernedChannelType[] = this.getAvailableChannelTypes();\r\n\r\n\t\t\tthis.surveyClient.refreshSurveyDefinitions(channelTypes);\r\n\r\n\t\t\tthis.setPendingSurveysAndStartFloodgate();\r\n\t\t\tthis.setInitializationStatus(InitializationStatus.Started);\r\n\t\t} catch (e) {\r\n\t\t\tthis.setInitializationStatus(InitializationStatus.Error);\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(TelemetryEvent.FloodgateEngine.Start.Failed,\r\n\t\t\t\t{ ErrorMessage: e && e.toString(), ErrorDetails: e && e.stack });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Start the engine.  Checks feature enable state, causes survey definitions to be read, and tracked activities to be set on the listener.\r\n\t */\r\n\tpublic startAsync(): Promise<void> {\r\n\t\tif (this.initializationStatus === InitializationStatus.Initializing ||\r\n\t\t\tthis.initializationStatus === InitializationStatus.Started) {\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tthis.setInitializationStatus(InitializationStatus.Initializing);\r\n\t\t\tthis.loadSettingsAndPriorEventCounts();\r\n\r\n\t\t\tconst channelTypes: GovernedChannelType[] = this.getAvailableChannelTypes();\r\n\r\n\t\t\tconst thisFloodgateEngine = this;\r\n\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\tthisFloodgateEngine.surveyClient.refreshSurveyDefinitionsAsync(channelTypes).then(\r\n\t\t\t\t\tfunction onFulfilled() {\r\n\t\t\t\t\t\t// Handle any stop() calls that happened while initializing\r\n\t\t\t\t\t\tif (thisFloodgateEngine.initializationStatus === InitializationStatus.Stopped) {\r\n\t\t\t\t\t\t\tthisFloodgateEngine.setInitializationStatus(InitializationStatus.Started);\r\n\t\t\t\t\t\t\tthisFloodgateEngine.stop();\r\n\t\t\t\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(TelemetryEvent.FloodgateEngine.StartAsync.Stopped,\r\n\t\t\t\t\t\t\t\t{ ErrorMessage: \"Stopped because of a pending stop() call\" });\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthisFloodgateEngine.setPendingSurveysAndStartFloodgate();\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tresolve();\r\n\t\t\t\t\t},\r\n\t\t\t\t).catch(\r\n\t\t\t\t\tfunction OnRejected(error: Error) {\r\n\t\t\t\t\t\tthisFloodgateEngine.setInitializationStatus(InitializationStatus.Error);\r\n\t\t\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(TelemetryEvent.FloodgateEngine.StartAsync.Failed,\r\n\t\t\t\t\t\t\t{ ErrorMessage: \"Survey refresh error \" + (error && error.message) });\r\n\r\n\t\t\t\t\t\treject(error);\r\n\t\t\t\t\t},\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t} catch (e) {\r\n\t\t\tthis.setInitializationStatus(InitializationStatus.Error);\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(TelemetryEvent.FloodgateEngine.StartAsync.Failed,\r\n\t\t\t\t{ ErrorMessage: e && e.toString(), ErrorDetails: e && e.stack });\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Stop the engine.  Causes tracked activities to be cleared and any in-progress counters not otherwise saved to be thrown out.\r\n\t */\r\n\tpublic stop(): void {\r\n\t\tif (this.initializationStatus === InitializationStatus.Started) {\r\n\t\t\tthis.mergeAndSave();\r\n\r\n\t\t\t// Clear our Survey list, and push that through to the listener\r\n\t\t\tthis.setPendingSurveys(null);\r\n\t\t\tthis.updateActivityListenerWithCurrentSurveyDefinitions();\r\n\t\t}\r\n\r\n\t\tthis.setInitializationStatus(InitializationStatus.Stopped);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the IActivityListener logging interface for callers that want to log directly rather than through telemetry\r\n\t */\r\n\tpublic getActivityListener(): IActivityListener {\r\n\t\treturn this.activityListener;\r\n\t}\r\n\r\n\tprivate setInitializationStatus(status: InitializationStatus): void {\r\n\t\tthis.initializationStatus = status;\r\n\t}\r\n\r\n\tprivate saveSettings(): void {\r\n\t\tthis.storage.fileLock(FileType.FloodgateSettings);\r\n\r\n\t\ttry {\r\n\t\t\tthis.writeString(FileType.FloodgateSettings, FloodgateSettings.toJson(this.floodgateSettings));\r\n\t\t} finally {\r\n\t\t\tthis.storage.fileUnlock(FileType.FloodgateSettings);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate loadSettingsAndPriorEventCounts(): void {\r\n\t\ttry {\r\n\t\t\t// Load up the prior survey history and prior event counts\r\n\t\t\tthis.previousSurveyActivationStats = this.surveyActivationStatsProvider.load();\r\n\r\n\t\t\tthis.previousSurveyEventActivityStats =\r\n\t\t\t\tSurveyStatCollectionEventActivity.fromJson(this.readString(FileType.SurveyEventActivityStats));\r\n\r\n\t\t\t// get the list of survey Id - all the survey should have event sent already\r\n\t\t\tconst stats: IDictionary<SurveyEventActivityStats> = this.previousSurveyEventActivityStats.getStats();\r\n\t\t\tfor (const key in stats) {\r\n\t\t\t\tif (stats.hasOwnProperty(key)) {\r\n\t\t\t\t\tthis.surveyEventSent.push(key);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Load up the general floodgateSettings\r\n\t\t\tthis.floodgateSettings = FloodgateSettings.fromJson(this.readString(FileType.FloodgateSettings));\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(TelemetryEvent.FloodgateEngine.Common.Error,\r\n\t\t\t\t{ ErrorMessage: \"Error loading prior settings/events \" + (e && e.toString()) });\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getAvailableChannelTypes(): GovernedChannelType[] {\r\n\t\t// Make sure we've loaded the current survey definitions\r\n\t\tconst channels: IGovernedChannelData[] = this.governor.getAvailableChannelData();\r\n\t\tconst channelTypes: GovernedChannelType[] = [];\r\n\r\n\t\tchannels.forEach((channel) => {\r\n\t\t\tif (channel) {\r\n\t\t\t\tchannelTypes.push(channel.getType());\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn channelTypes;\r\n\t}\r\n\r\n\tprivate setPendingSurveysAndStartFloodgate(): void {\r\n\t\t// Update our survey list, and push that through to the listener\r\n\t\tthis.setPendingSurveys(this.surveyClient.getAppSurveys());\r\n\t\tthis.updateActivityListenerWithCurrentSurveyDefinitions();\r\n\r\n\t\t// Mark us as started\r\n\t\tthis.setInitializationStatus(InitializationStatus.Started);\r\n\r\n\t\t// Log our first start (aka floodgate boot) event\r\n\t\tif (!this.loggedFirstStart) {\r\n\t\t\tthis.loggedFirstStart = true;\r\n\t\t\tthis.getActivityListener().logActivity(SurveyActivityListener.FloodgateStartActivityName);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate updateSurveyActivationStats(survey: ISurvey) {\r\n\t\tconst surveyInfo = survey.getSurveyInfo();\r\n\t\tconst surveyId = surveyInfo.getId();\r\n\t\tconst stats = this.previousSurveyActivationStats.getStats()[surveyId] || new SurveyActivationStats();\r\n\t\tstats.Type = survey.getType();\r\n\t\tstats.ExpirationTimeUtc = surveyInfo.getExpirationTimeUtc();\r\n\t\tstats.ActivationTimeUtc = new Date();\r\n\t\tstats.SurveyLaunchCount++;\r\n\r\n\t\tthis.previousSurveyActivationStats.addStats(surveyId, stats);\r\n\r\n\t\t// Save the SurveyLaunchCountPerSession into global memory but not local storage\r\n\t\t// so it won't be overwritten in local storage by another app instance\r\n\t\tif (!globalSessionSurveyActivationCounts.hasOwnProperty(surveyId)) {\r\n\t\t\tglobalSessionSurveyActivationCounts[surveyId] = 0;\r\n\t\t}\r\n\t\tglobalSessionSurveyActivationCounts[surveyId]++;\r\n\t}\r\n\r\n\tprivate saveSurveyActivationHistory(): void {\r\n\t\tthis.storage.fileLock(FileType.SurveyActivationStats);\r\n\r\n\t\ttry {\r\n\t\t\tconst statCollection: SurveyStatCollectionActivation = this.surveyActivationStatsProvider.load();\r\n\r\n\t\t\tconst previousStats = this.previousSurveyActivationStats.getStats();\r\n\r\n\t\t\t// Build the update collection\r\n\t\t\tconst updateCollection = new SurveyStatCollectionActivation();\r\n\t\t\tfor (const key in this.launchedSurveys) {\r\n\t\t\t\tif (this.launchedSurveys.hasOwnProperty(key)) {\r\n\t\t\t\t\tconst survey: ISurvey = this.launchedSurveys[key];\r\n\t\t\t\t\tconst surveyId = survey.getSurveyInfo().getId();\r\n\r\n\t\t\t\t\t// Make this part of the update list\r\n\t\t\t\t\tconst stats = previousStats[surveyId];\r\n\t\t\t\t\tupdateCollection.addStats(surveyId, stats);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Actually merge our updates into the full collection\r\n\t\t\tstatCollection.accumulate(updateCollection);\r\n\t\t\tthis.surveyActivationStatsProvider.save(statCollection);\r\n\r\n\t\t\t// Make sure to keep our internal collection consistent with what we just wrote\r\n\t\t\tthis.previousSurveyActivationStats = statCollection;\r\n\t\t} finally {\r\n\t\t\tthis.storage.fileUnlock(FileType.SurveyActivationStats);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate saveSurveyEventActivityHistory(): void {\r\n\t\tthis.storage.fileLock(FileType.SurveyEventActivityStats);\r\n\r\n\t\ttry {\r\n\t\t\tconst statCollection: SurveyStatCollectionEventActivity =\r\n\t\t\t\tSurveyStatCollectionEventActivity.fromJson(this.readString(FileType.SurveyEventActivityStats));\r\n\r\n\t\t\tconst now = new Date();\r\n\t\t\t// Fill out our list of updates\r\n\t\t\tconst updateCollection = new SurveyStatCollectionEventActivity();\r\n\t\t\tfor (const key in this.candidateSurveys) {\r\n\t\t\t\tif (this.candidateSurveys.hasOwnProperty(key)) {\r\n\t\t\t\t\tconst stats: SurveyEventActivityStats = new SurveyEventActivityStats();\r\n\t\t\t\t\tconst survey: ISurvey = this.candidateSurveys[key];\r\n\r\n\t\t\t\t\tif (!survey.getSurveyInfo().isActiveForDate(now)) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tstats.ExpirationTimeUtc = survey.getSurveyInfo().getExpirationTimeUtc();\r\n\r\n\t\t\t\t\t// Get the activities which are aggregated, if there aren't any continue\r\n\t\t\t\t\tconst allActivities: ActivityTrackingSet = survey.getSurveyInfo().getActivationEvent().getTrackingSet();\r\n\t\t\t\t\tconst aggregateActivities: string[] = [];\r\n\t\t\t\t\tconst nonAggregateActivities: string[] = [];\r\n\r\n\t\t\t\t\tallActivities.getList().forEach((data) => {\r\n\t\t\t\t\t\tif (data) {\r\n\t\t\t\t\t\t\tif (data.getIsAggregate()) {\r\n\t\t\t\t\t\t\t\taggregateActivities.push(data.getActivity());\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tnonAggregateActivities.push(data.getActivity());\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tstats.Counts = new Array(aggregateActivities.length);\r\n\r\n\t\t\t\t\t// Save off the counts we've added for this session\r\n\t\t\t\t\tfor (let i = 0; i < aggregateActivities.length; i++) {\r\n\t\t\t\t\t\tstats.Counts[i] = this.activityListener.moveSessionCountIntoBaseCount(aggregateActivities[i], survey.getSurveyInfo().getId());\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfor (const activity of nonAggregateActivities) {\r\n\t\t\t\t\t\tthis.activityListener.saveSessionTrackingActivity(activity);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Make this part of the update list\r\n\t\t\t\t\tupdateCollection.addStats(survey.getSurveyInfo().getId(), stats);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Actually merge our updates into the full collection\r\n\t\t\tstatCollection.accumulate(updateCollection);\r\n\r\n\t\t\tthis.writeString(FileType.SurveyEventActivityStats, SurveyStatCollectionEventActivity.toJson(statCollection));\r\n\t\t\t// Make sure to keep our internal collection consistent with what we just wrote\r\n\t\t\tthis.previousSurveyEventActivityStats = statCollection;\r\n\t\t} finally {\r\n\t\t\tthis.storage.fileUnlock(FileType.SurveyEventActivityStats);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate setPendingSurveys(pendingSurveys: IDictionary<ISurvey>): void {\r\n\t\tthis.candidateSurveys = {};\r\n\t\tif (pendingSurveys) {\r\n\t\t\tfor (const key in pendingSurveys) {\r\n\t\t\t\tif (pendingSurveys.hasOwnProperty(key)) {\r\n\t\t\t\t\tconst survey: ISurvey = pendingSurveys[key];\r\n\t\t\t\t\tif (this.launcherFactory.AcceptsSurvey(survey)) {\r\n\t\t\t\t\t\tthis.candidateSurveys[key] = survey;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getCurrentSurveyDefinitions(): ISurvey[] {\r\n\t\t// Get a vector of Surveys from our id-based map\r\n\t\tconst surveyList: ISurvey[] = new Array<ISurvey>();\r\n\r\n\t\tconst allCampaignDefinitionIDs = this.getAllCampaignDefinitionIDs();\r\n\t\tconst allCandidateCampaignDefinitionIDs = this.getAllCandidateCampaignDefinitionIDs();\r\n\r\n\t\t// Get all the campaign definitions. We need info from these for telemetry.\r\n\t\tconst allCampaignDefinitions = (this.surveyClient as CampaignManager).getCampaignDefinitions();\r\n\r\n\t\tconst isSurveyAllowed = (surveyInfo: ISurveyInfo) => {\r\n\t\t\t// always allow business critical and approved campaigns\r\n\t\t\tif (isBusinessCriticalSurvey(surveyInfo)) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tconst surveyActivationStats = this.previousSurveyActivationStats.getBySurveyId(surveyInfo.getId());\r\n\t\t\tif (isMultiLaunchSurvey(surveyInfo) &&\r\n\t\t\t\t!hasSurveyReachedMaxLaunches(surveyInfo, surveyActivationStats) &&\r\n\t\t\t\t!hasSurveyReachedMaxLaunchesPerSession(surveyInfo, globalSessionSurveyActivationCounts)) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\t// Skip over any candidate surveys that have been previously completed or not active anymore\r\n\t\t\tif (surveyActivationStats || !surveyInfo.isActiveForDate(new Date())) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\t\tfor (const key in this.candidateSurveys) {\r\n\t\t\tif (this.candidateSurveys.hasOwnProperty(key)) {\r\n\t\t\t\tconst survey: ISurvey = this.candidateSurveys[key];\r\n\t\t\t\tconst surveyInfo = survey.getSurveyInfo();\r\n\t\t\t\tconst campaignDefinition: CampaignDefinition = allCampaignDefinitions[surveyInfo?.getBackEndId()];\r\n\t\t\t\tif (!campaignDefinition || !isSurveyAllowed(surveyInfo)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// send the UserSelected event if it is not sent before\r\n\t\t\t\tif (this.surveyEventSent.indexOf(key) < 0) {\r\n\t\t\t\t\tthis.surveyEventSent.push(key);\r\n\r\n\t\t\t\t\tconst additionalSurveyInfo = this.getAdditionalSurveyInfoForTelemetry(survey,\r\n\t\t\t\t\t\tnull /* contextInfo */,\r\n\t\t\t\t\t\tallCampaignDefinitionIDs,\r\n\t\t\t\t\t\tallCandidateCampaignDefinitionIDs);\r\n\r\n\t\t\t\t\tFloodgateEngine.telemetryLogger.log_UserSelected(surveyInfo.getBackEndId(),\r\n\t\t\t\t\t\tsurveyInfo.getId(),\r\n\t\t\t\t\t\tsurvey.getType(),\r\n\t\t\t\t\t\tJSON.stringify(additionalSurveyInfo));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsurveyList.push(survey);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn surveyList;\r\n\t}\r\n\r\n\tprivate getAdditionalSurveyInfoForTelemetry(survey: ISurvey,\r\n\t\tcontextInfo: IContextData[], allCampaignDefinitionIDs: string[], allCandidateCampaignDefinitionIDs: string[]): {\r\n\t\tallCandidateCampaignDefinitionIDs: string[],\r\n\t\tallCampaignDefinitionIDs: string[],\r\n\t\tcontextCount?: number,\r\n\t\tsurveyLauncherType: string,\r\n\t\tchannelType: GovernedChannelType,\r\n\t\tpercentageNumerator: number,\r\n\t\tpercentageDenominator: number,\r\n\t\tnominationPeriodNumber: number,\r\n\t\tcooldownPeriodNumber: number,\r\n\t\tbusinessLevel: number,\r\n\t\tmaxLaunches: number,\r\n\t\tmaxLaunchesPerSession: number,\r\n\t\tgovernanceServiceClientState?: GovernanceServiceClientState,\r\n\t} {\r\n\t\t// Get all the campaign definitions. We need info from these for telemetry.\r\n\t\tconst allCampaignDefinitions = (this.surveyClient as CampaignManager).getCampaignDefinitions();\r\n\r\n\t\t// Get the corresponding campaign definition to the survey in question.\r\n\t\tconst correspondingCampaignDefinition = allCampaignDefinitions[survey.getCampaignId()];\r\n\r\n\t\t// Survey properties to get from its corresponding CampaignDefinition:\r\n\t\tlet percentageNumerator: number;\r\n\t\tlet percentageDenominator: number;\r\n\t\tlet nominationPeriodNumber: number;\r\n\t\tlet cooldownPeriodNumber: number;\r\n\r\n\t\tpercentageNumerator = (correspondingCampaignDefinition.nominationScheme as CampaignNominationSchemeRatioPercentage).percentageNumerator;\r\n\t\tpercentageDenominator = (correspondingCampaignDefinition.nominationScheme as CampaignNominationSchemeRatioPercentage).percentageDenominator;\r\n\r\n\t\tnominationPeriodNumber = correspondingCampaignDefinition.nominationScheme.nominationPeriod.asTimeIntervalSeconds();\r\n\t\tnominationPeriodNumber = isNOU(nominationPeriodNumber) ? -1 : nominationPeriodNumber; // Setting to -1 if null or undefined\r\n\r\n\t\tcooldownPeriodNumber = correspondingCampaignDefinition.nominationScheme.cooldownPeriod.asTimeIntervalSeconds();\r\n\t\tcooldownPeriodNumber = isNOU(cooldownPeriodNumber) ? -1 : cooldownPeriodNumber;  // Setting to -1 if null or undefined\r\n\r\n\t\tconst surveyInfo = survey.getSurveyInfo();\r\n\t\treturn {\r\n\t\t\tallCampaignDefinitionIDs,\r\n\t\t\tallCandidateCampaignDefinitionIDs,\r\n\t\t\tchannelType: surveyInfo.getGovernedChannelType(),\r\n\t\t\tcontextCount: contextInfo ? contextInfo.length : undefined,\r\n\t\t\tcooldownPeriodNumber,\r\n\t\t\tnominationPeriodNumber,\r\n\t\t\tpercentageDenominator,\r\n\t\t\tpercentageNumerator,\r\n\t\t\tsurveyLauncherType: survey.getLauncherType(),\r\n\r\n\t\t\tbusinessLevel: surveyInfo.getBusinessLevel(),\r\n\t\t\tmaxLaunches: surveyInfo.getMaxLaunches(),\r\n\t\t\tmaxLaunchesPerSession: surveyInfo.getMaxLaunchesPerSession(),\r\n\t\t};\r\n\t}\r\n\r\n\tprivate getAllCandidateCampaignDefinitionIDs(): string[] {\r\n\r\n\t\tconst allCandidateCampaignDefinitionIDs: string[] = [];\r\n\r\n\t\t// Get all the candidate surveys' campaign definition IDs\r\n\t\tfor (const key in this.candidateSurveys) {\r\n\t\t\tif (this.candidateSurveys.hasOwnProperty(key)) {\r\n\t\t\t\tconst candidateSurvey: ISurvey = this.candidateSurveys[key];\r\n\t\t\t\tallCandidateCampaignDefinitionIDs.push(candidateSurvey.getSurveyInfo().getBackEndId());\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn allCandidateCampaignDefinitionIDs;\r\n\t}\r\n\r\n\tprivate getAllCampaignDefinitionIDs(): string[] {\r\n\r\n\t\tconst allCampaignDefinitions = (this.surveyClient as CampaignManager).getCampaignDefinitions();\r\n\t\tconst allCampaignDefinitionIDs: string[] = [];\r\n\r\n\t\tfor (const definitionsKey in allCampaignDefinitions) {\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(allCampaignDefinitions, definitionsKey)) {\r\n\t\t\t\tconst definition: CampaignDefinition = allCampaignDefinitions[definitionsKey];\r\n\t\t\t\tallCampaignDefinitionIDs.push(definition.campaignId);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn allCampaignDefinitionIDs;\r\n\t}\r\n\r\n\tprivate updateActivityListenerWithCurrentSurveyDefinitions(): void {\r\n\t\tconst surveyList: ISurvey[] = this.getCurrentSurveyDefinitions();\r\n\t\tconst trackingContractList: ActivityTrackingContract[] = [];\r\n\r\n\t\tfor (const survey of surveyList) {\r\n\t\t\tconst surveyInfo = survey.getSurveyInfo();\r\n\t\t\tconst trackingContract = new ActivityTrackingContract(surveyInfo.getId(), surveyInfo.getActivationEvent().getTrackingSet());\r\n\t\t\ttrackingContractList.push(trackingContract);\r\n\t\t}\r\n\r\n\t\tthis.activityListener.SetActivityTrackingContracts(trackingContractList, this.previousSurveyEventActivityStats);\r\n\t}\r\n\r\n\tprivate setCriticalPendingSurveysAndUpdateActivityListener() {\r\n\t\tconst activeSurveys: IDictionary<ISurvey> = {};\r\n\r\n\t\t// Get all the candidate surveys' campaign definition IDs\r\n\t\tfor (const key in this.candidateSurveys) {\r\n\t\t\tif (this.candidateSurveys.hasOwnProperty(key)) {\r\n\t\t\t\tconst candidateSurvey: ISurvey = this.candidateSurveys[key];\r\n\t\t\t\tif (isCriticalSurvey(candidateSurvey.getSurveyInfo())) {\r\n\t\t\t\t\tactiveSurveys[key] = candidateSurvey;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (Object.keys(activeSurveys).length > 0) {\r\n\t\t\tthis.setPendingSurveys(activeSurveys);\r\n\t\t\tthis.updateActivityListenerWithCurrentSurveyDefinitions();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate shouldAcceptActivity(activityName: string): boolean {\r\n\t\treturn this.initializationStatus === InitializationStatus.Started ||\r\n\t\t\tactivityName === SurveyActivityListener.FloodgateStartActivityName;\r\n\t}\r\n\r\n\tprivate onSurveyActivated(surveyId: string, contextInfo: IContextData[]): void {\r\n\t\t// Find the survey object that corresponds to the surveyId passed\r\n\t\tconst surveys: ISurvey[] = this.getCurrentSurveyDefinitions();\r\n\t\tlet survey: ISurvey;\r\n\r\n\t\tfor (const tempSurvey of surveys) {\r\n\t\t\tif (tempSurvey.getSurveyInfo().getId() === surveyId) {\r\n\t\t\t\tsurvey = tempSurvey;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isNOU(survey)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.FloodgateEngine.OnSurveyActivated.SurveyNotDefined,\r\n\t\t\t\t\"Survey is not defined in the current survey definitions.\",\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst governedChannelType: GovernedChannelType = survey.getSurveyInfo().getGovernedChannelType();\r\n\r\n\t\t\t// If the governance service is in use, launch survey asynchronously\r\n\t\t\tif (this.governanceServiceClient.isEnabled(governedChannelType)) {\r\n\t\t\t\t// record the stale surveys, so we can clear its tracker if Engine is stopped\r\n\t\t\t\tthis.staleTriggeredSurveysQueue.push(survey);\r\n\r\n\t\t\t\t// If there is no survey in stale before, launch the survey right away\r\n\t\t\t\tif (this.staleTriggeredSurveysQueue.length === 1) {\r\n\t\t\t\t\t// Launch the survey asynchronously\r\n\t\t\t\t\tthis.checkGovernanceServiceAndActivateSurvey(survey, governedChannelType, contextInfo);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthis.activateSurvey(survey, governedChannelType, contextInfo);\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.telemetryLogger.log_Event(TelemetryEvent.FloodgateEngine.OnSurveyActivated.Error,\r\n\t\t\t\t{ ErrorMessage: `Error activating survey ${e && e.toString()}`, ErrorDetails: e && e.stack });\r\n\t\t}\r\n\t}\r\n\r\n\tprivate activateSurvey(survey: ISurvey, governedChannelType: GovernedChannelType, contextInfo: IContextData[]) {\r\n\t\tlet launchSurvey: boolean = false;\r\n\t\t// Figure out if the activated survey is still relevant\r\n\t\tif (!this.candidateSurveys[survey.getSurveyInfo().getId()]) {\r\n\t\t\t// Survey is no longer relevant but was activated. Suppress it.\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.FloodgateEngine.OnSurveyActivated.ActivationIrrelevantSurvey,\r\n\t\t\t\t{\r\n\t\t\t\t\tCampaignId: survey.getSurveyInfo().getBackEndId(),\r\n\t\t\t\t\tSurveyId: survey.getSurveyInfo().getId(),\r\n\t\t\t\t});\r\n\t\t} else if (!survey.getSurveyInfo().isActiveForDate(new Date())) {\r\n\t\t\t// Survey is no longer active (e.g. it was when we registered it but it has now expired)\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.FloodgateEngine.OnSurveyActivated.ActivationExpiredSurvey,\r\n\t\t\t\t{\r\n\t\t\t\t\tCampaignId: survey.getSurveyInfo().getBackEndId(),\r\n\t\t\t\t\tSurveyId: survey.getSurveyInfo().getId(),\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\t// Refresh channels\r\n\t\t\tthis.governor.refreshChannelData();\r\n\r\n\t\t\tif (isCriticalSurvey(survey.getSurveyInfo())) {\r\n\t\t\t\tlaunchSurvey = true;\r\n\t\t\t} else if (!this.governor.isChannelOpen(governedChannelType)) {\r\n\t\t\t\t// Channel has closed and maxLaunches is not set, suppress the survey\r\n\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\t\tTelemetryEvent.FloodgateEngine.OnSurveyActivated.ClosedChannelType,\r\n\t\t\t\t\t{ ClosedChannelType: GovernedChannelType[governedChannelType] });\r\n\t\t\t} else {\r\n\t\t\t\t// Get latest survey states from provider\r\n\t\t\t\tconst refreshedSurveyActivationStats = this.surveyActivationStatsProvider.load();\r\n\t\t\t\tif (refreshedSurveyActivationStats.getBySurveyId(survey.getSurveyInfo().getId())) {\r\n\t\t\t\t\t// Survey stats exists already, don't launch\r\n\t\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\t\t\tTelemetryEvent.FloodgateEngine.OnSurveyActivated.ActivationStatsSuppressedSurvey,\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tCampaignId: survey.getSurveyInfo().getBackEndId(),\r\n\t\t\t\t\t\t\tSurveyId: survey.getSurveyInfo().getId(),\r\n\t\t\t\t\t\t});\r\n\t\t\t\t} else if (Object.keys(this.launchedSurveys).length === 0) {\r\n\t\t\t\t\t// for now we only support launching one survey per session unless it is multi-launch campaign\r\n\t\t\t\t\t// Track this survey activation for the launch history tracker\r\n\t\t\t\t\tlaunchSurvey = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst triggeredSurvey = Object.values(this.launchedSurveys)[0];\r\n\t\t\t\t\tif (!isNOU(triggeredSurvey)) {\r\n\t\t\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\t\t\t\tTelemetryEvent.FloodgateEngine.OnSurveyActivated.SessionSuppressedSurvey,\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tCampaignId: triggeredSurvey.getSurveyInfo().getBackEndId(),\r\n\t\t\t\t\t\t\t\tSurveyId: triggeredSurvey.getSurveyInfo().getId(),\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (launchSurvey) {\r\n\t\t\t\tthis.launchedSurveys[survey.getSurveyInfo().getId()] = survey;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// At this point, regardless of whether or not the survey is still relevant, we should flush out the stats\r\n\t\tthis.updateSurveyActivationStats(survey);\r\n\t\tthis.mergeAndSave();\r\n\t\t// shut off further survey launches\r\n\t\tthis.activityListener.clearSurveys();\r\n\r\n\t\t// Clear the survey from stale list\r\n\t\tthis.staleTriggeredSurveysQueue = [];\r\n\r\n\t\t// Actually launch the survey if possible\r\n\t\tif (launchSurvey) {\r\n\t\t\t// Get the stringified json with activity names, counts and isAggregate info for TriggetMet telemetry.\r\n\t\t\tconst activityTrackingString = survey.getSurveyInfo().getActivationEvent().getTrackingSet()\r\n\t\t\t.getActivityTrackingInfo(this.activityListener, survey.getSurveyInfo().getId());\r\n\r\n\t\t\tconst additionalSurveyInfo = this.getAdditionalSurveyInfoForTelemetry(survey, contextInfo, this.getAllCampaignDefinitionIDs(),\r\n\t\t\t\tthis.getAllCandidateCampaignDefinitionIDs());\r\n\r\n\t\t\t// Only adding the governance service client state at TriggerMet event\r\n\t\t\tadditionalSurveyInfo.governanceServiceClientState = this.governanceServiceClient.getClientState();\r\n\r\n\t\t\tFloodgateEngine.telemetryLogger.log_TriggerMet(survey.getSurveyInfo().getBackEndId(), survey.getSurveyInfo().getId(),\r\n\t\t\t\tsurvey.getType(), activityTrackingString, JSON.stringify(additionalSurveyInfo));\r\n\r\n\t\t\t// Set govern channel\r\n\t\t\tthis.governor.startChannelCooldown(governedChannelType);\r\n\r\n\t\t\tconst surveyInfo = survey.getSurveyInfo();\r\n\t\t\tlet isSurveyComplete = true;\r\n\t\t\tif (isBusinessCriticalSurvey(surveyInfo)) {\r\n\t\t\t\t// critical campaigns are not tracked\r\n\t\t\t\tisSurveyComplete = false;\r\n\t\t\t} else if (isMultiLaunchSurvey(surveyInfo)) {\r\n\t\t\t\tconst surveyActivationStats = this.previousSurveyActivationStats.getBySurveyId(surveyInfo.getId());\r\n\t\t\t\tisSurveyComplete = hasSurveyReachedMaxLaunches(surveyInfo, surveyActivationStats);\r\n\t\t\t}\r\n\r\n\t\t\t// Set campaign states\r\n\t\t\tthis.surveyClient.onSurveyActivated(surveyInfo, isSurveyComplete);\r\n\r\n\t\t\t// Show the survey\r\n\t\t\tthis.launchLauncher(survey, contextInfo);\r\n\r\n\t\t\t// check if there are any critical campaigns and start tracking again\r\n\t\t\tthis.setCriticalPendingSurveysAndUpdateActivityListener();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate async checkGovernanceServiceAndActivateSurvey(survey: ISurvey,\r\n\t\tgovernedChannelType: GovernedChannelType,\r\n\t\tcontextInfo: IContextData[]): Promise<void> {\r\n\t\t// Get the cooldown setting\r\n\t\tconst campaignDefinition = this.surveyClient.getCampaignDefinitions()[survey.getCampaignId()];\r\n\t\tconst campaignCooldown = campaignDefinition.nominationScheme.cooldownPeriod.asTimeIntervalSeconds();\r\n\t\tconst channelCooldown = Governor.GetChannelCoolDown(governedChannelType);\r\n\r\n\t\t// Call the Governance Service\r\n\t\tconst serviceResult: IGovernanceServiceResult = await this.governanceServiceClient\r\n\t\t\t.checkGovernancePermitAsync(survey, campaignCooldown, channelCooldown, governedChannelType);\r\n\t\tlet launchSurvey: boolean = false;\r\n\r\n\t\t// Log the stale\r\n\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\tTelemetryEvent.FloodgateEngine.CheckGovernanceServiceAndActivateSurvey.GovernanceServiceClientCompleted,\r\n\t\t\t{\r\n\t\t\t\tMessage: JSON.stringify(this.createGorvernanceResponseTelemetry(serviceResult)),\r\n\t\t\t});\r\n\r\n\t\t// Check if engine is still running\r\n\t\tif (this.initializationStatus !== InitializationStatus.Started) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!serviceResult.error) {\r\n\t\t\t// Check result is permitted\r\n\t\t\tif (serviceResult.permission) { // the Governance Service is permitting, continue to trigger\r\n\t\t\t\tlaunchSurvey = true;\r\n\t\t\t} else {\r\n\t\t\t\tconst lastSurveyTriggerInfo: IGovernanceSurveyResponse = serviceResult.lastTriggerSurvey;\r\n\t\t\t\t// For now, we only know the channel is in cooldown but not the specific survey\r\n\t\t\t\t// So only set governed channel to new cooldown\r\n\t\t\t\tthis.governor.startChannelCooldown(governedChannelType, lastSurveyTriggerInfo.lastTriggerSurveyTime);\r\n\r\n\t\t\t\t// Clear the survey relating to channel\r\n\t\t\t\tthis.clearSurveyWithChannel(governedChannelType);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// If force to display with error, continue to trigger the survey\r\n\t\t\tif (this.governanceServiceClient.shouldForceDisplay()) {\r\n\t\t\t\tlaunchSurvey = true;\r\n\r\n\t\t\t\t// Log the force to display event\r\n\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\t\tTelemetryEvent.FloodgateEngine.CheckGovernanceServiceAndActivateSurvey.GovernanceServiceForceToDisplay,\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tErrorMessage: serviceResult.errorMessage,\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (launchSurvey) {\r\n\t\t\t// Launch the survey\r\n\t\t\tthis.activateSurvey(survey, governedChannelType, contextInfo);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If there is only one survey, which is the current one in process, clear queue and return\r\n\t\tif (this.staleTriggeredSurveysQueue.length <= 1) {\r\n\t\t\tthis.staleTriggeredSurveysQueue = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Remove the first activated survey from the list which is the current one in process\r\n\t\tthis.staleTriggeredSurveysQueue.shift();\r\n\r\n\t\t// Playback the next activated survey in waiting\r\n\t\tthis.checkGovernanceServiceAndActivateSurvey(this.staleTriggeredSurveysQueue[0], governedChannelType, contextInfo);\r\n\t}\r\n\r\n\tprivate readString(fileType: FileType): string {\r\n\t\treturn this.storage.read(fileType);\r\n\t}\r\n\r\n\tprivate writeString(fileType: FileType, str: string): void {\r\n\t\tthis.storage.write(fileType, str);\r\n\t}\r\n\r\n\tprivate launchLauncher(survey: ISurvey, contextInfo: IContextData[]): void {\r\n\t\tconst launcher: ISurveyLauncher = this.launcherFactory.makeSurveyLauncher(survey);\r\n\t\tif (launcher) {\r\n\t\t\tthis.launchedLaunchers.push(launcher);\r\n\t\t\tthis.onSurveyActivatedCallback.onSurveyActivated(launcher, survey, { contextInfo });\r\n\t\t}\r\n\t}\r\n\r\n\tprivate clearSurveyWithChannel(governedChannelType: GovernedChannelType) {\r\n\t\tconst activeSurveys: IDictionary<ISurvey> = {};\r\n\r\n\t\t// Get all the candidate surveys' campaign definition IDs\r\n\t\tfor (const key in this.candidateSurveys) {\r\n\t\t\tif (this.candidateSurveys.hasOwnProperty(key)) {\r\n\t\t\t\tconst candidateSurvey: ISurvey = this.candidateSurveys[key];\r\n\t\t\t\tif (candidateSurvey.getSurveyInfo().getGovernedChannelType() !== governedChannelType) {\r\n\t\t\t\t\tactiveSurveys[key] = candidateSurvey;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.candidateSurveys = activeSurveys;\r\n\t\tthis.activityListener.UpdateActivityTrackingContracts(this.candidateSurveys);\r\n\t}\r\n\r\n\tprivate createGorvernanceResponseTelemetry(serviceResult: IGovernanceServiceResult ) {\r\n\t\treturn {\r\n\t\t\tFloodgateEngineStatus: this.initializationStatus.toString(),\r\n\t\t\tGovernanceServiceResult: serviceResult,\r\n\t\t\tStaleTriggeredSurveysQueueCount: this.staleTriggeredSurveysQueue.length - 1,\r\n\t\t};\r\n\t}\r\n}\r\n","/**\r\n * Main entry point.\r\n */\r\n\r\nimport * as Api from \"./src/Api/Api\";\r\nimport * as Utils from \"./src/Utils\";\r\n\r\nexport { FloodgateEngine } from \"./src/FloodgateEngine\";\r\nexport { Api, Utils };\r\n","import * as ISurvey from \"../../src/Api/ISurvey\";\r\nimport { GovernedChannelType } from \"../GovernedChannel\";\r\nimport * as ISurveyEvent from \"../ISurveyEvent\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport { BusinessLevel } from \"../ISurveyInfo\";\r\nimport { ISurveyMetadata } from \"../ISurveyMetadata\";\r\nimport * as Utils from \"../Utils\";\r\n\r\nconst { getDistantFuture, getDistantPast, isNOU, isDate } = Utils;\r\n\r\nclass SurveyDataSource implements ISurveyInfo {\r\n\tprivate data: SurveyDataSource.SurveyDataSourceData;\r\n\r\n\tpublic constructor(data: SurveyDataSource.SurveyDataSourceData) {\r\n\t\tif (isNOU(data)) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (isNOU(data.id) || data.id === \"\") {\r\n\t\t\tthrow new Error(\"data.id must not be null or empty\");\r\n\t\t}\r\n\t\tif (isNOU(data.governedChannelType)) {\r\n\t\t\tdata.governedChannelType = GovernedChannelType.getDefault();\r\n\t\t}\r\n\t\tif (isNOU(data.expirationTimeUtc) || data.expirationTimeUtc === \"\") {\r\n\t\t\tthrow new Error(\"data.expirationTimeUtc must not be null or empty\");\r\n\t\t}\r\n\t\tif (isNOU(data.activationEvent)) {\r\n\t\t\tthrow new Error(\"data.activationEvent must not be null\");\r\n\t\t}\r\n\t\tif (isNOU(data.backEndIdentifier) || data.backEndIdentifier === \"\") {\r\n\t\t\tdata.backEndIdentifier = data.id;\r\n\t\t}\r\n\t\tif (isNOU(data.launcherType)) {\r\n\t\t\tdata.launcherType = ISurvey.LAUNCHER_TYPE_DEFAULT;\r\n\t\t}\r\n\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getId(): string {\r\n\t\treturn this.data.id;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getBackEndId(): string {\r\n\t\treturn this.data.backEndIdentifier;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getGovernedChannelType(): GovernedChannelType {\r\n\t\treturn this.data.governedChannelType;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getRawStartTimeUtc(): string {\r\n\t\treturn this.data.startTimeUtc;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getStartTimeUtc(): Date {\r\n\t\tif (isNOU(this.data.startTimeUtc)) {\r\n\t\t\treturn getDistantPast(); // Optional start date means the survey has started\r\n\t\t}\r\n\r\n\t\tconst parsed = new Date(this.data.startTimeUtc);\r\n\t\tif (!isDate(parsed)) {\r\n\t\t\treturn getDistantFuture(); // Badly specified start dates means the survey never starts\r\n\t\t}\r\n\r\n\t\treturn parsed;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getExpirationTimeUtc(): Date {\r\n\t\t// Bad or missing expiration date means survey is always expired.\r\n\r\n\t\tif (isNOU(this.data.expirationTimeUtc)) {\r\n\t\t\treturn getDistantPast();\r\n\t\t}\r\n\r\n\t\tconst parsed = new Date(this.data.expirationTimeUtc);\r\n\t\tif (!isDate(parsed)) {\r\n\t\t\treturn getDistantPast();\r\n\t\t}\r\n\r\n\t\treturn parsed;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getRawExpirationTimeUtc(): string {\r\n\t\treturn this.data.expirationTimeUtc;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic isActiveForDate(date: Date): boolean {\r\n\t\tif (isNOU(date)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (date >= this.getStartTimeUtc() && date <= this.getExpirationTimeUtc());\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getActivationEvent(): ISurveyEvent {\r\n\t\treturn this.data.activationEvent;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getPreferredLaunchType(): ISurveyInfo.LaunchType {\r\n\t\treturn this.data.preferredLaunchType;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic isAdditionalDataRequested(additionalDataToCheck: ISurveyInfo.AdditionalDataType): boolean {\r\n\t\tif (isNOU(this.data.additionalDataRequested)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor (const additionalData of this.data.additionalDataRequested) {\r\n\t\t\tif (additionalData === additionalDataToCheck) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getLauncherType(): string {\r\n\t\treturn this.data.launcherType;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getMetadata(): ISurveyMetadata {\r\n\t\treturn this.data.metadata;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getBusinessLevel(): BusinessLevel {\r\n\t\treturn this.data.businessLevel;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getMaxLaunches(): number {\r\n\t\treturn this.data.maxLaunches;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getMaxLaunchesPerSession(): number {\r\n\t\treturn this.data.maxLaunchesPerSession;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\tif (!doc) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\r\n\t\tconst typeElement: Element = doc.createElement(ISurveyInfo.DOM_TYPE_TAGNAME);\r\n\t\ttypeElement.appendChild(doc.createTextNode(ISurveyInfo.DOM_TYPE_VALUE));\r\n\r\n\t\tconst idElement: Element = doc.createElement(ISurveyInfo.DOM_ID_TAGNAME);\r\n\t\tidElement.appendChild(doc.createTextNode(this.getBackEndId()));\r\n\r\n\t\treturn [typeElement, idElement];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tconst surveyObject: object = {};\r\n\t\tsurveyObject[ISurveyInfo.JSON_ID_KEYNAME] = this.getBackEndId();\r\n\r\n\t\tconst result: object = {};\r\n\t\tresult[ISurveyInfo.JSON_SURVEY_KEYNAME] = surveyObject;\r\n\r\n\t\treturn result;\r\n\t}\r\n}\r\n\r\nmodule SurveyDataSource {\r\n\t/**\r\n\t * Basic data needed for all Surveys\r\n\t */\r\n\texport class SurveyDataSourceData {\r\n\t\tpublic id: string;\r\n\t\tpublic backEndIdentifier: string;\r\n\t\tpublic governedChannelType: GovernedChannelType;\r\n\t\tpublic startTimeUtc: string;\r\n\t\tpublic expirationTimeUtc: string;\r\n\t\tpublic activationEvent: ISurveyEvent;\r\n\t\tpublic preferredLaunchType: ISurveyInfo.LaunchType = ISurveyInfo.LaunchType.Default;\r\n\t\tpublic additionalDataRequested: ISurveyInfo.AdditionalDataType[];\r\n\t\tpublic launcherType: string;\r\n\t\tpublic metadata: ISurveyMetadata;\r\n\r\n\t\tpublic businessLevel: BusinessLevel;\r\n\t\tpublic maxLaunches: number;\r\n\t\tpublic maxLaunchesPerSession: number;\r\n\t}\r\n}\r\n\r\nexport = SurveyDataSource;\r\n","import ISurvey = require(\"../Api/ISurvey\");\r\nimport ISurveyComponent = require(\"../Api/ISurveyComponent\");\r\nimport { ITransporter } from \"../Api/ITransporter\";\r\nimport { FloodgateEngine } from \"../FloodgateEngine\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport * as Utils from \"./../Utils\";\r\n\r\nexport abstract class Survey implements ISurvey {\r\n\tprivate survey: ISurvey;\r\n\tprivate clientFeedbackId: string;\r\n\r\n\tpublic abstract getComponent(componentType: ISurveyComponent.Type): ISurveyComponent;\r\n\r\n\tpublic getCampaignId(): string {\r\n\t\treturn this.getSurveyInfo().getBackEndId();\r\n\t}\r\n\r\n\tpublic getLauncherType(): string {\r\n\t\treturn this.getSurveyInfo().getLauncherType();\r\n\t}\r\n\r\n\tpublic getClientFeedbackId(): string {\r\n\t\treturn this.clientFeedbackId;\r\n\t}\r\n\r\n\tpublic submit() {\r\n\t\tconst surveyType: string = ISurvey.Type[this.getType()];\r\n\t\tconst transporter: ITransporter = FloodgateEngine.getTransportFactory().makeTransporter(surveyType);\r\n\t\ttransporter.setManifestValues(this.getJsonElements());\r\n\t\tthis.clientFeedbackId = transporter.getClientFeedbackId();\r\n\t\ttransporter.submit();\r\n\t}\r\n\r\n\tpublic getPreGeneratedClientFeedbackId(): string {\r\n\t\tif (this.clientFeedbackId) {\r\n\t\t\treturn this.clientFeedbackId;\r\n\t\t} else {\r\n\t\t\treturn this.clientFeedbackId = Utils.guid();\r\n\t\t}\r\n\t}\r\n\t// Abstract classes that are implemented by actual Surveys\r\n\tpublic abstract getType(): ISurvey.Type;\r\n\r\n\tpublic abstract getSurveyInfo(): ISurveyInfo;\r\n\r\n\tpublic abstract getJsonElements(): object;\r\n\r\n\tpublic abstract getDomElements(doc: Document): Element[];\r\n}\r\n","import * as Utils from \"./Utils\";\r\n\r\nexport enum GovernedChannelType {\r\n\tStandard, // 0\r\n\tUrgent, // 1\r\n\tBanner, // 2\r\n\tTeachingMessage, // 3\r\n}\r\n\r\nexport namespace GovernedChannelType {\r\n\texport function getDefault(): GovernedChannelType { return GovernedChannelType.Standard; }\r\n}\r\n\r\nexport interface IGovernedChannelData {\r\n\t/**\r\n\t * Gets the type of GovernedChannel this object represents\r\n\t */\r\n\tgetType(): GovernedChannelType;\r\n\r\n\t/**\r\n\t * Gets the name of this GovernedChannel\r\n\t */\r\n\tgetName(): string;\r\n\r\n\t/**\r\n\t * Gets the amount of time during which this channel will refuse new surveys after a successful prompt\r\n\t */\r\n\tgetCooldownSeconds(): number;\r\n\r\n\t/**\r\n\t * Gets the last time this channel started a cool down (aka the last time a survey was successfully shown).\r\n\t * Null if cool down has never been initiated\r\n\t */\r\n\tgetCooldownStartTime(): Date;\r\n\r\n\t/**\r\n\t * If in cool down, returns the time in which this channel will next be \"Open\".\r\n\t * Else returns the last time this channel became \"Open\".\r\n\t */\r\n\tgetCooldownEndTime(): Date;\r\n\r\n\t/**\r\n\t * Whether or not this channel is open to new surveys at this current point in time (aka Now)\r\n\t */\r\n\tisOpen(): boolean;\r\n\r\n\t/**\r\n\t * Whether or not this channel is open to new surveys at the specified point in time\r\n\t */\r\n\tisOpenAtDate(date: Date): boolean;\r\n}\r\n\r\nexport class GovernedChannel implements IGovernedChannelData {\r\n\tprivate type: GovernedChannelType;\r\n\tprivate name: string;\r\n\tprivate cooldownSeconds: number;\r\n\tprivate cooldownStartTime: Date;\r\n\tprivate cooldownEndTime: Date;\r\n\r\n\tpublic constructor(type: GovernedChannelType, name: string, cooldownSeconds: number, cooldownStartTime: Date) {\r\n\t\tif (!Utils.isEnumValue(type, GovernedChannelType)) {\r\n\t\t\tthrow new Error(\"type is not a valid GovernedChannelType\");\r\n\t\t}\r\n\r\n\t\tif (!name) {\r\n\t\t\tthrow new Error(\"name must not be null or empty\");\r\n\t\t}\r\n\r\n\t\tif (cooldownSeconds < 0) {\r\n\t\t\tthrow new Error(\"cooldownSeconds must not be negative\");\r\n\t\t}\r\n\r\n\t\tthis.type = type;\r\n\t\tthis.name = name;\r\n\t\tthis.cooldownSeconds = cooldownSeconds;\r\n\t\tthis.setCooldownStartTime(cooldownStartTime);\r\n\t}\r\n\r\n\tpublic setCooldownStartTime(cooldownStartTime: Date): void {\r\n\t\t// Set the start time\r\n\t\tthis.cooldownStartTime = cooldownStartTime;\r\n\r\n\t\tif (Utils.isNOU(this.cooldownStartTime)) {\r\n\t\t\t// Null cooldownStartTime means cool down has never been initiated, so set the cooldownEndTime to distant past\r\n\t\t\tthis.cooldownEndTime = Utils.getDistantPast();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Calculate the end time, but don't overflow past max.\r\n\t\tthis.cooldownEndTime = Utils.addSecondsWithoutOverflow(this.cooldownStartTime, this.cooldownSeconds);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic isOpen(): boolean {\r\n\t\treturn this.isOpenAtDate(new Date());\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic isOpenAtDate(date: Date): boolean {\r\n\t\tif (!date) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn (date > this.cooldownEndTime);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): GovernedChannelType {\r\n\t\treturn this.type;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getName(): string {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getCooldownSeconds(): number {\r\n\t\treturn this.cooldownSeconds;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getCooldownStartTime(): Date {\r\n\t\treturn this.cooldownStartTime;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getCooldownEndTime(): Date {\r\n\t\treturn this.cooldownEndTime;\r\n\t}\r\n}\r\n","import { IFloodgateEnvironmentProvider } from \"../Api/IFloodgateEnvironmentProvider\";\r\nimport * as IFloodgateStorageProvider from \"../Api/IFloodgateStorageProvider\";\r\nimport { TelemetryEvent } from \"../Constants\";\r\nimport { FloodgateEngine } from \"../FloodgateEngine\";\r\nimport { GovernedChannelType } from \"../GovernedChannel\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport { BusinessLevel } from \"../ISurveyInfo\";\r\nimport * as Utils from \"../Utils\";\r\n\r\nimport { IUserFactProvider } from \"../Api/Api\";\r\nimport { UserFact } from \"../UserFact/UserFact\";\r\nimport { deserializeUserFacts, validateUserFacts } from \"../UserFact/UserFactHelper\";\r\nimport { CampaignScopeType } from \"./CampaignScopeTypes\";\r\n\r\nconst { getDistantFuture, isBoolean, isNOU, isNumber, isString, isUtcDatetimeString, stringToDate } = Utils;\r\n\r\n// region Language Range\r\n\r\n/**\r\n * Base class representing a language range in a campaign setting\r\n */\r\nexport abstract class CampaignLanguageRange {\r\n\tpublic static deserialize(input: any): CampaignLanguageRange {\r\n\t\tlet result: CampaignLanguageRange;\r\n\r\n\t\tif (input && input.Type === 0) {\r\n\t\t\tresult = CampaignLanguageRangeLanguageSubtag.deserialize(input);\r\n\t\t}\r\n\r\n\t\tif (result === undefined) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprotected constructor() { }\r\n\r\n\t/**\r\n\t * Returns whether or not the specific language tag (format from RFC 5646) is in this language range specification\r\n\t */\r\n\tpublic abstract isInRange(language: string): boolean;\r\n\r\n\tprotected validate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n/**\r\n * Represents a range matching on the \"language subtag\" against fully specified language tags, according to RFC 5646\r\n */\r\nexport class CampaignLanguageRangeLanguageSubtag extends CampaignLanguageRange {\r\n\tpublic static deserialize(input: any): CampaignLanguageRangeLanguageSubtag {\r\n\t\tconst result = new CampaignLanguageRangeLanguageSubtag();\r\n\r\n\t\tif (input) {\r\n\t\t\tresult.languageSubTag = input.Value;\r\n\t\t}\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"Value\")\r\n\tpublic languageSubTag: string;\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\t// @Override\r\n\tpublic isInRange(language: string): boolean {\r\n\t\tif (isNOU(language)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst extractedLanguageSubTag: string = Utils.extractLanguageSubtag(language);\r\n\t\tif (isNOU(extractedLanguageSubTag)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// compare strings ignoring case\r\n\t\treturn extractedLanguageSubTag.toLocaleUpperCase() === this.languageSubTag.toLocaleUpperCase();\r\n\t}\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.languageSubTag) || !isString(this.languageSubTag)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t// Reject any spec that isn't exactly a language subtag\r\n\t\tif (!Utils.isValidLanguageSubTag(this.languageSubTag)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n// endregion\r\n\r\n// region Scope\r\n\r\nexport abstract class CampaignScope {\r\n\tpublic static deserialize(input: any): CampaignScope {\r\n\t\tlet result: CampaignScope;\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (input.Type) {\r\n\t\t\tcase CampaignScopeType.CampaignScopeAny:\r\n\t\t\t\tresult = CampaignScopeAny.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignScopeType.CampaignScopeEnvironmentCrossProduct:\r\n\t\t\t\tresult = CampaignScopeEnvironmentCrossProduct.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignScopeType.CampaignScopeUserFactAny:\r\n\t\t\t\tresult = CampaignScopeUserFactAny.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignScopeType.CampaignScopeUserFactAll:\r\n\t\t\t\tresult = CampaignScopeUserFactAll.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (result === undefined) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprotected constructor() { }\r\n\r\n\tpublic abstract isInScope(): boolean;\r\n\r\n\tprotected validate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignScopeAny extends CampaignScope {\r\n\tpublic static deserialize(input: any): CampaignScopeAny {\r\n\t\treturn new CampaignScopeAny();\r\n\t}\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\t// @Override\r\n\tpublic isInScope(): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignScopeEnvironmentCrossProduct extends CampaignScope {\r\n\tpublic static deserialize(input: any): CampaignScopeEnvironmentCrossProduct {\r\n\t\tconst result = new CampaignScopeEnvironmentCrossProduct();\r\n\t\tlet languageRanges: CampaignLanguageRange[] = [];\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tfor (const key in input.Languages) {\r\n\t\t\tif (input.Languages.hasOwnProperty(key)) {\r\n\t\t\t\tconst readRange: CampaignLanguageRange = input.Languages[key];\r\n\r\n\t\t\t\tif (readRange) {\r\n\t\t\t\t\tlanguageRanges.push(CampaignLanguageRange.deserialize(readRange));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (languageRanges.length === 0) {\r\n\t\t\tlanguageRanges = null;\r\n\t\t}\r\n\r\n\t\tresult.languageRanges = languageRanges;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"Languages\")\r\n\tpublic languageRanges: CampaignLanguageRange[];\r\n\r\n\tprivate environmentProvider: IFloodgateEnvironmentProvider;\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\tpublic setEnvironmentProvider(environmentProvider: IFloodgateEnvironmentProvider) {\r\n\t\tthis.environmentProvider = environmentProvider;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic isInScope(): boolean {\r\n\t\tif (isNOU(this.languageRanges)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.environmentProvider) || !this.environmentProvider.getLanguage()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst language = this.environmentProvider.getLanguage();\r\n\t\t// If the environment matches a single pattern, then this is a yes\r\n\t\tfor (const key in this.languageRanges) {\r\n\t\t\tif (this.languageRanges.hasOwnProperty(key)) {\r\n\t\t\t\tconst range = this.languageRanges[key];\r\n\r\n\t\t\t\tif (range.isInRange(language)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Null languageRanges is allowed, means will match with everything.\r\n\t\tif (this.languageRanges) {\r\n\t\t\tfor (const key in this.languageRanges) {\r\n\t\t\t\tif (this.languageRanges.hasOwnProperty(key) && !this.languageRanges[key]) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignScopeUserFactAny extends CampaignScope {\r\n\tpublic static deserialize(input: any): CampaignScopeUserFactAny {\r\n\t\tconst result = new CampaignScopeUserFactAny();\r\n\t\tresult.userFacts = deserializeUserFacts(input);\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"UserFacts\")\r\n\tpublic userFacts: UserFact[];\r\n\r\n\tprivate userFactsProvider?: IUserFactProvider;\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\tpublic setUserFactsProvider(userFactsProvider?: IUserFactProvider) {\r\n\t\tthis.userFactsProvider = userFactsProvider;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic isInScope(): boolean {\r\n\t\tif (isNOU(this.userFacts)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (!this.userFactsProvider) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// If one of the user fact matches, then this is a yes\r\n\t\treturn this.userFacts.some((userFact) => {\r\n\t\t\tconst rawUserFact = this.userFactsProvider.getUserFact(userFact.getName());\r\n\t\t\treturn userFact.isAMatch(rawUserFact);\r\n\t\t});\r\n\t}\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn validateUserFacts(this.userFacts);\r\n\t}\r\n}\r\n\r\nexport class CampaignScopeUserFactAll extends CampaignScope {\r\n\tpublic static deserialize(input: any): CampaignScopeUserFactAll {\r\n\t\tconst result = new CampaignScopeUserFactAll();\r\n\t\tresult.userFacts = deserializeUserFacts(input);\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"UserFacts\")\r\n\tpublic userFacts: UserFact[];\r\n\r\n\tprivate userFactsProvider?: IUserFactProvider;\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\tpublic setUserFactsProvider(userFactsProvider?: IUserFactProvider) {\r\n\t\tthis.userFactsProvider = userFactsProvider;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic isInScope(): boolean {\r\n\t\tif (isNOU(this.userFacts)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (!this.userFactsProvider) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Get all of the mismatched user facts\r\n\t\tconst mismatchedFacts = this.userFacts.filter((userFact) => {\r\n\t\t\tconst rawUserFact = this.userFactsProvider.getUserFact(userFact.getName());\r\n\t\t\treturn !userFact.isAMatch(rawUserFact);\r\n\t\t});\r\n\r\n\t\tif (mismatchedFacts.length > 0) {\r\n\t\t\tconst mismatchedNames = mismatchedFacts.map((userFact) => userFact.getName());\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecIsAMatch.Summary, {\r\n\t\t\t\t\tCount: mismatchedFacts.length,\r\n\t\t\t\t\tMessage: mismatchedNames.toString(),\r\n\t\t\t\t});\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// If all of the user facts match, then this is a yes\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn validateUserFacts(this.userFacts);\r\n\t}\r\n}\r\n\r\n// endregion\r\n\r\n// region Durations\r\n\r\n/**\r\n * Base class representing a duration in a campaign setting\r\n */\r\nexport abstract class CampaignDuration {\r\n\tpublic static deserialize(input: any): CampaignDuration {\r\n\t\tlet result: CampaignDuration;\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (input.Type) {\r\n\t\t\tcase 0:\r\n\t\t\t\tresult = CampaignDurationTimeInterval.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tresult = CampaignDurationSingleBuildChange.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (result === undefined) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprotected constructor() { }\r\n\r\n\tpublic abstract asTimeIntervalSeconds(): number;\r\n\r\n\tprotected validate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n/**\r\n * A Duration expressed in seconds. UTC datetime comparisons are used to determine expiration.\r\n */\r\nexport class CampaignDurationTimeInterval extends CampaignDuration {\r\n\tpublic static deserialize(input: any): CampaignDurationTimeInterval {\r\n\t\tconst result = new CampaignDurationTimeInterval();\r\n\r\n\t\tif (input) {\r\n\t\t\tresult.intervalSeconds = input.IntervalSeconds;\r\n\t\t}\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"IntervalSeconds\")\r\n\tpublic intervalSeconds: number;\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\t// @Override\r\n\tpublic asTimeIntervalSeconds(): number {\r\n\t\treturn this.intervalSeconds;\r\n\t}\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNumber(this.intervalSeconds)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n/**\r\n * A Duration representing exactly 1 change in build number\r\n */\r\nexport class CampaignDurationSingleBuildChange extends CampaignDuration {\r\n\tpublic static deserialize(input: any): CampaignDurationSingleBuildChange {\r\n\t\treturn new CampaignDurationSingleBuildChange();\r\n\t}\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\t// @Override\r\n\tpublic asTimeIntervalSeconds(): number {\r\n\t\treturn null;\r\n\t}\r\n}\r\n\r\n/**\r\n * Class representing AdditionalDataRequested in CampaignDefinition\r\n */\r\nexport class CampaignAdditionalDataRequested {\r\n\tpublic static deserialize(additionalDataRequested: string[]): CampaignAdditionalDataRequested {\r\n\t\tconst result = new CampaignAdditionalDataRequested();\r\n\r\n\t\tif (!isNOU(additionalDataRequested)) {\r\n\t\t\t// Convert from AdditionalDataRequested string to enum\r\n\t\t\tresult.additionalData = [];\r\n\t\t\tfor (const additionalData of additionalDataRequested) {\r\n\t\t\t\tif (additionalData === \"EmailAddress\") {\r\n\t\t\t\t\tresult.additionalData.push(ISurveyInfo.AdditionalDataType.EmailAddress);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic additionalData: ISurveyInfo.AdditionalDataType[];\r\n\r\n\tprivate validate(): boolean {\r\n\t\tif (isNOU(this.additionalData)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n// endregion\r\n\r\n// region Distribution Schemes\r\n\r\nexport abstract class CampaignDistribution {\r\n\tpublic static deserialize(input: any): CampaignDistribution {\r\n\t\tlet result: CampaignDistribution;\r\n\r\n\t\tif (input && input.Type === 0) {\r\n\t\t\tresult = CampaignDistributionRamp.deserialize(input);\r\n\t\t}\r\n\r\n\t\tif (result === undefined) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprotected constructor() { }\r\n\r\n\tprotected validate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignDistributionRamp extends CampaignDistribution {\r\n\tpublic static deserialize(input: any): CampaignDistributionRamp {\r\n\t\tconst result = new CampaignDistributionRamp();\r\n\r\n\t\tif (input) {\r\n\t\t\tresult.maxDelaySeconds = input.MaxDelaySeconds;\r\n\t\t\tresult.chunks = input.Chunks;\r\n\t\t}\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// The time window over which the ramp will distribute start dates.\r\n\t// @SerializedName(\"MaxDelaySeconds\")\r\n\tpublic maxDelaySeconds: number;\r\n\r\n\t// The number of discrete buckets to divide the time window (maxDelaySeconds) into\r\n\t// @SerializedName(\"Chunks\")\r\n\tpublic chunks: number;\r\n\r\n\tprivate constructor() { super(); }\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNumber(this.maxDelaySeconds) || this.maxDelaySeconds < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNumber(this.chunks) || this.chunks < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n// endregion\r\n\r\n// region Nomination Scheme\r\n\r\nexport abstract class CampaignNominationScheme {\r\n\tpublic static deserialize(input: any): CampaignNominationScheme {\r\n\t\tlet result: CampaignNominationScheme;\r\n\r\n\t\tif (input && input.Type === 0) {\r\n\t\t\tresult = CampaignNominationSchemeRatioPercentage.deserialize(input);\r\n\t\t}\r\n\r\n\t\tif (result === undefined) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// The amount of time (in seconds) for which the survey is active, if the nominationPeriod can't be interpreted as a time interval\r\n\t// note: This is only used when nominationPeriod is not of a type that can be interpreted as a time interval, otherwise\r\n\t// that value is used instead\r\n\t// @SerializedName(\"FallbackSurveyDurationSeconds\")\r\n\tpublic fallbackSurveyDurationSeconds: number;\r\n\r\n\t// When the user never sees the survey during their candidacy (or anti-candidacy), this is the duration that must lapse\r\n\t// before re- nominating\r\n\t// @SerializedName(\"NominationPeriod\")\r\n\tpublic nominationPeriod: CampaignDuration;\r\n\r\n\t// When the user does sees the survey during their candidacy, this is the duration that must lapse before re-evaluating\r\n\t// candidacy. Generally recommended that this be greater than nominationPeriod\r\n\t// @SerializedName(\"CooldownPeriod\")\r\n\tpublic cooldownPeriod: CampaignDuration;\r\n\r\n\tprotected constructor() { }\r\n\r\n\t/**\r\n\t * @return The amount of time the survey should be active, in seconds. Abstracts the difference between nominationPeriod and the fallback\r\n\t */\r\n\tpublic getActiveSurveyTimeIntervalSeconds(): number {\r\n\t\tconst nominationTimIntervalSeconds: number = this.nominationPeriod.asTimeIntervalSeconds();\r\n\r\n\t\tif (isNumber(nominationTimIntervalSeconds)) {\r\n\t\t\treturn nominationTimIntervalSeconds;\r\n\t\t}\r\n\r\n\t\treturn this.fallbackSurveyDurationSeconds;\r\n\t}\r\n\r\n\t/**\r\n\t * @return The survey start time, possibly adjusted by an underlying DistributionModel.\r\n\t */\r\n\tpublic calculateSurveyStartTimeFromDate(soonestStartTime: Date): Date {\r\n\t\t// No adjustment in base class.  Derived classes can override and implement delays like a \"ramp\"\r\n\t\treturn soonestStartTime ? soonestStartTime : new Date();\r\n\t}\r\n\r\n\t/**\r\n\t * @return The survey expiration time, based on the nomination periods and the survey's adjusted start time\r\n\t */\r\n\tpublic calculateSurveyExpirationTimeFromSurveyStartTime(surveyStartTime: Date): Date {\r\n\t\tsurveyStartTime = surveyStartTime ? surveyStartTime : new Date();\r\n\t\treturn Utils.addSecondsWithoutOverflow(surveyStartTime, this.getActiveSurveyTimeIntervalSeconds());\r\n\t}\r\n\r\n\t/**\r\n\t * @return The appropriate campaign cool down based on whether or not the user activated the survey\r\n\t */\r\n\tpublic getCampaignCooldown(didUserActivateSurvey: boolean): CampaignDuration {\r\n\t\tif (didUserActivateSurvey) {\r\n\t\t\treturn this.cooldownPeriod;\r\n\t\t} else {\r\n\t\t\treturn this.nominationPeriod;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Evaluate this rule set based on a random number\r\n\t *\r\n\t * @return true if the user should be a candidate, false if they should be an anti-candidate\r\n\t */\r\n\tpublic abstract evaluateNominationRules(): boolean;\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (isNOU(this.nominationPeriod)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.cooldownPeriod)) {\r\n\t\t\tthis.cooldownPeriod = this.nominationPeriod;\r\n\t\t}\r\n\r\n\t\tif (!isNumber(this.nominationPeriod.asTimeIntervalSeconds())) {\r\n\t\t\tif (!isNumber(this.fallbackSurveyDurationSeconds) || this.fallbackSurveyDurationSeconds <= 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n/**\r\n * Class representing a set of campaign nomination rules to evaluate for in-scope campaigns:\r\n * percentage\r\n * re-election durations\r\n * distribution model (for \"nominated\" candidates)\r\n */\r\nexport class CampaignNominationSchemeRatioPercentage extends CampaignNominationScheme {\r\n\tpublic static deserialize(input: any): CampaignNominationSchemeRatioPercentage {\r\n\t\tconst result = new CampaignNominationSchemeRatioPercentage();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (input.DistributionModel) {\r\n\t\t\tresult.distributionModel = CampaignDistribution.deserialize(input.DistributionModel);\r\n\t\t}\r\n\r\n\t\tif (input.CooldownPeriod) {\r\n\t\t\tresult.cooldownPeriod = CampaignDuration.deserialize(input.CooldownPeriod);\r\n\t\t}\r\n\r\n\t\tif (input.NominationPeriod) {\r\n\t\t\tresult.nominationPeriod = CampaignDuration.deserialize(input.NominationPeriod);\r\n\t\t}\r\n\r\n\t\tresult.fallbackSurveyDurationSeconds = input.FallbackSurveyDurationSeconds;\r\n\t\tresult.percentageDenominator = input.PercentageDenominator;\r\n\t\tresult.percentageNumerator = input.PercentageNumerator;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// The numerator when calculating the percentage of users that should be selected as candidates.  Must\r\n\t// satisfy 0 <= percentageNumerator <= percentageDenominator\r\n\t// @SerializedName(\"PercentageNumerator\")\r\n\tpublic percentageNumerator: number;\r\n\r\n\t// The denominator when calculating the percentage of users that should be selected as candidates.  Must be greater than 0.\r\n\t// @SerializedName(\"PercentageDenominator\")\r\n\tpublic percentageDenominator: number;\r\n\r\n\t// NYI - For candidates, allows the Survey start/end dates to be shifted forward in time, to help achieve a smoother signal\r\n\t// @SerializedName(\"DistributionModel\")\r\n\tpublic distributionModel: CampaignDistribution;\r\n\r\n\tprivate constructor() { super(); }\r\n\r\n\t// @Override\r\n\tpublic evaluateNominationRules(): boolean {\r\n\t\tconst rand: number = Math.random();\r\n\t\t// Creates a random number between [0 to (percentageDenominator - 1)]\r\n\t\t// In range [0 to (percentageDenominator - 1)] exactly 'percentageNumerator' values are < percentageNumerator\r\n\t\treturn Math.floor(rand * this.percentageDenominator) < this.percentageNumerator;\r\n\t}\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNumber(this.percentageDenominator) || !isNumber(this.percentageNumerator)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this.percentageDenominator <= 0 || this.percentageNumerator < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this.percentageNumerator > this.percentageDenominator) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// distribution model may be null\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n// endregion\r\n\r\n// region Survey Event Definitions\r\nexport abstract class CampaignSurveyEvent {\r\n\tpublic static deserialize(input: any): CampaignSurveyEvent {\r\n\t\tlet result: CampaignSurveyEvent;\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (input.Type) {\r\n\t\t\tcase 0:\r\n\t\t\t\tresult = CampaignSurveyEventCountedActivity.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tresult = CampaignSurveyEventCountedActivitySequence.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (result === undefined) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprotected constructor() { }\r\n\r\n\tprotected validate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyEventCountedActivity extends CampaignSurveyEvent {\r\n\tpublic static deserialize(input: any): CampaignSurveyEventCountedActivity {\r\n\t\tconst result = new CampaignSurveyEventCountedActivity();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.activity = input.Activity;\r\n\t\tresult.count = input.Count;\r\n\t\tresult.isAggregate = input.IsAggregate;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"Activity\")\r\n\tpublic activity: string;\r\n\r\n\t// @SerializedName(\"Count\")\r\n\tpublic count: number;\r\n\r\n\t// @SerializedName(\"IsAggregate\")\r\n\tpublic isAggregate: boolean;\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.activity) || !isString(this.activity)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNumber(this.count) || this.count <= 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isBoolean(this.isAggregate)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyEventCountedActivitySequence extends CampaignSurveyEvent {\r\n\tpublic static deserialize(input: any): CampaignSurveyEventCountedActivitySequence {\r\n\t\tconst result = new CampaignSurveyEventCountedActivitySequence();\r\n\t\tlet sequence: CampaignSurveyEventCountedActivity[] = [];\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tfor (const key in input.Sequence) {\r\n\t\t\tif (input.Sequence.hasOwnProperty(key)) {\r\n\t\t\t\tconst readActivity: CampaignSurveyEventCountedActivity = input.Sequence[key];\r\n\r\n\t\t\t\tif (readActivity) {\r\n\t\t\t\t\tsequence.push(CampaignSurveyEventCountedActivity.deserialize(readActivity));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (sequence.length === 0) {\r\n\t\t\tsequence = null;\r\n\t\t}\r\n\r\n\t\tresult.sequence = sequence;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"Sequence\")\r\n\tpublic sequence: CampaignSurveyEventCountedActivity[];\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\t// @Override\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.sequence)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor (const key in this.sequence) {\r\n\t\t\tif (this.sequence.hasOwnProperty(key) && !this.sequence[key]) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n// endregion\r\n\r\n// region Survey Content Definitions\r\n\r\nexport class CampaignSurveyContent {\r\n\tpublic static deserialize(input: any, optionalComponents?: boolean): CampaignSurveyContent {\r\n\t\tconst result = new CampaignSurveyContent();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.prompt = CampaignSurveyContentPrompt.deserialize(input.Prompt);\r\n\t\tresult.rating = CampaignSurveyContentRating.deserialize(input.Rating);\r\n\t\tresult.comment = CampaignSurveyContentComment.deserialize(input.Question);\r\n\t\tresult.multipleChoice = CampaignSurveyContentMultipleChoice.deserialize(input.MultipleChoice);\r\n\t\tresult.intercept = CampaignSurveyContentIntercept.deserialize(input.Intercept);\r\n\t\tresult.cvSurvey = CampaignSurveyContentCVSurvey.deserialize(input.CVSurveyParams);\r\n\r\n\t\tif (!result.validate(optionalComponents)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"CVSurvey\")\r\n\tpublic cvSurvey: CampaignSurveyContentCVSurvey;\r\n\r\n\t// @SerializedName(\"Prompt\")\r\n\tpublic prompt: CampaignSurveyContentPrompt;\r\n\r\n\t// @SerializedName(\"Rating\")\r\n\tpublic rating: CampaignSurveyContentRating;\r\n\r\n\t// @SerializedName(\"Question\")\r\n\tpublic comment: CampaignSurveyContentComment;\r\n\r\n\t// @SerializedName(\"MultipleChoice\")\r\n\tpublic multipleChoice: CampaignSurveyContentMultipleChoice;\r\n\r\n\t// @SerializedName(\"Intercept\")\r\n\tpublic intercept: CampaignSurveyContentIntercept;\r\n\r\n\tpublic validate(optionalComponents?: boolean): boolean {\r\n\t\tif (!isNOU(this.intercept)) {\r\n\t\t\t// An intercept survey only requires intercept.\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.prompt)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (optionalComponents) {\r\n\t\t\treturn !isNOU(this.rating) ||\r\n\t\t\t\t!isNOU(this.multipleChoice) ||\r\n\t\t\t\t!isNOU(this.comment);\r\n\t\t}\r\n\r\n\t\treturn !isNOU(this.rating) && !isNOU(this.comment);\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyContentMultipleChoice {\r\n\tpublic static deserialize(input: any): CampaignSurveyContentMultipleChoice {\r\n\t\tconst result = new CampaignSurveyContentMultipleChoice();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.question = input.Question;\r\n\t\tresult.availableOptions = input.AvailableOptions;\r\n\t\tresult.minNumberOfSelectedOptions = input.MinNumberOfSelectedOptions;\r\n\t\tresult.maxNumberOfSelectedOptions = input.MaxNumberOfSelectedOptions;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"Question\")\r\n\tpublic question: string;\r\n\r\n\t// @SerializedName(\"AvailableOptions\")\r\n\tpublic availableOptions: string[];\r\n\r\n\t// @SerializedName(\"MinNumberOfSelectedOptions\")\r\n\tpublic minNumberOfSelectedOptions: number;\r\n\r\n\t// @SerializedName(\"MaxNumberOfSelectedOptions\")\r\n\tpublic maxNumberOfSelectedOptions: number;\r\n\r\n\tprivate validate(): boolean {\r\n\t\tif (isNOU(this.question) || !isString(this.question) ||\r\n\t\t\tisNOU(this.availableOptions) || !Array.isArray(this.availableOptions) || this.availableOptions.length < 2 ||\r\n\t\t\tisNOU(this.minNumberOfSelectedOptions) || !isNumber(this.minNumberOfSelectedOptions) ||\r\n\t\t\tisNOU(this.maxNumberOfSelectedOptions) || !isNumber(this.maxNumberOfSelectedOptions)) {\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// expect all availableOptions values to be string\r\n\t\tfor (const key in this.availableOptions) {\r\n\t\t\tif (this.availableOptions.hasOwnProperty(key)) {\r\n\t\t\t\tif (!isString(this.availableOptions[key])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyContentCVSurvey {\r\n\tpublic static deserialize(input: any): CampaignSurveyContentCVSurvey {\r\n\t\tconst result = new CampaignSurveyContentCVSurvey();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.customerVoiceFormId = input.CustomerVoiceFormId;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"FormId\")\r\n\tpublic customerVoiceFormId: string;\r\n\r\n\tprivate validate(): boolean {\r\n\r\n\t\treturn (!isNOU(this.customerVoiceFormId) && isString(this.customerVoiceFormId));\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyContentPrompt {\r\n\tpublic static deserialize(input: any): CampaignSurveyContentPrompt {\r\n\t\tconst result = new CampaignSurveyContentPrompt();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.title = input.Title;\r\n\t\tresult.question = input.Question;\r\n\t\tresult.yesLabel = input.YesLabel;\r\n\t\tresult.noLabel = input.NoLabel;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"Title\")\r\n\tpublic title: string;\r\n\r\n\t// @SerializedName(\"Question\")\r\n\tpublic question: string;\r\n\r\n\t// @SerializedName(\"YesLabel\")\r\n\tpublic yesLabel: string;\r\n\r\n\t// @SerializedName(\"NoLabel\")\r\n\tpublic noLabel: string;\r\n\r\n\tprivate validate(): boolean {\r\n\t\tif (isNOU(this.title) || !isString(this.title) ||\r\n\t\t\tisNOU(this.question) || !isString(this.question) ||\r\n\t\t\tisNOU(this.yesLabel) || !isString(this.yesLabel) ||\r\n\t\t\tisNOU(this.noLabel) || !isString(this.noLabel)) {\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyContentIntercept {\r\n\tpublic static deserialize(input: any): CampaignSurveyContentIntercept {\r\n\t\tconst result = new CampaignSurveyContentIntercept();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.title = input.Title;\r\n\t\tresult.question = input.Question;\r\n\t\tresult.url = input.Url;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"Title\")\r\n\tpublic title: string;\r\n\r\n\t// @SerializedName(\"Question\")\r\n\tpublic question: string;\r\n\r\n\t// @SerializedName(\"Url\")\r\n\tpublic url: string;\r\n\r\n\tprivate validate(): boolean {\r\n\t\tif (isNOU(this.title) || !isString(this.title) ||\r\n\t\t\tisNOU(this.question) || !isString(this.question) ||\r\n\t\t\tisNOU(this.url) || !isString(this.url)) {\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyContentRating {\r\n\tpublic static deserialize(input: any): CampaignSurveyContentRating {\r\n\t\tconst result = new CampaignSurveyContentRating();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.isZeroBased = input.IsZeroBased;\r\n\t\tresult.question = input.Question;\r\n\t\tresult.ratingValuesAscending = input.RatingValuesAscending;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"IsZeroBased\")\r\n\tpublic isZeroBased: boolean;\r\n\r\n\t// @SerializedName(\"Question\")\r\n\tpublic question: string;\r\n\r\n\t// @SerializedName(\"RatingValuesAscending\")\r\n\tpublic ratingValuesAscending: string[];\r\n\r\n\tprivate validate(): boolean {\r\n\t\t// expect ratingValuesAscending to contain between 2 to 11 values\r\n\t\tif (isNOU(this.question) || !isString(this.question) ||\r\n\t\t\tisNOU(this.ratingValuesAscending) || !Array.isArray(this.ratingValuesAscending) ||\r\n\t\t\tthis.ratingValuesAscending.length < 2 || this.ratingValuesAscending.length > 11) {\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.isZeroBased)) {\r\n\t\t\t// default to false if not provided\r\n\t\t\tthis.isZeroBased = false;\r\n\t\t} else if (!isBoolean(this.isZeroBased)) {\r\n\t\t\t// fail validation if non boolean value is provided\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// expect all ratingValuesAscending values to be string\r\n\t\tfor (const key in this.ratingValuesAscending) {\r\n\t\t\tif (this.ratingValuesAscending.hasOwnProperty(key)) {\r\n\t\t\t\tif (!isString(this.ratingValuesAscending[key])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyContentComment {\r\n\tpublic static deserialize(input: any): CampaignSurveyContentComment {\r\n\t\tconst result = new CampaignSurveyContentComment();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// @SerializedName(\"Question\")\r\n\t\tresult.question = input.Question;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"Question\")\r\n\tpublic question: string;\r\n\r\n\tprivate validate(): boolean {\r\n\t\tif (isNOU(this.question) || !isString(this.question)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n// endregion\r\n\r\n// region Survey Metadata Definitions\r\n\r\nexport class CampaignSurveyMetadata {\r\n\tpublic static deserialize(input: any): CampaignSurveyMetadata {\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst result = new CampaignSurveyMetadata();\r\n\t\tresult.contentMetadata = input.ContentMetadata;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"ContentMetadata\")\r\n\tpublic contentMetadata: object;\r\n\r\n\tpublic validate(): boolean {\r\n\t\tif (isNOU(this.contentMetadata) || !Utils.isObject(this.contentMetadata)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n// endregion\r\n\r\n// region Survey Template definitions\r\n\r\nexport abstract class CampaignSurveyTemplate {\r\n\tpublic static deserialize(input: any): CampaignSurveyTemplate {\r\n\t\tlet result: CampaignSurveyTemplate;\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (input.Type) {\r\n\t\t\tcase CampaignSurveyTemplate.Type.Nps5PointStatic:\r\n\t\t\t\tresult = CampaignSurveyTemplateNps5PointStatic.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignSurveyTemplate.Type.Nps11PointStatic:\r\n\t\t\t\tresult = CampaignSurveyTemplateNps11PointStatic.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignSurveyTemplate.Type.Fps:\r\n\t\t\t\tresult = CampaignSurveyTemplateFps.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignSurveyTemplate.Type.Nlqs:\r\n\t\t\t\tresult = CampaignSurveyTemplateNlqs.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignSurveyTemplate.Type.Nps:\r\n\t\t\t\tresult = CampaignSurveyTemplateNps.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignSurveyTemplate.Type.GenericMessagingSurface:\r\n\t\t\t\tresult = CampaignSurveyTemplateGenericMessagingSurface.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CampaignSurveyTemplate.Type.Intercept:\r\n\t\t\t\tresult = CampaignSurveyTemplateIntercept.deserialize(input);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (isNOU(result)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"ActivationEvent\")\r\n\tpublic activationEvent: CampaignSurveyEvent;\r\n\r\n\t// @SerializedName(\"Content\")\r\n\tpublic content: CampaignSurveyContent;\r\n\r\n\t// @SerializedName(\"Metadata\")\r\n\tpublic metadata: CampaignSurveyMetadata;\r\n\r\n\t// @SerializedName(\"MaxLaunches\")\r\n\tpublic maxLaunches: number;\r\n\r\n\t// @SerializedName(\"MaxLaunchesPerSession\")\r\n\tpublic maxLaunchesPerSession: number;\r\n\r\n\t// @SerializedName(\"PreferredLaunchType\")\r\n\tpublic preferredLaunchType: ISurveyInfo.LaunchType;\r\n\r\n\tprotected constructor() { }\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (isNOU(this.activationEvent)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport module CampaignSurveyTemplate {\r\n\texport const enum Type {\r\n\t\tNps5PointStatic = 0,\r\n\t\tNps11PointStatic = 1,\r\n\t\tFps = 2,\r\n\t\tNlqs = 3,\r\n\t\tNps = 4,\r\n\t\tIntercept = 5,\r\n\t\t// A generic messagibg surface template type, which will make use of\r\n\t\t// content metadata to render ui.\r\n\t\t// As of 4th Feb 2019 there are 20 template types defined in Mso,\r\n\t\t// hence giving 22 as value for this type.\r\n\t\tGenericMessagingSurface = 22,\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyTemplateFps extends CampaignSurveyTemplate {\r\n\tpublic static deserialize(input: any): CampaignSurveyTemplateFps {\r\n\t\tconst result = new CampaignSurveyTemplateFps();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.activationEvent = CampaignSurveyEvent.deserialize(input.ActivationEvent);\r\n\t\tresult.content = CampaignSurveyContent.deserialize(input.Content, true /* optionalComponents */);\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate() || isNOU(this.content)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyTemplateNlqs extends CampaignSurveyTemplate {\r\n\tpublic static deserialize(input: any): CampaignSurveyTemplateNlqs {\r\n\t\tconst result = new CampaignSurveyTemplateNlqs();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.activationEvent = CampaignSurveyEvent.deserialize(input.ActivationEvent);\r\n\t\tresult.content = CampaignSurveyContent.deserialize(input.Content);\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate() || isNOU(this.content)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyTemplateNps extends CampaignSurveyTemplate {\r\n\tpublic static deserialize(input: any): CampaignSurveyTemplateNps {\r\n\t\tconst result = new CampaignSurveyTemplateNps();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.activationEvent = CampaignSurveyEvent.deserialize(input.ActivationEvent);\r\n\t\tresult.content = CampaignSurveyContent.deserialize(input.Content);\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate() || isNOU(this.content)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyTemplateNps5PointStatic extends CampaignSurveyTemplate {\r\n\tpublic static deserialize(input: any): CampaignSurveyTemplateNps5PointStatic {\r\n\t\tconst result = new CampaignSurveyTemplateNps5PointStatic();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.activationEvent = CampaignSurveyEvent.deserialize(input.ActivationEvent);\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyTemplateNps11PointStatic extends CampaignSurveyTemplate {\r\n\tpublic static deserialize(input: any): CampaignSurveyTemplateNps11PointStatic {\r\n\t\tconst result = new CampaignSurveyTemplateNps11PointStatic();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.activationEvent = CampaignSurveyEvent.deserialize(input.ActivationEvent);\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprivate constructor() { super(); }\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyTemplateGenericMessagingSurface extends CampaignSurveyTemplate {\r\n\tpublic static deserialize(input: any): CampaignSurveyTemplateGenericMessagingSurface {\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst result = new CampaignSurveyTemplateGenericMessagingSurface();\r\n\t\tresult.activationEvent = CampaignSurveyEvent.deserialize(input.ActivationEvent);\r\n\t\tresult.metadata = CampaignSurveyMetadata.deserialize(input.Metadata);\r\n\t\tresult.maxLaunches = input.MaxLaunches;\r\n\t\tresult.maxLaunchesPerSession = input.MaxLaunchesPerSession;\r\n\t\tresult.preferredLaunchType = input.PreferredLaunchType;\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic constructor() { super(); }\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate() || isNOU(this.metadata)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif ((!isNOU(this.maxLaunches) && (!isNumber(this.maxLaunches) || this.maxLaunches <= 0)) ||\r\n\t\t\t(!isNOU(this.maxLaunchesPerSession) && (!isNumber(this.maxLaunchesPerSession) || this.maxLaunchesPerSession <= 0))) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_LocalError(\"Invalid Multi Launch settings\", this.maxLaunches, this.maxLaunchesPerSession);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// check for valid values\r\n\t\tif (isNumber(this.maxLaunches) &&\r\n\t\t\tisNumber(this.maxLaunchesPerSession) &&\r\n\t\t\tthis.maxLaunchesPerSession > this.maxLaunches) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_LocalError(\"Invalid Multi launch settings\", this.maxLaunches, this.maxLaunchesPerSession);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNOU(this.preferredLaunchType) && !isString(this.preferredLaunchType)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_LocalError(\"Invalid launcher type\", this.preferredLaunchType);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class CampaignSurveyTemplateIntercept extends CampaignSurveyTemplate {\r\n\tpublic static deserialize(input: any): CampaignSurveyTemplateIntercept {\r\n\t\tconst result = new CampaignSurveyTemplateIntercept();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.activationEvent = CampaignSurveyEvent.deserialize(input.ActivationEvent);\r\n\t\tresult.content = CampaignSurveyContent.deserialize(input.Content);\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// public for UT only\r\n\tpublic constructor() { super(); }\r\n\r\n\tprotected validate(): boolean {\r\n\t\tif (!super.validate() || isNOU(this.content)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n// endregion\r\n\r\n// region Campaign Definition\r\n\r\nexport class CampaignDefinition {\r\n\t/**\r\n\t * Method to deserialize a JSON object to class object\r\n\t * @param input: JSON object\r\n\t * Returns result of validation check\r\n\t */\r\n\tpublic static deserialize(input: any): CampaignDefinition {\r\n\t\tconst result: CampaignDefinition = new CampaignDefinition();\r\n\r\n\t\tif (isNOU(input)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tresult.campaignId = input.CampaignId;\r\n\t\tresult.governedChannelType = input.GovernedChannelType;\r\n\t\tresult.startTime = input.StartTimeUtc;\r\n\t\tresult.endTime = input.EndTimeUtc;\r\n\t\tresult.launcherType = input.LauncherType;\r\n\t\tresult.primaryPriority = input.PrimaryPriority;\r\n\t\tresult.tags = input.Tags;\r\n\r\n\t\tconst additionalDataRequested: CampaignAdditionalDataRequested = CampaignAdditionalDataRequested.deserialize(\r\n\t\t\tinput.AdditionalDataRequested);\r\n\t\tresult.additionalDataRequested = additionalDataRequested ? additionalDataRequested.additionalData : [];\r\n\r\n\t\tif (input.SurveyTemplate) {\r\n\t\t\tresult.surveyTemplate = CampaignSurveyTemplate.deserialize(input.SurveyTemplate);\r\n\t\t}\r\n\r\n\t\tif (input.NominationScheme) {\r\n\t\t\tresult.nominationScheme = CampaignNominationScheme.deserialize(input.NominationScheme);\r\n\t\t}\r\n\r\n\t\tif (input.Scope) {\r\n\t\t\tresult.scope = CampaignScope.deserialize(input.Scope);\r\n\t\t}\r\n\r\n\t\tif (!isNOU(input.BusinessLevel)) {\r\n\t\t\tresult.businessLevel = input.BusinessLevel;\r\n\t\t}\r\n\r\n\t\tif (!result.validate()) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_LocalError(\"Invalid definition\", input);\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"CampaignId\")\r\n\tpublic campaignId: string;\r\n\r\n\t// @SerializedName(\"GovernedChannelType\")\r\n\tpublic governedChannelType: GovernedChannelType;\r\n\r\n\t// @SerializedName(\"Scope\")\r\n\tpublic scope: CampaignScope;\r\n\r\n\t// @SerializedName(\"NominationScheme\")\r\n\tpublic nominationScheme: CampaignNominationScheme;\r\n\r\n\t// @SerializedName(\"SurveyTemplate\")\r\n\tpublic surveyTemplate: CampaignSurveyTemplate;\r\n\r\n\t// @SerializedName(\"StartTimeUtc\")\r\n\tpublic startTime: Date;\r\n\r\n\t// @SerializedName(\"EndTimeUtc\")\r\n\tpublic endTime: Date;\r\n\r\n\t// @SerializedName(\"AdditionalDataRequested\")\r\n\tpublic additionalDataRequested: ISurveyInfo.AdditionalDataType[];\r\n\r\n\t// @SerializedName(\"LauncherType\")\r\n\tpublic launcherType: string;\r\n\r\n\t// @SerializedName(\"Priority\")\r\n\tpublic primaryPriority: number;\r\n\r\n\t// @SerializedName(\"Tags\")\r\n\tpublic tags: string[];\r\n\r\n\t// @SerializedName(\"BusinessLevel\")\r\n\tpublic businessLevel: BusinessLevel;\r\n\r\n\tpublic validate(): boolean {\r\n\t\tif (isNOU(this.scope)) {\r\n\t\t\tthis.scope = new CampaignScopeAny();\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.campaignId) || !isString(this.campaignId)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNumber(this.governedChannelType) || !Utils.isEnumValue(this.governedChannelType, GovernedChannelType)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.nominationScheme)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.surveyTemplate)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNOU(this.launcherType) && !isString(this.launcherType)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this.launcherType === \"customervoice\" && isNOU(this.surveyTemplate.content?.cvSurvey?.customerVoiceFormId)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isNOU(this.primaryPriority) && !isNumber(this.primaryPriority)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this.tags && !Array.isArray(this.tags)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Campaigns with no start date are effectively disabled, in fact, this is the supported way to stage a definition but have it be turned off\r\n\t\tif (isNOU(this.startTime)) {\r\n\t\t\tthis.startTime = getDistantFuture();\r\n\t\t} else if (isUtcDatetimeString(this.startTime)) {\r\n\t\t\tthis.startTime = stringToDate(this.startTime);\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Campaigns with no end date are effectively on indefinitely\r\n\t\tif (isNOU(this.endTime) ||\r\n\t\t\t(typeof(this.endTime) === \"string\" && this.endTime === \"\")) {\r\n\t\t\tthis.endTime = getDistantFuture();\r\n\t\t} else if (isUtcDatetimeString(this.endTime)) {\r\n\t\t\tthis.endTime = stringToDate(this.endTime);\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\n/**\r\n * Given an array of campaign definitions, returns the valid ones and errors if any are invalid.\r\n * @param input: JSON object\r\n * Returns the valid definitions and the error as string if any.\r\n */\r\nexport function FilterValidCampaignDefinitions(campaignDefinitions: any): { result: CampaignDefinition[], error: string } {\r\n\tconst result: CampaignDefinition[] = [];\r\n\r\n\tif (isNOU(campaignDefinitions)) {\r\n\t\treturn { result, error: \"Empty\" };\r\n\t}\r\n\r\n\tif (!Array.isArray(campaignDefinitions)) {\r\n\t\treturn { result, error: \"Not an array\" };\r\n\t}\r\n\r\n\tconst badIndexes: number[] = [];\r\n\tfor (let i = 0; i < campaignDefinitions.length; i++) {\r\n\t\tconst definition: any = campaignDefinitions[i];\r\n\r\n\t\tif (definition) {\r\n\t\t\tconst newDefinition: CampaignDefinition = CampaignDefinition.deserialize(definition);\r\n\r\n\t\t\tnewDefinition\r\n\t\t\t\t? result.push(newDefinition)\r\n\t\t\t\t: badIndexes.push(i);\r\n\t\t} else {\r\n\t\t\tbadIndexes.push(i);\r\n\t\t}\r\n\t}\r\n\r\n\tconst error: string = badIndexes.length > 0 ? \"Invalid campaign definitions at indexes: \" + badIndexes.toString() : undefined;\r\n\treturn { result, error };\r\n}\r\n\r\n// endregion\r\n\r\nexport interface ICampaignDefinitionProvider {\r\n\tload(): CampaignDefinition[];\r\n\tloadAsync(): Promise<CampaignDefinition[]>;\r\n}\r\n\r\nexport class FileSystemCampaignDefinitionProvider implements ICampaignDefinitionProvider {\r\n\tprivate storage: IFloodgateStorageProvider;\r\n\r\n\tpublic constructor(storage: IFloodgateStorageProvider) {\r\n\t\tif (isNOU(storage)) {\r\n\t\t\tthrow new Error(\"storage must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.storage = storage;\r\n\t}\r\n\r\n\tpublic load(): CampaignDefinition[] {\r\n\t\tconst definitionString: string = this.storage.read(IFloodgateStorageProvider.FileType.CampaignDefinitions);\r\n\t\tif (isNOU(definitionString)) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tlet readDefinitions: any;\r\n\r\n\t\ttry {\r\n\t\t\treadDefinitions = JSON.parse(definitionString);\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_CampaignLoad_Failed(e.toString());\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\t// This ignores errors in validation for now.\r\n\t\treturn FilterValidCampaignDefinitions(readDefinitions).result;\r\n\t}\r\n\r\n\tpublic loadAsync(): Promise<CampaignDefinition[]> {\r\n\t\tconst definitions = this.load();\r\n\t\treturn new Promise(\r\n\t\t\tfunction onFulfilled(resolve, reject) {\r\n\t\t\t\tresolve(definitions);\r\n\t\t\t},\r\n\t\t);\r\n\t}\r\n}\r\n","/**\r\n * Parent module for all modules in Api/\r\n */\r\n\r\nimport * as ISurveyInfo from \"./../ISurveyInfo\";\r\nimport * as IActivityListener from \"./IActivityListener\";\r\nimport * as IFloodgateSettingIdMap from \"./IFloodgateSettingIdMap\";\r\nimport * as IFloodgateStorageProvider from \"./IFloodgateStorageProvider\";\r\nimport * as IFloodgateStringProvider from \"./IFloodgateStringProvider\";\r\nimport * as ISurvey from \"./ISurvey\";\r\nimport * as ISurveyComponent from \"./ISurveyComponent\";\r\n\r\nexport { CampaignDefinition } from \"../Campaign/CampaignDefinitionProvider\";\r\nexport { IActivityListener };\r\nexport { IAssetsProvider } from \"./IAssetsProvider\";\r\nexport { IAugLoopCallback } from \"./IAugLoopCallback\";\r\nexport { IBpsSurvey } from \"./IBpsSurvey\";\r\nexport { ICampaignDefinitionProvider } from \"../Campaign/CampaignDefinitionProvider\";\r\nexport { ICommentComponent } from \"./ICommentComponent\";\r\nexport { ICVSurveyComponent } from \"./ICVSurveyComponent\";\r\nexport { IDataProvider } from \"./IDataProvider\";\r\nexport { IFeedbackSurvey } from \"./IFeedbackSurvey\";\r\nexport { IFloodgateAuthTokenCallback } from \"./IFloodgateAuthTokenCallback\";\r\nexport { IFloodgateEnvironmentProvider } from \"./IFloodgateEnvironmentProvider\";\r\nexport { IFloodgateSettingStorageCallback } from \"./IFloodgateSettingStorageCallback\";\r\nexport { IFloodgateStorageProvider };\r\nexport { IFloodgateStringProvider };\r\nexport { IFloodgateSettingIdMap };\r\nexport { IFloodgateTelemetryLogger } from \"./IFloodgateTelemetryLogger\";\r\nexport { IFpsSurvey } from \"./IFpsSurvey\";\r\nexport { INpsSurvey } from \"./INpsSurvey\";\r\nexport { IInterceptSurvey } from \"./IInterceptSurvey\";\r\nexport { IOnSurveyActivatedCallback } from \"./IOnSurveyActivatedCallback\";\r\nexport { IPromptComponent } from \"./IPromptComponent\";\r\nexport { IInterceptComponent } from \"./IInterceptComponent\";\r\nexport { IPsatSurvey } from \"./IPsatSurvey\";\r\nexport { IRatingComponent } from \"./IRatingComponent\";\r\nexport { IFloodgateSetting } from \"./IFloodgateSetting\";\r\nexport { ISurvey };\r\nexport { ISurveyComponent };\r\nexport { ISurveyDomWriter } from \"./ISurveyDomWriter\";\r\nexport { ISurveyForm } from \"./ISurveyForm\";\r\nexport { ISurveyJsonWriter } from \"./ISurveyJsonWriter\";\r\nexport { ISurveyInfo };\r\nexport { ISurveyLauncher } from \"./ISurveyLauncher\";\r\nexport { ISurveyLauncherFactory } from \"./ISurveyLauncherFactory\";\r\nexport { ITelemetryProperties } from \"./ITelemetryProperties\";\r\nexport { ITransporter } from \"./ITransporter\";\r\nexport { ITransporterFactory } from \"./ITransporterFactory\";\r\nexport { IUserFact } from \"../UserFact/IUserFact\";\r\nexport { IUserFactProvider } from \"./IUserFactProvider\";\r\nexport { IGovernanceServiceClient } from \"./IGovernanceServiceClient\";\r\nexport { IPersonalizerClient } from \"./IPersonalizerClient\";\r\n","import { ISurveyDomWriter } from \"./Api/ISurveyDomWriter\";\r\nimport { ISurveyJsonWriter } from \"./Api/ISurveyJsonWriter\";\r\nimport { GovernedChannelType } from \"./GovernedChannel\";\r\nimport * as ISurveyEvent from \"./ISurveyEvent\";\r\nimport { ISurveyMetadata } from \"./ISurveyMetadata\";\r\n\r\n/**\r\n * Interface that can be used to access the basics of a Survey\r\n */\r\ninterface ISurveyInfo extends ISurveyDomWriter, ISurveyJsonWriter {\r\n\t/**\r\n\t * A globally unique, but otherwise opaque, identity for this particular survey\r\n\t */\r\n\tgetId(): string;\r\n\r\n\t/**\r\n\t * A globally unique, but otherwise opaque, identity for this particular survey on the OCV backend\r\n\t * May be the same, or different than getId\r\n\t */\r\n\tgetBackEndId(): string;\r\n\r\n\t/**\r\n\t * The goverend channel that this survey will be delivered/filtered through\r\n\t */\r\n\tgetGovernedChannelType(): GovernedChannelType;\r\n\r\n\t/**\r\n\t * The raw string provided as the survey's start date, with no error checking\r\n\t */\r\n\tgetRawStartTimeUtc(): string;\r\n\r\n\t/**\r\n\t * The start time, in UTC, of this Survey.  Before the client has passed this date\r\n\t * the survey will won't be loaded into the survey activity listener.\r\n\t * If no start date is given, returns distantPast.\r\n\t * If bad start date given, returns distantFuture\r\n\t * Otherwise, returns date\r\n\t */\r\n\tgetStartTimeUtc(): Date;\r\n\r\n\t/**\r\n\t * The expiration time, in UTC, of this Survey. Once the client has passed this date, it should clean any\r\n\t * cached data, and should reject any incoming surveys that have otherwise expired but are still active\r\n\t * in the flighting system\r\n\t * If no/bad expiration date given, returns distantPast to make sure this survey is always expired.\r\n\t */\r\n\tgetExpirationTimeUtc(): Date;\r\n\r\n\t/**\r\n\t * The expiration time, in UTC, of this Survey.  Once the client has passed this date, it should clean any\r\n\t * cached data, and should reject any incoming surveys that have otherwise expired but are still active\r\n\t * in the flighting system\r\n\t */\r\n\tgetRawExpirationTimeUtc(): string;\r\n\r\n\t/**\r\n\t * Returns whether or not the 'date' is between the start/expiration dates for this survey.\r\n\t */\r\n\tisActiveForDate(date: Date): boolean;\r\n\r\n\t/**\r\n\t * Gets the activation event that should be plumbed through to the FloodgateEngine/SurveyActiviytListener.\r\n\t * When activated, this survey should be shown to the user.\r\n\t */\r\n\tgetActivationEvent(): ISurveyEvent;\r\n\r\n\t/**\r\n\t * Gets the preferred launch mechanism based on this survey's data payload.  This may or may not be\r\n\t * respected by the LauncherFactory depending on the platform and implementation, and is strictly considered\r\n\t * a behavioral hint\r\n\t */\r\n\tgetPreferredLaunchType(): ISurveyInfo.LaunchType;\r\n\r\n\t/**\r\n\t * Return additionalDataRequested array\r\n\t */\r\n\tisAdditionalDataRequested(additionalData: ISurveyInfo.AdditionalDataType): boolean;\r\n\r\n\t/**\r\n\t * Return the launcher type string\r\n\t */\r\n\tgetLauncherType(): string;\r\n\r\n\t/**\r\n\t * Gets the metadata of the survey, this is optional but if available it can be used by launcher to\r\n\t * make appropriate decisions while launching a surface.\r\n\t */\r\n\tgetMetadata(): ISurveyMetadata;\r\n\r\n\t/**\r\n\t * Returns businessLevel\r\n\t */\r\n\tgetBusinessLevel(): ISurveyInfo.BusinessLevel;\r\n\r\n\t/**\r\n\t * Returns maxLaunches\r\n\t */\r\n\tgetMaxLaunches(): number;\r\n\r\n\t/**\r\n\t * Returns maxLaunches Per session\r\n\t */\r\n\tgetMaxLaunchesPerSession(): number;\r\n}\r\n\r\nmodule ISurveyInfo {\r\n\texport const enum LaunchType {\r\n\t\t// No launch type specified, defer to the launcher factory code\r\n\t\tDefault = \"Default\",\r\n\t\t// Prefer a notification-based launcher (like the windows toast launcher when present)\r\n\t\tNotification = \"Notification\",\r\n\t\t// Prefer a modal-dialog based launcher\r\n\t\tModal = \"Modal\",\r\n\t}\r\n\r\n\texport enum BusinessLevel {\r\n\t\tNone = 0,\r\n\t\tCritical,\r\n\t}\r\n\r\n\texport const enum AdditionalDataType {\r\n\t\t// Request email address\r\n\t\tEmailAddress,\r\n\t}\r\n\r\n\texport const DOM_TYPE_TAGNAME = \"Type\";\r\n\texport const DOM_TYPE_VALUE = \"Survey\";\r\n\texport const DOM_ID_TAGNAME = \"SurveyID\";\r\n\texport const JSON_SURVEY_KEYNAME = \"survey\";\r\n\texport const JSON_ID_KEYNAME = \"surveyId\";\r\n}\r\n\r\nexport = ISurveyInfo;\r\n","import { SurveyActivationStats, SurveyStatCollectionActivation } from \"../src/SurveyStatCollectionActivation\";\r\nimport { CampaignState } from \"./Campaign/CampaignStateProvider\";\r\nimport { IDictionary } from \"./Common\";\r\nimport { GovernedChannelState } from \"./GovernedChannelStateProvider\";\r\n\r\n/**\r\n * Values for the state list types\r\n */\r\nexport const enum StateListType {\r\n\tMerged,\r\n\tToBeUpdated,\r\n}\r\n\r\nexport interface IKeyedCollection<T> {\r\n\tadd(key: number, value: T);\r\n\tfind(key: number): T;\r\n\tremove(key: number);\r\n\tcount(): number;\r\n}\r\n\r\nexport class ItemCollection<T> implements IKeyedCollection<T> {\r\n\tprivate items: { [key: number]: T } = {};\r\n\tprivate itemCount: number = 0;\r\n\r\n\tpublic add(key: number, value: T) {\r\n\t\tif (!this.items[key]) {\r\n\t\t\tthis.itemCount++;\r\n\t\t}\r\n\t\tthis.items[key] = value;\r\n\t}\r\n\r\n\tpublic find(key: number): T {\r\n\t\treturn this.items[key];\r\n\t}\r\n\r\n\tpublic remove(key: number): T {\r\n\t\tconst item: T = this.items[key];\r\n\r\n\t\tif (item) {\r\n\t\t\tdelete this.items[key];\r\n\t\t\tthis.itemCount--;\r\n\t\t}\r\n\r\n\t\treturn item;\r\n\t}\r\n\r\n\tpublic count(): number {\r\n\t\treturn this.itemCount;\r\n\t}\r\n}\r\n\r\nexport function extractSettingItemValueSubString(itemValue: string): string {\r\n\tif (!itemValue) {\r\n\t\treturn itemValue;\r\n\t}\r\n\r\n\tconst beginPos: number = itemValue.indexOf(SETTING_DATA_OPEN_TAG) + SETTING_DATA_OPEN_TAG.length;\r\n\tconst endPos: number = itemValue.indexOf(SETTING_DATA_CLOSE_TAG);\r\n\r\n\tif (beginPos < 0 || endPos < 0) {\r\n\t\treturn itemValue;\r\n\t}\r\n\r\n\treturn itemValue.substring(beginPos, endPos);\r\n}\r\n\r\nexport function makeSettingItemValue(value: string): string {\r\n\tif (!value) {\r\n\t\treturn SETTING_DATA_OPEN_TAG + SETTING_DATA_CLOSE_TAG;\r\n\t}\r\n\r\n\treturn SETTING_DATA_OPEN_TAG + value + SETTING_DATA_CLOSE_TAG;\r\n}\r\n\r\nexport function MergeAndUpdateGovernedChannelStates(previousStates: GovernedChannelState[],\r\n\tcurrentStates: GovernedChannelState[]): IKeyedCollection<GovernedChannelState[]> {\r\n\tconst stateCollections: IKeyedCollection<GovernedChannelState[]> = new ItemCollection<GovernedChannelState[]>();\r\n\r\n\t// Todo: move the following into a generic method to be shared\r\n\tif (!previousStates && !currentStates) {\r\n\t\treturn stateCollections;\r\n\t}\r\n\r\n\tif (!previousStates) {\r\n\t\tstateCollections.add(StateListType.Merged, currentStates);\r\n\t\treturn stateCollections;\r\n\t}\r\n\r\n\tif (!currentStates) {\r\n\t\tstateCollections.add(StateListType.Merged, previousStates);\r\n\t\tstateCollections.add(StateListType.ToBeUpdated, previousStates);\r\n\t\treturn stateCollections;\r\n\t}\r\n\r\n\tconst mergedStates: GovernedChannelState[] = [];\r\n\tconst toBeUpdatedStates: GovernedChannelState[] = [];\r\n\r\n\tif (previousStates) {\r\n\t\tpreviousStates.forEach((previousState) => {\r\n\t\t\t// find matching in current states\r\n\t\t\tlet pos = -1;\r\n\t\t\tlet currentState: GovernedChannelState;\r\n\t\t\tfor (let i = 0; i < currentStates.length; i++) {\r\n\t\t\t\tcurrentState = currentStates[i];\r\n\t\t\t\tif (currentState.getType() === previousState.getType()) {\r\n\t\t\t\t\tpos = i;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// if previous state is not in current states\r\n\t\t\tif (pos === -1) {\r\n\t\t\t\t// add previous state to merged\r\n\t\t\t\tmergedStates.push(previousState);\r\n\r\n\t\t\t\t// add previous state to toUpdated\r\n\t\t\t\ttoBeUpdatedStates.push(previousState);\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// if ActivationTimeUtc of previous is greater than current\r\n\t\t\tif (previousState.getCooldownStartTime() > currentState.getCooldownStartTime()) {\r\n\t\t\t\t// add previous state to merged\r\n\t\t\t\tmergedStates.push(previousState);\r\n\r\n\t\t\t\t// add previous state to toUpdated\r\n\t\t\t\ttoBeUpdatedStates.push(previousState);\r\n\t\t\t} else {\r\n\t\t\t\t// add current state to merged\r\n\t\t\t\tmergedStates.push(currentState);\r\n\t\t\t}\r\n\r\n\t\t\t// remove state from current states\r\n\t\t\tcurrentStates.splice(pos, 1);\r\n\t\t});\r\n\t}\r\n\r\n\t// for the remaining current states\r\n\tif (currentStates) {\r\n\t\tcurrentStates.forEach((currentState) => {\r\n\t\t\t// add current state to merged\r\n\t\t\tmergedStates.push(currentState);\r\n\t\t});\r\n\t}\r\n\r\n\tstateCollections.add(StateListType.Merged, mergedStates);\r\n\r\n\tif (toBeUpdatedStates.length > 0) {\r\n\t\tstateCollections.add(StateListType.ToBeUpdated, toBeUpdatedStates);\r\n\t}\r\n\r\n\treturn stateCollections;\r\n}\r\n\r\nexport function MergeAndUpdateCampaignStates(previousStates: CampaignState[],\r\n\tcurrentStates: CampaignState[]): IKeyedCollection<CampaignState[]> {\r\n\tconst stateCollections: IKeyedCollection<CampaignState[]> = new ItemCollection<CampaignState[]>();\r\n\r\n\tif (!previousStates && !currentStates) {\r\n\t\treturn stateCollections;\r\n\t}\r\n\r\n\tif (!previousStates) {\r\n\t\tstateCollections.add(StateListType.Merged, currentStates);\r\n\t\treturn stateCollections;\r\n\t}\r\n\r\n\tif (!currentStates) {\r\n\t\tstateCollections.add(StateListType.Merged, previousStates);\r\n\t\tstateCollections.add(StateListType.ToBeUpdated, previousStates);\r\n\t\treturn stateCollections;\r\n\t}\r\n\r\n\tconst mergedStates: CampaignState[] = [];\r\n\tconst toBeUpdatedStates: CampaignState[] = [];\r\n\r\n\tif (previousStates) {\r\n\t\tpreviousStates.forEach((previousState) => {\r\n\t\t\tconst current = new Date();\r\n\r\n\t\t\t// find matching in current states\r\n\t\t\tlet pos = -1;\r\n\t\t\tlet currentState: CampaignState;\r\n\t\t\tfor (let i = 0; i < currentStates.length; i++) {\r\n\t\t\t\tcurrentState = currentStates[i];\r\n\t\t\t\tif (currentState.CampaignId === previousState.CampaignId) {\r\n\t\t\t\t\tpos = i;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// if previous state is not in current states\r\n\t\t\tif (pos === -1) {\r\n\t\t\t\t// add previous state to merged\r\n\t\t\t\tmergedStates.push(previousState);\r\n\r\n\t\t\t\t// add previous state to toUpdated\r\n\t\t\t\ttoBeUpdatedStates.push(previousState);\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// if current state is in cooldown, add to merged list\r\n\t\t\tif (currentState.LastCooldownEndTimeUtc > current) {\r\n\t\t\t\t// add previous state to merged list\r\n\t\t\t\tmergedStates.push(currentState);\r\n\r\n\t\t\t\t// emove state from current states\r\n\t\t\t\tcurrentStates.splice(pos, 1);\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// if previous state is in cooldown, add to merged and toUpdated lists\r\n\t\t\tif (previousState.LastCooldownEndTimeUtc > current) {\r\n\t\t\t\t// add previous state to merged list\r\n\t\t\t\tmergedStates.push(previousState);\r\n\r\n\t\t\t\t// add previous state to to-be-updated list\r\n\t\t\t\ttoBeUpdatedStates.push(previousState);\r\n\r\n\t\t\t\t// emove state from current states\r\n\t\t\t\tcurrentStates.splice(pos, 1);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// add previous state to toUpdated and merged for the following two conditions:\r\n\t\t\t//  1. previous cooldown time wins, or\r\n\t\t\t//  2. cooldown times are the same and previous nomination wins\r\n\t\t\tif (previousState.getCooldownStartDate() > currentState.getCooldownStartDate()\r\n\t\t\t\t|| (previousState.getCooldownStartDate() === currentState.getCooldownStartDate()\r\n\t\t\t\t\t&& previousState.LastNominationTimeUtc > currentState.LastNominationTimeUtc)\r\n\t\t\t) {\r\n\t\t\t\tmergedStates.push(previousState);\r\n\r\n\t\t\t\ttoBeUpdatedStates.push(previousState);\r\n\t\t\t} else {\r\n\t\t\t\t// add current state to merged\r\n\t\t\t\tmergedStates.push(currentState);\r\n\t\t\t}\r\n\r\n\t\t\t// remove state from current states\r\n\t\t\tcurrentStates.splice(pos, 1);\r\n\t\t});\r\n\t}\r\n\r\n\t// for the remaining current states\r\n\tif (currentStates) {\r\n\t\tcurrentStates.forEach((current) => {\r\n\t\t\t// add current state to merged\r\n\t\t\tmergedStates.push(current);\r\n\t\t});\r\n\t}\r\n\r\n\tstateCollections.add(StateListType.Merged, mergedStates);\r\n\r\n\tif (toBeUpdatedStates.length > 0) {\r\n\t\tstateCollections.add(StateListType.ToBeUpdated, toBeUpdatedStates);\r\n\t}\r\n\r\n\treturn stateCollections;\r\n}\r\n\r\nexport function MergeAndUpdateSurveyActivationStats(previousStats: SurveyStatCollectionActivation,\r\n\tcurrentStats: SurveyStatCollectionActivation): IKeyedCollection<SurveyStatCollectionActivation> {\r\n\r\n\tconst statsCollections: IKeyedCollection<SurveyStatCollectionActivation> = new ItemCollection<SurveyStatCollectionActivation>();\r\n\r\n\t// Handle previousStats and/or currentStats equal to null\r\n\tif (!previousStats && !currentStats) {\r\n\t\treturn statsCollections;\r\n\t}\r\n\r\n\tif (!previousStats) {\r\n\t\tstatsCollections.add(StateListType.Merged, currentStats);\r\n\t\treturn statsCollections;\r\n\t}\r\n\r\n\tif (!currentStats) {\r\n\t\tstatsCollections.add(StateListType.Merged, previousStats);\r\n\t\tstatsCollections.add(StateListType.ToBeUpdated, previousStats);\r\n\t\treturn statsCollections;\r\n\t}\r\n\r\n\t// Enumerate preivous stats\r\n\tconst mergedStats: SurveyStatCollectionActivation = new SurveyStatCollectionActivation();\r\n\tconst toBeUpdatedStats: SurveyStatCollectionActivation = new SurveyStatCollectionActivation();\r\n\r\n\tconst previousStatsDictionary: IDictionary<SurveyActivationStats> = previousStats.getStats();\r\n\tconst currentStatsDictionary: IDictionary<SurveyActivationStats> = currentStats.getStats();\r\n\r\n\tfor (const surveyId in previousStatsDictionary) {\r\n\t\tif (previousStatsDictionary.hasOwnProperty(surveyId)) {\r\n\t\t\t// if an updated stat is not found\r\n\t\t\tconst currentActivationStats: SurveyActivationStats = currentStatsDictionary[surveyId];\r\n\t\t\tif (!currentActivationStats) {\r\n\t\t\t\t// add to merged collection\r\n\t\t\t\tmergedStats.addStats(surveyId, previousStatsDictionary[surveyId]);\r\n\t\t\t\t// add to-be-updated collection\r\n\t\t\t\ttoBeUpdatedStats.addStats(surveyId, previousStatsDictionary[surveyId]);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\t// if previous stat has higher activation time\r\n\t\t\tconst previousActivationStats: SurveyActivationStats = previousStatsDictionary[surveyId];\r\n\t\t\tif (previousActivationStats.ActivationTimeUtc > currentActivationStats.ActivationTimeUtc) {\r\n\t\t\t\t// add to merged collection\r\n\t\t\t\tmergedStats.addStats(surveyId, previousStatsDictionary[surveyId]);\r\n\t\t\t\t// add to-be-updated collection\r\n\t\t\t\ttoBeUpdatedStats.addStats(surveyId, previousStatsDictionary[surveyId]);\r\n\t\t\t} else {\r\n\t\t\t\t// add to current stat merged collection\r\n\t\t\t\tmergedStats.addStats(surveyId, currentStatsDictionary[surveyId]);\r\n\t\t\t}\r\n\r\n\t\t\t// delete from stats\r\n\t\t\tdelete currentStatsDictionary[surveyId];\r\n\t\t}\r\n\t}\r\n\r\n\t// merge any remaining stats\r\n\tfor (const surveyId in currentStatsDictionary) {\r\n\t\tif (currentStatsDictionary.hasOwnProperty(surveyId)) {\r\n\t\t\tmergedStats.addStats(surveyId, currentStatsDictionary[surveyId]);\r\n\t\t}\r\n\t}\r\n\r\n\t// always return merged list\r\n\tstatsCollections.add(StateListType.Merged, mergedStats);\r\n\r\n\t// since dictionaries don't have an empty check, enumerate the  first entry to check for non-empty\r\n\tconst toBeUpdatedStatsDictionary: IDictionary<SurveyActivationStats> = toBeUpdatedStats.getStats();\r\n\tfor (const toBeUpdated in toBeUpdatedStatsDictionary) {\r\n\t\tif (toBeUpdatedStatsDictionary.hasOwnProperty(toBeUpdated)) {\r\n\t\t\t// not empty, return to-be-updated\r\n\t\t\tstatsCollections.add(StateListType.ToBeUpdated, toBeUpdatedStats);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn statsCollections;\r\n}\r\n\r\nconst SETTING_DATA_OPEN_TAG = \"<data>\";\r\nconst SETTING_DATA_CLOSE_TAG = \"</data>\";\r\n","import { ICommentComponent } from \"./../Api/ICommentComponent\";\r\nimport ISurveyComponent = require(\"./../Api/ISurveyComponent\");\r\n\r\nclass CommentComponent implements ICommentComponent {\r\n\tpublic static make(data: CommentComponent.CommentComponentData): ICommentComponent {\r\n\t\ttry {\r\n\t\t\treturn new CommentComponent(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: CommentComponent.CommentComponentData;\r\n\tprivate userComment: string;\r\n\r\n\tpublic constructor(data: CommentComponent.CommentComponentData) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (!data.question) {\r\n\t\t\tthrow new Error(\"data.question must not be null or empty\");\r\n\t\t}\r\n\r\n\t\tthis.data = data;\r\n\t\tthis.userComment = \"\";\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): ISurveyComponent.Type {\r\n\t\treturn ISurveyComponent.Type.Comment;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getQuestion(): string {\r\n\t\treturn this.data.question;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic setSubmittedText(userComment: string): void {\r\n\t\tthis.userComment = userComment;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getSubmittedText(): string {\r\n\t\treturn this.userComment;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\tif (!doc) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\r\n\t\tconst element: Element = doc.createElement(ISurveyComponent.DOM_COMMENT_TAGNAME);\r\n\t\telement.appendChild(doc.createTextNode(this.getSubmittedText()));\r\n\r\n\t\treturn [element];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tconst result: object = {};\r\n\t\tresult[ISurveyComponent.JSON_COMMENT_KEYNAME] = this.getSubmittedText();\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponentJson(): object {\r\n\t\treturn {\r\n\t\t\t[ISurveyComponent.JSON_QUESTION_KEYNAME]: this.getQuestion(),\r\n\t\t};\r\n\t}\r\n}\r\n\r\nmodule CommentComponent {\r\n\texport class CommentComponentData {\r\n\t\tpublic question: string;\r\n\t}\r\n}\r\n\r\nexport = CommentComponent;\r\n","import * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport * as IPrompt from \"./../Api/IPrompt\";\r\nimport { IPromptComponent } from \"./../Api/IPromptComponent\";\r\n\r\nclass PromptComponent implements IPromptComponent {\r\n\tpublic static make(data: PromptComponent.PromptComponentData): IPromptComponent {\r\n\t\ttry {\r\n\t\t\treturn new PromptComponent(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: PromptComponent.PromptComponentData;\r\n\tprivate selectedButton: IPrompt.PromptButton;\r\n\r\n\tpublic constructor(data: PromptComponent.PromptComponentData) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (!data.question) {\r\n\t\t\tthrow new Error(\"data.question must not be null or empty\");\r\n\t\t}\r\n\t\tif (!data.title) {\r\n\t\t\tthrow new Error(\"data.title must not be null or empty\");\r\n\t\t}\r\n\t\tif (!data.yesButtonLabel) {\r\n\t\t\tthrow new Error(\"data.yesButtonLabel must not be null or empty\");\r\n\t\t}\r\n\t\tif (!data.noButtonLabel) {\r\n\t\t\tthrow new Error(\"data.noButtonLabel must not be null or empty\");\r\n\t\t}\r\n\r\n\t\tthis.data = data;\r\n\t\tthis.selectedButton = IPrompt.PromptButton.Unselected;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): ISurveyComponent.Type {\r\n\t\treturn ISurveyComponent.Type.Prompt;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getTitle(): string {\r\n\t\treturn this.data.title;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getQuestion(): string {\r\n\t\treturn this.data.question;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getYesButtonText(): string {\r\n\t\treturn this.data.yesButtonLabel;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getNoButtonText(): string {\r\n\t\treturn this.data.noButtonLabel;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic setButtonSelected(selected: IPrompt.PromptButton): void {\r\n\t\tif (selected) {\r\n\t\t\tthis.selectedButton = selected;\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getButtonSelected(): IPrompt.PromptButton {\r\n\t\treturn this.selectedButton;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[]  {\r\n\t\tif (!doc) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\r\n\t\tconst element: Element = doc.createElement(ISurveyComponent.DOM_PROMPT_TAGNAME);\r\n\t\telement.appendChild(doc.createTextNode(this.promptButtonToString(this.getButtonSelected())));\r\n\r\n\t\treturn [element];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tconst result: object = {};\r\n\t\tresult[ISurveyComponent.JSON_PROMPT_KEYNAME] = this.promptButtonToString(this.getButtonSelected());\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponentJson(): object {\r\n\t\treturn {\r\n\t\t\t[ISurveyComponent.JSON_TITLE_KEYNAME]: this.getTitle(),\r\n\t\t\t[ISurveyComponent.JSON_QUESTION_KEYNAME]: this.getQuestion(),\r\n\t\t\t[ISurveyComponent.JSON_PROMPTYESTEXT_KEYNAME]: this.getYesButtonText(),\r\n\t\t\t[ISurveyComponent.JSON_PROMPTNOTEXT_KEYNAME]: this.getNoButtonText(),\r\n\t\t};\r\n\t}\r\n\r\n\tprivate promptButtonToString(value: IPrompt.PromptButton): string {\r\n\t\tswitch (value) {\r\n\t\t\tcase IPrompt.PromptButton.Unselected:\r\n\t\t\t\treturn \"Unselected\";\r\n\t\t\tcase IPrompt.PromptButton.Yes:\r\n\t\t\t\treturn \"Yes\";\r\n\t\t\tcase IPrompt.PromptButton.No:\r\n\t\t\t\treturn \"No\";\r\n\t\t\tdefault:\r\n\t\t\t\treturn \"Unknown\";\r\n\t\t}\r\n\t}\r\n}\r\n\r\nmodule PromptComponent {\r\n\texport class PromptComponentData {\r\n\t\tpublic question: string;\r\n\t\tpublic title: string;\r\n\t\tpublic yesButtonLabel: string;\r\n\t\tpublic noButtonLabel: string;\r\n\t}\r\n}\r\n\r\nexport = PromptComponent;\r\n","import * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport { IRatingComponent } from \"./../Api/IRatingComponent\";\r\n\r\nclass RatingComponent implements IRatingComponent {\r\n\tpublic static make(data: RatingComponent.RatingComponentData): IRatingComponent {\r\n\t\ttry {\r\n\t\t\treturn new RatingComponent(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: RatingComponent.RatingComponentData;\r\n\tprivate selectedIndex: number;\r\n\r\n\tpublic constructor(data: RatingComponent.RatingComponentData) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (!data.question) {\r\n\t\t\tthrow new Error(\"data.question must not be null or empty\");\r\n\t\t}\r\n\t\tif (!data.ratingValuesAscending || data.ratingValuesAscending.length < 2) {\r\n\t\t\tthrow new Error(\"data.ratingValuesAscending must not be null or have less than two choices\");\r\n\t\t}\r\n\r\n\t\tdata.ratingValuesAscending.forEach((rating) => {\r\n\t\t\tif (!rating) {\r\n\t\t\t\tthrow new Error(\"rating values must not contain null or empty\");\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.data = data;\r\n\t\tthis.selectedIndex = -1;\r\n\t}\r\n\r\n\tpublic getType(): ISurveyComponent.Type {\r\n\t\treturn ISurveyComponent.Type.Rating;\r\n\t}\r\n\r\n\tpublic getQuestion(): string {\r\n\t\treturn this.data.question;\r\n\t}\r\n\r\n\tpublic getRatingValuesAscending(): string[] {\r\n\t\treturn this.data.ratingValuesAscending;\r\n\t}\r\n\r\n\tpublic getSelectedRating(): string {\r\n\t\tif (!this.isRatingIndexValid(this.selectedIndex)) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\r\n\t\treturn this.data.ratingValuesAscending[this.selectedIndex];\r\n\t}\r\n\r\n\tpublic setSelectedRatingIndex(selected: number): void {\r\n\t\tif (this.isRatingIndexValid(selected)) {\r\n\t\t\tthis.selectedIndex = selected;\r\n\t\t} else {\r\n\t\t\tthis.selectedIndex = -1;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getSelectedRatingIndex(): number {\r\n\t\treturn this.selectedIndex;\r\n\t}\r\n\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\tif (!doc) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\r\n\t\tconst element: Element = doc.createElement(ISurveyComponent.DOM_RATING_TAGNAME);\r\n\r\n\t\tif (!this.isRatingIndexValid(this.getSelectedRatingIndex())) {\r\n\t\t\telement.appendChild(doc.createTextNode(\"Not rated\"));\r\n\t\t} else {\r\n\t\t\t// Enforce six digits after the decimal\r\n\t\t\telement.appendChild(doc.createTextNode(this.getNormalizedRatingScore().toFixed(6)));\r\n\t\t}\r\n\r\n\t\treturn [element];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tconst result: object = {};\r\n\r\n\t\tif (!this.isRatingIndexValid(this.getSelectedRatingIndex())) {\r\n\t\t\tresult[ISurveyComponent.JSON_RATING_KEYNAME] = \"Not rated\";\r\n\t\t} else {\r\n\t\t\tresult[ISurveyComponent.JSON_RATING_KEYNAME] = this.getNormalizedRatingScore();\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponentJson(): object {\r\n\t\treturn {\r\n\t\t\t[ISurveyComponent.JSON_QUESTION_KEYNAME]: this.getQuestion(),\r\n\t\t\t[ISurveyComponent.JSON_RATINGOPTIONS_KEYNAME]: this.getRatingValuesAscending(),\r\n\t\t};\r\n\t}\r\n\r\n\tpublic getNormalizedRatingScore(): number {\r\n\t\tif (!this.isRatingIndexValid(this.getSelectedRatingIndex())) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t\tif (this.data.isZeroBased) {\r\n\t\t\treturn (this.selectedIndex) / (this.data.ratingValuesAscending.length - 1);\r\n\t\t} else {\r\n\t\t\treturn (this.selectedIndex + 1.0) / this.data.ratingValuesAscending.length;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate isRatingIndexValid(index: number): boolean {\r\n\t\treturn (index >= 0 && index < this.data.ratingValuesAscending.length);\r\n\t}\r\n\r\n}\r\n\r\nmodule RatingComponent {\r\n\texport class RatingComponentData {\r\n\t\tpublic question: string;\r\n\t\tpublic ratingValuesAscending: string[];\r\n\t\tpublic isZeroBased: boolean;\r\n\t}\r\n}\r\n\r\nexport = RatingComponent;\r\n","import { IFloodgateSetting } from \"../Api/IFloodgateSetting\";\r\nimport { IFloodgateSettingStorageCallback } from \"../Api/IFloodgateSettingStorageCallback\";\r\nimport * as IFloodgateStorageProvider from \"../Api/IFloodgateStorageProvider\";\r\nimport { TelemetryEvent } from \"../Constants\";\r\nimport { FloodgateEngine } from \"../FloodgateEngine\";\r\nimport * as StateProviderHelpers from \"../StateProviderHelpers\";\r\nimport * as Utils from \"../Utils\";\r\nimport FileType = IFloodgateStorageProvider.FileType;\r\nimport StateListType = StateProviderHelpers.StateListType;\r\n\r\nconst { getDistantPast, isBoolean, isDate, isNOU, isString, isUtcDatetimeString, stringToDate } = Utils;\r\n\r\nexport class CampaignState {\r\n\t/**\r\n\t * Method to deserialize a JSON object to class object\r\n\t * @param input: JSON object\r\n\t * Returns class object\r\n\t */\r\n\tpublic static deserialize(input: any): CampaignState {\r\n\t\tlet result: CampaignState;\r\n\r\n\t\tif (!input) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tresult = new CampaignState(\r\n\t\t\t\tinput.CampaignId,\r\n\t\t\t\tinput.LastNominationTimeUtc,\r\n\t\t\t\tinput.LastNominationBuildNumber,\r\n\t\t\t\tinput.DeleteAfterSecondsWhenStale,\r\n\t\t\t\tfalse, // ForceCandidacy\r\n\t\t\t\tinput.IsCandidate,\r\n\t\t\t\tinput.DidCandidateTriggerSurvey,\r\n\t\t\t\tinput.LastSurveyActivatedTimeUtc,\r\n\t\t\t\tinput.LastSurveyId,\r\n\t\t\t\tinput.LastSurveyStartTimeUtc,\r\n\t\t\t\tinput.LastSurveyExpirationTimeUtc,\r\n\t\t\t\tinput.LastCooldownEndTimeUtc,\r\n\t\t\t);\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(TelemetryEvent.CampaignState.Deserialize.Failed, { ErrorMessage: e.toString() });\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// The Campaign to which this state corresponds\r\n\t// @SerializedName(\"CampaignId\")\r\n\tpublic CampaignId: string;\r\n\r\n\t// The last time the candidacy was evaluated\r\n\t// @SerializedName(\"LastNominationTimeUtc\")\r\n\tpublic LastNominationTimeUtc: Date;\r\n\r\n\t// The build number from the last time the candidacy was evaluated\r\n\t// @SerializedName(\"LastNominationBuildNumber\")\r\n\tpublic LastNominationBuildNumber: string;\r\n\r\n\t// Amount of time to delay cleanup of this state from storage, when it's campaign definition is no longer present\r\n\t// @SerializedName(\"DeleteAfterSecondsWhenStale\")\r\n\tpublic DeleteAfterSecondsWhenStale: number;\r\n\r\n\t// Manual setting that can be used to force this client to be a candidate for this campaign. Not persisted to the file.\r\n\tpublic ForceCandidacy: boolean;\r\n\r\n\t// Whether or not the user is currently a candidate or anti-candidate\r\n\t// @SerializedName(\"IsCandidate\")\r\n\tpublic IsCandidate: boolean;\r\n\r\n\t// Whether or not the user triggered a survey when they are a Candidate.\r\n\t// If isCandidate is false, then this value is meaningless.\r\n\t// If isCandidate is true, then this is used to pick a different campaign cooldown time\r\n\t// @SerializedName(\"DidCandidateTriggerSurvey\")\r\n\tpublic DidCandidateTriggerSurvey: boolean;\r\n\r\n\t// The date the last survey was activated\r\n\t// @SerializedName(\"LastSurveyActivatedTimeUtc\")\r\n\tpublic LastSurveyActivatedTimeUtc: Date;\r\n\r\n\t// region Properties of the most recently generated survey.\u0010\r\n\r\n\t// When isCandidate == true for the current election time, this is used to regenerate the same Survey definition\r\n\t// each time we are invoked\r\n\t// Consider: Putting this in its own subclass\r\n\r\n\t// The surveyId for the most recently generated survey in this campaign (can differ from campaignId, and is\r\n\t// used to guarantee a given survey is shown once)\r\n\t// @SerializedName(\"LastSurveyId\")\r\n\tpublic LastSurveyId: string;\r\n\r\n\t// The start time of the most recently generated survey\r\n\t// @SerializedName(\"LastSurveyStartTimeUtc\")\r\n\tpublic LastSurveyStartTimeUtc: Date;\r\n\r\n\t// The expiration time of the most recently generated survey\r\n\t// @SerializedName(\"LastSurveyExpirationTimeUtc\")\r\n\tpublic LastSurveyExpirationTimeUtc: Date;\r\n\r\n\t// The cooldown end time of the most recently generated survey\r\n\t// @SerializedName(\"LastCooldownEndTimeUtc\")\r\n\tpublic LastCooldownEndTimeUtc: Date;\r\n\r\n\tpublic constructor(campaignId: string, lastNominationTime: Date, lastNominationBuildNumber: string, deleteAfterSecondsWhenStale: number,\r\n\t\tForceCandidacy: boolean, isCandidate: boolean, didCandidateTriggerSurvey: boolean, lastSurveyActivatedTime: Date,\r\n\t\tlastSurveyId: string, lastSurveyStartTime: Date, lastSurveyExpirationTime: Date, lastCooldownEndTimeUtc: Date) {\r\n\t\tthis.CampaignId = campaignId;\r\n\t\tthis.LastNominationTimeUtc = lastNominationTime;\r\n\t\tthis.LastNominationBuildNumber = lastNominationBuildNumber;\r\n\t\tthis.DeleteAfterSecondsWhenStale = deleteAfterSecondsWhenStale;\r\n\t\tthis.ForceCandidacy = ForceCandidacy;\r\n\t\tthis.IsCandidate = isCandidate;\r\n\t\tthis.DidCandidateTriggerSurvey = didCandidateTriggerSurvey;\r\n\t\tthis.LastSurveyActivatedTimeUtc = lastSurveyActivatedTime;\r\n\t\tthis.LastSurveyId = lastSurveyId;\r\n\t\tthis.LastSurveyStartTimeUtc = lastSurveyStartTime;\r\n\t\tthis.LastSurveyExpirationTimeUtc = lastSurveyExpirationTime;\r\n\t\tthis.LastCooldownEndTimeUtc = lastCooldownEndTimeUtc;\r\n\r\n\t\tif (!this.validate()) {\r\n\t\t\tthrow new Error(\"Constructor arguments are not valid\");\r\n\t\t}\r\n\t}\r\n\r\n\tpublic validate(): boolean {\r\n\t\tif (!this.CampaignId || !isString(this.CampaignId)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.LastNominationBuildNumber)\r\n\t\t\t|| !isString(this.LastNominationBuildNumber)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!Utils.isNumber(this.DeleteAfterSecondsWhenStale) || this.DeleteAfterSecondsWhenStale < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!isBoolean(this.IsCandidate) || !isBoolean(this.DidCandidateTriggerSurvey)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this.IsCandidate) {\r\n\t\t\t// Disallow the following null's if isCandidate == true\r\n\t\t\tif (isNOU(this.LastSurveyStartTimeUtc) || isNOU(this.LastSurveyExpirationTimeUtc)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// LastSurveyId could be \"\"\r\n\t\t\tif (!isString(this.LastSurveyId)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.DidCandidateTriggerSurvey) {\r\n\t\t\t// Disallow the following null's if didCandidateTriggerSurvey == true\r\n\t\t\tif (isNOU(this.LastSurveyActivatedTimeUtc)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isNOU(this.LastSurveyId)) {\r\n\t\t\tthis.LastSurveyId = \"\";\r\n\t\t} else if (!isString(this.LastSurveyId)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// LastNominationTime does not allow null\r\n\t\tif (isUtcDatetimeString(this.LastNominationTimeUtc)) {\r\n\t\t\tthis.LastNominationTimeUtc = stringToDate(this.LastNominationTimeUtc);\r\n\t\t// invalidate if it's not a Date object\r\n\t\t} else if (!isDate(this.LastNominationTimeUtc)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Set value to distance past if value not provided\r\n\t\tif (isNOU(this.LastSurveyActivatedTimeUtc)) {\r\n\t\t\tthis.LastSurveyActivatedTimeUtc = getDistantPast();\r\n\t\t// check if it's UTC date time string, possibly coming from deserialize method\r\n\t\t} else if (isUtcDatetimeString(this.LastSurveyActivatedTimeUtc)) {\r\n\t\t\tthis.LastSurveyActivatedTimeUtc = stringToDate(this.LastSurveyActivatedTimeUtc);\r\n\t\t// invalidate if it's not a Date object\r\n\t\t} else if (!isDate(this.LastSurveyActivatedTimeUtc)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Set value to distance past if value not provided\r\n\t\tif (isNOU(this.LastSurveyStartTimeUtc)) {\r\n\t\t\tthis.LastSurveyStartTimeUtc = getDistantPast();\r\n\t\t// check if it's string, possibly coming from deserialize method\r\n\t\t} else if (isUtcDatetimeString(this.LastSurveyStartTimeUtc)) {\r\n\t\t\tthis.LastSurveyStartTimeUtc = stringToDate(this.LastSurveyStartTimeUtc);\r\n\t\t// invalidate if it's not a Date object\r\n\t\t} else if (!isDate(this.LastSurveyStartTimeUtc)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Set value to distance past if value not provided\r\n\t\tif (isNOU(this.LastSurveyExpirationTimeUtc)) {\r\n\t\t\tthis.LastSurveyExpirationTimeUtc = getDistantPast();\r\n\t\t// check if it's string, possibly coming from deserialize method\r\n\t\t} else if (isUtcDatetimeString(this.LastSurveyExpirationTimeUtc)) {\r\n\t\t\tthis.LastSurveyExpirationTimeUtc = stringToDate(this.LastSurveyExpirationTimeUtc);\r\n\t\t} else if (!isDate(this.LastSurveyExpirationTimeUtc)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Set value to distance past if value not provided\r\n\t\tif (isNOU(this.LastCooldownEndTimeUtc)) {\r\n\t\t\tthis.LastCooldownEndTimeUtc = getDistantPast();\r\n\t\t// check if it's string, possibly coming from deserialize method\r\n\t\t} else if (isUtcDatetimeString(this.LastCooldownEndTimeUtc)) {\r\n\t\t\tthis.LastCooldownEndTimeUtc = stringToDate(this.LastCooldownEndTimeUtc);\r\n\t\t} else if (!isDate(this.LastCooldownEndTimeUtc)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Record that the current survey was taken on this date\r\n\t *\r\n\t * @param date date\r\n\t * @param cooldownSeconds number\r\n\t */\r\n\tpublic markCurrentSurveyTakenOnDate(date: Date, cooldownSeconds: number, isSurveyComplete: boolean): void {\r\n\t\tthis.DidCandidateTriggerSurvey = isSurveyComplete;\r\n\t\tthis.LastSurveyActivatedTimeUtc = date != null ? date : new Date();\r\n\t\tthis.LastCooldownEndTimeUtc = Utils.addSecondsWithoutOverflow(this.LastSurveyActivatedTimeUtc, cooldownSeconds);\r\n\t}\r\n\r\n\tpublic getCooldownStartDate(): Date {\r\n\t\tif (!this.IsCandidate) {\r\n\t\t\treturn this.LastNominationTimeUtc;\r\n\t\t}\r\n\r\n\t\tif (this.DidCandidateTriggerSurvey) {\r\n\t\t\treturn this.LastSurveyActivatedTimeUtc;\r\n\t\t}\r\n\r\n\t\t// In practice this wil be equal to lastNominationTime, but\r\n\t\t// distribution models like a ramp effectively cause us to\r\n\t\t// shift our \"effective nomination date\" forward with the survey start date\r\n\t\treturn this.LastSurveyStartTimeUtc;\r\n\t}\r\n\r\n\t// endregion\r\n}\r\n\r\nexport interface ICampaignStateProvider {\r\n\tload(): CampaignState[];\r\n\r\n\tsave(campaignStates: CampaignState[]): void;\r\n}\r\n\r\nexport class CampaignStateProviderFactory {\r\n\tpublic static make(fileBasedStorage: IFloodgateStorageProvider,\r\n\t\thostBasedStorage: IFloodgateSettingStorageCallback): ICampaignStateProvider {\r\n\t\tif (hostBasedStorage) {\r\n\t\t\treturn new HostBasedCampaignStateProvider(fileBasedStorage, hostBasedStorage);\r\n\t\t}\r\n\r\n\t\treturn new FileBasedCampaignStateProvider(fileBasedStorage);\r\n\t}\r\n}\r\n\r\n/**\r\n * Class representing what is stored in the file.\r\n */\r\nclass FileData {\r\n\t// @SerializedName(\"CampaignStates\")\r\n\tpublic CampaignStates: CampaignState[];\r\n\r\n}\r\n\r\nexport class HostBasedCampaignStateProvider implements ICampaignStateProvider {\r\n\tprivate fileBasedStateProvider: ICampaignStateProvider;\r\n\tprivate hostBasedStorage: IFloodgateSettingStorageCallback;\r\n\r\n\tpublic constructor(fileBasedStorage: IFloodgateStorageProvider, hostBasedStorage: IFloodgateSettingStorageCallback) {\r\n\t\tif (!hostBasedStorage) {\r\n\t\t\tthrow new Error(\"host-based storage must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.hostBasedStorage = hostBasedStorage;\r\n\r\n\t\t// file-based provider is optional\r\n\t\tif (fileBasedStorage) {\r\n\t\t\tthis.fileBasedStateProvider = new FileBasedCampaignStateProvider(fileBasedStorage);\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic load(): CampaignState[] {\r\n\t\tconst statesFromHost: CampaignState[] = this.getStatesFromHost();\r\n\r\n\t\tlet statesFromFile: CampaignState[];\r\n\t\tif (this.fileBasedStateProvider) {\r\n\t\t\tstatesFromFile = this.fileBasedStateProvider.load();\r\n\t\t}\r\n\r\n\t\tconst StateCollections = StateProviderHelpers.MergeAndUpdateCampaignStates(statesFromFile, statesFromHost);\r\n\t\treturn StateCollections.find(StateListType.Merged);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic save(campaignStates: CampaignState[]): void {\r\n\t\tif (!campaignStates) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst statesFromHost: CampaignState[] = this.getStatesFromHost();\r\n\t\tconst StateCollections = StateProviderHelpers.MergeAndUpdateCampaignStates(campaignStates, statesFromHost);\r\n\t\tconst toBeUpdatedStates: CampaignState[] = StateCollections.find(StateListType.ToBeUpdated);\r\n\t\tconst mergedStates: CampaignState[] = StateCollections.find(StateListType.Merged);\r\n\r\n\t\t// write delta_data to host\r\n\t\tif (toBeUpdatedStates) {\r\n\t\t\ttoBeUpdatedStates.forEach((state) => {\r\n\t\t\t\tconst stateValue: string = StateProviderHelpers.makeSettingItemValue(JSON.stringify(state));\r\n\t\t\t\tthis.hostBasedStorage.upsertSettingItem(FileType[FileType.CampaignStates], state.CampaignId, stateValue);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Write merged data to File\r\n\t\tif (this.fileBasedStateProvider) {\r\n\t\t\tthis.fileBasedStateProvider.save(mergedStates);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getStatesFromHost(): CampaignState[] {\r\n\t\tconst states: CampaignState[] = [];\r\n\t\tconst settings: IFloodgateSetting = this.hostBasedStorage.readSettingList(FileType[FileType.CampaignStates]);\r\n\r\n\t\tfor (const key in settings) {\r\n\t\t\tif (!settings.hasOwnProperty(key)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst value = settings[key];\r\n\t\t\tconst dataString: string = StateProviderHelpers.extractSettingItemValueSubString(value);\r\n\r\n\t\t\tlet itemObject: any = {};\r\n\t\t\ttry {\r\n\t\t\t\titemObject = JSON.parse(dataString);\r\n\r\n\t\t\t\tconst newState: CampaignState = CampaignState.deserialize(itemObject);\r\n\t\t\t\tif (newState) {\r\n\t\t\t\t\tstates.push(newState);\r\n\t\t\t\t}\r\n\t\t\t} catch (e) {\r\n\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\t\tTelemetryEvent.HostBasedCampaignStateProvider.GetStatesFromHost.Failed,\r\n\t\t\t\t\t{ ErrorMessage: \"Json parsing/deserializing failed. \" + e.toString() + \".  Input:\" + dataString });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn states;\r\n\t}\r\n}\r\n\r\nexport class FileBasedCampaignStateProvider implements ICampaignStateProvider {\r\n\tprivate storage: IFloodgateStorageProvider;\r\n\r\n\tpublic constructor(storage: IFloodgateStorageProvider) {\r\n\t\tif (!storage) {\r\n\t\t\tthrow new Error(\"storage must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.storage = storage;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic load(): CampaignState[] {\r\n\t\tconst readString: string = this.storage.read(FileType.CampaignStates);\r\n\t\tif (!readString) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tlet fileData: FileData;\r\n\t\ttry {\r\n\t\t\tfileData = JSON.parse(readString);\r\n\r\n\t\t\tconst result: CampaignState[] = [];\r\n\t\t\tif (fileData && fileData.CampaignStates) {\r\n\t\t\t\tfileData.CampaignStates.forEach((state) => {\r\n\t\t\t\t\tconst newState: CampaignState = CampaignState.deserialize(state);\r\n\r\n\t\t\t\t\tif (newState) {\r\n\t\t\t\t\t\tresult.push(newState);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.FileBasedCampaignStateProvider.Load.Failed,\r\n\t\t\t\t{ ErrorMessage: \"Json parsing/deserializing failed. \" + e.toString() + \".  Input:\" + readString });\r\n\t\t\treturn [];\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic save(campaignStates: CampaignState[]): void {\r\n\t\tif (!campaignStates) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst fileData = new FileData();\r\n\t\tfileData.CampaignStates = campaignStates;\r\n\t\tconst writeString: string = JSON.stringify(fileData);\r\n\t\tthis.storage.write(FileType.CampaignStates, writeString);\r\n\t}\r\n}\r\n","import { IFloodgateSetting } from \"./Api/IFloodgateSetting\";\r\nimport { IFloodgateSettingStorageCallback } from \"./Api/IFloodgateSettingStorageCallback\";\r\nimport * as IFloodgateStorageProvider from \"./Api/IFloodgateStorageProvider\";\r\nimport FileType = IFloodgateStorageProvider.FileType;\r\nimport * as ISurvey from \"./Api/ISurvey\";\r\nimport { IDictionary, ISerializable } from \"./Common\";\r\nimport { TelemetryEvent } from \"./Constants\";\r\nimport { FloodgateEngine } from \"./FloodgateEngine\";\r\nimport * as StateProviderHelpers from \"./StateProviderHelpers\";\r\nimport { SurveyStatCollection } from \"./SurveyStatCollection\";\r\nimport * as Utils from \"./Utils\";\r\n\r\n/**\r\n * StatCollection for activated surveys.  Should be used to track the SurveyIds\r\n * that have been recently shown to a user\r\n */\r\n// TODO (gachoi) Check if this applies - VSOBug: 1443010 One bad Stat object fails the entire serialization\r\nexport class SurveyStatCollectionActivation extends SurveyStatCollection<SurveyActivationStats> implements ISerializable {\r\n\t/**\r\n\t * Load from Json\r\n\t */\r\n\tpublic static fromJson(json: string): SurveyStatCollectionActivation {\r\n\t\tconst statCollection = new SurveyStatCollectionActivation();\r\n\r\n\t\tif (!json) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.SurveyStatCollectionActivation.FromJson.Failed, { ErrorMessage: \"Input json is null or empty.\" });\r\n\t\t\treturn statCollection;\r\n\t\t}\r\n\r\n\t\tlet readStats: SurveyStatCollectionActivation;\r\n\t\ttry {\r\n\t\t\treadStats = JSON.parse(json);\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.SurveyStatCollectionActivation.FromJson.Failed, { ErrorMessage: \"Json parsing failed. \" + e.toString() });\r\n\t\t\treturn statCollection;\r\n\t\t}\r\n\r\n\t\tif (!statCollection.deserialize(readStats)) {\r\n\t\t\treturn new SurveyStatCollectionActivation();\r\n\t\t}\r\n\r\n\t\treturn statCollection;\r\n\t}\r\n\r\n\t/**\r\n\t * Convert to Json\r\n\t */\r\n\tpublic static toJson(object: SurveyStatCollectionActivation): string {\r\n\t\tif (!object) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.SurveyStatCollectionActivation.ToJson.Failed, { ErrorMessage: \"Input json is null or empty.\" });\r\n\t\t\tobject = new SurveyStatCollectionActivation();\r\n\t\t}\r\n\r\n\t\treturn JSON.stringify(object);\r\n\t}\r\n\r\n\t/**\r\n\t * Add another SurveyStatCollectionActivation object\r\n\t */\r\n\tpublic accumulate(other: SurveyStatCollectionActivation): void {\r\n\t\tif (!other) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst stats: IDictionary<SurveyActivationStats> = other.getStats();\r\n\t\t// SurveyActivationStats accumulation simply overwrites any keys from 'other' into our collection\r\n\t\tfor (const key in stats) {\r\n\t\t\tif (stats.hasOwnProperty(key)) {\r\n\t\t\t\tthis.addStats(key, stats[key]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Method to deserialize SurveyStatCollectionActivation\r\n\t * @param input: collection of SurveyStatCollectionActivation\r\n\t * Returns result of validation check\r\n\t */\r\n\tpublic deserialize(input: any): boolean {\r\n\t\tconst rawStats: IDictionary<SurveyActivationStats> = input.Surveys;\r\n\t\tconst now = new Date();\r\n\r\n\t\tfor (const key in rawStats) {\r\n\t\t\tif (rawStats.hasOwnProperty(key)) {\r\n\t\t\t\tconst newStat = new SurveyActivationStats();\r\n\r\n\t\t\t\tif (newStat.deserialize(rawStats[key]) && newStat.ExpirationTimeUtc > now) {\r\n\t\t\t\t\tthis.addStats(key, newStat);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Validate the Surveys\r\n\t * Returns false if validation fails\r\n\t */\r\n\tpublic validate(): boolean {\r\n\t\treturn Utils.isObject(this.getStats());\r\n\t}\r\n}\r\n\r\nexport interface ISurveyActivationStatsProvider {\r\n\tload(): SurveyStatCollectionActivation;\r\n\r\n\tsave(surveyStatCollectionActivation: SurveyStatCollectionActivation): void;\r\n}\r\n\r\nexport class SurveyActivationStatsProviderFactory {\r\n\tpublic static make(fileBasedStorage: IFloodgateStorageProvider,\r\n\t\thostBasedStorage: IFloodgateSettingStorageCallback): ISurveyActivationStatsProvider {\r\n\t\tif (hostBasedStorage) {\r\n\t\t\treturn new HostBasedSurveyActivationStatsProvider(fileBasedStorage, hostBasedStorage);\r\n\t\t}\r\n\r\n\t\treturn new FileBasedSurveyActivationStatsProvider(fileBasedStorage);\r\n\t}\r\n}\r\n\r\nexport class HostBasedSurveyActivationStatsProvider implements ISurveyActivationStatsProvider {\r\n\tprivate fileBasedStorageProvider: FileBasedSurveyActivationStatsProvider;\r\n\tprivate hostBasedStorage: IFloodgateSettingStorageCallback;\r\n\r\n\tpublic constructor(fileBasedStorageProvider: IFloodgateStorageProvider, hostBasedStorage: IFloodgateSettingStorageCallback) {\r\n\t\tif (!hostBasedStorage) {\r\n\t\t\tthrow new Error(\"host-based storage must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.hostBasedStorage = hostBasedStorage;\r\n\r\n\t\t// file based provider is optional\r\n\t\tif (fileBasedStorageProvider) {\r\n\t\t\tthis.fileBasedStorageProvider = new FileBasedSurveyActivationStatsProvider(fileBasedStorageProvider);\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic load(): SurveyStatCollectionActivation {\r\n\t\tconst surveyStatsFromHost: SurveyStatCollectionActivation = this.getSurveyStatsFromHost();\r\n\r\n\t\tlet surveyStatsFromFile: SurveyStatCollectionActivation = new SurveyStatCollectionActivation();\r\n\t\tif (this.fileBasedStorageProvider) {\r\n\t\t\tsurveyStatsFromFile = this.fileBasedStorageProvider.load();\r\n\t\t}\r\n\r\n\t\tconst surveyStatsCollections = StateProviderHelpers.MergeAndUpdateSurveyActivationStats(surveyStatsFromFile, surveyStatsFromHost);\r\n\t\treturn surveyStatsCollections.find(StateProviderHelpers.StateListType.Merged);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic save(stats: SurveyStatCollectionActivation): void {\r\n\t\tif (!stats) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst statsFromHost: SurveyStatCollectionActivation = this.getSurveyStatsFromHost();\r\n\t\tconst statCollection = StateProviderHelpers.MergeAndUpdateSurveyActivationStats(stats, statsFromHost);\r\n\t\tconst toBeUpdatedStats: SurveyStatCollectionActivation = statCollection.find(StateProviderHelpers.StateListType.ToBeUpdated);\r\n\t\tconst mergedStates: SurveyStatCollectionActivation = statCollection.find(StateProviderHelpers.StateListType.Merged);\r\n\r\n\t\t// write delta_data to Roaming\r\n\t\tif (toBeUpdatedStats) {\r\n\t\t\tconst toBeUpdatedStatsDictionary: IDictionary<SurveyActivationStats> = toBeUpdatedStats.getStats();\r\n\t\t\tfor (const surveyId in toBeUpdatedStatsDictionary) {\r\n\t\t\t\tif (toBeUpdatedStatsDictionary.hasOwnProperty(surveyId)) {\r\n\t\t\t\t\tconst item: string = StateProviderHelpers.makeSettingItemValue(\r\n\t\t\t\t\t\tJSON.stringify(toBeUpdatedStatsDictionary[surveyId]));\r\n\r\n\t\t\t\t\tthis.hostBasedStorage.upsertSettingItem(FileType[FileType.SurveyActivationStats],\r\n\t\t\t\t\t\tsurveyId, item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Write merged data to File\r\n\t\tif (this.fileBasedStorageProvider) {\r\n\t\t\tthis.fileBasedStorageProvider.save(mergedStates);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getSurveyStatsFromHost(): SurveyStatCollectionActivation {\r\n\t\tconst statsCollection: SurveyStatCollectionActivation = new  SurveyStatCollectionActivation();\r\n\t\tconst itemData: IFloodgateSetting = this.hostBasedStorage.readSettingList(FileType[FileType.SurveyActivationStats]);\r\n\r\n\t\tconst now = new Date();\r\n\t\tfor (const surveyId in itemData) {\r\n\t\t\tif (!itemData.hasOwnProperty(surveyId)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst dataString: string = StateProviderHelpers.extractSettingItemValueSubString(itemData[surveyId]);\r\n\t\t\tconst newStats: SurveyActivationStats = new SurveyActivationStats();\r\n\t\t\ttry {\r\n\t\t\t\tconst readStats: SurveyActivationStats = JSON.parse(dataString);\r\n\t\t\t\tnewStats.deserialize(readStats);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\t\tTelemetryEvent.HostBasedSurveyActivationStatsProvider.GetSurveyStatsFromHost.Failed,\r\n\t\t\t\t\t{ ErrorMessage: \"Json parsing/deserializing failed. \" + e.toString() + \".  Input:\" + dataString });\r\n\t\t\t}\r\n\r\n\t\t\tif (newStats.ExpirationTimeUtc <= now) {\r\n\t\t\t\t// Delete survey stat from host storage if it's expired.\r\n\t\t\t\tthis.hostBasedStorage.deleteSettingItem(FileType[FileType.SurveyActivationStats], surveyId);\r\n\t\t\t} else {\r\n\t\t\t\tstatsCollection.addStats(surveyId, newStats);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn statsCollection;\r\n\t}\r\n}\r\nexport class FileBasedSurveyActivationStatsProvider implements ISurveyActivationStatsProvider {\r\n\tprivate storage: IFloodgateStorageProvider;\r\n\r\n\tpublic constructor(storage: IFloodgateStorageProvider) {\r\n\t\tif (!storage) {\r\n\t\t\tthrow new Error(\"storage must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.storage = storage;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic load(): SurveyStatCollectionActivation {\r\n\t\tconst readString: string = this.storage.read(IFloodgateStorageProvider.FileType.SurveyActivationStats);\r\n\t\tif (!readString) {\r\n\t\t\treturn new SurveyStatCollectionActivation();\r\n\t\t}\r\n\r\n\t\treturn SurveyStatCollectionActivation.fromJson(readString);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic save(surveyStatCollectionActivation: SurveyStatCollectionActivation): void {\r\n\t\tif (!surveyStatCollectionActivation) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst writeString: string = SurveyStatCollectionActivation.toJson(surveyStatCollectionActivation);\r\n\t\tthis.storage.write(IFloodgateStorageProvider.FileType.SurveyActivationStats, writeString);\r\n\t}\r\n}\r\n\r\nexport class SurveyActivationStats implements ISerializable {\r\n\t// The following property names match JSON property names for proper serialization/deserialization\r\n\tpublic ExpirationTimeUtc: Date;\r\n\tpublic ActivationTimeUtc: Date;\r\n\tpublic Type: ISurvey.Type;\r\n\tpublic SurveyLaunchCount = 0;\r\n\tpublic SurveyLaunchCountPerSession = 0;\r\n\r\n\t/**\r\n\t * Method to deserialize a JSON object to class object\r\n\t * @param input: JSON object\r\n\t * Returns result of validation check\r\n\t */\r\n\tpublic deserialize(input: any): boolean {\r\n\t\tthis.ActivationTimeUtc = input.ActivationTimeUtc;\r\n\t\tthis.ExpirationTimeUtc = input.ExpirationTimeUtc;\r\n\t\tthis.Type = input.Type;\r\n\t\tthis.SurveyLaunchCount = input.SurveyLaunchCount ?? 0;\r\n\t\tthis.SurveyLaunchCountPerSession = input.SurveyLaunchCountPerSession ?? 0;\r\n\r\n\t\treturn this.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Method to call after deserialization to validate generated object.\r\n\t * Returns false if not valid.\r\n\t */\r\n\tpublic validate(): boolean {\r\n\t\t// make it a date object if it's a valid UTC date time value\r\n\t\tif (Utils.isUtcDatetimeString(this.ActivationTimeUtc)) {\r\n\t\t\tthis.ActivationTimeUtc = Utils.stringToDate(this.ActivationTimeUtc);\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// make it a date object if it's a valid UTC date time value\r\n\t\tif (Utils.isUtcDatetimeString(this.ExpirationTimeUtc)) {\r\n\t\t\tthis.ExpirationTimeUtc = Utils.stringToDate(this.ExpirationTimeUtc);\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!Utils.isNumber(this.SurveyLaunchCount) ||\r\n\t\t\t!Utils.isNumber(this.SurveyLaunchCountPerSession)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn Utils.isEnumValue(this.Type, ISurvey.Type);\r\n\t}\r\n}\r\n","import { IDictionary } from \"./Common\";\r\n\r\n/**\r\n * Generic class for managing a collection of survey stats. Includes read-from/write-to json structures or a file,\r\n * as well as merge routines for combining collections\r\n */\r\nexport abstract class SurveyStatCollection<TStats> {\r\n\t// The following property name matches the JSON root key name for proper serialization/ deserialization\r\n\tprivate Surveys: IDictionary<TStats> = {};\r\n\r\n\tpublic constructor() {\r\n\t\tthis.Surveys = {};\r\n\t}\r\n\r\n\t/**\r\n\t * Add stats. Overwrites if already exists.\r\n\t */\r\n\tpublic addStats(surveyId: string, stats: TStats): void {\r\n\t\tthis.Surveys[surveyId] = stats;\r\n\t}\r\n\r\n\t/**\r\n\t * Get a SurveyActivationStats object by surveyId. Returns null if surveyId is not found\r\n\t */\r\n\tpublic getBySurveyId(surveyId: string): TStats {\r\n\t\treturn (this.Surveys[surveyId]);\r\n\t}\r\n\r\n\t/**\r\n\t * Get all stats available\r\n\t */\r\n\tpublic getStats(): IDictionary<TStats> {\r\n\t\treturn this.Surveys;\r\n\t}\r\n}\r\n","import { ICVSurveyComponent } from \"src/Api/Api\";\r\nimport * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\n\r\nclass CVSurveyComponent implements ICVSurveyComponent {\r\n\tpublic static make(data: CVSurveyComponent.CVSurveyComponentData): ICVSurveyComponent {\r\n\t\ttry {\r\n\t\t\treturn new CVSurveyComponent(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: CVSurveyComponent.CVSurveyComponentData;\r\n\r\n\tpublic constructor(data: CVSurveyComponent.CVSurveyComponentData) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (!data.customerVoiceFormId) {\r\n\t\t\tthrow new Error(\"data.formID must not be null or empty\");\r\n\t\t}\r\n\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\tpublic getType(): ISurveyComponent.Type {\r\n\t\treturn ISurveyComponent.Type.CVSurvey;\r\n\t}\r\n\r\n\tpublic getFormId(): string {\r\n\t\treturn this.data.customerVoiceFormId;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\tif (!doc) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\t\tconst element: Element = doc.createElement(ISurveyComponent.DOM_CVSURVEY_TAGNAME);\r\n\t\treturn [element];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tconst result: object = {};\r\n\r\n\t\tresult[ISurveyComponent.JSON_CVSURVEY_KEYNAME] = this.getFormId();\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponentJson(): object {\r\n\t\treturn {\r\n\t\t\t[ISurveyComponent.JSON_CVSURVEYFORMID_KEYNAME]: this.getFormId(),\r\n\t\t};\r\n\t}\r\n}\r\n\r\nmodule CVSurveyComponent {\r\n\texport class CVSurveyComponentData {\r\n\t\tpublic customerVoiceFormId: string;\r\n\t}\r\n}\r\n\r\nexport = CVSurveyComponent;\r\n","import { IFloodgateSetting } from \"./Api/IFloodgateSetting\";\r\nimport { IFloodgateSettingStorageCallback } from \"./Api/IFloodgateSettingStorageCallback\";\r\nimport * as IFloodgateStorageProvider from \"./Api/IFloodgateStorageProvider\";\r\nimport { TelemetryEvent } from \"./Constants\";\r\nimport { FloodgateEngine } from \"./FloodgateEngine\";\r\nimport { GovernedChannelType } from \"./GovernedChannel\";\r\nimport * as StateProviderHelpers from \"./StateProviderHelpers\";\r\nimport * as Utils from \"./Utils\";\r\nimport FileType = IFloodgateStorageProvider.FileType;\r\nimport StateListType = StateProviderHelpers.StateListType;\r\n\r\nexport class GovernedChannelState {\r\n\t/**\r\n\t * Method to deserialize a JSON object to class object\r\n\t * @param input: JSON object\r\n\t * Returns class object\r\n\t */\r\n\tpublic static deserialize(input: any): GovernedChannelState {\r\n\t\tlet result: GovernedChannelState;\r\n\r\n\t\tif (!input) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// Validation is handled by GovernedChannelState's constructor\r\n\t\ttry {\r\n\t\t\tresult = new GovernedChannelState(\r\n\t\t\t\tinput.ChannelType,\r\n\t\t\t\tinput.CooldownStartTimeUtc,\r\n\t\t\t);\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.GovernedChannelState.Deserialize.Failed, { ErrorMessage: e.toString() });\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @SerializedName(\"ChannelType\")\r\n\tprivate ChannelType: GovernedChannelType;\r\n\r\n\t// @SerializedName(\"CooldownStartTimeUtc\")\r\n\tprivate CooldownStartTimeUtc: Date;\r\n\r\n\tpublic constructor(type: GovernedChannelType, cooldownStartTime: Date) {\r\n\t\tthis.ChannelType = type;\r\n\t\tthis.CooldownStartTimeUtc = cooldownStartTime;\r\n\r\n\t\tif (!this.validate()) {\r\n\t\t\tthrow new Error(\"Constructor arguments are not valid\");\r\n\t\t}\r\n\t}\r\n\r\n\tpublic validate(): boolean {\r\n\t\tif (!Utils.isEnumValue(this.ChannelType, GovernedChannelType)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// make it a date object if it's a valid UTC date time value\r\n\t\tif (Utils.isUtcDatetimeString(this.CooldownStartTimeUtc)) {\r\n\t\t\tthis.CooldownStartTimeUtc = Utils.stringToDate(this.CooldownStartTimeUtc);\r\n\t\t// Allow null and bad cooldownStartTime\r\n\t\t} else if (Utils.isNOU(this.CooldownStartTimeUtc) || !Utils.isDate(this.CooldownStartTimeUtc)) {\r\n\t\t\tthis.CooldownStartTimeUtc = Utils.getDistantPast();\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic getType(): GovernedChannelType {\r\n\t\treturn this.ChannelType;\r\n\t}\r\n\r\n\tpublic getCooldownStartTime(): Date {\r\n\t\treturn this.CooldownStartTimeUtc;\r\n\t}\r\n}\r\n\r\nexport interface IGovernedChannelStateProvider {\r\n\tload(): GovernedChannelState[];\r\n\r\n\tsave(channels: GovernedChannelState[]): void;\r\n}\r\n\r\nexport class GovernedChannelStateProviderFactory {\r\n\tpublic static make(fileBasedStorage: IFloodgateStorageProvider,\r\n\t\thostBasedStorage: IFloodgateSettingStorageCallback): IGovernedChannelStateProvider {\r\n\t\tif (hostBasedStorage) {\r\n\t\t\treturn new HostBasedGovernedChannelStateProvider(fileBasedStorage, hostBasedStorage);\r\n\t\t}\r\n\r\n\t\treturn new FileBasedGovernedChannelStateProvider(fileBasedStorage);\r\n\t}\r\n}\r\n\r\n/**\r\n * Class representing what is stored in the file.\r\n */\r\nclass FileData {\r\n\t// @SerializedName(\"ChannelStates\")\r\n\tpublic ChannelStates: GovernedChannelState[];\r\n}\r\n\r\nexport class HostBasedGovernedChannelStateProvider implements IGovernedChannelStateProvider {\r\n\tprivate fileBasedStateProvider: IGovernedChannelStateProvider;\r\n\tprivate hostBasedStorage: IFloodgateSettingStorageCallback;\r\n\r\n\tpublic constructor(fileBasedStorage: IFloodgateStorageProvider, hostBasedStorage: IFloodgateSettingStorageCallback) {\r\n\t\tif (!hostBasedStorage) {\r\n\t\t\tthrow new Error(\"host-based storage must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.hostBasedStorage = hostBasedStorage;\r\n\r\n\t\t// file-based provider is optional\r\n\t\tif (fileBasedStorage) {\r\n\t\t\tthis.fileBasedStateProvider = new FileBasedGovernedChannelStateProvider(fileBasedStorage);\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic load(): GovernedChannelState[] {\r\n\t\tconst statesFromHost: GovernedChannelState[] = this.getStatesFromHost();\r\n\r\n\t\tlet statesFromFile: GovernedChannelState[];\r\n\t\tif (this.fileBasedStateProvider) {\r\n\t\t\tstatesFromFile = this.fileBasedStateProvider.load();\r\n\t\t}\r\n\r\n\t\tconst StateCollections = StateProviderHelpers.MergeAndUpdateGovernedChannelStates(statesFromFile, statesFromHost);\r\n\t\treturn StateCollections.find(StateListType.Merged);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic save(states: GovernedChannelState[]): void {\r\n\t\tif (!states) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst statesFromHost: GovernedChannelState[] = this.getStatesFromHost();\r\n\t\tconst StateCollections = StateProviderHelpers.MergeAndUpdateGovernedChannelStates(states, statesFromHost);\r\n\t\tconst toBeUpdatedStates: GovernedChannelState[] = StateCollections.find(StateListType.ToBeUpdated);\r\n\t\tconst mergedStates: GovernedChannelState[] = StateCollections.find(StateListType.Merged);\r\n\r\n\t\t// write delta_data to Host\r\n\t\tif (toBeUpdatedStates) {\r\n\t\t\ttoBeUpdatedStates.forEach((state) => {\r\n\t\t\t\tconst stateValue: string = StateProviderHelpers.makeSettingItemValue(JSON.stringify(state));\r\n\t\t\t\tthis.hostBasedStorage.upsertSettingItem(FileType[FileType.GovernedChannelStates], String(state.getType()), stateValue);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Write merged data to File\r\n\t\tif (this.fileBasedStateProvider) {\r\n\t\t\tthis.fileBasedStateProvider.save(mergedStates);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getStatesFromHost(): GovernedChannelState[] {\r\n\t\tconst states: GovernedChannelState[] = [];\r\n\t\tconst settings: IFloodgateSetting = this.hostBasedStorage.readSettingList(FileType[FileType.GovernedChannelStates]);\r\n\r\n\t\tfor (const key in settings) {\r\n\t\t\tif (!settings.hasOwnProperty(key)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst value = settings[key];\r\n\t\t\tconst dataString: string = StateProviderHelpers.extractSettingItemValueSubString(value);\r\n\r\n\t\t\tlet itemObject: any = {};\r\n\t\t\ttry {\r\n\t\t\t\titemObject = JSON.parse(dataString);\r\n\r\n\t\t\t\tconst newState: GovernedChannelState = GovernedChannelState.deserialize(itemObject);\r\n\t\t\t\tif (newState) {\r\n\t\t\t\t\tstates.push(newState);\r\n\t\t\t\t}\r\n\t\t\t} catch (e) {\r\n\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\t\tTelemetryEvent.HostBasedGovernedChannelStateProvider.GetStatesFromHost.Failed,\r\n\t\t\t\t\t{ ErrorMessage: \"Json parsing/deserializing failed. \" + e.toString() + \".  Input:\" + dataString });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn states;\r\n\t}\r\n}\r\n\r\nexport class FileBasedGovernedChannelStateProvider implements IGovernedChannelStateProvider {\r\n\tprivate storage: IFloodgateStorageProvider;\r\n\r\n\tpublic constructor(storage: IFloodgateStorageProvider) {\r\n\t\tif (!storage) {\r\n\t\t\tthrow new Error(\"storage must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.storage = storage;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic load(): GovernedChannelState[] {\r\n\t\t// Load channel state from file using _storageProvider (get back string)\r\n\t\tconst readString: string = this.storage.read(FileType.GovernedChannelStates);\r\n\t\tif (!readString) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tlet fileData: FileData;\r\n\t\ttry {\r\n\t\t\tfileData = JSON.parse(readString);\r\n\r\n\t\t\tconst result: GovernedChannelState[] = [];\r\n\r\n\t\t\tif (fileData && fileData.ChannelStates) {\r\n\t\t\t\tfileData.ChannelStates.forEach((state) => {\r\n\t\t\t\t\tconst newState: GovernedChannelState = GovernedChannelState.deserialize(state);\r\n\r\n\t\t\t\t\tif (newState) {\r\n\t\t\t\t\t\tresult.push(newState);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.FileBasedGovernedChannelStateProvider.Load.Failed,\r\n\t\t\t\t{ ErrorMessage: \"Json parsing/deserializing failed. \" + e.toString() + \".  Input:\" + readString });\r\n\t\t\treturn [];\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic save(states: GovernedChannelState[]): void {\r\n\t\tif (!states) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst fileData = new FileData();\r\n\t\tfileData.ChannelStates = states;\r\n\t\tconst writeString: string = JSON.stringify(fileData);\r\n\r\n\t\tthis.storage.write(FileType.GovernedChannelStates, writeString);\r\n\t}\r\n}\r\n","import { IDictionary, ISerializable } from \"./Common\";\r\nimport { TelemetryEvent } from \"./Constants\";\r\nimport { FloodgateEngine } from \"./FloodgateEngine\";\r\nimport { SurveyStatCollection } from \"./SurveyStatCollection\";\r\nimport * as Utils from \"./Utils\";\r\n\r\n/**\r\n * StatCollection for EventActivity counts.  Should be used to store/merge\r\n * aggregate values between sessions tracking the same surveys/events\r\n * E.g. A survey that activates after 3 boots.\r\n */\r\n// TODO (gachoi) check the following - VSOBug: 1443010 One bad Stat object fails the entire serialization\r\nexport class SurveyStatCollectionEventActivity extends SurveyStatCollection<SurveyEventActivityStats> implements ISerializable {\r\n\r\n\t/**\r\n\t * Load from Json\r\n\t */\r\n\tpublic static fromJson(json: string): SurveyStatCollectionEventActivity {\r\n\t\tconst statCollection = new SurveyStatCollectionEventActivity();\r\n\r\n\t\tif (!json) {\r\n\t\t\treturn statCollection;\r\n\t\t}\r\n\r\n\t\tlet readStats: SurveyStatCollectionEventActivity;\r\n\t\ttry {\r\n\t\t\treadStats = JSON.parse(json);\r\n\t\t} catch (e) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.SurveyStatCollectionEventActivity.FromJson.Failed,\r\n\t\t\t\t{ ErrorMessage: \"Json parsing failed. \" + e.toString() });\r\n\t\t\treturn statCollection;\r\n\t\t}\r\n\r\n\t\tif (!statCollection.deserialize(readStats)) {\r\n\t\t\treturn new SurveyStatCollectionEventActivity();\r\n\t\t}\r\n\r\n\t\treturn statCollection;\r\n\t}\r\n\r\n\t/**\r\n\t * Convert to Json\r\n\t */\r\n\tpublic static toJson(object: SurveyStatCollectionEventActivity): string {\r\n\t\tif (!object) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.SurveyStatCollectionEventActivity.ToJson.Failed,\r\n\t\t\t\t{ ErrorMessage: \"Input json is null or empty.\" });\r\n\t\t\tobject = new SurveyStatCollectionEventActivity();\r\n\t\t}\r\n\r\n\t\treturn JSON.stringify(object);\r\n\t}\r\n\r\n\t/**\r\n\t * Add another SurveyStatCollectionEventActivity object\r\n\t */\r\n\tpublic accumulate(other: SurveyStatCollectionEventActivity): void {\r\n\t\tif (!other) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst stats: IDictionary<SurveyEventActivityStats> = other.getStats();\r\n\t\t// SurveyEventActivityStats accumulation simply overwrites any keys from 'other' into our collection\r\n\t\tfor (const key in stats) {\r\n\t\t\tif (stats.hasOwnProperty(key)) {\r\n\t\t\t\tlet ourStats: SurveyEventActivityStats = this.getBySurveyId(key);\r\n\r\n\t\t\t\t// If it does not already exist\r\n\t\t\t\tif (!ourStats) {\r\n\t\t\t\t\tourStats = new SurveyEventActivityStats();\r\n\t\t\t\t\tourStats.Counts = [];\r\n\t\t\t\t\tthis.addStats(key, ourStats);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tourStats.ExpirationTimeUtc = stats[key].ExpirationTimeUtc;\r\n\r\n\t\t\t\t// If for some reason the other counts array is larger, resize ourStats.counts\r\n\t\t\t\tif (ourStats.Counts.length < stats[key].Counts.length) {\r\n\t\t\t\t\tconst resizedCounts: number[] = ourStats.Counts.slice();\r\n\t\t\t\t\tourStats.Counts = resizedCounts;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor (let i = 0; i < stats[key].Counts.length; i++) {\r\n\t\t\t\t\tif (!ourStats.Counts[i]) {\r\n\t\t\t\t\t\tourStats.Counts[i] = 0;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tourStats.Counts[i] += stats[key].Counts[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Method to deserialize SurveyStatCollectionEventActivity\r\n\t * @param input: collection of SurveyStatCollectionEventActivity\r\n\t * Returns result of validation check\r\n\t */\r\n\tpublic deserialize(input: any): boolean {\r\n\t\tconst rawStats: IDictionary<SurveyEventActivityStats> = input.Surveys;\r\n\t\tconst now = new Date();\r\n\r\n\t\tfor (const key in rawStats) {\r\n\t\t\tif (rawStats.hasOwnProperty(key)) {\r\n\t\t\t\tconst newStat = new SurveyEventActivityStats();\r\n\r\n\t\t\t\tif (newStat.deserialize(rawStats[key]) && newStat.ExpirationTimeUtc > now) {\r\n\t\t\t\t\tthis.addStats(key, newStat);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Validate the Surveys\r\n\t * Returns false if validation fails\r\n\t */\r\n\tpublic validate(): boolean {\r\n\t\treturn Utils.isObject(this.getStats());\r\n\t}\r\n}\r\n\r\nexport class SurveyEventActivityStats implements ISerializable {\r\n\t// The following property names match JSON property names for proper serialization/deserialization\r\n\tpublic ExpirationTimeUtc: Date;\r\n\tpublic Counts: number[];\r\n\r\n\t/**\r\n\t * Method to deserialize a JSON object to class object\r\n\t * @param input: JSON object\r\n\t * Returns result of validation check\r\n\t */\r\n\tpublic deserialize(input: any): boolean {\r\n\t\tthis.ExpirationTimeUtc = input.ExpirationTimeUtc;\r\n\t\tthis.Counts = input.Counts;\r\n\r\n\t\treturn this.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Method to call after deserialization to validate generated object.\r\n\t * Returns false if not valid.\r\n\t */\r\n\tpublic validate(): boolean {\r\n\t\tif (!this.Counts) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < this.Counts.length; i++) {\r\n\t\t\tconst val: number = this.Counts[i];\r\n\r\n\t\t\tif (!Utils.isNumber(val)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (val < 0) {\r\n\t\t\t\tthis.Counts[i] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// make it a date object if it's a valid UTC date time value\r\n\t\tif (Utils.isUtcDatetimeString(this.ExpirationTimeUtc)) {\r\n\t\t\tthis.ExpirationTimeUtc = Utils.stringToDate(this.ExpirationTimeUtc);\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","/*!\r\n * html2canvas 1.0.0-rc.5 <https://html2canvas.hertzen.com>\r\n * Copyright (c) 2019 Niklas von Hertzen <https://hertzen.com>\r\n * Released under MIT License\r\n */\r\n\r\n(function (global, factory) {\r\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n        typeof define === 'function' && define.amd ? define(factory) :\r\n            (global = global || self, global.html2canvas = factory());\r\n}(this, function () {\r\n    'use strict';\r\n\r\n    /*! *****************************************************************************\r\n    Copyright (c) Microsoft Corporation. All rights reserved.\r\n    Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\n    this file except in compliance with the License. You may obtain a copy of the\r\n    License at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n    MERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\n    See the Apache Version 2.0 License for specific language governing permissions\r\n    and limitations under the License.\r\n    ***************************************************************************** */\r\n    /* global Reflect, Promise */\r\n\r\n    var extendStatics = function (d, b) {\r\n        extendStatics = Object.setPrototypeOf ||\r\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n        return extendStatics(d, b);\r\n    };\r\n\r\n    function __extends(d, b) {\r\n        extendStatics(d, b);\r\n        function __() { this.constructor = d; }\r\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n    }\r\n\r\n    var __assign = function () {\r\n        __assign = Object.assign || function __assign(t) {\r\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n                s = arguments[i];\r\n                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n            }\r\n            return t;\r\n        };\r\n        return __assign.apply(this, arguments);\r\n    };\r\n\r\n    function __awaiter(thisArg, _arguments, P, generator) {\r\n        return new (P || (P = Promise))(function (resolve, reject) {\r\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n            function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n        });\r\n    }\r\n\r\n    function __generator(thisArg, body) {\r\n        var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\r\n        function verb(n) { return function (v) { return step([n, v]); }; }\r\n        function step(op) {\r\n            if (f) throw new TypeError(\"Generator is already executing.\");\r\n            while (_) try {\r\n                if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n                if (y = 0, t) op = [op[0] & 2, t.value];\r\n                switch (op[0]) {\r\n                    case 0: case 1: t = op; break;\r\n                    case 4: _.label++; return { value: op[1], done: false };\r\n                    case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                    case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                    default:\r\n                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                        if (t[2]) _.ops.pop();\r\n                        _.trys.pop(); continue;\r\n                }\r\n                op = body.call(thisArg, _);\r\n            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n        }\r\n    }\r\n\r\n    var Bounds = /** @class */ (function () {\r\n        function Bounds(x, y, w, h) {\r\n            this.left = x;\r\n            this.top = y;\r\n            this.width = w;\r\n            this.height = h;\r\n        }\r\n        Bounds.prototype.add = function (x, y, w, h) {\r\n            return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h);\r\n        };\r\n        Bounds.fromClientRect = function (clientRect) {\r\n            return new Bounds(clientRect.left, clientRect.top, clientRect.width, clientRect.height);\r\n        };\r\n        return Bounds;\r\n    }());\r\n    var parseBounds = function (node) {\r\n        return Bounds.fromClientRect(node.getBoundingClientRect());\r\n    };\r\n    var parseDocumentSize = function (document) {\r\n        var body = document.body;\r\n        var documentElement = document.documentElement;\r\n        if (!body || !documentElement) {\r\n            throw new Error(\"Unable to get document size\");\r\n        }\r\n        var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth));\r\n        var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight));\r\n        return new Bounds(0, 0, width, height);\r\n    };\r\n\r\n    /*\r\n     * css-line-break 1.1.1 <https://github.com/niklasvh/css-line-break#readme>\r\n     * Copyright (c) 2019 Niklas von Hertzen <https://hertzen.com>\r\n     * Released under MIT License\r\n     */\r\n    var toCodePoints = function (str) {\r\n        var codePoints = [];\r\n        var i = 0;\r\n        var length = str.length;\r\n        while (i < length) {\r\n            var value = str.charCodeAt(i++);\r\n            if (value >= 0xd800 && value <= 0xdbff && i < length) {\r\n                var extra = str.charCodeAt(i++);\r\n                if ((extra & 0xfc00) === 0xdc00) {\r\n                    codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\r\n                }\r\n                else {\r\n                    codePoints.push(value);\r\n                    i--;\r\n                }\r\n            }\r\n            else {\r\n                codePoints.push(value);\r\n            }\r\n        }\r\n        return codePoints;\r\n    };\r\n    var fromCodePoint = function () {\r\n        var codePoints = [];\r\n        for (var _i = 0; _i < arguments.length; _i++) {\r\n            codePoints[_i] = arguments[_i];\r\n        }\r\n        if (String.fromCodePoint) {\r\n            return String.fromCodePoint.apply(String, codePoints);\r\n        }\r\n        var length = codePoints.length;\r\n        if (!length) {\r\n            return '';\r\n        }\r\n        var codeUnits = [];\r\n        var index = -1;\r\n        var result = '';\r\n        while (++index < length) {\r\n            var codePoint = codePoints[index];\r\n            if (codePoint <= 0xffff) {\r\n                codeUnits.push(codePoint);\r\n            }\r\n            else {\r\n                codePoint -= 0x10000;\r\n                codeUnits.push((codePoint >> 10) + 0xd800, codePoint % 0x400 + 0xdc00);\r\n            }\r\n            if (index + 1 === length || codeUnits.length > 0x4000) {\r\n                result += String.fromCharCode.apply(String, codeUnits);\r\n                codeUnits.length = 0;\r\n            }\r\n        }\r\n        return result;\r\n    };\r\n    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n    // Use a lookup table to find the index.\r\n    var lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\r\n    for (var i = 0; i < chars.length; i++) {\r\n        lookup[chars.charCodeAt(i)] = i;\r\n    }\r\n    var decode = function (base64) {\r\n        var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\r\n        if (base64[base64.length - 1] === '=') {\r\n            bufferLength--;\r\n            if (base64[base64.length - 2] === '=') {\r\n                bufferLength--;\r\n            }\r\n        }\r\n        var buffer = typeof ArrayBuffer !== 'undefined' &&\r\n            typeof Uint8Array !== 'undefined' &&\r\n            typeof Uint8Array.prototype.slice !== 'undefined'\r\n            ? new ArrayBuffer(bufferLength)\r\n            : new Array(bufferLength);\r\n        var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);\r\n        for (i = 0; i < len; i += 4) {\r\n            encoded1 = lookup[base64.charCodeAt(i)];\r\n            encoded2 = lookup[base64.charCodeAt(i + 1)];\r\n            encoded3 = lookup[base64.charCodeAt(i + 2)];\r\n            encoded4 = lookup[base64.charCodeAt(i + 3)];\r\n            bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\r\n            bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\r\n            bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\r\n        }\r\n        return buffer;\r\n    };\r\n    var polyUint16Array = function (buffer) {\r\n        var length = buffer.length;\r\n        var bytes = [];\r\n        for (var i = 0; i < length; i += 2) {\r\n            bytes.push((buffer[i + 1] << 8) | buffer[i]);\r\n        }\r\n        return bytes;\r\n    };\r\n    var polyUint32Array = function (buffer) {\r\n        var length = buffer.length;\r\n        var bytes = [];\r\n        for (var i = 0; i < length; i += 4) {\r\n            bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);\r\n        }\r\n        return bytes;\r\n    };\r\n\r\n    /** Shift size for getting the index-2 table offset. */\r\n    var UTRIE2_SHIFT_2 = 5;\r\n    /** Shift size for getting the index-1 table offset. */\r\n    var UTRIE2_SHIFT_1 = 6 + 5;\r\n    /**\r\n     * Shift size for shifting left the index array values.\r\n     * Increases possible data size with 16-bit index values at the cost\r\n     * of compactability.\r\n     * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.\r\n     */\r\n    var UTRIE2_INDEX_SHIFT = 2;\r\n    /**\r\n     * Difference between the two shift sizes,\r\n     * for getting an index-1 offset from an index-2 offset. 6=11-5\r\n     */\r\n    var UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;\r\n    /**\r\n     * The part of the index-2 table for U+D800..U+DBFF stores values for\r\n     * lead surrogate code _units_ not code _points_.\r\n     * Values for lead surrogate code _points_ are indexed with this portion of the table.\r\n     * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)\r\n     */\r\n    var UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;\r\n    /** Number of entries in a data block. 32=0x20 */\r\n    var UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;\r\n    /** Mask for getting the lower bits for the in-data-block offset. */\r\n    var UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;\r\n    var UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;\r\n    /** Count the lengths of both BMP pieces. 2080=0x820 */\r\n    var UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;\r\n    /**\r\n     * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\r\n     * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.\r\n     */\r\n    var UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;\r\n    var UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */\r\n    /**\r\n     * The index-1 table, only used for supplementary code points, at offset 2112=0x840.\r\n     * Variable length, for code points up to highStart, where the last single-value range starts.\r\n     * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.\r\n     * (For 0x100000 supplementary code points U+10000..U+10ffff.)\r\n     *\r\n     * The part of the index-2 table for supplementary code points starts\r\n     * after this index-1 table.\r\n     *\r\n     * Both the index-1 table and the following part of the index-2 table\r\n     * are omitted completely if there is only BMP data.\r\n     */\r\n    var UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;\r\n    /**\r\n     * Number of index-1 entries for the BMP. 32=0x20\r\n     * This part of the index-1 table is omitted from the serialized form.\r\n     */\r\n    var UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;\r\n    /** Number of entries in an index-2 block. 64=0x40 */\r\n    var UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;\r\n    /** Mask for getting the lower bits for the in-index-2-block offset. */\r\n    var UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;\r\n    var slice16 = function (view, start, end) {\r\n        if (view.slice) {\r\n            return view.slice(start, end);\r\n        }\r\n        return new Uint16Array(Array.prototype.slice.call(view, start, end));\r\n    };\r\n    var slice32 = function (view, start, end) {\r\n        if (view.slice) {\r\n            return view.slice(start, end);\r\n        }\r\n        return new Uint32Array(Array.prototype.slice.call(view, start, end));\r\n    };\r\n    var createTrieFromBase64 = function (base64) {\r\n        var buffer = decode(base64);\r\n        var view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);\r\n        var view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);\r\n        var headerLength = 24;\r\n        var index = slice16(view16, headerLength / 2, view32[4] / 2);\r\n        var data = view32[5] === 2\r\n            ? slice16(view16, (headerLength + view32[4]) / 2)\r\n            : slice32(view32, Math.ceil((headerLength + view32[4]) / 4));\r\n        return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);\r\n    };\r\n    var Trie = /** @class */ (function () {\r\n        function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) {\r\n            this.initialValue = initialValue;\r\n            this.errorValue = errorValue;\r\n            this.highStart = highStart;\r\n            this.highValueIndex = highValueIndex;\r\n            this.index = index;\r\n            this.data = data;\r\n        }\r\n        /**\r\n         * Get the value for a code point as stored in the Trie.\r\n         *\r\n         * @param codePoint the code point\r\n         * @return the value\r\n         */\r\n        Trie.prototype.get = function (codePoint) {\r\n            var ix;\r\n            if (codePoint >= 0) {\r\n                if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {\r\n                    // Ordinary BMP code point, excluding leading surrogates.\r\n                    // BMP uses a single level lookup.  BMP index starts at offset 0 in the Trie2 index.\r\n                    // 16 bit data is stored in the index array itself.\r\n                    ix = this.index[codePoint >> UTRIE2_SHIFT_2];\r\n                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\r\n                    return this.data[ix];\r\n                }\r\n                if (codePoint <= 0xffff) {\r\n                    // Lead Surrogate Code Point.  A Separate index section is stored for\r\n                    // lead surrogate code units and code points.\r\n                    //   The main index has the code unit data.\r\n                    //   For this function, we need the code point data.\r\n                    // Note: this expression could be refactored for slightly improved efficiency, but\r\n                    //       surrogate code points will be so rare in practice that it's not worth it.\r\n                    ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)];\r\n                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\r\n                    return this.data[ix];\r\n                }\r\n                if (codePoint < this.highStart) {\r\n                    // Supplemental code point, use two-level lookup.\r\n                    ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);\r\n                    ix = this.index[ix];\r\n                    ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK;\r\n                    ix = this.index[ix];\r\n                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\r\n                    return this.data[ix];\r\n                }\r\n                if (codePoint <= 0x10ffff) {\r\n                    return this.data[this.highValueIndex];\r\n                }\r\n            }\r\n            // Fall through.  The code point is outside of the legal range of 0..0x10ffff.\r\n            return this.errorValue;\r\n        };\r\n        return Trie;\r\n    }());\r\n\r\n    var base64 = 'KwAAAAAAAAAACA4AIDoAAPAfAAACAAAAAAAIABAAGABAAEgAUABYAF4AZgBeAGYAYABoAHAAeABeAGYAfACEAIAAiACQAJgAoACoAK0AtQC9AMUAXgBmAF4AZgBeAGYAzQDVAF4AZgDRANkA3gDmAOwA9AD8AAQBDAEUARoBIgGAAIgAJwEvATcBPwFFAU0BTAFUAVwBZAFsAXMBewGDATAAiwGTAZsBogGkAawBtAG8AcIBygHSAdoB4AHoAfAB+AH+AQYCDgIWAv4BHgImAi4CNgI+AkUCTQJTAlsCYwJrAnECeQKBAk0CiQKRApkCoQKoArACuALAAsQCzAIwANQC3ALkAjAA7AL0AvwCAQMJAxADGAMwACADJgMuAzYDPgOAAEYDSgNSA1IDUgNaA1oDYANiA2IDgACAAGoDgAByA3YDfgOAAIQDgACKA5IDmgOAAIAAogOqA4AAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAK8DtwOAAIAAvwPHA88D1wPfAyAD5wPsA/QD/AOAAIAABAQMBBIEgAAWBB4EJgQuBDMEIAM7BEEEXgBJBCADUQRZBGEEaQQwADAAcQQ+AXkEgQSJBJEEgACYBIAAoASoBK8EtwQwAL8ExQSAAIAAgACAAIAAgACgAM0EXgBeAF4AXgBeAF4AXgBeANUEXgDZBOEEXgDpBPEE+QQBBQkFEQUZBSEFKQUxBTUFPQVFBUwFVAVcBV4AYwVeAGsFcwV7BYMFiwWSBV4AmgWgBacFXgBeAF4AXgBeAKsFXgCyBbEFugW7BcIFwgXIBcIFwgXQBdQF3AXkBesF8wX7BQMGCwYTBhsGIwYrBjMGOwZeAD8GRwZNBl4AVAZbBl4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAGMGXgBqBnEGXgBeAF4AXgBeAF4AXgBeAF4AXgB5BoAG4wSGBo4GkwaAAIADHgR5AF4AXgBeAJsGgABGA4AAowarBrMGswagALsGwwbLBjAA0wbaBtoG3QbaBtoG2gbaBtoG2gblBusG8wb7BgMHCwcTBxsHCwcjBysHMAc1BzUHOgdCB9oGSgdSB1oHYAfaBloHaAfaBlIH2gbaBtoG2gbaBtoG2gbaBjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHbQdeAF4ANQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQd1B30HNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B4MH2gaKB68EgACAAIAAgACAAIAAgACAAI8HlwdeAJ8HpweAAIAArwe3B14AXgC/B8UHygcwANAH2AfgB4AA6AfwBz4B+AcACFwBCAgPCBcIogEYAR8IJwiAAC8INwg/CCADRwhPCFcIXwhnCEoDGgSAAIAAgABvCHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIhAiLCI4IMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAANQc1BzUHNQc1BzUHNQc1BzUHNQc1B54INQc1B6II2gaqCLIIugiAAIAAvgjGCIAAgACAAIAAgACAAIAAgACAAIAAywiHAYAA0wiAANkI3QjlCO0I9Aj8CIAAgACAAAIJCgkSCRoJIgknCTYHLwk3CZYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiAAIAAAAFAAXgBeAGAAcABeAHwAQACQAKAArQC9AJ4AXgBeAE0A3gBRAN4A7AD8AMwBGgEAAKcBNwEFAUwBXAF4QkhCmEKnArcCgAHHAsABz4LAAcABwAHAAd+C6ABoAG+C/4LAAcABwAHAAc+DF4MAAcAB54M3gweDV4Nng3eDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEeDqABVg6WDqABoQ6gAaABoAHXDvcONw/3DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DncPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB7cPPwlGCU4JMACAAIAAgABWCV4JYQmAAGkJcAl4CXwJgAkwADAAMAAwAIgJgACLCZMJgACZCZ8JowmrCYAAswkwAF4AXgB8AIAAuwkABMMJyQmAAM4JgADVCTAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAqwYWBNkIMAAwADAAMADdCeAJ6AnuCR4E9gkwAP4JBQoNCjAAMACAABUK0wiAAB0KJAosCjQKgAAwADwKQwqAAEsKvQmdCVMKWwowADAAgACAALcEMACAAGMKgABrCjAAMAAwADAAMAAwADAAMAAwADAAMAAeBDAAMAAwADAAMAAwADAAMAAwADAAMAAwAIkEPQFzCnoKiQSCCooKkAqJBJgKoAqkCokEGAGsCrQKvArBCjAAMADJCtEKFQHZCuEK/gHpCvEKMAAwADAAMACAAIwE+QowAIAAPwEBCzAAMAAwADAAMACAAAkLEQswAIAAPwEZCyELgAAOCCkLMAAxCzkLMAAwADAAMAAwADAAXgBeAEELMAAwADAAMAAwADAAMAAwAEkLTQtVC4AAXAtkC4AAiQkwADAAMAAwADAAMAAwADAAbAtxC3kLgAuFC4sLMAAwAJMLlwufCzAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAApwswADAAMACAAIAAgACvC4AAgACAAIAAgACAALcLMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAvwuAAMcLgACAAIAAgACAAIAAyguAAIAAgACAAIAA0QswADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAANkLgACAAIAA4AswADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACJCR4E6AswADAAhwHwC4AA+AsADAgMEAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMACAAIAAGAwdDCUMMAAwAC0MNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQw1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHPQwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADUHNQc1BzUHNQc1BzUHNQc2BzAAMAA5DDUHNQc1BzUHNQc1BzUHNQc1BzUHNQdFDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAATQxSDFoMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAF4AXgBeAF4AXgBeAF4AYgxeAGoMXgBxDHkMfwxeAIUMXgBeAI0MMAAwADAAMAAwAF4AXgCVDJ0MMAAwADAAMABeAF4ApQxeAKsMswy7DF4Awgy9DMoMXgBeAF4AXgBeAF4AXgBeAF4AXgDRDNkMeQBqCeAM3Ax8AOYM7Az0DPgMXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgCgAAANoAAHDQ4NFg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAeDSYNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAC4NMABeAF4ANg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD4NRg1ODVYNXg1mDTAAbQ0wADAAMAAwADAAMAAwADAA2gbaBtoG2gbaBtoG2gbaBnUNeg3CBYANwgWFDdoGjA3aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gaUDZwNpA2oDdoG2gawDbcNvw3HDdoG2gbPDdYN3A3fDeYN2gbsDfMN2gbaBvoN/g3aBgYODg7aBl4AXgBeABYOXgBeACUG2gYeDl4AJA5eACwO2w3aBtoGMQ45DtoG2gbaBtoGQQ7aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B1EO2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQdZDjUHNQc1BzUHNQc1B2EONQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHaA41BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B3AO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B2EO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBkkOeA6gAKAAoAAwADAAMAAwAKAAoACgAKAAoACgAKAAgA4wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAD//wQABAAEAAQABAAEAAQABAAEAA0AAwABAAEAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAKABMAFwAeABsAGgAeABcAFgASAB4AGwAYAA8AGAAcAEsASwBLAEsASwBLAEsASwBLAEsAGAAYAB4AHgAeABMAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAFgAbABIAHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYADQARAB4ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkAFgAaABsAGwAbAB4AHQAdAB4ATwAXAB4ADQAeAB4AGgAbAE8ATwAOAFAAHQAdAB0ATwBPABcATwBPAE8AFgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwArAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAAQABAANAA0ASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAUAArACsAKwArACsAKwArACsABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAGgAaAFAAUABQAFAAUABMAB4AGwBQAB4AKwArACsABAAEAAQAKwBQAFAAUABQAFAAUAArACsAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUAArAFAAUAArACsABAArAAQABAAEAAQABAArACsAKwArAAQABAArACsABAAEAAQAKwArACsABAArACsAKwArACsAKwArAFAAUABQAFAAKwBQACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwAEAAQAUABQAFAABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQAKwArAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeABsAKwArACsAKwArACsAKwBQAAQABAAEAAQABAAEACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAKwArACsAKwArACsAKwArAAQABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwAEAFAAKwBQAFAAUABQAFAAUAArACsAKwBQAFAAUAArAFAAUABQAFAAKwArACsAUABQACsAUAArAFAAUAArACsAKwBQAFAAKwArACsAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQAKwArACsABAAEAAQAKwAEAAQABAAEACsAKwBQACsAKwArACsAKwArAAQAKwArACsAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAB4AHgAeAB4AHgAeABsAHgArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArAFAAUABQACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAB4AUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArACsAKwArACsAKwArAFAAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwArAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAKwBcAFwAKwBcACsAKwBcACsAKwArACsAKwArAFwAXABcAFwAKwBcAFwAXABcAFwAXABcACsAXABcAFwAKwBcACsAXAArACsAXABcACsAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgArACoAKgBcACsAKwBcAFwAXABcAFwAKwBcACsAKgAqACoAKgAqACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAFwAXABcAFwAUAAOAA4ADgAOAB4ADgAOAAkADgAOAA0ACQATABMAEwATABMACQAeABMAHgAeAB4ABAAEAB4AHgAeAB4AHgAeAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUAANAAQAHgAEAB4ABAAWABEAFgARAAQABABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAAQABAAEAAQABAANAAQABABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsADQANAB4AHgAeAB4AHgAeAAQAHgAeAB4AHgAeAB4AKwAeAB4ADgAOAA0ADgAeAB4AHgAeAB4ACQAJACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgAeAB4AHgBcAFwAXABcAFwAXAAqACoAKgAqAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAKgAqACoAKgAqACoAKgBcAFwAXAAqACoAKgAqAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAXAAqAEsASwBLAEsASwBLAEsASwBLAEsAKgAqACoAKgAqACoAUABQAFAAUABQAFAAKwBQACsAKwArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQACsAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwAEAAQABAAeAA0AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAEQArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAADQANAA0AUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAA0ADQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoADQANABUAXAANAB4ADQAbAFwAKgArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAB4AHgATABMADQANAA4AHgATABMAHgAEAAQABAAJACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAUABQAFAAUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwAeACsAKwArABMAEwBLAEsASwBLAEsASwBLAEsASwBLAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwBcAFwAXABcAFwAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcACsAKwArACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwAeAB4AXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsABABLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKgAqACoAKgAqACoAKgBcACoAKgAqACoAKgAqACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAUABQAFAAUABQAFAAUAArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4ADQANAA0ADQAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAHgAeAB4AHgBQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwANAA0ADQANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwBQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsABAAEAAQAHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAABABQAFAAUABQAAQABAAEAFAAUAAEAAQABAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAKwBQACsAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAKwArAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAKwAeAB4AHgAeAB4AHgAeAA4AHgArAA0ADQANAA0ADQANAA0ACQANAA0ADQAIAAQACwAEAAQADQAJAA0ADQAMAB0AHQAeABcAFwAWABcAFwAXABYAFwAdAB0AHgAeABQAFAAUAA0AAQABAAQABAAEAAQABAAJABoAGgAaABoAGgAaABoAGgAeABcAFwAdABUAFQAeAB4AHgAeAB4AHgAYABYAEQAVABUAFQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgANAB4ADQANAA0ADQAeAA0ADQANAAcAHgAeAB4AHgArAAQABAAEAAQABAAEAAQABAAEAAQAUABQACsAKwBPAFAAUABQAFAAUAAeAB4AHgAWABEATwBQAE8ATwBPAE8AUABQAFAAUABQAB4AHgAeABYAEQArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGgAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgBQABoAHgAdAB4AUAAeABoAHgAeAB4AHgAeAB4AHgAeAB4ATwAeAFAAGwAeAB4AUABQAFAAUABQAB4AHgAeAB0AHQAeAFAAHgBQAB4AUAAeAFAATwBQAFAAHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AUABQAFAAUABPAE8AUABQAFAAUABQAE8AUABQAE8AUABPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAE8ATwBPAE8ATwBPAE8ATwBPAE8AUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAATwAeAB4AKwArACsAKwAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB0AHQAeAB4AHgAdAB0AHgAeAB0AHgAeAB4AHQAeAB0AGwAbAB4AHQAeAB4AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB0AHgAdAB4AHQAdAB0AHQAdAB0AHgAdAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAdAB0AHQAdAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAlACUAHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB0AHQAeAB4AHgAeAB0AHQAdAB4AHgAdAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB0AHQAeAB4AHQAeAB4AHgAeAB0AHQAeAB4AHgAeACUAJQAdAB0AJQAeACUAJQAlACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHQAdAB0AHgAdACUAHQAdAB4AHQAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHQAdAB0AHQAlAB4AJQAlACUAHQAlACUAHQAdAB0AJQAlAB0AHQAlAB0AHQAlACUAJQAeAB0AHgAeAB4AHgAdAB0AJQAdAB0AHQAdAB0AHQAlACUAJQAlACUAHQAlACUAIAAlAB0AHQAlACUAJQAlACUAJQAlACUAHgAeAB4AJQAlACAAIAAgACAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeABcAFwAXABcAFwAXAB4AEwATACUAHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACUAJQBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwArACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAE8ATwBPAE8ATwBPAE8ATwAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeACsAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUAArACsAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQBQAFAAUABQACsAKwArACsAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAABAAEAAQAKwAEAAQAKwArACsAKwArAAQABAAEAAQAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsABAAEAAQAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsADQANAA0ADQANAA0ADQANAB4AKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAUABQAFAAUABQAA0ADQANAA0ADQANABQAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwANAA0ADQANAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAeAAQABAAEAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLACsADQArAB4AKwArAAQABAAEAAQAUABQAB4AUAArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwAEAAQABAAEAAQABAAEAAQABAAOAA0ADQATABMAHgAeAB4ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0AUABQAFAAUAAEAAQAKwArAAQADQANAB4AUAArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXABcAA0ADQANACoASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUAArACsAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANACsADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEcARwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwAeAAQABAANAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAEAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUAArACsAUAArACsAUABQACsAKwBQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAeAB4ADQANAA0ADQAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAArAAQABAArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAEAAQABAAEAAQABAAEACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAFgAWAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAKwBQACsAKwArACsAKwArAFAAKwArACsAKwBQACsAUAArAFAAKwBQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQACsAUAArAFAAKwBQACsAUABQACsAUAArACsAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAUABQAFAAUAArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUAArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAlACUAJQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeACUAJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeACUAJQAlACUAJQAeACUAJQAlACUAJQAgACAAIAAlACUAIAAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIQAhACEAIQAhACUAJQAgACAAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAIAAlACUAJQAlACAAJQAgACAAIAAgACAAIAAgACAAIAAlACUAJQAgACUAJQAlACUAIAAgACAAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeACUAHgAlAB4AJQAlACUAJQAlACAAJQAlACUAJQAeACUAHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAIAAgACAAIAAgAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFwAXABcAFQAVABUAHgAeAB4AHgAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAlACAAIAAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsA';\r\n\r\n    /* @flow */\r\n    var LETTER_NUMBER_MODIFIER = 50;\r\n    // Non-tailorable Line Breaking Classes\r\n    var BK = 1; //  Cause a line break (after)\r\n    var CR = 2; //  Cause a line break (after), except between CR and LF\r\n    var LF = 3; //  Cause a line break (after)\r\n    var CM = 4; //  Prohibit a line break between the character and the preceding character\r\n    var NL = 5; //  Cause a line break (after)\r\n    var WJ = 7; //  Prohibit line breaks before and after\r\n    var ZW = 8; //  Provide a break opportunity\r\n    var GL = 9; //  Prohibit line breaks before and after\r\n    var SP = 10; // Enable indirect line breaks\r\n    var ZWJ = 11; // Prohibit line breaks within joiner sequences\r\n    // Break Opportunities\r\n    var B2 = 12; //  Provide a line break opportunity before and after the character\r\n    var BA = 13; //  Generally provide a line break opportunity after the character\r\n    var BB = 14; //  Generally provide a line break opportunity before the character\r\n    var HY = 15; //  Provide a line break opportunity after the character, except in numeric context\r\n    var CB = 16; //   Provide a line break opportunity contingent on additional information\r\n    // Characters Prohibiting Certain Breaks\r\n    var CL = 17; //  Prohibit line breaks before\r\n    var CP = 18; //  Prohibit line breaks before\r\n    var EX = 19; //  Prohibit line breaks before\r\n    var IN = 20; //  Allow only indirect line breaks between pairs\r\n    var NS = 21; //  Allow only indirect line breaks before\r\n    var OP = 22; //  Prohibit line breaks after\r\n    var QU = 23; //  Act like they are both opening and closing\r\n    // Numeric Context\r\n    var IS = 24; //  Prevent breaks after any and before numeric\r\n    var NU = 25; //  Form numeric expressions for line breaking purposes\r\n    var PO = 26; //  Do not break following a numeric expression\r\n    var PR = 27; //  Do not break in front of a numeric expression\r\n    var SY = 28; //  Prevent a break before; and allow a break after\r\n    // Other Characters\r\n    var AI = 29; //  Act like AL when the resolvedEAW is N; otherwise; act as ID\r\n    var AL = 30; //  Are alphabetic characters or symbols that are used with alphabetic characters\r\n    var CJ = 31; //  Treat as NS or ID for strict or normal breaking.\r\n    var EB = 32; //  Do not break from following Emoji Modifier\r\n    var EM = 33; //  Do not break from preceding Emoji Base\r\n    var H2 = 34; //  Form Korean syllable blocks\r\n    var H3 = 35; //  Form Korean syllable blocks\r\n    var HL = 36; //  Do not break around a following hyphen; otherwise act as Alphabetic\r\n    var ID = 37; //  Break before or after; except in some numeric context\r\n    var JL = 38; //  Form Korean syllable blocks\r\n    var JV = 39; //  Form Korean syllable blocks\r\n    var JT = 40; //  Form Korean syllable blocks\r\n    var RI = 41; //  Keep pairs together. For pairs; break before and after other classes\r\n    var SA = 42; //  Provide a line break opportunity contingent on additional, language-specific context analysis\r\n    var XX = 43; //  Have as yet unknown line breaking behavior or unassigned code positions\r\n    var BREAK_MANDATORY = '!';\r\n    var BREAK_NOT_ALLOWED = '×';\r\n    var BREAK_ALLOWED = '÷';\r\n    var UnicodeTrie = createTrieFromBase64(base64);\r\n    var ALPHABETICS = [AL, HL];\r\n    var HARD_LINE_BREAKS = [BK, CR, LF, NL];\r\n    var SPACE = [SP, ZW];\r\n    var PREFIX_POSTFIX = [PR, PO];\r\n    var LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE);\r\n    var KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3];\r\n    var HYPHEN = [HY, BA];\r\n    var codePointsToCharacterClasses = function (codePoints, lineBreak) {\r\n        if (lineBreak === void 0) { lineBreak = 'strict'; }\r\n        var types = [];\r\n        var indicies = [];\r\n        var categories = [];\r\n        codePoints.forEach(function (codePoint, index) {\r\n            var classType = UnicodeTrie.get(codePoint);\r\n            if (classType > LETTER_NUMBER_MODIFIER) {\r\n                categories.push(true);\r\n                classType -= LETTER_NUMBER_MODIFIER;\r\n            }\r\n            else {\r\n                categories.push(false);\r\n            }\r\n            if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) {\r\n                // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0\r\n                if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) {\r\n                    indicies.push(index);\r\n                    return types.push(CB);\r\n                }\r\n            }\r\n            if (classType === CM || classType === ZWJ) {\r\n                // LB10 Treat any remaining combining mark or ZWJ as AL.\r\n                if (index === 0) {\r\n                    indicies.push(index);\r\n                    return types.push(AL);\r\n                }\r\n                // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of\r\n                // the base character in all of the following rules. Treat ZWJ as if it were CM.\r\n                var prev = types[index - 1];\r\n                if (LINE_BREAKS.indexOf(prev) === -1) {\r\n                    indicies.push(indicies[index - 1]);\r\n                    return types.push(prev);\r\n                }\r\n                indicies.push(index);\r\n                return types.push(AL);\r\n            }\r\n            indicies.push(index);\r\n            if (classType === CJ) {\r\n                return types.push(lineBreak === 'strict' ? NS : ID);\r\n            }\r\n            if (classType === SA) {\r\n                return types.push(AL);\r\n            }\r\n            if (classType === AI) {\r\n                return types.push(AL);\r\n            }\r\n            // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL\r\n            // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised\r\n            // to take into account the actual line breaking properties for these characters.\r\n            if (classType === XX) {\r\n                if ((codePoint >= 0x20000 && codePoint <= 0x2fffd) || (codePoint >= 0x30000 && codePoint <= 0x3fffd)) {\r\n                    return types.push(ID);\r\n                }\r\n                else {\r\n                    return types.push(AL);\r\n                }\r\n            }\r\n            types.push(classType);\r\n        });\r\n        return [indicies, types, categories];\r\n    };\r\n    var isAdjacentWithSpaceIgnored = function (a, b, currentIndex, classTypes) {\r\n        var current = classTypes[currentIndex];\r\n        if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) {\r\n            var i = currentIndex;\r\n            while (i <= classTypes.length) {\r\n                i++;\r\n                var next = classTypes[i];\r\n                if (next === b) {\r\n                    return true;\r\n                }\r\n                if (next !== SP) {\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        if (current === SP) {\r\n            var i = currentIndex;\r\n            while (i > 0) {\r\n                i--;\r\n                var prev = classTypes[i];\r\n                if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) {\r\n                    var n = currentIndex;\r\n                    while (n <= classTypes.length) {\r\n                        n++;\r\n                        var next = classTypes[n];\r\n                        if (next === b) {\r\n                            return true;\r\n                        }\r\n                        if (next !== SP) {\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                if (prev !== SP) {\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    };\r\n    var previousNonSpaceClassType = function (currentIndex, classTypes) {\r\n        var i = currentIndex;\r\n        while (i >= 0) {\r\n            var type = classTypes[i];\r\n            if (type === SP) {\r\n                i--;\r\n            }\r\n            else {\r\n                return type;\r\n            }\r\n        }\r\n        return 0;\r\n    };\r\n    var _lineBreakAtIndex = function (codePoints, classTypes, indicies, index, forbiddenBreaks) {\r\n        if (indicies[index] === 0) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        var currentIndex = index - 1;\r\n        if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        var beforeIndex = currentIndex - 1;\r\n        var afterIndex = currentIndex + 1;\r\n        var current = classTypes[currentIndex];\r\n        // LB4 Always break after hard line breaks.\r\n        // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks.\r\n        var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0;\r\n        var next = classTypes[afterIndex];\r\n        if (current === CR && next === LF) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        if (HARD_LINE_BREAKS.indexOf(current) !== -1) {\r\n            return BREAK_MANDATORY;\r\n        }\r\n        // LB6 Do not break before hard line breaks.\r\n        if (HARD_LINE_BREAKS.indexOf(next) !== -1) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB7 Do not break before spaces or zero width space.\r\n        if (SPACE.indexOf(next) !== -1) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB8 Break before any character following a zero-width space, even if one or more spaces intervene.\r\n        if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) {\r\n            return BREAK_ALLOWED;\r\n        }\r\n        // LB8a Do not break between a zero width joiner and an ideograph, emoji base or emoji modifier.\r\n        if (UnicodeTrie.get(codePoints[currentIndex]) === ZWJ && (next === ID || next === EB || next === EM)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB11 Do not break before or after Word joiner and related characters.\r\n        if (current === WJ || next === WJ) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB12 Do not break after NBSP and related characters.\r\n        if (current === GL) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB12a Do not break before NBSP and related characters, except after spaces and hyphens.\r\n        if ([SP, BA, HY].indexOf(current) === -1 && next === GL) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.\r\n        if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB14 Do not break after ‘[’, even after spaces.\r\n        if (previousNonSpaceClassType(currentIndex, classTypes) === OP) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB15 Do not break within ‘”[’, even with intervening spaces.\r\n        if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces.\r\n        if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB17 Do not break within ‘——’, even with intervening spaces.\r\n        if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB18 Break after spaces.\r\n        if (current === SP) {\r\n            return BREAK_ALLOWED;\r\n        }\r\n        // LB19 Do not break before or after quotation marks, such as ‘ ” ’.\r\n        if (current === QU || next === QU) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB20 Break before and after unresolved CB.\r\n        if (next === CB || current === CB) {\r\n            return BREAK_ALLOWED;\r\n        }\r\n        // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents.\r\n        if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB21a Don't break after Hebrew + Hyphen.\r\n        if (before === HL && HYPHEN.indexOf(current) !== -1) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB21b Don’t break between Solidus and Hebrew letters.\r\n        if (current === SY && next === HL) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB22 Do not break between two ellipses, or between letters, numbers or exclamations and ellipsis.\r\n        if (next === IN && ALPHABETICS.concat(IN, EX, NU, ID, EB, EM).indexOf(current) !== -1) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB23 Do not break between digits and letters.\r\n        if ((ALPHABETICS.indexOf(next) !== -1 && current === NU) || (ALPHABETICS.indexOf(current) !== -1 && next === NU)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes.\r\n        if ((current === PR && [ID, EB, EM].indexOf(next) !== -1) ||\r\n            ([ID, EB, EM].indexOf(current) !== -1 && next === PO)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix.\r\n        if ((ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1) ||\r\n            (PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB25 Do not break between the following pairs of classes relevant to numbers:\r\n        if (\r\n            // (PR | PO) × ( OP | HY )? NU\r\n            ([PR, PO].indexOf(current) !== -1 &&\r\n                (next === NU || ([OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU))) ||\r\n            // ( OP | HY ) × NU\r\n            ([OP, HY].indexOf(current) !== -1 && next === NU) ||\r\n            // NU ×\t(NU | SY | IS)\r\n            (current === NU && [NU, SY, IS].indexOf(next) !== -1)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP)\r\n        if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) {\r\n            var prevIndex = currentIndex;\r\n            while (prevIndex >= 0) {\r\n                var type = classTypes[prevIndex];\r\n                if (type === NU) {\r\n                    return BREAK_NOT_ALLOWED;\r\n                }\r\n                else if ([SY, IS].indexOf(type) !== -1) {\r\n                    prevIndex--;\r\n                }\r\n                else {\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        // NU (NU | SY | IS)* (CL | CP)? × (PO | PR))\r\n        if ([PR, PO].indexOf(next) !== -1) {\r\n            var prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex;\r\n            while (prevIndex >= 0) {\r\n                var type = classTypes[prevIndex];\r\n                if (type === NU) {\r\n                    return BREAK_NOT_ALLOWED;\r\n                }\r\n                else if ([SY, IS].indexOf(type) !== -1) {\r\n                    prevIndex--;\r\n                }\r\n                else {\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        // LB26 Do not break a Korean syllable.\r\n        if ((JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) ||\r\n            ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) ||\r\n            ([JT, H3].indexOf(current) !== -1 && next === JT)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB27 Treat a Korean Syllable Block the same as ID.\r\n        if ((KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1) ||\r\n            (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB28 Do not break between alphabetics (“at”).\r\n        if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).\r\n        if (current === IS && ALPHABETICS.indexOf(next) !== -1) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses.\r\n        if ((ALPHABETICS.concat(NU).indexOf(current) !== -1 && next === OP) ||\r\n            (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP)) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        // LB30a Break between two regional indicator symbols if and only if there are an even number of regional\r\n        // indicators preceding the position of the break.\r\n        if (current === RI && next === RI) {\r\n            var i = indicies[currentIndex];\r\n            var count = 1;\r\n            while (i > 0) {\r\n                i--;\r\n                if (classTypes[i] === RI) {\r\n                    count++;\r\n                }\r\n                else {\r\n                    break;\r\n                }\r\n            }\r\n            if (count % 2 !== 0) {\r\n                return BREAK_NOT_ALLOWED;\r\n            }\r\n        }\r\n        // LB30b Do not break between an emoji base and an emoji modifier.\r\n        if (current === EB && next === EM) {\r\n            return BREAK_NOT_ALLOWED;\r\n        }\r\n        return BREAK_ALLOWED;\r\n    };\r\n    var cssFormattedClasses = function (codePoints, options) {\r\n        if (!options) {\r\n            options = { lineBreak: 'normal', wordBreak: 'normal' };\r\n        }\r\n        var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), indicies = _a[0], classTypes = _a[1], isLetterNumber = _a[2];\r\n        if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') {\r\n            classTypes = classTypes.map(function (type) { return ([NU, AL, SA].indexOf(type) !== -1 ? ID : type); });\r\n        }\r\n        var forbiddenBreakpoints = options.wordBreak === 'keep-all'\r\n            ? isLetterNumber.map(function (letterNumber, i) {\r\n                return letterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff;\r\n            })\r\n            : undefined;\r\n        return [indicies, classTypes, forbiddenBreakpoints];\r\n    };\r\n    var Break = /** @class */ (function () {\r\n        function Break(codePoints, lineBreak, start, end) {\r\n            this.codePoints = codePoints;\r\n            this.required = lineBreak === BREAK_MANDATORY;\r\n            this.start = start;\r\n            this.end = end;\r\n        }\r\n        Break.prototype.slice = function () {\r\n            return fromCodePoint.apply(void 0, this.codePoints.slice(this.start, this.end));\r\n        };\r\n        return Break;\r\n    }());\r\n    var LineBreaker = function (str, options) {\r\n        var codePoints = toCodePoints(str);\r\n        var _a = cssFormattedClasses(codePoints, options), indicies = _a[0], classTypes = _a[1], forbiddenBreakpoints = _a[2];\r\n        var length = codePoints.length;\r\n        var lastEnd = 0;\r\n        var nextIndex = 0;\r\n        return {\r\n            next: function () {\r\n                if (nextIndex >= length) {\r\n                    return { done: true, value: null };\r\n                }\r\n                var lineBreak = BREAK_NOT_ALLOWED;\r\n                while (nextIndex < length &&\r\n                    (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) ===\r\n                    BREAK_NOT_ALLOWED) { }\r\n                if (lineBreak !== BREAK_NOT_ALLOWED || nextIndex === length) {\r\n                    var value = new Break(codePoints, lineBreak, lastEnd, nextIndex);\r\n                    lastEnd = nextIndex;\r\n                    return { value: value, done: false };\r\n                }\r\n                return { done: true, value: null };\r\n            },\r\n        };\r\n    };\r\n\r\n    // https://www.w3.org/TR/css-syntax-3\r\n    var TokenType;\r\n    (function (TokenType) {\r\n        TokenType[TokenType[\"STRING_TOKEN\"] = 0] = \"STRING_TOKEN\";\r\n        TokenType[TokenType[\"BAD_STRING_TOKEN\"] = 1] = \"BAD_STRING_TOKEN\";\r\n        TokenType[TokenType[\"LEFT_PARENTHESIS_TOKEN\"] = 2] = \"LEFT_PARENTHESIS_TOKEN\";\r\n        TokenType[TokenType[\"RIGHT_PARENTHESIS_TOKEN\"] = 3] = \"RIGHT_PARENTHESIS_TOKEN\";\r\n        TokenType[TokenType[\"COMMA_TOKEN\"] = 4] = \"COMMA_TOKEN\";\r\n        TokenType[TokenType[\"HASH_TOKEN\"] = 5] = \"HASH_TOKEN\";\r\n        TokenType[TokenType[\"DELIM_TOKEN\"] = 6] = \"DELIM_TOKEN\";\r\n        TokenType[TokenType[\"AT_KEYWORD_TOKEN\"] = 7] = \"AT_KEYWORD_TOKEN\";\r\n        TokenType[TokenType[\"PREFIX_MATCH_TOKEN\"] = 8] = \"PREFIX_MATCH_TOKEN\";\r\n        TokenType[TokenType[\"DASH_MATCH_TOKEN\"] = 9] = \"DASH_MATCH_TOKEN\";\r\n        TokenType[TokenType[\"INCLUDE_MATCH_TOKEN\"] = 10] = \"INCLUDE_MATCH_TOKEN\";\r\n        TokenType[TokenType[\"LEFT_CURLY_BRACKET_TOKEN\"] = 11] = \"LEFT_CURLY_BRACKET_TOKEN\";\r\n        TokenType[TokenType[\"RIGHT_CURLY_BRACKET_TOKEN\"] = 12] = \"RIGHT_CURLY_BRACKET_TOKEN\";\r\n        TokenType[TokenType[\"SUFFIX_MATCH_TOKEN\"] = 13] = \"SUFFIX_MATCH_TOKEN\";\r\n        TokenType[TokenType[\"SUBSTRING_MATCH_TOKEN\"] = 14] = \"SUBSTRING_MATCH_TOKEN\";\r\n        TokenType[TokenType[\"DIMENSION_TOKEN\"] = 15] = \"DIMENSION_TOKEN\";\r\n        TokenType[TokenType[\"PERCENTAGE_TOKEN\"] = 16] = \"PERCENTAGE_TOKEN\";\r\n        TokenType[TokenType[\"NUMBER_TOKEN\"] = 17] = \"NUMBER_TOKEN\";\r\n        TokenType[TokenType[\"FUNCTION\"] = 18] = \"FUNCTION\";\r\n        TokenType[TokenType[\"FUNCTION_TOKEN\"] = 19] = \"FUNCTION_TOKEN\";\r\n        TokenType[TokenType[\"IDENT_TOKEN\"] = 20] = \"IDENT_TOKEN\";\r\n        TokenType[TokenType[\"COLUMN_TOKEN\"] = 21] = \"COLUMN_TOKEN\";\r\n        TokenType[TokenType[\"URL_TOKEN\"] = 22] = \"URL_TOKEN\";\r\n        TokenType[TokenType[\"BAD_URL_TOKEN\"] = 23] = \"BAD_URL_TOKEN\";\r\n        TokenType[TokenType[\"CDC_TOKEN\"] = 24] = \"CDC_TOKEN\";\r\n        TokenType[TokenType[\"CDO_TOKEN\"] = 25] = \"CDO_TOKEN\";\r\n        TokenType[TokenType[\"COLON_TOKEN\"] = 26] = \"COLON_TOKEN\";\r\n        TokenType[TokenType[\"SEMICOLON_TOKEN\"] = 27] = \"SEMICOLON_TOKEN\";\r\n        TokenType[TokenType[\"LEFT_SQUARE_BRACKET_TOKEN\"] = 28] = \"LEFT_SQUARE_BRACKET_TOKEN\";\r\n        TokenType[TokenType[\"RIGHT_SQUARE_BRACKET_TOKEN\"] = 29] = \"RIGHT_SQUARE_BRACKET_TOKEN\";\r\n        TokenType[TokenType[\"UNICODE_RANGE_TOKEN\"] = 30] = \"UNICODE_RANGE_TOKEN\";\r\n        TokenType[TokenType[\"WHITESPACE_TOKEN\"] = 31] = \"WHITESPACE_TOKEN\";\r\n        TokenType[TokenType[\"EOF_TOKEN\"] = 32] = \"EOF_TOKEN\";\r\n    })(TokenType || (TokenType = {}));\r\n    var FLAG_UNRESTRICTED = 1 << 0;\r\n    var FLAG_ID = 1 << 1;\r\n    var FLAG_INTEGER = 1 << 2;\r\n    var FLAG_NUMBER = 1 << 3;\r\n    var LINE_FEED = 0x000a;\r\n    var SOLIDUS = 0x002f;\r\n    var REVERSE_SOLIDUS = 0x005c;\r\n    var CHARACTER_TABULATION = 0x0009;\r\n    var SPACE$1 = 0x0020;\r\n    var QUOTATION_MARK = 0x0022;\r\n    var EQUALS_SIGN = 0x003d;\r\n    var NUMBER_SIGN = 0x0023;\r\n    var DOLLAR_SIGN = 0x0024;\r\n    var PERCENTAGE_SIGN = 0x0025;\r\n    var APOSTROPHE = 0x0027;\r\n    var LEFT_PARENTHESIS = 0x0028;\r\n    var RIGHT_PARENTHESIS = 0x0029;\r\n    var LOW_LINE = 0x005f;\r\n    var HYPHEN_MINUS = 0x002d;\r\n    var EXCLAMATION_MARK = 0x0021;\r\n    var LESS_THAN_SIGN = 0x003c;\r\n    var GREATER_THAN_SIGN = 0x003e;\r\n    var COMMERCIAL_AT = 0x0040;\r\n    var LEFT_SQUARE_BRACKET = 0x005b;\r\n    var RIGHT_SQUARE_BRACKET = 0x005d;\r\n    var CIRCUMFLEX_ACCENT = 0x003d;\r\n    var LEFT_CURLY_BRACKET = 0x007b;\r\n    var QUESTION_MARK = 0x003f;\r\n    var RIGHT_CURLY_BRACKET = 0x007d;\r\n    var VERTICAL_LINE = 0x007c;\r\n    var TILDE = 0x007e;\r\n    var CONTROL = 0x0080;\r\n    var REPLACEMENT_CHARACTER = 0xfffd;\r\n    var ASTERISK = 0x002a;\r\n    var PLUS_SIGN = 0x002b;\r\n    var COMMA = 0x002c;\r\n    var COLON = 0x003a;\r\n    var SEMICOLON = 0x003b;\r\n    var FULL_STOP = 0x002e;\r\n    var NULL = 0x0000;\r\n    var BACKSPACE = 0x0008;\r\n    var LINE_TABULATION = 0x000b;\r\n    var SHIFT_OUT = 0x000e;\r\n    var INFORMATION_SEPARATOR_ONE = 0x001f;\r\n    var DELETE = 0x007f;\r\n    var EOF = -1;\r\n    var ZERO = 0x0030;\r\n    var a = 0x0061;\r\n    var e = 0x0065;\r\n    var f = 0x0066;\r\n    var u = 0x0075;\r\n    var z = 0x007a;\r\n    var A = 0x0041;\r\n    var E = 0x0045;\r\n    var F = 0x0046;\r\n    var U = 0x0055;\r\n    var Z = 0x005a;\r\n    var isDigit = function (codePoint) { return codePoint >= ZERO && codePoint <= 0x0039; };\r\n    var isSurrogateCodePoint = function (codePoint) { return codePoint >= 0xd800 && codePoint <= 0xdfff; };\r\n    var isHex = function (codePoint) {\r\n        return isDigit(codePoint) || (codePoint >= A && codePoint <= F) || (codePoint >= a && codePoint <= f);\r\n    };\r\n    var isLowerCaseLetter = function (codePoint) { return codePoint >= a && codePoint <= z; };\r\n    var isUpperCaseLetter = function (codePoint) { return codePoint >= A && codePoint <= Z; };\r\n    var isLetter = function (codePoint) { return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint); };\r\n    var isNonASCIICodePoint = function (codePoint) { return codePoint >= CONTROL; };\r\n    var isWhiteSpace = function (codePoint) {\r\n        return codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE$1;\r\n    };\r\n    var isNameStartCodePoint = function (codePoint) {\r\n        return isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE;\r\n    };\r\n    var isNameCodePoint = function (codePoint) {\r\n        return isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS;\r\n    };\r\n    var isNonPrintableCodePoint = function (codePoint) {\r\n        return ((codePoint >= NULL && codePoint <= BACKSPACE) ||\r\n            codePoint === LINE_TABULATION ||\r\n            (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) ||\r\n            codePoint === DELETE);\r\n    };\r\n    var isValidEscape = function (c1, c2) {\r\n        if (c1 !== REVERSE_SOLIDUS) {\r\n            return false;\r\n        }\r\n        return c2 !== LINE_FEED;\r\n    };\r\n    var isIdentifierStart = function (c1, c2, c3) {\r\n        if (c1 === HYPHEN_MINUS) {\r\n            return isNameStartCodePoint(c2) || isValidEscape(c2, c3);\r\n        }\r\n        else if (isNameStartCodePoint(c1)) {\r\n            return true;\r\n        }\r\n        else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) {\r\n            return true;\r\n        }\r\n        return false;\r\n    };\r\n    var isNumberStart = function (c1, c2, c3) {\r\n        if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {\r\n            if (isDigit(c2)) {\r\n                return true;\r\n            }\r\n            return c2 === FULL_STOP && isDigit(c3);\r\n        }\r\n        if (c1 === FULL_STOP) {\r\n            return isDigit(c2);\r\n        }\r\n        return isDigit(c1);\r\n    };\r\n    var stringToNumber = function (codePoints) {\r\n        var c = 0;\r\n        var sign = 1;\r\n        if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {\r\n            if (codePoints[c] === HYPHEN_MINUS) {\r\n                sign = -1;\r\n            }\r\n            c++;\r\n        }\r\n        var integers = [];\r\n        while (isDigit(codePoints[c])) {\r\n            integers.push(codePoints[c++]);\r\n        }\r\n        var int = integers.length ? parseInt(fromCodePoint.apply(void 0, integers), 10) : 0;\r\n        if (codePoints[c] === FULL_STOP) {\r\n            c++;\r\n        }\r\n        var fraction = [];\r\n        while (isDigit(codePoints[c])) {\r\n            fraction.push(codePoints[c++]);\r\n        }\r\n        var fracd = fraction.length;\r\n        var frac = fracd ? parseInt(fromCodePoint.apply(void 0, fraction), 10) : 0;\r\n        if (codePoints[c] === E || codePoints[c] === e) {\r\n            c++;\r\n        }\r\n        var expsign = 1;\r\n        if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {\r\n            if (codePoints[c] === HYPHEN_MINUS) {\r\n                expsign = -1;\r\n            }\r\n            c++;\r\n        }\r\n        var exponent = [];\r\n        while (isDigit(codePoints[c])) {\r\n            exponent.push(codePoints[c++]);\r\n        }\r\n        var exp = exponent.length ? parseInt(fromCodePoint.apply(void 0, exponent), 10) : 0;\r\n        return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp);\r\n    };\r\n    var LEFT_PARENTHESIS_TOKEN = {\r\n        type: TokenType.LEFT_PARENTHESIS_TOKEN\r\n    };\r\n    var RIGHT_PARENTHESIS_TOKEN = {\r\n        type: TokenType.RIGHT_PARENTHESIS_TOKEN\r\n    };\r\n    var COMMA_TOKEN = { type: TokenType.COMMA_TOKEN };\r\n    var SUFFIX_MATCH_TOKEN = { type: TokenType.SUFFIX_MATCH_TOKEN };\r\n    var PREFIX_MATCH_TOKEN = { type: TokenType.PREFIX_MATCH_TOKEN };\r\n    var COLUMN_TOKEN = { type: TokenType.COLUMN_TOKEN };\r\n    var DASH_MATCH_TOKEN = { type: TokenType.DASH_MATCH_TOKEN };\r\n    var INCLUDE_MATCH_TOKEN = { type: TokenType.INCLUDE_MATCH_TOKEN };\r\n    var LEFT_CURLY_BRACKET_TOKEN = {\r\n        type: TokenType.LEFT_CURLY_BRACKET_TOKEN\r\n    };\r\n    var RIGHT_CURLY_BRACKET_TOKEN = {\r\n        type: TokenType.RIGHT_CURLY_BRACKET_TOKEN\r\n    };\r\n    var SUBSTRING_MATCH_TOKEN = { type: TokenType.SUBSTRING_MATCH_TOKEN };\r\n    var BAD_URL_TOKEN = { type: TokenType.BAD_URL_TOKEN };\r\n    var BAD_STRING_TOKEN = { type: TokenType.BAD_STRING_TOKEN };\r\n    var CDO_TOKEN = { type: TokenType.CDO_TOKEN };\r\n    var CDC_TOKEN = { type: TokenType.CDC_TOKEN };\r\n    var COLON_TOKEN = { type: TokenType.COLON_TOKEN };\r\n    var SEMICOLON_TOKEN = { type: TokenType.SEMICOLON_TOKEN };\r\n    var LEFT_SQUARE_BRACKET_TOKEN = {\r\n        type: TokenType.LEFT_SQUARE_BRACKET_TOKEN\r\n    };\r\n    var RIGHT_SQUARE_BRACKET_TOKEN = {\r\n        type: TokenType.RIGHT_SQUARE_BRACKET_TOKEN\r\n    };\r\n    var WHITESPACE_TOKEN = { type: TokenType.WHITESPACE_TOKEN };\r\n    var EOF_TOKEN = { type: TokenType.EOF_TOKEN };\r\n    var Tokenizer = /** @class */ (function () {\r\n        function Tokenizer() {\r\n            this._value = [];\r\n        }\r\n        Tokenizer.prototype.write = function (chunk) {\r\n            this._value = this._value.concat(toCodePoints(chunk));\r\n        };\r\n        Tokenizer.prototype.read = function () {\r\n            var tokens = [];\r\n            var token = this.consumeToken();\r\n            while (token !== EOF_TOKEN) {\r\n                tokens.push(token);\r\n                token = this.consumeToken();\r\n            }\r\n            return tokens;\r\n        };\r\n        Tokenizer.prototype.consumeToken = function () {\r\n            var codePoint = this.consumeCodePoint();\r\n            switch (codePoint) {\r\n                case QUOTATION_MARK:\r\n                    return this.consumeStringToken(QUOTATION_MARK);\r\n                case NUMBER_SIGN:\r\n                    var c1 = this.peekCodePoint(0);\r\n                    var c2 = this.peekCodePoint(1);\r\n                    var c3 = this.peekCodePoint(2);\r\n                    if (isNameCodePoint(c1) || isValidEscape(c2, c3)) {\r\n                        var flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED;\r\n                        var value = this.consumeName();\r\n                        return { type: TokenType.HASH_TOKEN, value: value, flags: flags };\r\n                    }\r\n                    break;\r\n                case DOLLAR_SIGN:\r\n                    if (this.peekCodePoint(0) === EQUALS_SIGN) {\r\n                        this.consumeCodePoint();\r\n                        return SUFFIX_MATCH_TOKEN;\r\n                    }\r\n                    break;\r\n                case APOSTROPHE:\r\n                    return this.consumeStringToken(APOSTROPHE);\r\n                case LEFT_PARENTHESIS:\r\n                    return LEFT_PARENTHESIS_TOKEN;\r\n                case RIGHT_PARENTHESIS:\r\n                    return RIGHT_PARENTHESIS_TOKEN;\r\n                case ASTERISK:\r\n                    if (this.peekCodePoint(0) === EQUALS_SIGN) {\r\n                        this.consumeCodePoint();\r\n                        return SUBSTRING_MATCH_TOKEN;\r\n                    }\r\n                    break;\r\n                case PLUS_SIGN:\r\n                    if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {\r\n                        this.reconsumeCodePoint(codePoint);\r\n                        return this.consumeNumericToken();\r\n                    }\r\n                    break;\r\n                case COMMA:\r\n                    return COMMA_TOKEN;\r\n                case HYPHEN_MINUS:\r\n                    var e1 = codePoint;\r\n                    var e2 = this.peekCodePoint(0);\r\n                    var e3 = this.peekCodePoint(1);\r\n                    if (isNumberStart(e1, e2, e3)) {\r\n                        this.reconsumeCodePoint(codePoint);\r\n                        return this.consumeNumericToken();\r\n                    }\r\n                    if (isIdentifierStart(e1, e2, e3)) {\r\n                        this.reconsumeCodePoint(codePoint);\r\n                        return this.consumeIdentLikeToken();\r\n                    }\r\n                    if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) {\r\n                        this.consumeCodePoint();\r\n                        this.consumeCodePoint();\r\n                        return CDC_TOKEN;\r\n                    }\r\n                    break;\r\n                case FULL_STOP:\r\n                    if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {\r\n                        this.reconsumeCodePoint(codePoint);\r\n                        return this.consumeNumericToken();\r\n                    }\r\n                    break;\r\n                case SOLIDUS:\r\n                    if (this.peekCodePoint(0) === ASTERISK) {\r\n                        this.consumeCodePoint();\r\n                        while (true) {\r\n                            var c = this.consumeCodePoint();\r\n                            if (c === ASTERISK) {\r\n                                c = this.consumeCodePoint();\r\n                                if (c === SOLIDUS) {\r\n                                    return this.consumeToken();\r\n                                }\r\n                            }\r\n                            if (c === EOF) {\r\n                                return this.consumeToken();\r\n                            }\r\n                        }\r\n                    }\r\n                    break;\r\n                case COLON:\r\n                    return COLON_TOKEN;\r\n                case SEMICOLON:\r\n                    return SEMICOLON_TOKEN;\r\n                case LESS_THAN_SIGN:\r\n                    if (this.peekCodePoint(0) === EXCLAMATION_MARK &&\r\n                        this.peekCodePoint(1) === HYPHEN_MINUS &&\r\n                        this.peekCodePoint(2) === HYPHEN_MINUS) {\r\n                        this.consumeCodePoint();\r\n                        this.consumeCodePoint();\r\n                        return CDO_TOKEN;\r\n                    }\r\n                    break;\r\n                case COMMERCIAL_AT:\r\n                    var a1 = this.peekCodePoint(0);\r\n                    var a2 = this.peekCodePoint(1);\r\n                    var a3 = this.peekCodePoint(2);\r\n                    if (isIdentifierStart(a1, a2, a3)) {\r\n                        var value = this.consumeName();\r\n                        return { type: TokenType.AT_KEYWORD_TOKEN, value: value };\r\n                    }\r\n                    break;\r\n                case LEFT_SQUARE_BRACKET:\r\n                    return LEFT_SQUARE_BRACKET_TOKEN;\r\n                case REVERSE_SOLIDUS:\r\n                    if (isValidEscape(codePoint, this.peekCodePoint(0))) {\r\n                        this.reconsumeCodePoint(codePoint);\r\n                        return this.consumeIdentLikeToken();\r\n                    }\r\n                    break;\r\n                case RIGHT_SQUARE_BRACKET:\r\n                    return RIGHT_SQUARE_BRACKET_TOKEN;\r\n                case CIRCUMFLEX_ACCENT:\r\n                    if (this.peekCodePoint(0) === EQUALS_SIGN) {\r\n                        this.consumeCodePoint();\r\n                        return PREFIX_MATCH_TOKEN;\r\n                    }\r\n                    break;\r\n                case LEFT_CURLY_BRACKET:\r\n                    return LEFT_CURLY_BRACKET_TOKEN;\r\n                case RIGHT_CURLY_BRACKET:\r\n                    return RIGHT_CURLY_BRACKET_TOKEN;\r\n                case u:\r\n                case U:\r\n                    var u1 = this.peekCodePoint(0);\r\n                    var u2 = this.peekCodePoint(1);\r\n                    if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) {\r\n                        this.consumeCodePoint();\r\n                        this.consumeUnicodeRangeToken();\r\n                    }\r\n                    this.reconsumeCodePoint(codePoint);\r\n                    return this.consumeIdentLikeToken();\r\n                case VERTICAL_LINE:\r\n                    if (this.peekCodePoint(0) === EQUALS_SIGN) {\r\n                        this.consumeCodePoint();\r\n                        return DASH_MATCH_TOKEN;\r\n                    }\r\n                    if (this.peekCodePoint(0) === VERTICAL_LINE) {\r\n                        this.consumeCodePoint();\r\n                        return COLUMN_TOKEN;\r\n                    }\r\n                    break;\r\n                case TILDE:\r\n                    if (this.peekCodePoint(0) === EQUALS_SIGN) {\r\n                        this.consumeCodePoint();\r\n                        return INCLUDE_MATCH_TOKEN;\r\n                    }\r\n                    break;\r\n                case EOF:\r\n                    return EOF_TOKEN;\r\n            }\r\n            if (isWhiteSpace(codePoint)) {\r\n                this.consumeWhiteSpace();\r\n                return WHITESPACE_TOKEN;\r\n            }\r\n            if (isDigit(codePoint)) {\r\n                this.reconsumeCodePoint(codePoint);\r\n                return this.consumeNumericToken();\r\n            }\r\n            if (isNameStartCodePoint(codePoint)) {\r\n                this.reconsumeCodePoint(codePoint);\r\n                return this.consumeIdentLikeToken();\r\n            }\r\n            return { type: TokenType.DELIM_TOKEN, value: fromCodePoint(codePoint) };\r\n        };\r\n        Tokenizer.prototype.consumeCodePoint = function () {\r\n            var value = this._value.shift();\r\n            return typeof value === 'undefined' ? -1 : value;\r\n        };\r\n        Tokenizer.prototype.reconsumeCodePoint = function (codePoint) {\r\n            this._value.unshift(codePoint);\r\n        };\r\n        Tokenizer.prototype.peekCodePoint = function (delta) {\r\n            if (delta >= this._value.length) {\r\n                return -1;\r\n            }\r\n            return this._value[delta];\r\n        };\r\n        Tokenizer.prototype.consumeUnicodeRangeToken = function () {\r\n            var digits = [];\r\n            var codePoint = this.consumeCodePoint();\r\n            while (isHex(codePoint) && digits.length < 6) {\r\n                digits.push(codePoint);\r\n                codePoint = this.consumeCodePoint();\r\n            }\r\n            var questionMarks = false;\r\n            while (codePoint === QUESTION_MARK && digits.length < 6) {\r\n                digits.push(codePoint);\r\n                codePoint = this.consumeCodePoint();\r\n                questionMarks = true;\r\n            }\r\n            if (questionMarks) {\r\n                var start_1 = parseInt(fromCodePoint.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? ZERO : digit); })), 16);\r\n                var end = parseInt(fromCodePoint.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? F : digit); })), 16);\r\n                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start_1, end: end };\r\n            }\r\n            var start = parseInt(fromCodePoint.apply(void 0, digits), 16);\r\n            if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) {\r\n                this.consumeCodePoint();\r\n                codePoint = this.consumeCodePoint();\r\n                var endDigits = [];\r\n                while (isHex(codePoint) && endDigits.length < 6) {\r\n                    endDigits.push(codePoint);\r\n                    codePoint = this.consumeCodePoint();\r\n                }\r\n                var end = parseInt(fromCodePoint.apply(void 0, endDigits), 16);\r\n                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start, end: end };\r\n            }\r\n            else {\r\n                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start, end: start };\r\n            }\r\n        };\r\n        Tokenizer.prototype.consumeIdentLikeToken = function () {\r\n            var value = this.consumeName();\r\n            if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) {\r\n                this.consumeCodePoint();\r\n                return this.consumeUrlToken();\r\n            }\r\n            else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) {\r\n                this.consumeCodePoint();\r\n                return { type: TokenType.FUNCTION_TOKEN, value: value };\r\n            }\r\n            return { type: TokenType.IDENT_TOKEN, value: value };\r\n        };\r\n        Tokenizer.prototype.consumeUrlToken = function () {\r\n            var value = [];\r\n            this.consumeWhiteSpace();\r\n            if (this.peekCodePoint(0) === EOF) {\r\n                return { type: TokenType.URL_TOKEN, value: '' };\r\n            }\r\n            var next = this.peekCodePoint(0);\r\n            if (next === APOSTROPHE || next === QUOTATION_MARK) {\r\n                var stringToken = this.consumeStringToken(this.consumeCodePoint());\r\n                if (stringToken.type === TokenType.STRING_TOKEN) {\r\n                    this.consumeWhiteSpace();\r\n                    if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {\r\n                        this.consumeCodePoint();\r\n                        return { type: TokenType.URL_TOKEN, value: stringToken.value };\r\n                    }\r\n                }\r\n                this.consumeBadUrlRemnants();\r\n                return BAD_URL_TOKEN;\r\n            }\r\n            while (true) {\r\n                var codePoint = this.consumeCodePoint();\r\n                if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) {\r\n                    return { type: TokenType.URL_TOKEN, value: fromCodePoint.apply(void 0, value) };\r\n                }\r\n                else if (isWhiteSpace(codePoint)) {\r\n                    this.consumeWhiteSpace();\r\n                    if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {\r\n                        this.consumeCodePoint();\r\n                        return { type: TokenType.URL_TOKEN, value: fromCodePoint.apply(void 0, value) };\r\n                    }\r\n                    this.consumeBadUrlRemnants();\r\n                    return BAD_URL_TOKEN;\r\n                }\r\n                else if (codePoint === QUOTATION_MARK ||\r\n                    codePoint === APOSTROPHE ||\r\n                    codePoint === LEFT_PARENTHESIS ||\r\n                    isNonPrintableCodePoint(codePoint)) {\r\n                    this.consumeBadUrlRemnants();\r\n                    return BAD_URL_TOKEN;\r\n                }\r\n                else if (codePoint === REVERSE_SOLIDUS) {\r\n                    if (isValidEscape(codePoint, this.peekCodePoint(0))) {\r\n                        value.push(this.consumeEscapedCodePoint());\r\n                    }\r\n                    else {\r\n                        this.consumeBadUrlRemnants();\r\n                        return BAD_URL_TOKEN;\r\n                    }\r\n                }\r\n                else {\r\n                    value.push(codePoint);\r\n                }\r\n            }\r\n        };\r\n        Tokenizer.prototype.consumeWhiteSpace = function () {\r\n            while (isWhiteSpace(this.peekCodePoint(0))) {\r\n                this.consumeCodePoint();\r\n            }\r\n        };\r\n        Tokenizer.prototype.consumeBadUrlRemnants = function () {\r\n            while (true) {\r\n                var codePoint = this.consumeCodePoint();\r\n                if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) {\r\n                    return;\r\n                }\r\n                if (isValidEscape(codePoint, this.peekCodePoint(0))) {\r\n                    this.consumeEscapedCodePoint();\r\n                }\r\n            }\r\n        };\r\n        Tokenizer.prototype.consumeStringSlice = function (count) {\r\n            var SLICE_STACK_SIZE = 60000;\r\n            var value = '';\r\n            while (count > 0) {\r\n                var amount = Math.min(SLICE_STACK_SIZE, count);\r\n                value += fromCodePoint.apply(void 0, this._value.splice(0, amount));\r\n                count -= amount;\r\n            }\r\n            this._value.shift();\r\n            return value;\r\n        };\r\n        Tokenizer.prototype.consumeStringToken = function (endingCodePoint) {\r\n            var value = '';\r\n            var i = 0;\r\n            do {\r\n                var codePoint = this._value[i];\r\n                if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) {\r\n                    value += this.consumeStringSlice(i);\r\n                    return { type: TokenType.STRING_TOKEN, value: value };\r\n                }\r\n                if (codePoint === LINE_FEED) {\r\n                    this._value.splice(0, i);\r\n                    return BAD_STRING_TOKEN;\r\n                }\r\n                if (codePoint === REVERSE_SOLIDUS) {\r\n                    var next = this._value[i + 1];\r\n                    if (next !== EOF && next !== undefined) {\r\n                        if (next === LINE_FEED) {\r\n                            value += this.consumeStringSlice(i);\r\n                            i = -1;\r\n                            this._value.shift();\r\n                        }\r\n                        else if (isValidEscape(codePoint, next)) {\r\n                            value += this.consumeStringSlice(i);\r\n                            value += fromCodePoint(this.consumeEscapedCodePoint());\r\n                            i = -1;\r\n                        }\r\n                    }\r\n                }\r\n                i++;\r\n            } while (true);\r\n        };\r\n        Tokenizer.prototype.consumeNumber = function () {\r\n            var repr = [];\r\n            var type = FLAG_INTEGER;\r\n            var c1 = this.peekCodePoint(0);\r\n            if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {\r\n                repr.push(this.consumeCodePoint());\r\n            }\r\n            while (isDigit(this.peekCodePoint(0))) {\r\n                repr.push(this.consumeCodePoint());\r\n            }\r\n            c1 = this.peekCodePoint(0);\r\n            var c2 = this.peekCodePoint(1);\r\n            if (c1 === FULL_STOP && isDigit(c2)) {\r\n                repr.push(this.consumeCodePoint(), this.consumeCodePoint());\r\n                type = FLAG_NUMBER;\r\n                while (isDigit(this.peekCodePoint(0))) {\r\n                    repr.push(this.consumeCodePoint());\r\n                }\r\n            }\r\n            c1 = this.peekCodePoint(0);\r\n            c2 = this.peekCodePoint(1);\r\n            var c3 = this.peekCodePoint(2);\r\n            if ((c1 === E || c1 === e) && (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || isDigit(c2))) {\r\n                repr.push(this.consumeCodePoint(), this.consumeCodePoint());\r\n                type = FLAG_NUMBER;\r\n                while (isDigit(this.peekCodePoint(0))) {\r\n                    repr.push(this.consumeCodePoint());\r\n                }\r\n            }\r\n            return [stringToNumber(repr), type];\r\n        };\r\n        Tokenizer.prototype.consumeNumericToken = function () {\r\n            var _a = this.consumeNumber(), number = _a[0], flags = _a[1];\r\n            var c1 = this.peekCodePoint(0);\r\n            var c2 = this.peekCodePoint(1);\r\n            var c3 = this.peekCodePoint(2);\r\n            if (isIdentifierStart(c1, c2, c3)) {\r\n                var unit = this.consumeName();\r\n                return { type: TokenType.DIMENSION_TOKEN, number: number, flags: flags, unit: unit };\r\n            }\r\n            if (c1 === PERCENTAGE_SIGN) {\r\n                this.consumeCodePoint();\r\n                return { type: TokenType.PERCENTAGE_TOKEN, number: number, flags: flags };\r\n            }\r\n            return { type: TokenType.NUMBER_TOKEN, number: number, flags: flags };\r\n        };\r\n        Tokenizer.prototype.consumeEscapedCodePoint = function () {\r\n            var codePoint = this.consumeCodePoint();\r\n            if (isHex(codePoint)) {\r\n                var hex = fromCodePoint(codePoint);\r\n                while (isHex(this.peekCodePoint(0)) && hex.length < 6) {\r\n                    hex += fromCodePoint(this.consumeCodePoint());\r\n                }\r\n                if (isWhiteSpace(this.peekCodePoint(0))) {\r\n                    this.consumeCodePoint();\r\n                }\r\n                var hexCodePoint = parseInt(hex, 16);\r\n                if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) {\r\n                    return REPLACEMENT_CHARACTER;\r\n                }\r\n                return hexCodePoint;\r\n            }\r\n            if (codePoint === EOF) {\r\n                return REPLACEMENT_CHARACTER;\r\n            }\r\n            return codePoint;\r\n        };\r\n        Tokenizer.prototype.consumeName = function () {\r\n            var result = '';\r\n            while (true) {\r\n                var codePoint = this.consumeCodePoint();\r\n                if (isNameCodePoint(codePoint)) {\r\n                    result += fromCodePoint(codePoint);\r\n                }\r\n                else if (isValidEscape(codePoint, this.peekCodePoint(0))) {\r\n                    result += fromCodePoint(this.consumeEscapedCodePoint());\r\n                }\r\n                else {\r\n                    this.reconsumeCodePoint(codePoint);\r\n                    return result;\r\n                }\r\n            }\r\n        };\r\n        return Tokenizer;\r\n    }());\r\n\r\n    var Parser = /** @class */ (function () {\r\n        function Parser(tokens) {\r\n            this._tokens = tokens;\r\n        }\r\n        Parser.create = function (value) {\r\n            var tokenizer = new Tokenizer();\r\n            tokenizer.write(value);\r\n            return new Parser(tokenizer.read());\r\n        };\r\n        Parser.parseValue = function (value) {\r\n            return Parser.create(value).parseComponentValue();\r\n        };\r\n        Parser.parseValues = function (value) {\r\n            return Parser.create(value).parseComponentValues();\r\n        };\r\n        Parser.prototype.parseComponentValue = function () {\r\n            var token = this.consumeToken();\r\n            while (token.type === TokenType.WHITESPACE_TOKEN) {\r\n                token = this.consumeToken();\r\n            }\r\n            if (token.type === TokenType.EOF_TOKEN) {\r\n                throw new SyntaxError(\"Error parsing CSS component value, unexpected EOF\");\r\n            }\r\n            this.reconsumeToken(token);\r\n            var value = this.consumeComponentValue();\r\n            do {\r\n                token = this.consumeToken();\r\n            } while (token.type === TokenType.WHITESPACE_TOKEN);\r\n            if (token.type === TokenType.EOF_TOKEN) {\r\n                return value;\r\n            }\r\n            throw new SyntaxError(\"Error parsing CSS component value, multiple values found when expecting only one\");\r\n        };\r\n        Parser.prototype.parseComponentValues = function () {\r\n            var values = [];\r\n            while (true) {\r\n                var value = this.consumeComponentValue();\r\n                if (value.type === TokenType.EOF_TOKEN) {\r\n                    return values;\r\n                }\r\n                values.push(value);\r\n                values.push();\r\n            }\r\n        };\r\n        Parser.prototype.consumeComponentValue = function () {\r\n            var token = this.consumeToken();\r\n            switch (token.type) {\r\n                case TokenType.LEFT_CURLY_BRACKET_TOKEN:\r\n                case TokenType.LEFT_SQUARE_BRACKET_TOKEN:\r\n                case TokenType.LEFT_PARENTHESIS_TOKEN:\r\n                    return this.consumeSimpleBlock(token.type);\r\n                case TokenType.FUNCTION_TOKEN:\r\n                    return this.consumeFunction(token);\r\n            }\r\n            return token;\r\n        };\r\n        Parser.prototype.consumeSimpleBlock = function (type) {\r\n            var block = { type: type, values: [] };\r\n            var token = this.consumeToken();\r\n            while (true) {\r\n                if (token.type === TokenType.EOF_TOKEN || isEndingTokenFor(token, type)) {\r\n                    return block;\r\n                }\r\n                this.reconsumeToken(token);\r\n                block.values.push(this.consumeComponentValue());\r\n                token = this.consumeToken();\r\n            }\r\n        };\r\n        Parser.prototype.consumeFunction = function (functionToken) {\r\n            var cssFunction = {\r\n                name: functionToken.value,\r\n                values: [],\r\n                type: TokenType.FUNCTION\r\n            };\r\n            while (true) {\r\n                var token = this.consumeToken();\r\n                if (token.type === TokenType.EOF_TOKEN || token.type === TokenType.RIGHT_PARENTHESIS_TOKEN) {\r\n                    return cssFunction;\r\n                }\r\n                this.reconsumeToken(token);\r\n                cssFunction.values.push(this.consumeComponentValue());\r\n            }\r\n        };\r\n        Parser.prototype.consumeToken = function () {\r\n            var token = this._tokens.shift();\r\n            return typeof token === 'undefined' ? EOF_TOKEN : token;\r\n        };\r\n        Parser.prototype.reconsumeToken = function (token) {\r\n            this._tokens.unshift(token);\r\n        };\r\n        return Parser;\r\n    }());\r\n    var isDimensionToken = function (token) { return token.type === TokenType.DIMENSION_TOKEN; };\r\n    var isNumberToken = function (token) { return token.type === TokenType.NUMBER_TOKEN; };\r\n    var isIdentToken = function (token) { return token.type === TokenType.IDENT_TOKEN; };\r\n    var isStringToken = function (token) { return token.type === TokenType.STRING_TOKEN; };\r\n    var isIdentWithValue = function (token, value) {\r\n        return isIdentToken(token) && token.value === value;\r\n    };\r\n    var nonWhiteSpace = function (token) { return token.type !== TokenType.WHITESPACE_TOKEN; };\r\n    var nonFunctionArgSeparator = function (token) {\r\n        return token.type !== TokenType.WHITESPACE_TOKEN && token.type !== TokenType.COMMA_TOKEN;\r\n    };\r\n    var parseFunctionArgs = function (tokens) {\r\n        var args = [];\r\n        var arg = [];\r\n        tokens.forEach(function (token) {\r\n            if (token.type === TokenType.COMMA_TOKEN) {\r\n                if (arg.length === 0) {\r\n                    throw new Error(\"Error parsing function args, zero tokens for arg\");\r\n                }\r\n                args.push(arg);\r\n                arg = [];\r\n                return;\r\n            }\r\n            if (token.type !== TokenType.WHITESPACE_TOKEN) {\r\n                arg.push(token);\r\n            }\r\n        });\r\n        if (arg.length) {\r\n            args.push(arg);\r\n        }\r\n        return args;\r\n    };\r\n    var isEndingTokenFor = function (token, type) {\r\n        if (type === TokenType.LEFT_CURLY_BRACKET_TOKEN && token.type === TokenType.RIGHT_CURLY_BRACKET_TOKEN) {\r\n            return true;\r\n        }\r\n        if (type === TokenType.LEFT_SQUARE_BRACKET_TOKEN && token.type === TokenType.RIGHT_SQUARE_BRACKET_TOKEN) {\r\n            return true;\r\n        }\r\n        return type === TokenType.LEFT_PARENTHESIS_TOKEN && token.type === TokenType.RIGHT_PARENTHESIS_TOKEN;\r\n    };\r\n\r\n    var isLength = function (token) {\r\n        return token.type === TokenType.NUMBER_TOKEN || token.type === TokenType.DIMENSION_TOKEN;\r\n    };\r\n\r\n    var isLengthPercentage = function (token) {\r\n        return token.type === TokenType.PERCENTAGE_TOKEN || isLength(token);\r\n    };\r\n    var parseLengthPercentageTuple = function (tokens) {\r\n        return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]];\r\n    };\r\n    var ZERO_LENGTH = {\r\n        type: TokenType.NUMBER_TOKEN,\r\n        number: 0,\r\n        flags: FLAG_INTEGER\r\n    };\r\n    var FIFTY_PERCENT = {\r\n        type: TokenType.PERCENTAGE_TOKEN,\r\n        number: 50,\r\n        flags: FLAG_INTEGER\r\n    };\r\n    var HUNDRED_PERCENT = {\r\n        type: TokenType.PERCENTAGE_TOKEN,\r\n        number: 100,\r\n        flags: FLAG_INTEGER\r\n    };\r\n    var getAbsoluteValueForTuple = function (tuple, width, height) {\r\n        var x = tuple[0], y = tuple[1];\r\n        return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== 'undefined' ? y : x, height)];\r\n    };\r\n    var getAbsoluteValue = function (token, parent) {\r\n        if (token.type === TokenType.PERCENTAGE_TOKEN) {\r\n            return (token.number / 100) * parent;\r\n        }\r\n        if (isDimensionToken(token)) {\r\n            switch (token.unit) {\r\n                case 'rem':\r\n                case 'em':\r\n                    return 16 * token.number; // TODO use correct font-size\r\n                case 'px':\r\n                default:\r\n                    return token.number;\r\n            }\r\n        }\r\n        return token.number;\r\n    };\r\n\r\n    var DEG = 'deg';\r\n    var GRAD = 'grad';\r\n    var RAD = 'rad';\r\n    var TURN = 'turn';\r\n    var angle = {\r\n        name: 'angle',\r\n        parse: function (value) {\r\n            if (value.type === TokenType.DIMENSION_TOKEN) {\r\n                switch (value.unit) {\r\n                    case DEG:\r\n                        return (Math.PI * value.number) / 180;\r\n                    case GRAD:\r\n                        return (Math.PI / 200) * value.number;\r\n                    case RAD:\r\n                        return value.number;\r\n                    case TURN:\r\n                        return Math.PI * 2 * value.number;\r\n                }\r\n            }\r\n            throw new Error(\"Unsupported angle type\");\r\n        }\r\n    };\r\n    var isAngle = function (value) {\r\n        if (value.type === TokenType.DIMENSION_TOKEN) {\r\n            if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) {\r\n                return true;\r\n            }\r\n        }\r\n        return false;\r\n    };\r\n    var parseNamedSide = function (tokens) {\r\n        var sideOrCorner = tokens\r\n            .filter(isIdentToken)\r\n            .map(function (ident) { return ident.value; })\r\n            .join(' ');\r\n        switch (sideOrCorner) {\r\n            case 'to bottom right':\r\n            case 'to right bottom':\r\n            case 'left top':\r\n            case 'top left':\r\n                return [ZERO_LENGTH, ZERO_LENGTH];\r\n            case 'to top':\r\n            case 'bottom':\r\n                return deg(0);\r\n            case 'to bottom left':\r\n            case 'to left bottom':\r\n            case 'right top':\r\n            case 'top right':\r\n                return [ZERO_LENGTH, HUNDRED_PERCENT];\r\n            case 'to right':\r\n            case 'left':\r\n                return deg(90);\r\n            case 'to top left':\r\n            case 'to left top':\r\n            case 'right bottom':\r\n            case 'bottom right':\r\n                return [HUNDRED_PERCENT, HUNDRED_PERCENT];\r\n            case 'to bottom':\r\n            case 'top':\r\n                return deg(180);\r\n            case 'to top right':\r\n            case 'to right top':\r\n            case 'left bottom':\r\n            case 'bottom left':\r\n                return [HUNDRED_PERCENT, ZERO_LENGTH];\r\n            case 'to left':\r\n            case 'right':\r\n                return deg(270);\r\n        }\r\n        return 0;\r\n    };\r\n    var deg = function (deg) { return (Math.PI * deg) / 180; };\r\n\r\n    var color = {\r\n        name: 'color',\r\n        parse: function (value) {\r\n            if (value.type === TokenType.FUNCTION) {\r\n                var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name];\r\n                if (typeof colorFunction === 'undefined') {\r\n                    throw new Error(\"Attempting to parse an unsupported color function \\\"\" + value.name + \"\\\"\");\r\n                }\r\n                return colorFunction(value.values);\r\n            }\r\n            if (value.type === TokenType.HASH_TOKEN) {\r\n                if (value.value.length === 3) {\r\n                    var r = value.value.substring(0, 1);\r\n                    var g = value.value.substring(1, 2);\r\n                    var b = value.value.substring(2, 3);\r\n                    return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1);\r\n                }\r\n                if (value.value.length === 4) {\r\n                    var r = value.value.substring(0, 1);\r\n                    var g = value.value.substring(1, 2);\r\n                    var b = value.value.substring(2, 3);\r\n                    var a = value.value.substring(3, 4);\r\n                    return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a + a, 16) / 255);\r\n                }\r\n                if (value.value.length === 6) {\r\n                    var r = value.value.substring(0, 2);\r\n                    var g = value.value.substring(2, 4);\r\n                    var b = value.value.substring(4, 6);\r\n                    return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1);\r\n                }\r\n                if (value.value.length === 8) {\r\n                    var r = value.value.substring(0, 2);\r\n                    var g = value.value.substring(2, 4);\r\n                    var b = value.value.substring(4, 6);\r\n                    var a = value.value.substring(6, 8);\r\n                    return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a, 16) / 255);\r\n                }\r\n            }\r\n            if (value.type === TokenType.IDENT_TOKEN) {\r\n                var namedColor = COLORS[value.value.toUpperCase()];\r\n                if (typeof namedColor !== 'undefined') {\r\n                    return namedColor;\r\n                }\r\n            }\r\n            return COLORS.TRANSPARENT;\r\n        }\r\n    };\r\n    var isTransparent = function (color) { return (0xff & color) === 0; };\r\n    var asString = function (color) {\r\n        var alpha = 0xff & color;\r\n        var blue = 0xff & (color >> 8);\r\n        var green = 0xff & (color >> 16);\r\n        var red = 0xff & (color >> 24);\r\n        return alpha < 255 ? \"rgba(\" + red + \",\" + green + \",\" + blue + \",\" + alpha / 255 + \")\" : \"rgb(\" + red + \",\" + green + \",\" + blue + \")\";\r\n    };\r\n    var pack = function (r, g, b, a) {\r\n        return ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0;\r\n    };\r\n    var getTokenColorValue = function (token, i) {\r\n        if (token.type === TokenType.NUMBER_TOKEN) {\r\n            return token.number;\r\n        }\r\n        if (token.type === TokenType.PERCENTAGE_TOKEN) {\r\n            var max = i === 3 ? 1 : 255;\r\n            return i === 3 ? (token.number / 100) * max : Math.round((token.number / 100) * max);\r\n        }\r\n        return 0;\r\n    };\r\n    var rgb = function (args) {\r\n        var tokens = args.filter(nonFunctionArgSeparator);\r\n        if (tokens.length === 3) {\r\n            var _a = tokens.map(getTokenColorValue), r = _a[0], g = _a[1], b = _a[2];\r\n            return pack(r, g, b, 1);\r\n        }\r\n        if (tokens.length === 4) {\r\n            var _b = tokens.map(getTokenColorValue), r = _b[0], g = _b[1], b = _b[2], a = _b[3];\r\n            return pack(r, g, b, a);\r\n        }\r\n        return 0;\r\n    };\r\n    function hue2rgb(t1, t2, hue) {\r\n        if (hue < 0) {\r\n            hue += 1;\r\n        }\r\n        if (hue >= 1) {\r\n            hue -= 1;\r\n        }\r\n        if (hue < 1 / 6) {\r\n            return (t2 - t1) * hue * 6 + t1;\r\n        }\r\n        else if (hue < 1 / 2) {\r\n            return t2;\r\n        }\r\n        else if (hue < 2 / 3) {\r\n            return (t2 - t1) * 6 * (2 / 3 - hue) + t1;\r\n        }\r\n        else {\r\n            return t1;\r\n        }\r\n    }\r\n    var hsl = function (args) {\r\n        var tokens = args.filter(nonFunctionArgSeparator);\r\n        var hue = tokens[0], saturation = tokens[1], lightness = tokens[2], alpha = tokens[3];\r\n        var h = (hue.type === TokenType.NUMBER_TOKEN ? deg(hue.number) : angle.parse(hue)) / (Math.PI * 2);\r\n        var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0;\r\n        var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0;\r\n        var a = typeof alpha !== 'undefined' && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1;\r\n        if (s === 0) {\r\n            return pack(l * 255, l * 255, l * 255, 1);\r\n        }\r\n        var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\r\n        var t1 = l * 2 - t2;\r\n        var r = hue2rgb(t1, t2, h + 1 / 3);\r\n        var g = hue2rgb(t1, t2, h);\r\n        var b = hue2rgb(t1, t2, h - 1 / 3);\r\n        return pack(r * 255, g * 255, b * 255, a);\r\n    };\r\n    var SUPPORTED_COLOR_FUNCTIONS = {\r\n        hsl: hsl,\r\n        hsla: hsl,\r\n        rgb: rgb,\r\n        rgba: rgb\r\n    };\r\n    var COLORS = {\r\n        ALICEBLUE: 0xf0f8ffff,\r\n        ANTIQUEWHITE: 0xfaebd7ff,\r\n        AQUA: 0x00ffffff,\r\n        AQUAMARINE: 0x7fffd4ff,\r\n        AZURE: 0xf0ffffff,\r\n        BEIGE: 0xf5f5dcff,\r\n        BISQUE: 0xffe4c4ff,\r\n        BLACK: 0x000000ff,\r\n        BLANCHEDALMOND: 0xffebcdff,\r\n        BLUE: 0x0000ffff,\r\n        BLUEVIOLET: 0x8a2be2ff,\r\n        BROWN: 0xa52a2aff,\r\n        BURLYWOOD: 0xdeb887ff,\r\n        CADETBLUE: 0x5f9ea0ff,\r\n        CHARTREUSE: 0x7fff00ff,\r\n        CHOCOLATE: 0xd2691eff,\r\n        CORAL: 0xff7f50ff,\r\n        CORNFLOWERBLUE: 0x6495edff,\r\n        CORNSILK: 0xfff8dcff,\r\n        CRIMSON: 0xdc143cff,\r\n        CYAN: 0x00ffffff,\r\n        DARKBLUE: 0x00008bff,\r\n        DARKCYAN: 0x008b8bff,\r\n        DARKGOLDENROD: 0xb886bbff,\r\n        DARKGRAY: 0xa9a9a9ff,\r\n        DARKGREEN: 0x006400ff,\r\n        DARKGREY: 0xa9a9a9ff,\r\n        DARKKHAKI: 0xbdb76bff,\r\n        DARKMAGENTA: 0x8b008bff,\r\n        DARKOLIVEGREEN: 0x556b2fff,\r\n        DARKORANGE: 0xff8c00ff,\r\n        DARKORCHID: 0x9932ccff,\r\n        DARKRED: 0x8b0000ff,\r\n        DARKSALMON: 0xe9967aff,\r\n        DARKSEAGREEN: 0x8fbc8fff,\r\n        DARKSLATEBLUE: 0x483d8bff,\r\n        DARKSLATEGRAY: 0x2f4f4fff,\r\n        DARKSLATEGREY: 0x2f4f4fff,\r\n        DARKTURQUOISE: 0x00ced1ff,\r\n        DARKVIOLET: 0x9400d3ff,\r\n        DEEPPINK: 0xff1493ff,\r\n        DEEPSKYBLUE: 0x00bfffff,\r\n        DIMGRAY: 0x696969ff,\r\n        DIMGREY: 0x696969ff,\r\n        DODGERBLUE: 0x1e90ffff,\r\n        FIREBRICK: 0xb22222ff,\r\n        FLORALWHITE: 0xfffaf0ff,\r\n        FORESTGREEN: 0x228b22ff,\r\n        FUCHSIA: 0xff00ffff,\r\n        GAINSBORO: 0xdcdcdcff,\r\n        GHOSTWHITE: 0xf8f8ffff,\r\n        GOLD: 0xffd700ff,\r\n        GOLDENROD: 0xdaa520ff,\r\n        GRAY: 0x808080ff,\r\n        GREEN: 0x008000ff,\r\n        GREENYELLOW: 0xadff2fff,\r\n        GREY: 0x808080ff,\r\n        HONEYDEW: 0xf0fff0ff,\r\n        HOTPINK: 0xff69b4ff,\r\n        INDIANRED: 0xcd5c5cff,\r\n        INDIGO: 0x4b0082ff,\r\n        IVORY: 0xfffff0ff,\r\n        KHAKI: 0xf0e68cff,\r\n        LAVENDER: 0xe6e6faff,\r\n        LAVENDERBLUSH: 0xfff0f5ff,\r\n        LAWNGREEN: 0x7cfc00ff,\r\n        LEMONCHIFFON: 0xfffacdff,\r\n        LIGHTBLUE: 0xadd8e6ff,\r\n        LIGHTCORAL: 0xf08080ff,\r\n        LIGHTCYAN: 0xe0ffffff,\r\n        LIGHTGOLDENRODYELLOW: 0xfafad2ff,\r\n        LIGHTGRAY: 0xd3d3d3ff,\r\n        LIGHTGREEN: 0x90ee90ff,\r\n        LIGHTGREY: 0xd3d3d3ff,\r\n        LIGHTPINK: 0xffb6c1ff,\r\n        LIGHTSALMON: 0xffa07aff,\r\n        LIGHTSEAGREEN: 0x20b2aaff,\r\n        LIGHTSKYBLUE: 0x87cefaff,\r\n        LIGHTSLATEGRAY: 0x778899ff,\r\n        LIGHTSLATEGREY: 0x778899ff,\r\n        LIGHTSTEELBLUE: 0xb0c4deff,\r\n        LIGHTYELLOW: 0xffffe0ff,\r\n        LIME: 0x00ff00ff,\r\n        LIMEGREEN: 0x32cd32ff,\r\n        LINEN: 0xfaf0e6ff,\r\n        MAGENTA: 0xff00ffff,\r\n        MAROON: 0x800000ff,\r\n        MEDIUMAQUAMARINE: 0x66cdaaff,\r\n        MEDIUMBLUE: 0x0000cdff,\r\n        MEDIUMORCHID: 0xba55d3ff,\r\n        MEDIUMPURPLE: 0x9370dbff,\r\n        MEDIUMSEAGREEN: 0x3cb371ff,\r\n        MEDIUMSLATEBLUE: 0x7b68eeff,\r\n        MEDIUMSPRINGGREEN: 0x00fa9aff,\r\n        MEDIUMTURQUOISE: 0x48d1ccff,\r\n        MEDIUMVIOLETRED: 0xc71585ff,\r\n        MIDNIGHTBLUE: 0x191970ff,\r\n        MINTCREAM: 0xf5fffaff,\r\n        MISTYROSE: 0xffe4e1ff,\r\n        MOCCASIN: 0xffe4b5ff,\r\n        NAVAJOWHITE: 0xffdeadff,\r\n        NAVY: 0x000080ff,\r\n        OLDLACE: 0xfdf5e6ff,\r\n        OLIVE: 0x808000ff,\r\n        OLIVEDRAB: 0x6b8e23ff,\r\n        ORANGE: 0xffa500ff,\r\n        ORANGERED: 0xff4500ff,\r\n        ORCHID: 0xda70d6ff,\r\n        PALEGOLDENROD: 0xeee8aaff,\r\n        PALEGREEN: 0x98fb98ff,\r\n        PALETURQUOISE: 0xafeeeeff,\r\n        PALEVIOLETRED: 0xdb7093ff,\r\n        PAPAYAWHIP: 0xffefd5ff,\r\n        PEACHPUFF: 0xffdab9ff,\r\n        PERU: 0xcd853fff,\r\n        PINK: 0xffc0cbff,\r\n        PLUM: 0xdda0ddff,\r\n        POWDERBLUE: 0xb0e0e6ff,\r\n        PURPLE: 0x800080ff,\r\n        REBECCAPURPLE: 0x663399ff,\r\n        RED: 0xff0000ff,\r\n        ROSYBROWN: 0xbc8f8fff,\r\n        ROYALBLUE: 0x4169e1ff,\r\n        SADDLEBROWN: 0x8b4513ff,\r\n        SALMON: 0xfa8072ff,\r\n        SANDYBROWN: 0xf4a460ff,\r\n        SEAGREEN: 0x2e8b57ff,\r\n        SEASHELL: 0xfff5eeff,\r\n        SIENNA: 0xa0522dff,\r\n        SILVER: 0xc0c0c0ff,\r\n        SKYBLUE: 0x87ceebff,\r\n        SLATEBLUE: 0x6a5acdff,\r\n        SLATEGRAY: 0x708090ff,\r\n        SLATEGREY: 0x708090ff,\r\n        SNOW: 0xfffafaff,\r\n        SPRINGGREEN: 0x00ff7fff,\r\n        STEELBLUE: 0x4682b4ff,\r\n        TAN: 0xd2b48cff,\r\n        TEAL: 0x008080ff,\r\n        THISTLE: 0xd8bfd8ff,\r\n        TOMATO: 0xff6347ff,\r\n        TRANSPARENT: 0x00000000,\r\n        TURQUOISE: 0x40e0d0ff,\r\n        VIOLET: 0xee82eeff,\r\n        WHEAT: 0xf5deb3ff,\r\n        WHITE: 0xffffffff,\r\n        WHITESMOKE: 0xf5f5f5ff,\r\n        YELLOW: 0xffff00ff,\r\n        YELLOWGREEN: 0x9acd32ff\r\n    };\r\n\r\n    var PropertyDescriptorParsingType;\r\n    (function (PropertyDescriptorParsingType) {\r\n        PropertyDescriptorParsingType[PropertyDescriptorParsingType[\"VALUE\"] = 0] = \"VALUE\";\r\n        PropertyDescriptorParsingType[PropertyDescriptorParsingType[\"LIST\"] = 1] = \"LIST\";\r\n        PropertyDescriptorParsingType[PropertyDescriptorParsingType[\"IDENT_VALUE\"] = 2] = \"IDENT_VALUE\";\r\n        PropertyDescriptorParsingType[PropertyDescriptorParsingType[\"TYPE_VALUE\"] = 3] = \"TYPE_VALUE\";\r\n        PropertyDescriptorParsingType[PropertyDescriptorParsingType[\"TOKEN_VALUE\"] = 4] = \"TOKEN_VALUE\";\r\n    })(PropertyDescriptorParsingType || (PropertyDescriptorParsingType = {}));\r\n\r\n    var BACKGROUND_CLIP;\r\n    (function (BACKGROUND_CLIP) {\r\n        BACKGROUND_CLIP[BACKGROUND_CLIP[\"BORDER_BOX\"] = 0] = \"BORDER_BOX\";\r\n        BACKGROUND_CLIP[BACKGROUND_CLIP[\"PADDING_BOX\"] = 1] = \"PADDING_BOX\";\r\n        BACKGROUND_CLIP[BACKGROUND_CLIP[\"CONTENT_BOX\"] = 2] = \"CONTENT_BOX\";\r\n    })(BACKGROUND_CLIP || (BACKGROUND_CLIP = {}));\r\n    var backgroundClip = {\r\n        name: 'background-clip',\r\n        initialValue: 'border-box',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            return tokens.map(function (token) {\r\n                if (isIdentToken(token)) {\r\n                    switch (token.value) {\r\n                        case 'padding-box':\r\n                            return BACKGROUND_CLIP.PADDING_BOX;\r\n                        case 'content-box':\r\n                            return BACKGROUND_CLIP.CONTENT_BOX;\r\n                    }\r\n                }\r\n                return BACKGROUND_CLIP.BORDER_BOX;\r\n            });\r\n        }\r\n    };\r\n\r\n    var backgroundColor = {\r\n        name: \"background-color\",\r\n        initialValue: 'transparent',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.TYPE_VALUE,\r\n        format: 'color'\r\n    };\r\n\r\n    var parseColorStop = function (args) {\r\n        var color$1 = color.parse(args[0]);\r\n        var stop = args[1];\r\n        return stop && isLengthPercentage(stop) ? { color: color$1, stop: stop } : { color: color$1, stop: null };\r\n    };\r\n    var processColorStops = function (stops, lineLength) {\r\n        var first = stops[0];\r\n        var last = stops[stops.length - 1];\r\n        if (first.stop === null) {\r\n            first.stop = ZERO_LENGTH;\r\n        }\r\n        if (last.stop === null) {\r\n            last.stop = HUNDRED_PERCENT;\r\n        }\r\n        var processStops = [];\r\n        var previous = 0;\r\n        for (var i = 0; i < stops.length; i++) {\r\n            var stop_1 = stops[i].stop;\r\n            if (stop_1 !== null) {\r\n                var absoluteValue = getAbsoluteValue(stop_1, lineLength);\r\n                if (absoluteValue > previous) {\r\n                    processStops.push(absoluteValue);\r\n                }\r\n                else {\r\n                    processStops.push(previous);\r\n                }\r\n                previous = absoluteValue;\r\n            }\r\n            else {\r\n                processStops.push(null);\r\n            }\r\n        }\r\n        var gapBegin = null;\r\n        for (var i = 0; i < processStops.length; i++) {\r\n            var stop_2 = processStops[i];\r\n            if (stop_2 === null) {\r\n                if (gapBegin === null) {\r\n                    gapBegin = i;\r\n                }\r\n            }\r\n            else if (gapBegin !== null) {\r\n                var gapLength = i - gapBegin;\r\n                var beforeGap = processStops[gapBegin - 1];\r\n                var gapValue = (stop_2 - beforeGap) / (gapLength + 1);\r\n                for (var g = 1; g <= gapLength; g++) {\r\n                    processStops[gapBegin + g - 1] = gapValue * g;\r\n                }\r\n                gapBegin = null;\r\n            }\r\n        }\r\n        return stops.map(function (_a, i) {\r\n            var color = _a.color;\r\n            return { color: color, stop: Math.max(Math.min(1, processStops[i] / lineLength), 0) };\r\n        });\r\n    };\r\n    var getAngleFromCorner = function (corner, width, height) {\r\n        var centerX = width / 2;\r\n        var centerY = height / 2;\r\n        var x = getAbsoluteValue(corner[0], width) - centerX;\r\n        var y = centerY - getAbsoluteValue(corner[1], height);\r\n        return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2);\r\n    };\r\n    var calculateGradientDirection = function (angle, width, height) {\r\n        var radian = typeof angle === 'number' ? angle : getAngleFromCorner(angle, width, height);\r\n        var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));\r\n        var halfWidth = width / 2;\r\n        var halfHeight = height / 2;\r\n        var halfLineLength = lineLength / 2;\r\n        var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength;\r\n        var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength;\r\n        return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff];\r\n    };\r\n    var distance = function (a, b) { return Math.sqrt(a * a + b * b); };\r\n    var findCorner = function (width, height, x, y, closest) {\r\n        var corners = [[0, 0], [0, height], [width, 0], [width, height]];\r\n        return corners.reduce(function (stat, corner) {\r\n            var cx = corner[0], cy = corner[1];\r\n            var d = distance(x - cx, y - cy);\r\n            if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {\r\n                return {\r\n                    optimumCorner: corner,\r\n                    optimumDistance: d\r\n                };\r\n            }\r\n            return stat;\r\n        }, {\r\n            optimumDistance: closest ? Infinity : -Infinity,\r\n            optimumCorner: null\r\n        }).optimumCorner;\r\n    };\r\n    var calculateRadius = function (gradient, x, y, width, height) {\r\n        var rx = 0;\r\n        var ry = 0;\r\n        switch (gradient.size) {\r\n            case CSSRadialExtent.CLOSEST_SIDE:\r\n                // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.\r\n                // If the shape is an ellipse, it exactly meets the closest side in each dimension.\r\n                if (gradient.shape === CSSRadialShape.CIRCLE) {\r\n                    rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));\r\n                }\r\n                else if (gradient.shape === CSSRadialShape.ELLIPSE) {\r\n                    rx = Math.min(Math.abs(x), Math.abs(x - width));\r\n                    ry = Math.min(Math.abs(y), Math.abs(y - height));\r\n                }\r\n                break;\r\n            case CSSRadialExtent.CLOSEST_CORNER:\r\n                // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.\r\n                // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.\r\n                if (gradient.shape === CSSRadialShape.CIRCLE) {\r\n                    rx = ry = Math.min(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));\r\n                }\r\n                else if (gradient.shape === CSSRadialShape.ELLIPSE) {\r\n                    // Compute the ratio ry/rx (which is to be the same as for \"closest-side\")\r\n                    var c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width));\r\n                    var _a = findCorner(width, height, x, y, true), cx = _a[0], cy = _a[1];\r\n                    rx = distance(cx - x, (cy - y) / c);\r\n                    ry = c * rx;\r\n                }\r\n                break;\r\n            case CSSRadialExtent.FARTHEST_SIDE:\r\n                // Same as closest-side, except the ending shape is sized based on the farthest side(s)\r\n                if (gradient.shape === CSSRadialShape.CIRCLE) {\r\n                    rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));\r\n                }\r\n                else if (gradient.shape === CSSRadialShape.ELLIPSE) {\r\n                    rx = Math.max(Math.abs(x), Math.abs(x - width));\r\n                    ry = Math.max(Math.abs(y), Math.abs(y - height));\r\n                }\r\n                break;\r\n            case CSSRadialExtent.FARTHEST_CORNER:\r\n                // Same as closest-corner, except the ending shape is sized based on the farthest corner.\r\n                // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.\r\n                if (gradient.shape === CSSRadialShape.CIRCLE) {\r\n                    rx = ry = Math.max(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));\r\n                }\r\n                else if (gradient.shape === CSSRadialShape.ELLIPSE) {\r\n                    // Compute the ratio ry/rx (which is to be the same as for \"farthest-side\")\r\n                    var c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width));\r\n                    var _b = findCorner(width, height, x, y, false), cx = _b[0], cy = _b[1];\r\n                    rx = distance(cx - x, (cy - y) / c);\r\n                    ry = c * rx;\r\n                }\r\n                break;\r\n        }\r\n        if (Array.isArray(gradient.size)) {\r\n            rx = getAbsoluteValue(gradient.size[0], width);\r\n            ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.size[1], height) : rx;\r\n        }\r\n        return [rx, ry];\r\n    };\r\n\r\n    var linearGradient = function (tokens) {\r\n        var angle$1 = deg(180);\r\n        var stops = [];\r\n        parseFunctionArgs(tokens).forEach(function (arg, i) {\r\n            if (i === 0) {\r\n                var firstToken = arg[0];\r\n                if (firstToken.type === TokenType.IDENT_TOKEN && firstToken.value === 'to') {\r\n                    angle$1 = parseNamedSide(arg);\r\n                    return;\r\n                }\r\n                else if (isAngle(firstToken)) {\r\n                    angle$1 = angle.parse(firstToken);\r\n                    return;\r\n                }\r\n            }\r\n            var colorStop = parseColorStop(arg);\r\n            stops.push(colorStop);\r\n        });\r\n        return { angle: angle$1, stops: stops, type: CSSImageType.LINEAR_GRADIENT };\r\n    };\r\n\r\n    var prefixLinearGradient = function (tokens) {\r\n        var angle$1 = deg(180);\r\n        var stops = [];\r\n        parseFunctionArgs(tokens).forEach(function (arg, i) {\r\n            if (i === 0) {\r\n                var firstToken = arg[0];\r\n                if (firstToken.type === TokenType.IDENT_TOKEN &&\r\n                    ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1) {\r\n                    angle$1 = parseNamedSide(arg);\r\n                    return;\r\n                }\r\n                else if (isAngle(firstToken)) {\r\n                    angle$1 = (angle.parse(firstToken) + deg(270)) % deg(360);\r\n                    return;\r\n                }\r\n            }\r\n            var colorStop = parseColorStop(arg);\r\n            stops.push(colorStop);\r\n        });\r\n        return {\r\n            angle: angle$1,\r\n            stops: stops,\r\n            type: CSSImageType.LINEAR_GRADIENT\r\n        };\r\n    };\r\n\r\n    var testRangeBounds = function (document) {\r\n        var TEST_HEIGHT = 123;\r\n        if (document.createRange) {\r\n            var range = document.createRange();\r\n            if (range.getBoundingClientRect) {\r\n                var testElement = document.createElement('boundtest');\r\n                testElement.style.height = TEST_HEIGHT + \"px\";\r\n                testElement.style.display = 'block';\r\n                document.body.appendChild(testElement);\r\n                range.selectNode(testElement);\r\n                var rangeBounds = range.getBoundingClientRect();\r\n                var rangeHeight = Math.round(rangeBounds.height);\r\n                document.body.removeChild(testElement);\r\n                if (rangeHeight === TEST_HEIGHT) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    };\r\n    var testCORS = function () { return typeof new Image().crossOrigin !== 'undefined'; };\r\n    var testResponseType = function () { return typeof new XMLHttpRequest().responseType === 'string'; };\r\n    var testSVG = function (document) {\r\n        var img = new Image();\r\n        var canvas = document.createElement('canvas');\r\n        var ctx = canvas.getContext('2d');\r\n        if (!ctx) {\r\n            return false;\r\n        }\r\n        img.src = \"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>\";\r\n        try {\r\n            ctx.drawImage(img, 0, 0);\r\n            canvas.toDataURL();\r\n        }\r\n        catch (e) {\r\n            return false;\r\n        }\r\n        return true;\r\n    };\r\n    var isGreenPixel = function (data) {\r\n        return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255;\r\n    };\r\n    var testForeignObject = function (document) {\r\n        var canvas = document.createElement('canvas');\r\n        var size = 100;\r\n        canvas.width = size;\r\n        canvas.height = size;\r\n        var ctx = canvas.getContext('2d');\r\n        if (!ctx) {\r\n            return Promise.reject(false);\r\n        }\r\n        ctx.fillStyle = 'rgb(0, 255, 0)';\r\n        ctx.fillRect(0, 0, size, size);\r\n        var img = new Image();\r\n        var greenImageSrc = canvas.toDataURL();\r\n        img.src = greenImageSrc;\r\n        var svg = createForeignObjectSVG(size, size, 0, 0, img);\r\n        ctx.fillStyle = 'red';\r\n        ctx.fillRect(0, 0, size, size);\r\n        return loadSerializedSVG(svg)\r\n            .then(function (img) {\r\n                ctx.drawImage(img, 0, 0);\r\n                var data = ctx.getImageData(0, 0, size, size).data;\r\n                ctx.fillStyle = 'red';\r\n                ctx.fillRect(0, 0, size, size);\r\n                var node = document.createElement('div');\r\n                node.style.backgroundImage = \"url(\" + greenImageSrc + \")\";\r\n                node.style.height = size + \"px\";\r\n                // Firefox 55 does not render inline <img /> tags\r\n                return isGreenPixel(data)\r\n                    ? loadSerializedSVG(createForeignObjectSVG(size, size, 0, 0, node))\r\n                    : Promise.reject(false);\r\n            })\r\n            .then(function (img) {\r\n                ctx.drawImage(img, 0, 0);\r\n                // Edge does not render background-images\r\n                return isGreenPixel(ctx.getImageData(0, 0, size, size).data);\r\n            })\r\n            .catch(function () { return false; });\r\n    };\r\n    var createForeignObjectSVG = function (width, height, x, y, node) {\r\n        var xmlns = 'http://www.w3.org/2000/svg';\r\n        var svg = document.createElementNS(xmlns, 'svg');\r\n        var foreignObject = document.createElementNS(xmlns, 'foreignObject');\r\n        svg.setAttributeNS(null, 'width', width.toString());\r\n        svg.setAttributeNS(null, 'height', height.toString());\r\n        foreignObject.setAttributeNS(null, 'width', '100%');\r\n        foreignObject.setAttributeNS(null, 'height', '100%');\r\n        foreignObject.setAttributeNS(null, 'x', x.toString());\r\n        foreignObject.setAttributeNS(null, 'y', y.toString());\r\n        foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true');\r\n        svg.appendChild(foreignObject);\r\n        foreignObject.appendChild(node);\r\n        return svg;\r\n    };\r\n    var loadSerializedSVG = function (svg) {\r\n        return new Promise(function (resolve, reject) {\r\n            var img = new Image();\r\n            img.onload = function () { return resolve(img); };\r\n            img.onerror = reject;\r\n            img.src = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(new XMLSerializer().serializeToString(svg));\r\n        });\r\n    };\r\n    var FEATURES = {\r\n        get SUPPORT_RANGE_BOUNDS() {\r\n            var value = testRangeBounds(document);\r\n            Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value });\r\n            return value;\r\n        },\r\n        get SUPPORT_SVG_DRAWING() {\r\n            var value = testSVG(document);\r\n            Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value });\r\n            return value;\r\n        },\r\n        get SUPPORT_FOREIGNOBJECT_DRAWING() {\r\n            var value = typeof Array.from === 'function' && typeof window.fetch === 'function'\r\n                ? testForeignObject(document)\r\n                : Promise.resolve(false);\r\n            Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value });\r\n            return value;\r\n        },\r\n        get SUPPORT_CORS_IMAGES() {\r\n            var value = testCORS();\r\n            Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value });\r\n            return value;\r\n        },\r\n        get SUPPORT_RESPONSE_TYPE() {\r\n            var value = testResponseType();\r\n            Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value });\r\n            return value;\r\n        },\r\n        get SUPPORT_CORS_XHR() {\r\n            var value = 'withCredentials' in new XMLHttpRequest();\r\n            Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value });\r\n            return value;\r\n        }\r\n    };\r\n\r\n    var Logger = /** @class */ (function () {\r\n        function Logger(_a) {\r\n            var id = _a.id, enabled = _a.enabled;\r\n            this.id = id;\r\n            this.enabled = enabled;\r\n            this.start = Date.now();\r\n        }\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        Logger.prototype.debug = function () {\r\n            var args = [];\r\n            for (var _i = 0; _i < arguments.length; _i++) {\r\n                args[_i] = arguments[_i];\r\n            }\r\n            if (this.enabled) {\r\n                // eslint-disable-next-line no-console\r\n                if (typeof window !== 'undefined' && window.console && typeof console.debug === 'function') {\r\n                    // eslint-disable-next-line no-console\r\n                    console.debug.apply(console, [this.id, this.getTime() + \"ms\"].concat(args));\r\n                }\r\n                else {\r\n                    this.info.apply(this, args);\r\n                }\r\n            }\r\n        };\r\n        Logger.prototype.getTime = function () {\r\n            return Date.now() - this.start;\r\n        };\r\n        Logger.create = function (options) {\r\n            Logger.instances[options.id] = new Logger(options);\r\n        };\r\n        Logger.destroy = function (id) {\r\n            delete Logger.instances[id];\r\n        };\r\n        Logger.getInstance = function (id) {\r\n            var instance = Logger.instances[id];\r\n            if (typeof instance === 'undefined') {\r\n                throw new Error(\"No logger instance found with id \" + id);\r\n            }\r\n            return instance;\r\n        };\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        Logger.prototype.info = function () {\r\n            var args = [];\r\n            for (var _i = 0; _i < arguments.length; _i++) {\r\n                args[_i] = arguments[_i];\r\n            }\r\n            if (this.enabled) {\r\n                // eslint-disable-next-line no-console\r\n                if (typeof window !== 'undefined' && window.console && typeof console.info === 'function') {\r\n                    // eslint-disable-next-line no-console\r\n                    console.info.apply(console, [this.id, this.getTime() + \"ms\"].concat(args));\r\n                }\r\n            }\r\n        };\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        Logger.prototype.error = function () {\r\n            var args = [];\r\n            for (var _i = 0; _i < arguments.length; _i++) {\r\n                args[_i] = arguments[_i];\r\n            }\r\n            if (this.enabled) {\r\n                // eslint-disable-next-line no-console\r\n                if (typeof window !== 'undefined' && window.console && typeof console.error === 'function') {\r\n                    // eslint-disable-next-line no-console\r\n                    console.error.apply(console, [this.id, this.getTime() + \"ms\"].concat(args));\r\n                }\r\n                else {\r\n                    this.info.apply(this, args);\r\n                }\r\n            }\r\n        };\r\n        Logger.instances = {};\r\n        return Logger;\r\n    }());\r\n\r\n    var CacheStorage = /** @class */ (function () {\r\n        function CacheStorage() {\r\n        }\r\n        CacheStorage.create = function (name, options) {\r\n            return (CacheStorage._caches[name] = new Cache(name, options));\r\n        };\r\n        CacheStorage.destroy = function (name) {\r\n            delete CacheStorage._caches[name];\r\n        };\r\n        CacheStorage.open = function (name) {\r\n            var cache = CacheStorage._caches[name];\r\n            if (typeof cache !== 'undefined') {\r\n                return cache;\r\n            }\r\n            throw new Error(\"Cache with key \\\"\" + name + \"\\\" not found\");\r\n        };\r\n        CacheStorage.getOrigin = function (url) {\r\n            var link = CacheStorage._link;\r\n            if (!link) {\r\n                return 'about:blank';\r\n            }\r\n            link.href = url;\r\n            link.href = link.href; // IE9, LOL! - http://jsfiddle.net/niklasvh/2e48b/\r\n            return link.protocol + link.hostname + link.port;\r\n        };\r\n        CacheStorage.isSameOrigin = function (src) {\r\n            return CacheStorage.getOrigin(src) === CacheStorage._origin;\r\n        };\r\n        CacheStorage.setContext = function (window) {\r\n            CacheStorage._link = window.document.createElement('a');\r\n            CacheStorage._origin = CacheStorage.getOrigin(window.location.href);\r\n        };\r\n        CacheStorage.getInstance = function () {\r\n            var current = CacheStorage._current;\r\n            if (current === null) {\r\n                throw new Error(\"No cache instance attached\");\r\n            }\r\n            return current;\r\n        };\r\n        CacheStorage.attachInstance = function (cache) {\r\n            CacheStorage._current = cache;\r\n        };\r\n        CacheStorage.detachInstance = function () {\r\n            CacheStorage._current = null;\r\n        };\r\n        CacheStorage._caches = {};\r\n        CacheStorage._origin = 'about:blank';\r\n        CacheStorage._current = null;\r\n        return CacheStorage;\r\n    }());\r\n    var Cache = /** @class */ (function () {\r\n        function Cache(id, options) {\r\n            this.id = id;\r\n            this._options = options;\r\n            this._cache = {};\r\n        }\r\n        Cache.prototype.addImage = function (src) {\r\n            var result = Promise.resolve();\r\n            if (this.has(src)) {\r\n                return result;\r\n            }\r\n            if (isBlobImage(src) || isRenderable(src)) {\r\n                this._cache[src] = this.loadImage(src);\r\n                return result;\r\n            }\r\n            return result;\r\n        };\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        Cache.prototype.match = function (src) {\r\n            return this._cache[src];\r\n        };\r\n        Cache.prototype.loadImage = function (key) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var isSameOrigin, useCORS, useProxy, src;\r\n                var _this = this;\r\n                return __generator(this, function (_a) {\r\n                    switch (_a.label) {\r\n                        case 0:\r\n                            isSameOrigin = CacheStorage.isSameOrigin(key);\r\n                            useCORS = !isInlineImage(key) && this._options.useCORS === true && FEATURES.SUPPORT_CORS_IMAGES && !isSameOrigin;\r\n                            useProxy = !isInlineImage(key) &&\r\n                                !isSameOrigin &&\r\n                                typeof this._options.proxy === 'string' &&\r\n                                FEATURES.SUPPORT_CORS_XHR &&\r\n                                !useCORS;\r\n                            if (!isSameOrigin && this._options.allowTaint === false && !isInlineImage(key) && !useProxy && !useCORS) {\r\n                                return [2 /*return*/];\r\n                            }\r\n                            src = key;\r\n                            if (!useProxy) return [3 /*break*/, 2];\r\n                            return [4 /*yield*/, this.proxy(src)];\r\n                        case 1:\r\n                            src = _a.sent();\r\n                            _a.label = 2;\r\n                        case 2:\r\n                            Logger.getInstance(this.id).debug(\"Added image \" + key.substring(0, 256));\r\n                            return [4 /*yield*/, new Promise(function (resolve, reject) {\r\n                                var img = new Image();\r\n                                img.onload = function () { return resolve(img); };\r\n                                img.onerror = reject;\r\n                                //ios safari 10.3 taints canvas with data urls unless crossOrigin is set to anonymous\r\n                                if (isInlineBase64Image(src) || useCORS) {\r\n                                    img.crossOrigin = 'anonymous';\r\n                                }\r\n                                img.src = src;\r\n                                if (img.complete === true) {\r\n                                    // Inline XML images may fail to parse, throwing an Error later on\r\n                                    setTimeout(function () { return resolve(img); }, 500);\r\n                                }\r\n                                if (_this._options.imageTimeout > 0) {\r\n                                    setTimeout(function () { return reject(\"Timed out (\" + _this._options.imageTimeout + \"ms) loading image\"); }, _this._options.imageTimeout);\r\n                                }\r\n                            })];\r\n                        case 3: return [2 /*return*/, _a.sent()];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        Cache.prototype.has = function (key) {\r\n            return typeof this._cache[key] !== 'undefined';\r\n        };\r\n        Cache.prototype.keys = function () {\r\n            return Promise.resolve(Object.keys(this._cache));\r\n        };\r\n        Cache.prototype.proxy = function (src) {\r\n            var _this = this;\r\n            var proxy = this._options.proxy;\r\n            if (!proxy) {\r\n                throw new Error('No proxy defined');\r\n            }\r\n            var key = src.substring(0, 256);\r\n            return new Promise(function (resolve, reject) {\r\n                var responseType = FEATURES.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text';\r\n                var xhr = new XMLHttpRequest();\r\n                xhr.onload = function () {\r\n                    if (xhr.status === 200) {\r\n                        if (responseType === 'text') {\r\n                            resolve(xhr.response);\r\n                        }\r\n                        else {\r\n                            var reader_1 = new FileReader();\r\n                            reader_1.addEventListener('load', function () { return resolve(reader_1.result); }, false);\r\n                            reader_1.addEventListener('error', function (e) { return reject(e); }, false);\r\n                            reader_1.readAsDataURL(xhr.response);\r\n                        }\r\n                    }\r\n                    else {\r\n                        reject(\"Failed to proxy resource \" + key + \" with status code \" + xhr.status);\r\n                    }\r\n                };\r\n                xhr.onerror = reject;\r\n                xhr.open('GET', proxy + \"?url=\" + encodeURIComponent(src) + \"&responseType=\" + responseType);\r\n                if (responseType !== 'text' && xhr instanceof XMLHttpRequest) {\r\n                    xhr.responseType = responseType;\r\n                }\r\n                if (_this._options.imageTimeout) {\r\n                    var timeout_1 = _this._options.imageTimeout;\r\n                    xhr.timeout = timeout_1;\r\n                    xhr.ontimeout = function () { return reject(\"Timed out (\" + timeout_1 + \"ms) proxying \" + key); };\r\n                }\r\n                xhr.send();\r\n            });\r\n        };\r\n        return Cache;\r\n    }());\r\n    var INLINE_SVG = /^data:image\\/svg\\+xml/i;\r\n    var INLINE_BASE64 = /^data:image\\/.*;base64,/i;\r\n    var INLINE_IMG = /^data:image\\/.*/i;\r\n    var isRenderable = function (src) { return FEATURES.SUPPORT_SVG_DRAWING || !isSVG(src); };\r\n    var isInlineImage = function (src) { return INLINE_IMG.test(src); };\r\n    var isInlineBase64Image = function (src) { return INLINE_BASE64.test(src); };\r\n    var isBlobImage = function (src) { return src.substr(0, 4) === 'blob'; };\r\n    var isSVG = function (src) { return src.substr(-3).toLowerCase() === 'svg' || INLINE_SVG.test(src); };\r\n\r\n    var webkitGradient = function (tokens) {\r\n        var angle = deg(180);\r\n        var stops = [];\r\n        var type = CSSImageType.LINEAR_GRADIENT;\r\n        var shape = CSSRadialShape.CIRCLE;\r\n        var size = CSSRadialExtent.FARTHEST_CORNER;\r\n        var position = [];\r\n        parseFunctionArgs(tokens).forEach(function (arg, i) {\r\n            var firstToken = arg[0];\r\n            if (i === 0) {\r\n                if (isIdentToken(firstToken) && firstToken.value === 'linear') {\r\n                    type = CSSImageType.LINEAR_GRADIENT;\r\n                    return;\r\n                }\r\n                else if (isIdentToken(firstToken) && firstToken.value === 'radial') {\r\n                    type = CSSImageType.RADIAL_GRADIENT;\r\n                    return;\r\n                }\r\n            }\r\n            if (firstToken.type === TokenType.FUNCTION) {\r\n                if (firstToken.name === 'from') {\r\n                    var color$1 = color.parse(firstToken.values[0]);\r\n                    stops.push({ stop: ZERO_LENGTH, color: color$1 });\r\n                }\r\n                else if (firstToken.name === 'to') {\r\n                    var color$1 = color.parse(firstToken.values[0]);\r\n                    stops.push({ stop: HUNDRED_PERCENT, color: color$1 });\r\n                }\r\n                else if (firstToken.name === 'color-stop') {\r\n                    var values = firstToken.values.filter(nonFunctionArgSeparator);\r\n                    if (values.length === 2) {\r\n                        var color$1 = color.parse(values[1]);\r\n                        var stop_1 = values[0];\r\n                        if (isNumberToken(stop_1)) {\r\n                            stops.push({\r\n                                stop: { type: TokenType.PERCENTAGE_TOKEN, number: stop_1.number * 100, flags: stop_1.flags },\r\n                                color: color$1\r\n                            });\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        return type === CSSImageType.LINEAR_GRADIENT\r\n            ? {\r\n                angle: (angle + deg(180)) % deg(360),\r\n                stops: stops,\r\n                type: type\r\n            }\r\n            : { size: size, shape: shape, stops: stops, position: position, type: type };\r\n    };\r\n\r\n    var CLOSEST_SIDE = 'closest-side';\r\n    var FARTHEST_SIDE = 'farthest-side';\r\n    var CLOSEST_CORNER = 'closest-corner';\r\n    var FARTHEST_CORNER = 'farthest-corner';\r\n    var CIRCLE = 'circle';\r\n    var ELLIPSE = 'ellipse';\r\n    var COVER = 'cover';\r\n    var CONTAIN = 'contain';\r\n    var radialGradient = function (tokens) {\r\n        var shape = CSSRadialShape.CIRCLE;\r\n        var size = CSSRadialExtent.FARTHEST_CORNER;\r\n        var stops = [];\r\n        var position = [];\r\n        parseFunctionArgs(tokens).forEach(function (arg, i) {\r\n            var isColorStop = true;\r\n            if (i === 0) {\r\n                var isAtPosition_1 = false;\r\n                isColorStop = arg.reduce(function (acc, token) {\r\n                    if (isAtPosition_1) {\r\n                        if (isIdentToken(token)) {\r\n                            switch (token.value) {\r\n                                case 'center':\r\n                                    position.push(FIFTY_PERCENT);\r\n                                    return acc;\r\n                                case 'top':\r\n                                case 'left':\r\n                                    position.push(ZERO_LENGTH);\r\n                                    return acc;\r\n                                case 'right':\r\n                                case 'bottom':\r\n                                    position.push(HUNDRED_PERCENT);\r\n                                    return acc;\r\n                            }\r\n                        }\r\n                        else if (isLengthPercentage(token) || isLength(token)) {\r\n                            position.push(token);\r\n                        }\r\n                    }\r\n                    else if (isIdentToken(token)) {\r\n                        switch (token.value) {\r\n                            case CIRCLE:\r\n                                shape = CSSRadialShape.CIRCLE;\r\n                                return false;\r\n                            case ELLIPSE:\r\n                                shape = CSSRadialShape.ELLIPSE;\r\n                                return false;\r\n                            case 'at':\r\n                                isAtPosition_1 = true;\r\n                                return false;\r\n                            case CLOSEST_SIDE:\r\n                                size = CSSRadialExtent.CLOSEST_SIDE;\r\n                                return false;\r\n                            case COVER:\r\n                            case FARTHEST_SIDE:\r\n                                size = CSSRadialExtent.FARTHEST_SIDE;\r\n                                return false;\r\n                            case CONTAIN:\r\n                            case CLOSEST_CORNER:\r\n                                size = CSSRadialExtent.CLOSEST_CORNER;\r\n                                return false;\r\n                            case FARTHEST_CORNER:\r\n                                size = CSSRadialExtent.FARTHEST_CORNER;\r\n                                return false;\r\n                        }\r\n                    }\r\n                    else if (isLength(token) || isLengthPercentage(token)) {\r\n                        if (!Array.isArray(size)) {\r\n                            size = [];\r\n                        }\r\n                        size.push(token);\r\n                        return false;\r\n                    }\r\n                    return acc;\r\n                }, isColorStop);\r\n            }\r\n            if (isColorStop) {\r\n                var colorStop = parseColorStop(arg);\r\n                stops.push(colorStop);\r\n            }\r\n        });\r\n        return { size: size, shape: shape, stops: stops, position: position, type: CSSImageType.RADIAL_GRADIENT };\r\n    };\r\n\r\n    var prefixRadialGradient = function (tokens) {\r\n        var shape = CSSRadialShape.CIRCLE;\r\n        var size = CSSRadialExtent.FARTHEST_CORNER;\r\n        var stops = [];\r\n        var position = [];\r\n        parseFunctionArgs(tokens).forEach(function (arg, i) {\r\n            var isColorStop = true;\r\n            if (i === 0) {\r\n                isColorStop = arg.reduce(function (acc, token) {\r\n                    if (isIdentToken(token)) {\r\n                        switch (token.value) {\r\n                            case 'center':\r\n                                position.push(FIFTY_PERCENT);\r\n                                return false;\r\n                            case 'top':\r\n                            case 'left':\r\n                                position.push(ZERO_LENGTH);\r\n                                return false;\r\n                            case 'right':\r\n                            case 'bottom':\r\n                                position.push(HUNDRED_PERCENT);\r\n                                return false;\r\n                        }\r\n                    }\r\n                    else if (isLengthPercentage(token) || isLength(token)) {\r\n                        position.push(token);\r\n                        return false;\r\n                    }\r\n                    return acc;\r\n                }, isColorStop);\r\n            }\r\n            else if (i === 1) {\r\n                isColorStop = arg.reduce(function (acc, token) {\r\n                    if (isIdentToken(token)) {\r\n                        switch (token.value) {\r\n                            case CIRCLE:\r\n                                shape = CSSRadialShape.CIRCLE;\r\n                                return false;\r\n                            case ELLIPSE:\r\n                                shape = CSSRadialShape.ELLIPSE;\r\n                                return false;\r\n                            case CONTAIN:\r\n                            case CLOSEST_SIDE:\r\n                                size = CSSRadialExtent.CLOSEST_SIDE;\r\n                                return false;\r\n                            case FARTHEST_SIDE:\r\n                                size = CSSRadialExtent.FARTHEST_SIDE;\r\n                                return false;\r\n                            case CLOSEST_CORNER:\r\n                                size = CSSRadialExtent.CLOSEST_CORNER;\r\n                                return false;\r\n                            case COVER:\r\n                            case FARTHEST_CORNER:\r\n                                size = CSSRadialExtent.FARTHEST_CORNER;\r\n                                return false;\r\n                        }\r\n                    }\r\n                    else if (isLength(token) || isLengthPercentage(token)) {\r\n                        if (!Array.isArray(size)) {\r\n                            size = [];\r\n                        }\r\n                        size.push(token);\r\n                        return false;\r\n                    }\r\n                    return acc;\r\n                }, isColorStop);\r\n            }\r\n            if (isColorStop) {\r\n                var colorStop = parseColorStop(arg);\r\n                stops.push(colorStop);\r\n            }\r\n        });\r\n        return { size: size, shape: shape, stops: stops, position: position, type: CSSImageType.RADIAL_GRADIENT };\r\n    };\r\n\r\n    var CSSImageType;\r\n    (function (CSSImageType) {\r\n        CSSImageType[CSSImageType[\"URL\"] = 0] = \"URL\";\r\n        CSSImageType[CSSImageType[\"LINEAR_GRADIENT\"] = 1] = \"LINEAR_GRADIENT\";\r\n        CSSImageType[CSSImageType[\"RADIAL_GRADIENT\"] = 2] = \"RADIAL_GRADIENT\";\r\n    })(CSSImageType || (CSSImageType = {}));\r\n    var isLinearGradient = function (background) {\r\n        return background.type === CSSImageType.LINEAR_GRADIENT;\r\n    };\r\n    var isRadialGradient = function (background) {\r\n        return background.type === CSSImageType.RADIAL_GRADIENT;\r\n    };\r\n    var CSSRadialShape;\r\n    (function (CSSRadialShape) {\r\n        CSSRadialShape[CSSRadialShape[\"CIRCLE\"] = 0] = \"CIRCLE\";\r\n        CSSRadialShape[CSSRadialShape[\"ELLIPSE\"] = 1] = \"ELLIPSE\";\r\n    })(CSSRadialShape || (CSSRadialShape = {}));\r\n    var CSSRadialExtent;\r\n    (function (CSSRadialExtent) {\r\n        CSSRadialExtent[CSSRadialExtent[\"CLOSEST_SIDE\"] = 0] = \"CLOSEST_SIDE\";\r\n        CSSRadialExtent[CSSRadialExtent[\"FARTHEST_SIDE\"] = 1] = \"FARTHEST_SIDE\";\r\n        CSSRadialExtent[CSSRadialExtent[\"CLOSEST_CORNER\"] = 2] = \"CLOSEST_CORNER\";\r\n        CSSRadialExtent[CSSRadialExtent[\"FARTHEST_CORNER\"] = 3] = \"FARTHEST_CORNER\";\r\n    })(CSSRadialExtent || (CSSRadialExtent = {}));\r\n    var image = {\r\n        name: 'image',\r\n        parse: function (value) {\r\n            if (value.type === TokenType.URL_TOKEN) {\r\n                var image_1 = { url: value.value, type: CSSImageType.URL };\r\n                CacheStorage.getInstance().addImage(value.value);\r\n                return image_1;\r\n            }\r\n            if (value.type === TokenType.FUNCTION) {\r\n                var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name];\r\n                if (typeof imageFunction === 'undefined') {\r\n                    throw new Error(\"Attempting to parse an unsupported image function \\\"\" + value.name + \"\\\"\");\r\n                }\r\n                return imageFunction(value.values);\r\n            }\r\n            throw new Error(\"Unsupported image type\");\r\n        }\r\n    };\r\n    function isSupportedImage(value) {\r\n        return value.type !== TokenType.FUNCTION || SUPPORTED_IMAGE_FUNCTIONS[value.name];\r\n    }\r\n    var SUPPORTED_IMAGE_FUNCTIONS = {\r\n        'linear-gradient': linearGradient,\r\n        '-moz-linear-gradient': prefixLinearGradient,\r\n        '-ms-linear-gradient': prefixLinearGradient,\r\n        '-o-linear-gradient': prefixLinearGradient,\r\n        '-webkit-linear-gradient': prefixLinearGradient,\r\n        'radial-gradient': radialGradient,\r\n        '-moz-radial-gradient': prefixRadialGradient,\r\n        '-ms-radial-gradient': prefixRadialGradient,\r\n        '-o-radial-gradient': prefixRadialGradient,\r\n        '-webkit-radial-gradient': prefixRadialGradient,\r\n        '-webkit-gradient': webkitGradient\r\n    };\r\n\r\n    var backgroundImage = {\r\n        name: 'background-image',\r\n        initialValue: 'none',\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        prefix: false,\r\n        parse: function (tokens) {\r\n            if (tokens.length === 0) {\r\n                return [];\r\n            }\r\n            var first = tokens[0];\r\n            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\r\n                return [];\r\n            }\r\n            return tokens.filter(function (value) { return nonFunctionArgSeparator(value) && isSupportedImage(value); }).map(image.parse);\r\n        }\r\n    };\r\n\r\n    var backgroundOrigin = {\r\n        name: 'background-origin',\r\n        initialValue: 'border-box',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            return tokens.map(function (token) {\r\n                if (isIdentToken(token)) {\r\n                    switch (token.value) {\r\n                        case 'padding-box':\r\n                            return 1 /* PADDING_BOX */;\r\n                        case 'content-box':\r\n                            return 2 /* CONTENT_BOX */;\r\n                    }\r\n                }\r\n                return 0 /* BORDER_BOX */;\r\n            });\r\n        }\r\n    };\r\n\r\n    var backgroundPosition = {\r\n        name: 'background-position',\r\n        initialValue: '0% 0%',\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        prefix: false,\r\n        parse: function (tokens) {\r\n            return parseFunctionArgs(tokens)\r\n                .map(function (values) { return values.filter(isLengthPercentage); })\r\n                .map(parseLengthPercentageTuple);\r\n        }\r\n    };\r\n\r\n    var BACKGROUND_REPEAT;\r\n    (function (BACKGROUND_REPEAT) {\r\n        BACKGROUND_REPEAT[BACKGROUND_REPEAT[\"REPEAT\"] = 0] = \"REPEAT\";\r\n        BACKGROUND_REPEAT[BACKGROUND_REPEAT[\"NO_REPEAT\"] = 1] = \"NO_REPEAT\";\r\n        BACKGROUND_REPEAT[BACKGROUND_REPEAT[\"REPEAT_X\"] = 2] = \"REPEAT_X\";\r\n        BACKGROUND_REPEAT[BACKGROUND_REPEAT[\"REPEAT_Y\"] = 3] = \"REPEAT_Y\";\r\n    })(BACKGROUND_REPEAT || (BACKGROUND_REPEAT = {}));\r\n    var backgroundRepeat = {\r\n        name: 'background-repeat',\r\n        initialValue: 'repeat',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            return parseFunctionArgs(tokens)\r\n                .map(function (values) {\r\n                    return values\r\n                        .filter(isIdentToken)\r\n                        .map(function (token) { return token.value; })\r\n                        .join(' ');\r\n                })\r\n                .map(parseBackgroundRepeat);\r\n        }\r\n    };\r\n    var parseBackgroundRepeat = function (value) {\r\n        switch (value) {\r\n            case 'no-repeat':\r\n                return BACKGROUND_REPEAT.NO_REPEAT;\r\n            case 'repeat-x':\r\n            case 'repeat no-repeat':\r\n                return BACKGROUND_REPEAT.REPEAT_X;\r\n            case 'repeat-y':\r\n            case 'no-repeat repeat':\r\n                return BACKGROUND_REPEAT.REPEAT_Y;\r\n            case 'repeat':\r\n            default:\r\n                return BACKGROUND_REPEAT.REPEAT;\r\n        }\r\n    };\r\n\r\n    var BACKGROUND_SIZE;\r\n    (function (BACKGROUND_SIZE) {\r\n        BACKGROUND_SIZE[\"AUTO\"] = \"auto\";\r\n        BACKGROUND_SIZE[\"CONTAIN\"] = \"contain\";\r\n        BACKGROUND_SIZE[\"COVER\"] = \"cover\";\r\n    })(BACKGROUND_SIZE || (BACKGROUND_SIZE = {}));\r\n    var backgroundSize = {\r\n        name: 'background-size',\r\n        initialValue: '0',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            return parseFunctionArgs(tokens).map(function (values) { return values.filter(isBackgroundSizeInfoToken); });\r\n        }\r\n    };\r\n    var isBackgroundSizeInfoToken = function (value) {\r\n        return isIdentToken(value) || isLengthPercentage(value);\r\n    };\r\n\r\n    var borderColorForSide = function (side) {\r\n        return ({\r\n            name: \"border-\" + side + \"-color\",\r\n            initialValue: 'transparent',\r\n            prefix: false,\r\n            type: PropertyDescriptorParsingType.TYPE_VALUE,\r\n            format: 'color'\r\n        });\r\n    };\r\n    var borderTopColor = borderColorForSide('top');\r\n    var borderRightColor = borderColorForSide('right');\r\n    var borderBottomColor = borderColorForSide('bottom');\r\n    var borderLeftColor = borderColorForSide('left');\r\n\r\n    var borderRadiusForSide = function (side) {\r\n        return ({\r\n            name: \"border-radius-\" + side,\r\n            initialValue: '0 0',\r\n            prefix: false,\r\n            type: PropertyDescriptorParsingType.LIST,\r\n            parse: function (tokens) { return parseLengthPercentageTuple(tokens.filter(isLengthPercentage)); }\r\n        });\r\n    };\r\n    var borderTopLeftRadius = borderRadiusForSide('top-left');\r\n    var borderTopRightRadius = borderRadiusForSide('top-right');\r\n    var borderBottomRightRadius = borderRadiusForSide('bottom-right');\r\n    var borderBottomLeftRadius = borderRadiusForSide('bottom-left');\r\n\r\n    var BORDER_STYLE;\r\n    (function (BORDER_STYLE) {\r\n        BORDER_STYLE[BORDER_STYLE[\"NONE\"] = 0] = \"NONE\";\r\n        BORDER_STYLE[BORDER_STYLE[\"SOLID\"] = 1] = \"SOLID\";\r\n    })(BORDER_STYLE || (BORDER_STYLE = {}));\r\n    var borderStyleForSide = function (side) {\r\n        return ({\r\n            name: \"border-\" + side + \"-style\",\r\n            initialValue: 'solid',\r\n            prefix: false,\r\n            type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n            parse: function (style) {\r\n                switch (style) {\r\n                    case 'none':\r\n                        return BORDER_STYLE.NONE;\r\n                }\r\n                return BORDER_STYLE.SOLID;\r\n            }\r\n        });\r\n    };\r\n    var borderTopStyle = borderStyleForSide('top');\r\n    var borderRightStyle = borderStyleForSide('right');\r\n    var borderBottomStyle = borderStyleForSide('bottom');\r\n    var borderLeftStyle = borderStyleForSide('left');\r\n\r\n    var borderWidthForSide = function (side) {\r\n        return ({\r\n            name: \"border-\" + side + \"-width\",\r\n            initialValue: '0',\r\n            type: PropertyDescriptorParsingType.VALUE,\r\n            prefix: false,\r\n            parse: function (token) {\r\n                if (isDimensionToken(token)) {\r\n                    return token.number;\r\n                }\r\n                return 0;\r\n            }\r\n        });\r\n    };\r\n    var borderTopWidth = borderWidthForSide('top');\r\n    var borderRightWidth = borderWidthForSide('right');\r\n    var borderBottomWidth = borderWidthForSide('bottom');\r\n    var borderLeftWidth = borderWidthForSide('left');\r\n\r\n    var color$1 = {\r\n        name: \"color\",\r\n        initialValue: 'transparent',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.TYPE_VALUE,\r\n        format: 'color'\r\n    };\r\n\r\n    var display = {\r\n        name: 'display',\r\n        initialValue: 'inline-block',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            return tokens.filter(isIdentToken).reduce(function (bit, token) {\r\n                return bit | parseDisplayValue(token.value);\r\n            }, 0 /* NONE */);\r\n        }\r\n    };\r\n    var parseDisplayValue = function (display) {\r\n        switch (display) {\r\n            case 'block':\r\n                return 2 /* BLOCK */;\r\n            case 'inline':\r\n                return 4 /* INLINE */;\r\n            case 'run-in':\r\n                return 8 /* RUN_IN */;\r\n            case 'flow':\r\n                return 16 /* FLOW */;\r\n            case 'flow-root':\r\n                return 32 /* FLOW_ROOT */;\r\n            case 'table':\r\n                return 64 /* TABLE */;\r\n            case 'flex':\r\n            case '-webkit-flex':\r\n                return 128 /* FLEX */;\r\n            case 'grid':\r\n            case '-ms-grid':\r\n                return 256 /* GRID */;\r\n            case 'ruby':\r\n                return 512 /* RUBY */;\r\n            case 'subgrid':\r\n                return 1024 /* SUBGRID */;\r\n            case 'list-item':\r\n                return 2048 /* LIST_ITEM */;\r\n            case 'table-row-group':\r\n                return 4096 /* TABLE_ROW_GROUP */;\r\n            case 'table-header-group':\r\n                return 8192 /* TABLE_HEADER_GROUP */;\r\n            case 'table-footer-group':\r\n                return 16384 /* TABLE_FOOTER_GROUP */;\r\n            case 'table-row':\r\n                return 32768 /* TABLE_ROW */;\r\n            case 'table-cell':\r\n                return 65536 /* TABLE_CELL */;\r\n            case 'table-column-group':\r\n                return 131072 /* TABLE_COLUMN_GROUP */;\r\n            case 'table-column':\r\n                return 262144 /* TABLE_COLUMN */;\r\n            case 'table-caption':\r\n                return 524288 /* TABLE_CAPTION */;\r\n            case 'ruby-base':\r\n                return 1048576 /* RUBY_BASE */;\r\n            case 'ruby-text':\r\n                return 2097152 /* RUBY_TEXT */;\r\n            case 'ruby-base-container':\r\n                return 4194304 /* RUBY_BASE_CONTAINER */;\r\n            case 'ruby-text-container':\r\n                return 8388608 /* RUBY_TEXT_CONTAINER */;\r\n            case 'contents':\r\n                return 16777216 /* CONTENTS */;\r\n            case 'inline-block':\r\n                return 33554432 /* INLINE_BLOCK */;\r\n            case 'inline-list-item':\r\n                return 67108864 /* INLINE_LIST_ITEM */;\r\n            case 'inline-table':\r\n                return 134217728 /* INLINE_TABLE */;\r\n            case 'inline-flex':\r\n                return 268435456 /* INLINE_FLEX */;\r\n            case 'inline-grid':\r\n                return 536870912 /* INLINE_GRID */;\r\n        }\r\n        return 0 /* NONE */;\r\n    };\r\n\r\n    var FLOAT;\r\n    (function (FLOAT) {\r\n        FLOAT[FLOAT[\"NONE\"] = 0] = \"NONE\";\r\n        FLOAT[FLOAT[\"LEFT\"] = 1] = \"LEFT\";\r\n        FLOAT[FLOAT[\"RIGHT\"] = 2] = \"RIGHT\";\r\n        FLOAT[FLOAT[\"INLINE_START\"] = 3] = \"INLINE_START\";\r\n        FLOAT[FLOAT[\"INLINE_END\"] = 4] = \"INLINE_END\";\r\n    })(FLOAT || (FLOAT = {}));\r\n    var float = {\r\n        name: 'float',\r\n        initialValue: 'none',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (float) {\r\n            switch (float) {\r\n                case 'left':\r\n                    return FLOAT.LEFT;\r\n                case 'right':\r\n                    return FLOAT.RIGHT;\r\n                case 'inline-start':\r\n                    return FLOAT.INLINE_START;\r\n                case 'inline-end':\r\n                    return FLOAT.INLINE_END;\r\n            }\r\n            return FLOAT.NONE;\r\n        }\r\n    };\r\n\r\n    var letterSpacing = {\r\n        name: 'letter-spacing',\r\n        initialValue: '0',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.VALUE,\r\n        parse: function (token) {\r\n            if (token.type === TokenType.IDENT_TOKEN && token.value === 'normal') {\r\n                return 0;\r\n            }\r\n            if (token.type === TokenType.NUMBER_TOKEN) {\r\n                return token.number;\r\n            }\r\n            if (token.type === TokenType.DIMENSION_TOKEN) {\r\n                return token.number;\r\n            }\r\n            return 0;\r\n        }\r\n    };\r\n\r\n    var LINE_BREAK;\r\n    (function (LINE_BREAK) {\r\n        LINE_BREAK[\"NORMAL\"] = \"normal\";\r\n        LINE_BREAK[\"STRICT\"] = \"strict\";\r\n    })(LINE_BREAK || (LINE_BREAK = {}));\r\n    var lineBreak = {\r\n        name: 'line-break',\r\n        initialValue: 'normal',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (lineBreak) {\r\n            switch (lineBreak) {\r\n                case 'strict':\r\n                    return LINE_BREAK.STRICT;\r\n                case 'normal':\r\n                default:\r\n                    return LINE_BREAK.NORMAL;\r\n            }\r\n        }\r\n    };\r\n\r\n    var lineHeight = {\r\n        name: 'line-height',\r\n        initialValue: 'normal',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.TOKEN_VALUE\r\n    };\r\n    var computeLineHeight = function (token, fontSize) {\r\n        if (isIdentToken(token) && token.value === 'normal') {\r\n            return 1.2 * fontSize;\r\n        }\r\n        else if (token.type === TokenType.NUMBER_TOKEN) {\r\n            return fontSize * token.number;\r\n        }\r\n        else if (isLengthPercentage(token)) {\r\n            return getAbsoluteValue(token, fontSize);\r\n        }\r\n        return fontSize;\r\n    };\r\n\r\n    var listStyleImage = {\r\n        name: 'list-style-image',\r\n        initialValue: 'none',\r\n        type: PropertyDescriptorParsingType.VALUE,\r\n        prefix: false,\r\n        parse: function (token) {\r\n            if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {\r\n                return null;\r\n            }\r\n            return image.parse(token);\r\n        }\r\n    };\r\n\r\n    var LIST_STYLE_POSITION;\r\n    (function (LIST_STYLE_POSITION) {\r\n        LIST_STYLE_POSITION[LIST_STYLE_POSITION[\"INSIDE\"] = 0] = \"INSIDE\";\r\n        LIST_STYLE_POSITION[LIST_STYLE_POSITION[\"OUTSIDE\"] = 1] = \"OUTSIDE\";\r\n    })(LIST_STYLE_POSITION || (LIST_STYLE_POSITION = {}));\r\n    var listStylePosition = {\r\n        name: 'list-style-position',\r\n        initialValue: 'outside',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (position) {\r\n            switch (position) {\r\n                case 'inside':\r\n                    return LIST_STYLE_POSITION.INSIDE;\r\n                case 'outside':\r\n                default:\r\n                    return LIST_STYLE_POSITION.OUTSIDE;\r\n            }\r\n        }\r\n    };\r\n\r\n    var LIST_STYLE_TYPE;\r\n    (function (LIST_STYLE_TYPE) {\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"NONE\"] = -1] = \"NONE\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"DISC\"] = 0] = \"DISC\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"CIRCLE\"] = 1] = \"CIRCLE\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"SQUARE\"] = 2] = \"SQUARE\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"DECIMAL\"] = 3] = \"DECIMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"CJK_DECIMAL\"] = 4] = \"CJK_DECIMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"DECIMAL_LEADING_ZERO\"] = 5] = \"DECIMAL_LEADING_ZERO\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"LOWER_ROMAN\"] = 6] = \"LOWER_ROMAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"UPPER_ROMAN\"] = 7] = \"UPPER_ROMAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"LOWER_GREEK\"] = 8] = \"LOWER_GREEK\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"LOWER_ALPHA\"] = 9] = \"LOWER_ALPHA\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"UPPER_ALPHA\"] = 10] = \"UPPER_ALPHA\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"ARABIC_INDIC\"] = 11] = \"ARABIC_INDIC\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"ARMENIAN\"] = 12] = \"ARMENIAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"BENGALI\"] = 13] = \"BENGALI\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"CAMBODIAN\"] = 14] = \"CAMBODIAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"CJK_EARTHLY_BRANCH\"] = 15] = \"CJK_EARTHLY_BRANCH\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"CJK_HEAVENLY_STEM\"] = 16] = \"CJK_HEAVENLY_STEM\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"CJK_IDEOGRAPHIC\"] = 17] = \"CJK_IDEOGRAPHIC\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"DEVANAGARI\"] = 18] = \"DEVANAGARI\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"ETHIOPIC_NUMERIC\"] = 19] = \"ETHIOPIC_NUMERIC\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"GEORGIAN\"] = 20] = \"GEORGIAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"GUJARATI\"] = 21] = \"GUJARATI\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"GURMUKHI\"] = 22] = \"GURMUKHI\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"HEBREW\"] = 22] = \"HEBREW\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"HIRAGANA\"] = 23] = \"HIRAGANA\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"HIRAGANA_IROHA\"] = 24] = \"HIRAGANA_IROHA\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"JAPANESE_FORMAL\"] = 25] = \"JAPANESE_FORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"JAPANESE_INFORMAL\"] = 26] = \"JAPANESE_INFORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"KANNADA\"] = 27] = \"KANNADA\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"KATAKANA\"] = 28] = \"KATAKANA\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"KATAKANA_IROHA\"] = 29] = \"KATAKANA_IROHA\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"KHMER\"] = 30] = \"KHMER\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"KOREAN_HANGUL_FORMAL\"] = 31] = \"KOREAN_HANGUL_FORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"KOREAN_HANJA_FORMAL\"] = 32] = \"KOREAN_HANJA_FORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"KOREAN_HANJA_INFORMAL\"] = 33] = \"KOREAN_HANJA_INFORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"LAO\"] = 34] = \"LAO\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"LOWER_ARMENIAN\"] = 35] = \"LOWER_ARMENIAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"MALAYALAM\"] = 36] = \"MALAYALAM\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"MONGOLIAN\"] = 37] = \"MONGOLIAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"MYANMAR\"] = 38] = \"MYANMAR\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"ORIYA\"] = 39] = \"ORIYA\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"PERSIAN\"] = 40] = \"PERSIAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"SIMP_CHINESE_FORMAL\"] = 41] = \"SIMP_CHINESE_FORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"SIMP_CHINESE_INFORMAL\"] = 42] = \"SIMP_CHINESE_INFORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"TAMIL\"] = 43] = \"TAMIL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"TELUGU\"] = 44] = \"TELUGU\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"THAI\"] = 45] = \"THAI\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"TIBETAN\"] = 46] = \"TIBETAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"TRAD_CHINESE_FORMAL\"] = 47] = \"TRAD_CHINESE_FORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"TRAD_CHINESE_INFORMAL\"] = 48] = \"TRAD_CHINESE_INFORMAL\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"UPPER_ARMENIAN\"] = 49] = \"UPPER_ARMENIAN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"DISCLOSURE_OPEN\"] = 50] = \"DISCLOSURE_OPEN\";\r\n        LIST_STYLE_TYPE[LIST_STYLE_TYPE[\"DISCLOSURE_CLOSED\"] = 51] = \"DISCLOSURE_CLOSED\";\r\n    })(LIST_STYLE_TYPE || (LIST_STYLE_TYPE = {}));\r\n    var listStyleType = {\r\n        name: 'list-style-type',\r\n        initialValue: 'none',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (type) {\r\n            switch (type) {\r\n                case 'disc':\r\n                    return LIST_STYLE_TYPE.DISC;\r\n                case 'circle':\r\n                    return LIST_STYLE_TYPE.CIRCLE;\r\n                case 'square':\r\n                    return LIST_STYLE_TYPE.SQUARE;\r\n                case 'decimal':\r\n                    return LIST_STYLE_TYPE.DECIMAL;\r\n                case 'cjk-decimal':\r\n                    return LIST_STYLE_TYPE.CJK_DECIMAL;\r\n                case 'decimal-leading-zero':\r\n                    return LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO;\r\n                case 'lower-roman':\r\n                    return LIST_STYLE_TYPE.LOWER_ROMAN;\r\n                case 'upper-roman':\r\n                    return LIST_STYLE_TYPE.UPPER_ROMAN;\r\n                case 'lower-greek':\r\n                    return LIST_STYLE_TYPE.LOWER_GREEK;\r\n                case 'lower-alpha':\r\n                    return LIST_STYLE_TYPE.LOWER_ALPHA;\r\n                case 'upper-alpha':\r\n                    return LIST_STYLE_TYPE.UPPER_ALPHA;\r\n                case 'arabic-indic':\r\n                    return LIST_STYLE_TYPE.ARABIC_INDIC;\r\n                case 'armenian':\r\n                    return LIST_STYLE_TYPE.ARMENIAN;\r\n                case 'bengali':\r\n                    return LIST_STYLE_TYPE.BENGALI;\r\n                case 'cambodian':\r\n                    return LIST_STYLE_TYPE.CAMBODIAN;\r\n                case 'cjk-earthly-branch':\r\n                    return LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH;\r\n                case 'cjk-heavenly-stem':\r\n                    return LIST_STYLE_TYPE.CJK_HEAVENLY_STEM;\r\n                case 'cjk-ideographic':\r\n                    return LIST_STYLE_TYPE.CJK_IDEOGRAPHIC;\r\n                case 'devanagari':\r\n                    return LIST_STYLE_TYPE.DEVANAGARI;\r\n                case 'ethiopic-numeric':\r\n                    return LIST_STYLE_TYPE.ETHIOPIC_NUMERIC;\r\n                case 'georgian':\r\n                    return LIST_STYLE_TYPE.GEORGIAN;\r\n                case 'gujarati':\r\n                    return LIST_STYLE_TYPE.GUJARATI;\r\n                case 'gurmukhi':\r\n                    return LIST_STYLE_TYPE.GURMUKHI;\r\n                case 'hebrew':\r\n                    return LIST_STYLE_TYPE.HEBREW;\r\n                case 'hiragana':\r\n                    return LIST_STYLE_TYPE.HIRAGANA;\r\n                case 'hiragana-iroha':\r\n                    return LIST_STYLE_TYPE.HIRAGANA_IROHA;\r\n                case 'japanese-formal':\r\n                    return LIST_STYLE_TYPE.JAPANESE_FORMAL;\r\n                case 'japanese-informal':\r\n                    return LIST_STYLE_TYPE.JAPANESE_INFORMAL;\r\n                case 'kannada':\r\n                    return LIST_STYLE_TYPE.KANNADA;\r\n                case 'katakana':\r\n                    return LIST_STYLE_TYPE.KATAKANA;\r\n                case 'katakana-iroha':\r\n                    return LIST_STYLE_TYPE.KATAKANA_IROHA;\r\n                case 'khmer':\r\n                    return LIST_STYLE_TYPE.KHMER;\r\n                case 'korean-hangul-formal':\r\n                    return LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL;\r\n                case 'korean-hanja-formal':\r\n                    return LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL;\r\n                case 'korean-hanja-informal':\r\n                    return LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL;\r\n                case 'lao':\r\n                    return LIST_STYLE_TYPE.LAO;\r\n                case 'lower-armenian':\r\n                    return LIST_STYLE_TYPE.LOWER_ARMENIAN;\r\n                case 'malayalam':\r\n                    return LIST_STYLE_TYPE.MALAYALAM;\r\n                case 'mongolian':\r\n                    return LIST_STYLE_TYPE.MONGOLIAN;\r\n                case 'myanmar':\r\n                    return LIST_STYLE_TYPE.MYANMAR;\r\n                case 'oriya':\r\n                    return LIST_STYLE_TYPE.ORIYA;\r\n                case 'persian':\r\n                    return LIST_STYLE_TYPE.PERSIAN;\r\n                case 'simp-chinese-formal':\r\n                    return LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL;\r\n                case 'simp-chinese-informal':\r\n                    return LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL;\r\n                case 'tamil':\r\n                    return LIST_STYLE_TYPE.TAMIL;\r\n                case 'telugu':\r\n                    return LIST_STYLE_TYPE.TELUGU;\r\n                case 'thai':\r\n                    return LIST_STYLE_TYPE.THAI;\r\n                case 'tibetan':\r\n                    return LIST_STYLE_TYPE.TIBETAN;\r\n                case 'trad-chinese-formal':\r\n                    return LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL;\r\n                case 'trad-chinese-informal':\r\n                    return LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL;\r\n                case 'upper-armenian':\r\n                    return LIST_STYLE_TYPE.UPPER_ARMENIAN;\r\n                case 'disclosure-open':\r\n                    return LIST_STYLE_TYPE.DISCLOSURE_OPEN;\r\n                case 'disclosure-closed':\r\n                    return LIST_STYLE_TYPE.DISCLOSURE_CLOSED;\r\n                case 'none':\r\n                default:\r\n                    return LIST_STYLE_TYPE.NONE;\r\n            }\r\n        }\r\n    };\r\n\r\n    var marginForSide = function (side) {\r\n        return ({\r\n            name: \"margin-\" + side,\r\n            initialValue: '0',\r\n            prefix: false,\r\n            type: PropertyDescriptorParsingType.TOKEN_VALUE\r\n        });\r\n    };\r\n    var marginTop = marginForSide('top');\r\n    var marginRight = marginForSide('right');\r\n    var marginBottom = marginForSide('bottom');\r\n    var marginLeft = marginForSide('left');\r\n\r\n    var OVERFLOW;\r\n    (function (OVERFLOW) {\r\n        OVERFLOW[OVERFLOW[\"VISIBLE\"] = 0] = \"VISIBLE\";\r\n        OVERFLOW[OVERFLOW[\"HIDDEN\"] = 1] = \"HIDDEN\";\r\n        OVERFLOW[OVERFLOW[\"SCROLL\"] = 2] = \"SCROLL\";\r\n        OVERFLOW[OVERFLOW[\"AUTO\"] = 3] = \"AUTO\";\r\n    })(OVERFLOW || (OVERFLOW = {}));\r\n    var overflow = {\r\n        name: 'overflow',\r\n        initialValue: 'visible',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            return tokens.filter(isIdentToken).map(function (overflow) {\r\n                switch (overflow.value) {\r\n                    case 'hidden':\r\n                        return OVERFLOW.HIDDEN;\r\n                    case 'scroll':\r\n                        return OVERFLOW.SCROLL;\r\n                    case 'auto':\r\n                        return OVERFLOW.AUTO;\r\n                    case 'visible':\r\n                    default:\r\n                        return OVERFLOW.VISIBLE;\r\n                }\r\n            });\r\n        }\r\n    };\r\n\r\n    var OVERFLOW_WRAP;\r\n    (function (OVERFLOW_WRAP) {\r\n        OVERFLOW_WRAP[\"NORMAL\"] = \"normal\";\r\n        OVERFLOW_WRAP[\"BREAK_WORD\"] = \"break-word\";\r\n    })(OVERFLOW_WRAP || (OVERFLOW_WRAP = {}));\r\n    var overflowWrap = {\r\n        name: 'overflow-wrap',\r\n        initialValue: 'normal',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (overflow) {\r\n            switch (overflow) {\r\n                case 'break-word':\r\n                    return OVERFLOW_WRAP.BREAK_WORD;\r\n                case 'normal':\r\n                default:\r\n                    return OVERFLOW_WRAP.NORMAL;\r\n            }\r\n        }\r\n    };\r\n\r\n    var paddingForSide = function (side) {\r\n        return ({\r\n            name: \"padding-\" + side,\r\n            initialValue: '0',\r\n            prefix: false,\r\n            type: PropertyDescriptorParsingType.TYPE_VALUE,\r\n            format: 'length-percentage'\r\n        });\r\n    };\r\n    var paddingTop = paddingForSide('top');\r\n    var paddingRight = paddingForSide('right');\r\n    var paddingBottom = paddingForSide('bottom');\r\n    var paddingLeft = paddingForSide('left');\r\n\r\n    var TEXT_ALIGN;\r\n    (function (TEXT_ALIGN) {\r\n        TEXT_ALIGN[TEXT_ALIGN[\"LEFT\"] = 0] = \"LEFT\";\r\n        TEXT_ALIGN[TEXT_ALIGN[\"CENTER\"] = 1] = \"CENTER\";\r\n        TEXT_ALIGN[TEXT_ALIGN[\"RIGHT\"] = 2] = \"RIGHT\";\r\n    })(TEXT_ALIGN || (TEXT_ALIGN = {}));\r\n    var textAlign = {\r\n        name: 'text-align',\r\n        initialValue: 'left',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (textAlign) {\r\n            switch (textAlign) {\r\n                case 'right':\r\n                    return TEXT_ALIGN.RIGHT;\r\n                case 'center':\r\n                case 'justify':\r\n                    return TEXT_ALIGN.CENTER;\r\n                case 'left':\r\n                default:\r\n                    return TEXT_ALIGN.LEFT;\r\n            }\r\n        }\r\n    };\r\n\r\n    var POSITION;\r\n    (function (POSITION) {\r\n        POSITION[POSITION[\"STATIC\"] = 0] = \"STATIC\";\r\n        POSITION[POSITION[\"RELATIVE\"] = 1] = \"RELATIVE\";\r\n        POSITION[POSITION[\"ABSOLUTE\"] = 2] = \"ABSOLUTE\";\r\n        POSITION[POSITION[\"FIXED\"] = 3] = \"FIXED\";\r\n        POSITION[POSITION[\"STICKY\"] = 4] = \"STICKY\";\r\n    })(POSITION || (POSITION = {}));\r\n    var position = {\r\n        name: 'position',\r\n        initialValue: 'static',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (position) {\r\n            switch (position) {\r\n                case 'relative':\r\n                    return POSITION.RELATIVE;\r\n                case 'absolute':\r\n                    return POSITION.ABSOLUTE;\r\n                case 'fixed':\r\n                    return POSITION.FIXED;\r\n                case 'sticky':\r\n                    return POSITION.STICKY;\r\n            }\r\n            return POSITION.STATIC;\r\n        }\r\n    };\r\n\r\n    var textShadow = {\r\n        name: 'text-shadow',\r\n        initialValue: 'none',\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        prefix: false,\r\n        parse: function (tokens) {\r\n            if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {\r\n                return [];\r\n            }\r\n            return parseFunctionArgs(tokens).map(function (values) {\r\n                var shadow = {\r\n                    color: COLORS.TRANSPARENT,\r\n                    offsetX: ZERO_LENGTH,\r\n                    offsetY: ZERO_LENGTH,\r\n                    blur: ZERO_LENGTH\r\n                };\r\n                var c = 0;\r\n                for (var i = 0; i < values.length; i++) {\r\n                    var token = values[i];\r\n                    if (isLength(token)) {\r\n                        if (c === 0) {\r\n                            shadow.offsetX = token;\r\n                        }\r\n                        else if (c === 1) {\r\n                            shadow.offsetY = token;\r\n                        }\r\n                        else {\r\n                            shadow.blur = token;\r\n                        }\r\n                        c++;\r\n                    }\r\n                    else {\r\n                        shadow.color = color.parse(token);\r\n                    }\r\n                }\r\n                return shadow;\r\n            });\r\n        }\r\n    };\r\n\r\n    var TEXT_TRANSFORM;\r\n    (function (TEXT_TRANSFORM) {\r\n        TEXT_TRANSFORM[TEXT_TRANSFORM[\"NONE\"] = 0] = \"NONE\";\r\n        TEXT_TRANSFORM[TEXT_TRANSFORM[\"LOWERCASE\"] = 1] = \"LOWERCASE\";\r\n        TEXT_TRANSFORM[TEXT_TRANSFORM[\"UPPERCASE\"] = 2] = \"UPPERCASE\";\r\n        TEXT_TRANSFORM[TEXT_TRANSFORM[\"CAPITALIZE\"] = 3] = \"CAPITALIZE\";\r\n    })(TEXT_TRANSFORM || (TEXT_TRANSFORM = {}));\r\n    var textTransform = {\r\n        name: 'text-transform',\r\n        initialValue: 'none',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (textTransform) {\r\n            switch (textTransform) {\r\n                case 'uppercase':\r\n                    return TEXT_TRANSFORM.UPPERCASE;\r\n                case 'lowercase':\r\n                    return TEXT_TRANSFORM.LOWERCASE;\r\n                case 'capitalize':\r\n                    return TEXT_TRANSFORM.CAPITALIZE;\r\n            }\r\n            return TEXT_TRANSFORM.NONE;\r\n        }\r\n    };\r\n\r\n    var transform = {\r\n        name: 'transform',\r\n        initialValue: 'none',\r\n        prefix: true,\r\n        type: PropertyDescriptorParsingType.VALUE,\r\n        parse: function (token) {\r\n            if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {\r\n                return null;\r\n            }\r\n            if (token.type === TokenType.FUNCTION) {\r\n                var transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name];\r\n                if (typeof transformFunction === 'undefined') {\r\n                    throw new Error(\"Attempting to parse an unsupported transform function \\\"\" + token.name + \"\\\"\");\r\n                }\r\n                return transformFunction(token.values);\r\n            }\r\n            return null;\r\n        }\r\n    };\r\n    var matrix = function (args) {\r\n        var values = args.filter(function (arg) { return arg.type === TokenType.NUMBER_TOKEN; }).map(function (arg) { return arg.number; });\r\n        return values.length === 6 ? values : null;\r\n    };\r\n    // doesn't support 3D transforms at the moment\r\n    var matrix3d = function (args) {\r\n        var values = args.filter(function (arg) { return arg.type === TokenType.NUMBER_TOKEN; }).map(function (arg) { return arg.number; });\r\n        var a1 = values[0], b1 = values[1], _a = values[2], _b = values[3], a2 = values[4], b2 = values[5], _c = values[6], _d = values[7], _e = values[8], _f = values[9], _g = values[10], _h = values[11], a4 = values[12], b4 = values[13], _j = values[14], _k = values[15];\r\n        return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null;\r\n    };\r\n    var SUPPORTED_TRANSFORM_FUNCTIONS = {\r\n        matrix: matrix,\r\n        matrix3d: matrix3d\r\n    };\r\n\r\n    var DEFAULT_VALUE = {\r\n        type: TokenType.PERCENTAGE_TOKEN,\r\n        number: 50,\r\n        flags: FLAG_INTEGER\r\n    };\r\n    var DEFAULT = [DEFAULT_VALUE, DEFAULT_VALUE];\r\n    var transformOrigin = {\r\n        name: 'transform-origin',\r\n        initialValue: '50% 50%',\r\n        prefix: true,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            var origins = tokens.filter(isLengthPercentage);\r\n            if (origins.length !== 2) {\r\n                return DEFAULT;\r\n            }\r\n            return [origins[0], origins[1]];\r\n        }\r\n    };\r\n\r\n    var VISIBILITY;\r\n    (function (VISIBILITY) {\r\n        VISIBILITY[VISIBILITY[\"VISIBLE\"] = 0] = \"VISIBLE\";\r\n        VISIBILITY[VISIBILITY[\"HIDDEN\"] = 1] = \"HIDDEN\";\r\n        VISIBILITY[VISIBILITY[\"COLLAPSE\"] = 2] = \"COLLAPSE\";\r\n    })(VISIBILITY || (VISIBILITY = {}));\r\n    var visibility = {\r\n        name: 'visible',\r\n        initialValue: 'none',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (visibility) {\r\n            switch (visibility) {\r\n                case 'hidden':\r\n                    return VISIBILITY.HIDDEN;\r\n                case 'collapse':\r\n                    return VISIBILITY.COLLAPSE;\r\n                case 'visible':\r\n                default:\r\n                    return VISIBILITY.VISIBLE;\r\n            }\r\n        }\r\n    };\r\n\r\n    var WORD_BREAK;\r\n    (function (WORD_BREAK) {\r\n        WORD_BREAK[\"NORMAL\"] = \"normal\";\r\n        WORD_BREAK[\"BREAK_ALL\"] = \"break-all\";\r\n        WORD_BREAK[\"KEEP_ALL\"] = \"keep-all\";\r\n    })(WORD_BREAK || (WORD_BREAK = {}));\r\n    var wordBreak = {\r\n        name: 'word-break',\r\n        initialValue: 'normal',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (wordBreak) {\r\n            switch (wordBreak) {\r\n                case 'break-all':\r\n                    return WORD_BREAK.BREAK_ALL;\r\n                case 'keep-all':\r\n                    return WORD_BREAK.KEEP_ALL;\r\n                case 'normal':\r\n                default:\r\n                    return WORD_BREAK.NORMAL;\r\n            }\r\n        }\r\n    };\r\n\r\n    var zIndex = {\r\n        name: 'z-index',\r\n        initialValue: 'auto',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.VALUE,\r\n        parse: function (token) {\r\n            if (token.type === TokenType.IDENT_TOKEN) {\r\n                return { auto: true, order: 0 };\r\n            }\r\n            if (isNumberToken(token)) {\r\n                return { auto: false, order: token.number };\r\n            }\r\n            throw new Error(\"Invalid z-index number parsed\");\r\n        }\r\n    };\r\n\r\n    var opacity = {\r\n        name: 'opacity',\r\n        initialValue: '1',\r\n        type: PropertyDescriptorParsingType.VALUE,\r\n        prefix: false,\r\n        parse: function (token) {\r\n            if (isNumberToken(token)) {\r\n                return token.number;\r\n            }\r\n            return 1;\r\n        }\r\n    };\r\n\r\n    var textDecorationColor = {\r\n        name: \"text-decoration-color\",\r\n        initialValue: 'transparent',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.TYPE_VALUE,\r\n        format: 'color'\r\n    };\r\n\r\n    var textDecorationLine = {\r\n        name: 'text-decoration-line',\r\n        initialValue: 'none',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            return tokens\r\n                .filter(isIdentToken)\r\n                .map(function (token) {\r\n                    switch (token.value) {\r\n                        case 'underline':\r\n                            return 1 /* UNDERLINE */;\r\n                        case 'overline':\r\n                            return 2 /* OVERLINE */;\r\n                        case 'line-through':\r\n                            return 3 /* LINE_THROUGH */;\r\n                        case 'none':\r\n                            return 4 /* BLINK */;\r\n                    }\r\n                    return 0 /* NONE */;\r\n                })\r\n                .filter(function (line) { return line !== 0 /* NONE */; });\r\n        }\r\n    };\r\n\r\n    var fontFamily = {\r\n        name: \"font-family\",\r\n        initialValue: '',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            return tokens.filter(isStringToken$1).map(function (token) { return token.value; });\r\n        }\r\n    };\r\n    var isStringToken$1 = function (token) {\r\n        return token.type === TokenType.STRING_TOKEN || token.type === TokenType.IDENT_TOKEN;\r\n    };\r\n\r\n    var fontSize = {\r\n        name: \"font-size\",\r\n        initialValue: '0',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.TYPE_VALUE,\r\n        format: 'length'\r\n    };\r\n\r\n    var fontWeight = {\r\n        name: 'font-weight',\r\n        initialValue: 'normal',\r\n        type: PropertyDescriptorParsingType.VALUE,\r\n        prefix: false,\r\n        parse: function (token) {\r\n            if (isNumberToken(token)) {\r\n                return token.number;\r\n            }\r\n            if (isIdentToken(token)) {\r\n                switch (token.value) {\r\n                    case 'bold':\r\n                        return 700;\r\n                    case 'normal':\r\n                    default:\r\n                        return 400;\r\n                }\r\n            }\r\n            return 400;\r\n        }\r\n    };\r\n\r\n    var fontVariant = {\r\n        name: 'font-variant',\r\n        initialValue: 'none',\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        prefix: false,\r\n        parse: function (tokens) {\r\n            return tokens.filter(isIdentToken).map(function (token) { return token.value; });\r\n        }\r\n    };\r\n\r\n    var FONT_STYLE;\r\n    (function (FONT_STYLE) {\r\n        FONT_STYLE[\"NORMAL\"] = \"normal\";\r\n        FONT_STYLE[\"ITALIC\"] = \"italic\";\r\n        FONT_STYLE[\"OBLIQUE\"] = \"oblique\";\r\n    })(FONT_STYLE || (FONT_STYLE = {}));\r\n    var fontStyle = {\r\n        name: 'font-style',\r\n        initialValue: 'normal',\r\n        prefix: false,\r\n        type: PropertyDescriptorParsingType.IDENT_VALUE,\r\n        parse: function (overflow) {\r\n            switch (overflow) {\r\n                case 'oblique':\r\n                    return FONT_STYLE.OBLIQUE;\r\n                case 'italic':\r\n                    return FONT_STYLE.ITALIC;\r\n                case 'normal':\r\n                default:\r\n                    return FONT_STYLE.NORMAL;\r\n            }\r\n        }\r\n    };\r\n\r\n    var contains = function (bit, value) { return (bit & value) !== 0; };\r\n\r\n    var content = {\r\n        name: 'content',\r\n        initialValue: 'none',\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        prefix: false,\r\n        parse: function (tokens) {\r\n            if (tokens.length === 0) {\r\n                return [];\r\n            }\r\n            var first = tokens[0];\r\n            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\r\n                return [];\r\n            }\r\n            return tokens;\r\n        }\r\n    };\r\n\r\n    var counterIncrement = {\r\n        name: 'counter-increment',\r\n        initialValue: 'none',\r\n        prefix: true,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            if (tokens.length === 0) {\r\n                return null;\r\n            }\r\n            var first = tokens[0];\r\n            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\r\n                return null;\r\n            }\r\n            var increments = [];\r\n            var filtered = tokens.filter(nonWhiteSpace);\r\n            for (var i = 0; i < filtered.length; i++) {\r\n                var counter = filtered[i];\r\n                var next = filtered[i + 1];\r\n                if (counter.type === TokenType.IDENT_TOKEN) {\r\n                    var increment = next && isNumberToken(next) ? next.number : 1;\r\n                    increments.push({ counter: counter.value, increment: increment });\r\n                }\r\n            }\r\n            return increments;\r\n        }\r\n    };\r\n\r\n    var counterReset = {\r\n        name: 'counter-reset',\r\n        initialValue: 'none',\r\n        prefix: true,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            if (tokens.length === 0) {\r\n                return [];\r\n            }\r\n            var resets = [];\r\n            var filtered = tokens.filter(nonWhiteSpace);\r\n            for (var i = 0; i < filtered.length; i++) {\r\n                var counter = filtered[i];\r\n                var next = filtered[i + 1];\r\n                if (isIdentToken(counter) && counter.value !== 'none') {\r\n                    var reset = next && isNumberToken(next) ? next.number : 0;\r\n                    resets.push({ counter: counter.value, reset: reset });\r\n                }\r\n            }\r\n            return resets;\r\n        }\r\n    };\r\n\r\n    var quotes = {\r\n        name: 'quotes',\r\n        initialValue: 'none',\r\n        prefix: true,\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        parse: function (tokens) {\r\n            if (tokens.length === 0) {\r\n                return null;\r\n            }\r\n            var first = tokens[0];\r\n            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\r\n                return null;\r\n            }\r\n            var quotes = [];\r\n            var filtered = tokens.filter(isStringToken);\r\n            if (filtered.length % 2 !== 0) {\r\n                return null;\r\n            }\r\n            for (var i = 0; i < filtered.length; i += 2) {\r\n                var open_1 = filtered[i].value;\r\n                var close_1 = filtered[i + 1].value;\r\n                quotes.push({ open: open_1, close: close_1 });\r\n            }\r\n            return quotes;\r\n        }\r\n    };\r\n    var getQuote = function (quotes, depth, open) {\r\n        if (!quotes) {\r\n            return '';\r\n        }\r\n        var quote = quotes[Math.min(depth, quotes.length - 1)];\r\n        if (!quote) {\r\n            return '';\r\n        }\r\n        return open ? quote.open : quote.close;\r\n    };\r\n\r\n    var boxShadow = {\r\n        name: 'box-shadow',\r\n        initialValue: 'none',\r\n        type: PropertyDescriptorParsingType.LIST,\r\n        prefix: false,\r\n        parse: function (tokens) {\r\n            if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {\r\n                return [];\r\n            }\r\n            return parseFunctionArgs(tokens).map(function (values) {\r\n                var shadow = {\r\n                    color: 0x000000ff,\r\n                    offsetX: ZERO_LENGTH,\r\n                    offsetY: ZERO_LENGTH,\r\n                    blur: ZERO_LENGTH,\r\n                    spread: ZERO_LENGTH,\r\n                    inset: false\r\n                };\r\n                var c = 0;\r\n                for (var i = 0; i < values.length; i++) {\r\n                    var token = values[i];\r\n                    if (isIdentWithValue(token, 'inset')) {\r\n                        shadow.inset = true;\r\n                    }\r\n                    else if (isLength(token)) {\r\n                        if (c === 0) {\r\n                            shadow.offsetX = token;\r\n                        }\r\n                        else if (c === 1) {\r\n                            shadow.offsetY = token;\r\n                        }\r\n                        else if (c === 2) {\r\n                            shadow.blur = token;\r\n                        }\r\n                        else {\r\n                            shadow.spread = token;\r\n                        }\r\n                        c++;\r\n                    }\r\n                    else {\r\n                        shadow.color = color.parse(token);\r\n                    }\r\n                }\r\n                return shadow;\r\n            });\r\n        }\r\n    };\r\n\r\n    var CSSParsedDeclaration = /** @class */ (function () {\r\n        function CSSParsedDeclaration(declaration) {\r\n            this.backgroundClip = parse(backgroundClip, declaration.backgroundClip);\r\n            this.backgroundColor = parse(backgroundColor, declaration.backgroundColor);\r\n            this.backgroundImage = parse(backgroundImage, declaration.backgroundImage);\r\n            this.backgroundOrigin = parse(backgroundOrigin, declaration.backgroundOrigin);\r\n            this.backgroundPosition = parse(backgroundPosition, declaration.backgroundPosition);\r\n            this.backgroundRepeat = parse(backgroundRepeat, declaration.backgroundRepeat);\r\n            this.backgroundSize = parse(backgroundSize, declaration.backgroundSize);\r\n            this.borderTopColor = parse(borderTopColor, declaration.borderTopColor);\r\n            this.borderRightColor = parse(borderRightColor, declaration.borderRightColor);\r\n            this.borderBottomColor = parse(borderBottomColor, declaration.borderBottomColor);\r\n            this.borderLeftColor = parse(borderLeftColor, declaration.borderLeftColor);\r\n            this.borderTopLeftRadius = parse(borderTopLeftRadius, declaration.borderTopLeftRadius);\r\n            this.borderTopRightRadius = parse(borderTopRightRadius, declaration.borderTopRightRadius);\r\n            this.borderBottomRightRadius = parse(borderBottomRightRadius, declaration.borderBottomRightRadius);\r\n            this.borderBottomLeftRadius = parse(borderBottomLeftRadius, declaration.borderBottomLeftRadius);\r\n            this.borderTopStyle = parse(borderTopStyle, declaration.borderTopStyle);\r\n            this.borderRightStyle = parse(borderRightStyle, declaration.borderRightStyle);\r\n            this.borderBottomStyle = parse(borderBottomStyle, declaration.borderBottomStyle);\r\n            this.borderLeftStyle = parse(borderLeftStyle, declaration.borderLeftStyle);\r\n            this.borderTopWidth = parse(borderTopWidth, declaration.borderTopWidth);\r\n            this.borderRightWidth = parse(borderRightWidth, declaration.borderRightWidth);\r\n            this.borderBottomWidth = parse(borderBottomWidth, declaration.borderBottomWidth);\r\n            this.borderLeftWidth = parse(borderLeftWidth, declaration.borderLeftWidth);\r\n            this.boxShadow = parse(boxShadow, declaration.boxShadow);\r\n            this.color = parse(color$1, declaration.color);\r\n            this.display = parse(display, declaration.display);\r\n            this.float = parse(float, declaration.cssFloat);\r\n            this.fontFamily = parse(fontFamily, declaration.fontFamily);\r\n            this.fontSize = parse(fontSize, declaration.fontSize);\r\n            this.fontStyle = parse(fontStyle, declaration.fontStyle);\r\n            this.fontVariant = parse(fontVariant, declaration.fontVariant);\r\n            this.fontWeight = parse(fontWeight, declaration.fontWeight);\r\n            this.letterSpacing = parse(letterSpacing, declaration.letterSpacing);\r\n            this.lineBreak = parse(lineBreak, declaration.lineBreak);\r\n            this.lineHeight = parse(lineHeight, declaration.lineHeight);\r\n            this.listStyleImage = parse(listStyleImage, declaration.listStyleImage);\r\n            this.listStylePosition = parse(listStylePosition, declaration.listStylePosition);\r\n            this.listStyleType = parse(listStyleType, declaration.listStyleType);\r\n            this.marginTop = parse(marginTop, declaration.marginTop);\r\n            this.marginRight = parse(marginRight, declaration.marginRight);\r\n            this.marginBottom = parse(marginBottom, declaration.marginBottom);\r\n            this.marginLeft = parse(marginLeft, declaration.marginLeft);\r\n            this.opacity = parse(opacity, declaration.opacity);\r\n            var overflowTuple = parse(overflow, declaration.overflow);\r\n            this.overflowX = overflowTuple[0];\r\n            this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];\r\n            this.overflowWrap = parse(overflowWrap, declaration.overflowWrap);\r\n            this.paddingTop = parse(paddingTop, declaration.paddingTop);\r\n            this.paddingRight = parse(paddingRight, declaration.paddingRight);\r\n            this.paddingBottom = parse(paddingBottom, declaration.paddingBottom);\r\n            this.paddingLeft = parse(paddingLeft, declaration.paddingLeft);\r\n            this.position = parse(position, declaration.position);\r\n            this.textAlign = parse(textAlign, declaration.textAlign);\r\n            this.textDecorationColor = parse(textDecorationColor, declaration.textDecorationColor || declaration.color);\r\n            this.textDecorationLine = parse(textDecorationLine, declaration.textDecorationLine);\r\n            this.textShadow = parse(textShadow, declaration.textShadow);\r\n            this.textTransform = parse(textTransform, declaration.textTransform);\r\n            this.transform = parse(transform, declaration.transform);\r\n            this.transformOrigin = parse(transformOrigin, declaration.transformOrigin);\r\n            this.visibility = parse(visibility, declaration.visibility);\r\n            this.wordBreak = parse(wordBreak, declaration.wordBreak);\r\n            this.zIndex = parse(zIndex, declaration.zIndex);\r\n        }\r\n        CSSParsedDeclaration.prototype.isVisible = function () {\r\n            return this.display > 0 && this.opacity > 0 && this.visibility === VISIBILITY.VISIBLE;\r\n        };\r\n        CSSParsedDeclaration.prototype.isTransparent = function () {\r\n            return isTransparent(this.backgroundColor);\r\n        };\r\n        CSSParsedDeclaration.prototype.isTransformed = function () {\r\n            return this.transform !== null;\r\n        };\r\n        CSSParsedDeclaration.prototype.isPositioned = function () {\r\n            return this.position !== POSITION.STATIC;\r\n        };\r\n        CSSParsedDeclaration.prototype.isPositionedWithZIndex = function () {\r\n            return this.isPositioned() && !this.zIndex.auto;\r\n        };\r\n        CSSParsedDeclaration.prototype.isFloating = function () {\r\n            return this.float !== FLOAT.NONE;\r\n        };\r\n        CSSParsedDeclaration.prototype.isInlineLevel = function () {\r\n            return (contains(this.display, 4 /* INLINE */) ||\r\n                contains(this.display, 33554432 /* INLINE_BLOCK */) ||\r\n                contains(this.display, 268435456 /* INLINE_FLEX */) ||\r\n                contains(this.display, 536870912 /* INLINE_GRID */) ||\r\n                contains(this.display, 67108864 /* INLINE_LIST_ITEM */) ||\r\n                contains(this.display, 134217728 /* INLINE_TABLE */));\r\n        };\r\n        return CSSParsedDeclaration;\r\n    }());\r\n    var CSSParsedPseudoDeclaration = /** @class */ (function () {\r\n        function CSSParsedPseudoDeclaration(declaration) {\r\n            this.content = parse(content, declaration.content);\r\n            this.quotes = parse(quotes, declaration.quotes);\r\n        }\r\n        return CSSParsedPseudoDeclaration;\r\n    }());\r\n    var CSSParsedCounterDeclaration = /** @class */ (function () {\r\n        function CSSParsedCounterDeclaration(declaration) {\r\n            this.counterIncrement = parse(counterIncrement, declaration.counterIncrement);\r\n            this.counterReset = parse(counterReset, declaration.counterReset);\r\n        }\r\n        return CSSParsedCounterDeclaration;\r\n    }());\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    var parse = function (descriptor, style) {\r\n        var tokenizer = new Tokenizer();\r\n        var value = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue;\r\n        tokenizer.write(value);\r\n        var parser = new Parser(tokenizer.read());\r\n        switch (descriptor.type) {\r\n            case PropertyDescriptorParsingType.IDENT_VALUE:\r\n                var token = parser.parseComponentValue();\r\n                return descriptor.parse(isIdentToken(token) ? token.value : descriptor.initialValue);\r\n            case PropertyDescriptorParsingType.VALUE:\r\n                return descriptor.parse(parser.parseComponentValue());\r\n            case PropertyDescriptorParsingType.LIST:\r\n                return descriptor.parse(parser.parseComponentValues());\r\n            case PropertyDescriptorParsingType.TOKEN_VALUE:\r\n                return parser.parseComponentValue();\r\n            case PropertyDescriptorParsingType.TYPE_VALUE:\r\n                switch (descriptor.format) {\r\n                    case 'angle':\r\n                        return angle.parse(parser.parseComponentValue());\r\n                    case 'color':\r\n                        return color.parse(parser.parseComponentValue());\r\n                    case 'image':\r\n                        return image.parse(parser.parseComponentValue());\r\n                    case 'length':\r\n                        var length_1 = parser.parseComponentValue();\r\n                        return isLength(length_1) ? length_1 : ZERO_LENGTH;\r\n                    case 'length-percentage':\r\n                        var value_1 = parser.parseComponentValue();\r\n                        return isLengthPercentage(value_1) ? value_1 : ZERO_LENGTH;\r\n                }\r\n        }\r\n        throw new Error(\"Attempting to parse unsupported css format type \" + descriptor.format);\r\n    };\r\n\r\n    var ElementContainer = /** @class */ (function () {\r\n        function ElementContainer(element) {\r\n            this.styles = new CSSParsedDeclaration(window.getComputedStyle(element, null));\r\n            this.textNodes = [];\r\n            this.elements = [];\r\n            if (this.styles.transform !== null && isHTMLElementNode(element)) {\r\n                // getBoundingClientRect takes transforms into account\r\n                element.style.transform = 'none';\r\n            }\r\n            this.bounds = parseBounds(element);\r\n            this.flags = 0;\r\n        }\r\n        return ElementContainer;\r\n    }());\r\n\r\n    var TextBounds = /** @class */ (function () {\r\n        function TextBounds(text, bounds) {\r\n            this.text = text;\r\n            this.bounds = bounds;\r\n        }\r\n        return TextBounds;\r\n    }());\r\n    var parseTextBounds = function (value, styles, node) {\r\n        var textList = breakText(value, styles);\r\n        var textBounds = [];\r\n        var offset = 0;\r\n        textList.forEach(function (text) {\r\n            if (styles.textDecorationLine.length || text.trim().length > 0) {\r\n                if (FEATURES.SUPPORT_RANGE_BOUNDS) {\r\n                    textBounds.push(new TextBounds(text, getRangeBounds(node, offset, text.length)));\r\n                }\r\n                else {\r\n                    var replacementNode = node.splitText(text.length);\r\n                    textBounds.push(new TextBounds(text, getWrapperBounds(node)));\r\n                    node = replacementNode;\r\n                }\r\n            }\r\n            else if (!FEATURES.SUPPORT_RANGE_BOUNDS) {\r\n                node = node.splitText(text.length);\r\n            }\r\n            offset += text.length;\r\n        });\r\n        return textBounds;\r\n    };\r\n    var getWrapperBounds = function (node) {\r\n        var ownerDocument = node.ownerDocument;\r\n        if (ownerDocument) {\r\n            var wrapper = ownerDocument.createElement('html2canvaswrapper');\r\n            wrapper.appendChild(node.cloneNode(true));\r\n            var parentNode = node.parentNode;\r\n            if (parentNode) {\r\n                parentNode.replaceChild(wrapper, node);\r\n                var bounds = parseBounds(wrapper);\r\n                if (wrapper.firstChild) {\r\n                    parentNode.replaceChild(wrapper.firstChild, wrapper);\r\n                }\r\n                return bounds;\r\n            }\r\n        }\r\n        return new Bounds(0, 0, 0, 0);\r\n    };\r\n    var getRangeBounds = function (node, offset, length) {\r\n        var ownerDocument = node.ownerDocument;\r\n        if (!ownerDocument) {\r\n            throw new Error('Node has no owner document');\r\n        }\r\n        var range = ownerDocument.createRange();\r\n        range.setStart(node, offset);\r\n        range.setEnd(node, offset + length);\r\n        return Bounds.fromClientRect(range.getBoundingClientRect());\r\n    };\r\n    var breakText = function (value, styles) {\r\n        return styles.letterSpacing !== 0 ? toCodePoints(value).map(function (i) { return fromCodePoint(i); }) : breakWords(value, styles);\r\n    };\r\n    var breakWords = function (str, styles) {\r\n        var breaker = LineBreaker(str, {\r\n            lineBreak: styles.lineBreak,\r\n            wordBreak: styles.overflowWrap === OVERFLOW_WRAP.BREAK_WORD ? 'break-word' : styles.wordBreak\r\n        });\r\n        var words = [];\r\n        var bk;\r\n        while (!(bk = breaker.next()).done) {\r\n            if (bk.value) {\r\n                words.push(bk.value.slice());\r\n            }\r\n        }\r\n        return words;\r\n    };\r\n\r\n    var TextContainer = /** @class */ (function () {\r\n        function TextContainer(node, styles) {\r\n            this.text = transform$1(node.data, styles.textTransform);\r\n            this.textBounds = parseTextBounds(this.text, styles, node);\r\n        }\r\n        return TextContainer;\r\n    }());\r\n    var transform$1 = function (text, transform) {\r\n        switch (transform) {\r\n            case TEXT_TRANSFORM.LOWERCASE:\r\n                return text.toLowerCase();\r\n            case TEXT_TRANSFORM.CAPITALIZE:\r\n                return text.replace(CAPITALIZE, capitalize);\r\n            case TEXT_TRANSFORM.UPPERCASE:\r\n                return text.toUpperCase();\r\n            default:\r\n                return text;\r\n        }\r\n    };\r\n    var CAPITALIZE = /(^|\\s|:|-|\\(|\\))([a-z])/g;\r\n    var capitalize = function (m, p1, p2) {\r\n        if (m.length > 0) {\r\n            return p1 + p2.toUpperCase();\r\n        }\r\n        return m;\r\n    };\r\n\r\n    var ImageElementContainer = /** @class */ (function (_super) {\r\n        __extends(ImageElementContainer, _super);\r\n        function ImageElementContainer(img) {\r\n            var _this = _super.call(this, img) || this;\r\n            _this.src = img.currentSrc || img.src;\r\n            _this.intrinsicWidth = img.naturalWidth;\r\n            _this.intrinsicHeight = img.naturalHeight;\r\n            CacheStorage.getInstance().addImage(_this.src);\r\n            return _this;\r\n        }\r\n        return ImageElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var CanvasElementContainer = /** @class */ (function (_super) {\r\n        __extends(CanvasElementContainer, _super);\r\n        function CanvasElementContainer(canvas) {\r\n            var _this = _super.call(this, canvas) || this;\r\n            _this.canvas = canvas;\r\n            _this.intrinsicWidth = canvas.width;\r\n            _this.intrinsicHeight = canvas.height;\r\n            return _this;\r\n        }\r\n        return CanvasElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var SVGElementContainer = /** @class */ (function (_super) {\r\n        __extends(SVGElementContainer, _super);\r\n        function SVGElementContainer(img) {\r\n            var _this = _super.call(this, img) || this;\r\n            var s = new XMLSerializer();\r\n            _this.svg = \"data:image/svg+xml,\" + encodeURIComponent(s.serializeToString(img));\r\n            _this.intrinsicWidth = img.width.baseVal.value;\r\n            _this.intrinsicHeight = img.height.baseVal.value;\r\n            CacheStorage.getInstance().addImage(_this.svg);\r\n            return _this;\r\n        }\r\n        return SVGElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var LIElementContainer = /** @class */ (function (_super) {\r\n        __extends(LIElementContainer, _super);\r\n        function LIElementContainer(element) {\r\n            var _this = _super.call(this, element) || this;\r\n            _this.value = element.value;\r\n            return _this;\r\n        }\r\n        return LIElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var OLElementContainer = /** @class */ (function (_super) {\r\n        __extends(OLElementContainer, _super);\r\n        function OLElementContainer(element) {\r\n            var _this = _super.call(this, element) || this;\r\n            _this.start = element.start;\r\n            _this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;\r\n            return _this;\r\n        }\r\n        return OLElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var CHECKBOX_BORDER_RADIUS = [\r\n        {\r\n            type: TokenType.DIMENSION_TOKEN,\r\n            flags: 0,\r\n            unit: 'px',\r\n            number: 3\r\n        }\r\n    ];\r\n    var RADIO_BORDER_RADIUS = [\r\n        {\r\n            type: TokenType.PERCENTAGE_TOKEN,\r\n            flags: 0,\r\n            number: 50\r\n        }\r\n    ];\r\n    var reformatInputBounds = function (bounds) {\r\n        if (bounds.width > bounds.height) {\r\n            return new Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height);\r\n        }\r\n        else if (bounds.width < bounds.height) {\r\n            return new Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width);\r\n        }\r\n        return bounds;\r\n    };\r\n    var getInputValue = function (node) {\r\n        var value = node.type === PASSWORD ? new Array(node.value.length + 1).join('\\u2022') : node.value;\r\n        return value.length === 0 ? node.placeholder || '' : value;\r\n    };\r\n    var CHECKBOX = 'checkbox';\r\n    var RADIO = 'radio';\r\n    var PASSWORD = 'password';\r\n    var INPUT_COLOR = 0x2a2a2aff;\r\n    var InputElementContainer = /** @class */ (function (_super) {\r\n        __extends(InputElementContainer, _super);\r\n        function InputElementContainer(input) {\r\n            var _this = _super.call(this, input) || this;\r\n            _this.type = input.type.toLowerCase();\r\n            _this.checked = input.checked;\r\n            _this.value = getInputValue(input);\r\n            if (_this.type === CHECKBOX || _this.type === RADIO) {\r\n                _this.styles.backgroundColor = 0xdededeff;\r\n                _this.styles.borderTopColor = _this.styles.borderRightColor = _this.styles.borderBottomColor = _this.styles.borderLeftColor = 0xa5a5a5ff;\r\n                _this.styles.borderTopWidth = _this.styles.borderRightWidth = _this.styles.borderBottomWidth = _this.styles.borderLeftWidth = 1;\r\n                _this.styles.borderTopStyle = _this.styles.borderRightStyle = _this.styles.borderBottomStyle = _this.styles.borderLeftStyle =\r\n                    BORDER_STYLE.SOLID;\r\n                _this.styles.backgroundClip = [BACKGROUND_CLIP.BORDER_BOX];\r\n                _this.styles.backgroundOrigin = [0 /* BORDER_BOX */];\r\n                _this.bounds = reformatInputBounds(_this.bounds);\r\n            }\r\n            switch (_this.type) {\r\n                case CHECKBOX:\r\n                    _this.styles.borderTopRightRadius = _this.styles.borderTopLeftRadius = _this.styles.borderBottomRightRadius = _this.styles.borderBottomLeftRadius = CHECKBOX_BORDER_RADIUS;\r\n                    break;\r\n                case RADIO:\r\n                    _this.styles.borderTopRightRadius = _this.styles.borderTopLeftRadius = _this.styles.borderBottomRightRadius = _this.styles.borderBottomLeftRadius = RADIO_BORDER_RADIUS;\r\n                    break;\r\n            }\r\n            return _this;\r\n        }\r\n        return InputElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var SelectElementContainer = /** @class */ (function (_super) {\r\n        __extends(SelectElementContainer, _super);\r\n        function SelectElementContainer(element) {\r\n            var _this = _super.call(this, element) || this;\r\n            var option = element.options[element.selectedIndex || 0];\r\n            _this.value = option ? option.text || '' : '';\r\n            return _this;\r\n        }\r\n        return SelectElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var TextareaElementContainer = /** @class */ (function (_super) {\r\n        __extends(TextareaElementContainer, _super);\r\n        function TextareaElementContainer(element) {\r\n            var _this = _super.call(this, element) || this;\r\n            _this.value = element.value;\r\n            return _this;\r\n        }\r\n        return TextareaElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var parseColor = function (value) { return color.parse(Parser.create(value).parseComponentValue()); };\r\n    var IFrameElementContainer = /** @class */ (function (_super) {\r\n        __extends(IFrameElementContainer, _super);\r\n        function IFrameElementContainer(iframe) {\r\n            var _this = _super.call(this, iframe) || this;\r\n            _this.src = iframe.src;\r\n            _this.width = parseInt(iframe.width, 10) || 0;\r\n            _this.height = parseInt(iframe.height, 10) || 0;\r\n            _this.backgroundColor = _this.styles.backgroundColor;\r\n            try {\r\n                if (iframe.contentWindow &&\r\n                    iframe.contentWindow.document &&\r\n                    iframe.contentWindow.document.documentElement) {\r\n                    _this.tree = parseTree(iframe.contentWindow.document.documentElement);\r\n                    // http://www.w3.org/TR/css3-background/#special-backgrounds\r\n                    var documentBackgroundColor = iframe.contentWindow.document.documentElement\r\n                        ? parseColor(getComputedStyle(iframe.contentWindow.document.documentElement)\r\n                            .backgroundColor)\r\n                        : COLORS.TRANSPARENT;\r\n                    var bodyBackgroundColor = iframe.contentWindow.document.body\r\n                        ? parseColor(getComputedStyle(iframe.contentWindow.document.body).backgroundColor)\r\n                        : COLORS.TRANSPARENT;\r\n                    _this.backgroundColor = isTransparent(documentBackgroundColor)\r\n                        ? isTransparent(bodyBackgroundColor)\r\n                            ? _this.styles.backgroundColor\r\n                            : bodyBackgroundColor\r\n                        : documentBackgroundColor;\r\n                }\r\n            }\r\n            catch (e) { }\r\n            return _this;\r\n        }\r\n        return IFrameElementContainer;\r\n    }(ElementContainer));\r\n\r\n    var LIST_OWNERS = ['OL', 'UL', 'MENU'];\r\n    var parseNodeTree = function (node, parent, root) {\r\n        for (var childNode = node.firstChild, nextNode = void 0; childNode; childNode = nextNode) {\r\n            nextNode = childNode.nextSibling;\r\n            if (isTextNode(childNode) && childNode.data.trim().length > 0) {\r\n                parent.textNodes.push(new TextContainer(childNode, parent.styles));\r\n            }\r\n            else if (isElementNode(childNode)) {\r\n                var container = createContainer(childNode);\r\n                if (container.styles.isVisible()) {\r\n                    if (createsRealStackingContext(childNode, container, root)) {\r\n                        container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */;\r\n                    }\r\n                    else if (createsStackingContext(container.styles)) {\r\n                        container.flags |= 2 /* CREATES_STACKING_CONTEXT */;\r\n                    }\r\n                    if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) {\r\n                        container.flags |= 8 /* IS_LIST_OWNER */;\r\n                    }\r\n                    parent.elements.push(container);\r\n                    if (!isTextareaElement(childNode) && !isSVGElement(childNode) && !isSelectElement(childNode)) {\r\n                        parseNodeTree(childNode, container, root);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    };\r\n    var createContainer = function (element) {\r\n        if (isImageElement(element)) {\r\n            return new ImageElementContainer(element);\r\n        }\r\n        if (isCanvasElement(element)) {\r\n            return new CanvasElementContainer(element);\r\n        }\r\n        if (isSVGElement(element)) {\r\n            return new SVGElementContainer(element);\r\n        }\r\n        if (isLIElement(element)) {\r\n            return new LIElementContainer(element);\r\n        }\r\n        if (isOLElement(element)) {\r\n            return new OLElementContainer(element);\r\n        }\r\n        if (isInputElement(element)) {\r\n            return new InputElementContainer(element);\r\n        }\r\n        if (isSelectElement(element)) {\r\n            return new SelectElementContainer(element);\r\n        }\r\n        if (isTextareaElement(element)) {\r\n            return new TextareaElementContainer(element);\r\n        }\r\n        if (isIFrameElement(element)) {\r\n            return new IFrameElementContainer(element);\r\n        }\r\n        return new ElementContainer(element);\r\n    };\r\n    var parseTree = function (element) {\r\n        var container = createContainer(element);\r\n        container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */;\r\n        parseNodeTree(element, container, container);\r\n        return container;\r\n    };\r\n    var createsRealStackingContext = function (node, container, root) {\r\n        return (container.styles.isPositionedWithZIndex() ||\r\n            container.styles.opacity < 1 ||\r\n            container.styles.isTransformed() ||\r\n            (isBodyElement(node) && root.styles.isTransparent()));\r\n    };\r\n    var createsStackingContext = function (styles) { return styles.isPositioned() || styles.isFloating(); };\r\n    var isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; };\r\n    var isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; };\r\n    var isHTMLElementNode = function (node) {\r\n        return typeof node.style !== 'undefined';\r\n    };\r\n    var isLIElement = function (node) { return node.tagName === 'LI'; };\r\n    var isOLElement = function (node) { return node.tagName === 'OL'; };\r\n    var isInputElement = function (node) { return node.tagName === 'INPUT'; };\r\n    var isHTMLElement = function (node) { return node.tagName === 'HTML'; };\r\n    var isSVGElement = function (node) { return node.tagName === 'svg'; };\r\n    var isBodyElement = function (node) { return node.tagName === 'BODY'; };\r\n    var isCanvasElement = function (node) { return node.tagName === 'CANVAS'; };\r\n    var isImageElement = function (node) { return node.tagName === 'IMG'; };\r\n    var isIFrameElement = function (node) { return node.tagName === 'IFRAME'; };\r\n    var isStyleElement = function (node) { return node.tagName === 'STYLE'; };\r\n    var isScriptElement = function (node) { return node.tagName === 'SCRIPT'; };\r\n    var isTextareaElement = function (node) { return node.tagName === 'TEXTAREA'; };\r\n    var isSelectElement = function (node) { return node.tagName === 'SELECT'; };\r\n\r\n    var CounterState = /** @class */ (function () {\r\n        function CounterState() {\r\n            this.counters = {};\r\n        }\r\n        CounterState.prototype.getCounterValue = function (name) {\r\n            var counter = this.counters[name];\r\n            if (counter && counter.length) {\r\n                return counter[counter.length - 1];\r\n            }\r\n            return 1;\r\n        };\r\n        CounterState.prototype.getCounterValues = function (name) {\r\n            var counter = this.counters[name];\r\n            return counter ? counter : [];\r\n        };\r\n        CounterState.prototype.pop = function (counters) {\r\n            var _this = this;\r\n            counters.forEach(function (counter) { return _this.counters[counter].pop(); });\r\n        };\r\n        CounterState.prototype.parse = function (style) {\r\n            var _this = this;\r\n            var counterIncrement = style.counterIncrement;\r\n            var counterReset = style.counterReset;\r\n            var canReset = true;\r\n            if (counterIncrement !== null) {\r\n                counterIncrement.forEach(function (entry) {\r\n                    var counter = _this.counters[entry.counter];\r\n                    if (counter && entry.increment !== 0) {\r\n                        canReset = false;\r\n                        counter[Math.max(0, counter.length - 1)] += entry.increment;\r\n                    }\r\n                });\r\n            }\r\n            var counterNames = [];\r\n            if (canReset) {\r\n                counterReset.forEach(function (entry) {\r\n                    var counter = _this.counters[entry.counter];\r\n                    counterNames.push(entry.counter);\r\n                    if (!counter) {\r\n                        counter = _this.counters[entry.counter] = [];\r\n                    }\r\n                    counter.push(entry.reset);\r\n                });\r\n            }\r\n            return counterNames;\r\n        };\r\n        return CounterState;\r\n    }());\r\n    var ROMAN_UPPER = {\r\n        integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],\r\n        values: ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']\r\n    };\r\n    var ARMENIAN = {\r\n        integers: [\r\n            9000,\r\n            8000,\r\n            7000,\r\n            6000,\r\n            5000,\r\n            4000,\r\n            3000,\r\n            2000,\r\n            1000,\r\n            900,\r\n            800,\r\n            700,\r\n            600,\r\n            500,\r\n            400,\r\n            300,\r\n            200,\r\n            100,\r\n            90,\r\n            80,\r\n            70,\r\n            60,\r\n            50,\r\n            40,\r\n            30,\r\n            20,\r\n            10,\r\n            9,\r\n            8,\r\n            7,\r\n            6,\r\n            5,\r\n            4,\r\n            3,\r\n            2,\r\n            1\r\n        ],\r\n        values: [\r\n            'Ք',\r\n            'Փ',\r\n            'Ւ',\r\n            'Ց',\r\n            'Ր',\r\n            'Տ',\r\n            'Վ',\r\n            'Ս',\r\n            'Ռ',\r\n            'Ջ',\r\n            'Պ',\r\n            'Չ',\r\n            'Ո',\r\n            'Շ',\r\n            'Ն',\r\n            'Յ',\r\n            'Մ',\r\n            'Ճ',\r\n            'Ղ',\r\n            'Ձ',\r\n            'Հ',\r\n            'Կ',\r\n            'Ծ',\r\n            'Խ',\r\n            'Լ',\r\n            'Ի',\r\n            'Ժ',\r\n            'Թ',\r\n            'Ը',\r\n            'Է',\r\n            'Զ',\r\n            'Ե',\r\n            'Դ',\r\n            'Գ',\r\n            'Բ',\r\n            'Ա'\r\n        ]\r\n    };\r\n    var HEBREW = {\r\n        integers: [\r\n            10000,\r\n            9000,\r\n            8000,\r\n            7000,\r\n            6000,\r\n            5000,\r\n            4000,\r\n            3000,\r\n            2000,\r\n            1000,\r\n            400,\r\n            300,\r\n            200,\r\n            100,\r\n            90,\r\n            80,\r\n            70,\r\n            60,\r\n            50,\r\n            40,\r\n            30,\r\n            20,\r\n            19,\r\n            18,\r\n            17,\r\n            16,\r\n            15,\r\n            10,\r\n            9,\r\n            8,\r\n            7,\r\n            6,\r\n            5,\r\n            4,\r\n            3,\r\n            2,\r\n            1\r\n        ],\r\n        values: [\r\n            'י׳',\r\n            'ט׳',\r\n            'ח׳',\r\n            'ז׳',\r\n            'ו׳',\r\n            'ה׳',\r\n            'ד׳',\r\n            'ג׳',\r\n            'ב׳',\r\n            'א׳',\r\n            'ת',\r\n            'ש',\r\n            'ר',\r\n            'ק',\r\n            'צ',\r\n            'פ',\r\n            'ע',\r\n            'ס',\r\n            'נ',\r\n            'מ',\r\n            'ל',\r\n            'כ',\r\n            'יט',\r\n            'יח',\r\n            'יז',\r\n            'טז',\r\n            'טו',\r\n            'י',\r\n            'ט',\r\n            'ח',\r\n            'ז',\r\n            'ו',\r\n            'ה',\r\n            'ד',\r\n            'ג',\r\n            'ב',\r\n            'א'\r\n        ]\r\n    };\r\n    var GEORGIAN = {\r\n        integers: [\r\n            10000,\r\n            9000,\r\n            8000,\r\n            7000,\r\n            6000,\r\n            5000,\r\n            4000,\r\n            3000,\r\n            2000,\r\n            1000,\r\n            900,\r\n            800,\r\n            700,\r\n            600,\r\n            500,\r\n            400,\r\n            300,\r\n            200,\r\n            100,\r\n            90,\r\n            80,\r\n            70,\r\n            60,\r\n            50,\r\n            40,\r\n            30,\r\n            20,\r\n            10,\r\n            9,\r\n            8,\r\n            7,\r\n            6,\r\n            5,\r\n            4,\r\n            3,\r\n            2,\r\n            1\r\n        ],\r\n        values: [\r\n            'ჵ',\r\n            'ჰ',\r\n            'ჯ',\r\n            'ჴ',\r\n            'ხ',\r\n            'ჭ',\r\n            'წ',\r\n            'ძ',\r\n            'ც',\r\n            'ჩ',\r\n            'შ',\r\n            'ყ',\r\n            'ღ',\r\n            'ქ',\r\n            'ფ',\r\n            'ჳ',\r\n            'ტ',\r\n            'ს',\r\n            'რ',\r\n            'ჟ',\r\n            'პ',\r\n            'ო',\r\n            'ჲ',\r\n            'ნ',\r\n            'მ',\r\n            'ლ',\r\n            'კ',\r\n            'ი',\r\n            'თ',\r\n            'ჱ',\r\n            'ზ',\r\n            'ვ',\r\n            'ე',\r\n            'დ',\r\n            'გ',\r\n            'ბ',\r\n            'ა'\r\n        ]\r\n    };\r\n    var createAdditiveCounter = function (value, min, max, symbols, fallback, suffix) {\r\n        if (value < min || value > max) {\r\n            return createCounterText(value, fallback, suffix.length > 0);\r\n        }\r\n        return (symbols.integers.reduce(function (string, integer, index) {\r\n            while (value >= integer) {\r\n                value -= integer;\r\n                string += symbols.values[index];\r\n            }\r\n            return string;\r\n        }, '') + suffix);\r\n    };\r\n    var createCounterStyleWithSymbolResolver = function (value, codePointRangeLength, isNumeric, resolver) {\r\n        var string = '';\r\n        do {\r\n            if (!isNumeric) {\r\n                value--;\r\n            }\r\n            string = resolver(value) + string;\r\n            value /= codePointRangeLength;\r\n        } while (value * codePointRangeLength >= codePointRangeLength);\r\n        return string;\r\n    };\r\n    var createCounterStyleFromRange = function (value, codePointRangeStart, codePointRangeEnd, isNumeric, suffix) {\r\n        var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1;\r\n        return ((value < 0 ? '-' : '') +\r\n            (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, function (codePoint) {\r\n                return fromCodePoint(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart);\r\n            }) +\r\n                suffix));\r\n    };\r\n    var createCounterStyleFromSymbols = function (value, symbols, suffix) {\r\n        if (suffix === void 0) { suffix = '. '; }\r\n        var codePointRangeLength = symbols.length;\r\n        return (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, false, function (codePoint) { return symbols[Math.floor(codePoint % codePointRangeLength)]; }) + suffix);\r\n    };\r\n    var CJK_ZEROS = 1 << 0;\r\n    var CJK_TEN_COEFFICIENTS = 1 << 1;\r\n    var CJK_TEN_HIGH_COEFFICIENTS = 1 << 2;\r\n    var CJK_HUNDRED_COEFFICIENTS = 1 << 3;\r\n    var createCJKCounter = function (value, numbers, multipliers, negativeSign, suffix, flags) {\r\n        if (value < -9999 || value > 9999) {\r\n            return createCounterText(value, LIST_STYLE_TYPE.CJK_DECIMAL, suffix.length > 0);\r\n        }\r\n        var tmp = Math.abs(value);\r\n        var string = suffix;\r\n        if (tmp === 0) {\r\n            return numbers[0] + string;\r\n        }\r\n        for (var digit = 0; tmp > 0 && digit <= 4; digit++) {\r\n            var coefficient = tmp % 10;\r\n            if (coefficient === 0 && contains(flags, CJK_ZEROS) && string !== '') {\r\n                string = numbers[coefficient] + string;\r\n            }\r\n            else if (coefficient > 1 ||\r\n                (coefficient === 1 && digit === 0) ||\r\n                (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_COEFFICIENTS)) ||\r\n                (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100) ||\r\n                (coefficient === 1 && digit > 1 && contains(flags, CJK_HUNDRED_COEFFICIENTS))) {\r\n                string = numbers[coefficient] + (digit > 0 ? multipliers[digit - 1] : '') + string;\r\n            }\r\n            else if (coefficient === 1 && digit > 0) {\r\n                string = multipliers[digit - 1] + string;\r\n            }\r\n            tmp = Math.floor(tmp / 10);\r\n        }\r\n        return (value < 0 ? negativeSign : '') + string;\r\n    };\r\n    var CHINESE_INFORMAL_MULTIPLIERS = '十百千萬';\r\n    var CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬';\r\n    var JAPANESE_NEGATIVE = 'マイナス';\r\n    var KOREAN_NEGATIVE = '마이너스';\r\n    var createCounterText = function (value, type, appendSuffix) {\r\n        var defaultSuffix = appendSuffix ? '. ' : '';\r\n        var cjkSuffix = appendSuffix ? '、' : '';\r\n        var koreanSuffix = appendSuffix ? ', ' : '';\r\n        var spaceSuffix = appendSuffix ? ' ' : '';\r\n        switch (type) {\r\n            case LIST_STYLE_TYPE.DISC:\r\n                return '•' + spaceSuffix;\r\n            case LIST_STYLE_TYPE.CIRCLE:\r\n                return '◦' + spaceSuffix;\r\n            case LIST_STYLE_TYPE.SQUARE:\r\n                return '◾' + spaceSuffix;\r\n            case LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO:\r\n                var string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);\r\n                return string.length < 4 ? \"0\" + string : string;\r\n            case LIST_STYLE_TYPE.CJK_DECIMAL:\r\n                return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix);\r\n            case LIST_STYLE_TYPE.LOWER_ROMAN:\r\n                return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase();\r\n            case LIST_STYLE_TYPE.UPPER_ROMAN:\r\n                return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);\r\n            case LIST_STYLE_TYPE.LOWER_GREEK:\r\n                return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix);\r\n            case LIST_STYLE_TYPE.LOWER_ALPHA:\r\n                return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix);\r\n            case LIST_STYLE_TYPE.UPPER_ALPHA:\r\n                return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix);\r\n            case LIST_STYLE_TYPE.ARABIC_INDIC:\r\n                return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.ARMENIAN:\r\n            case LIST_STYLE_TYPE.UPPER_ARMENIAN:\r\n                return createAdditiveCounter(value, 1, 9999, ARMENIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);\r\n            case LIST_STYLE_TYPE.LOWER_ARMENIAN:\r\n                return createAdditiveCounter(value, 1, 9999, ARMENIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase();\r\n            case LIST_STYLE_TYPE.BENGALI:\r\n                return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.CAMBODIAN:\r\n            case LIST_STYLE_TYPE.KHMER:\r\n                return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH:\r\n                return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix);\r\n            case LIST_STYLE_TYPE.CJK_HEAVENLY_STEM:\r\n                return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix);\r\n            case LIST_STYLE_TYPE.CJK_IDEOGRAPHIC:\r\n            case LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL:\r\n                return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);\r\n            case LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL:\r\n                return createCJKCounter(value, '零壹貳參肆伍陸柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);\r\n            case LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL:\r\n                return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);\r\n            case LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL:\r\n                return createCJKCounter(value, '零壹贰叁肆伍陆柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);\r\n            case LIST_STYLE_TYPE.JAPANESE_INFORMAL:\r\n                return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0);\r\n            case LIST_STYLE_TYPE.JAPANESE_FORMAL:\r\n                return createCJKCounter(value, '零壱弐参四伍六七八九', '拾百千万', JAPANESE_NEGATIVE, cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);\r\n            case LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL:\r\n                return createCJKCounter(value, '영일이삼사오육칠팔구', '십백천만', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);\r\n            case LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL:\r\n                return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0);\r\n            case LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL:\r\n                return createCJKCounter(value, '零壹貳參四五六七八九', '拾百千', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);\r\n            case LIST_STYLE_TYPE.DEVANAGARI:\r\n                return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.GEORGIAN:\r\n                return createAdditiveCounter(value, 1, 19999, GEORGIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);\r\n            case LIST_STYLE_TYPE.GUJARATI:\r\n                return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.GURMUKHI:\r\n                return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.HEBREW:\r\n                return createAdditiveCounter(value, 1, 10999, HEBREW, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);\r\n            case LIST_STYLE_TYPE.HIRAGANA:\r\n                return createCounterStyleFromSymbols(value, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん');\r\n            case LIST_STYLE_TYPE.HIRAGANA_IROHA:\r\n                return createCounterStyleFromSymbols(value, 'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす');\r\n            case LIST_STYLE_TYPE.KANNADA:\r\n                return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.KATAKANA:\r\n                return createCounterStyleFromSymbols(value, 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン', cjkSuffix);\r\n            case LIST_STYLE_TYPE.KATAKANA_IROHA:\r\n                return createCounterStyleFromSymbols(value, 'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス', cjkSuffix);\r\n            case LIST_STYLE_TYPE.LAO:\r\n                return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.MONGOLIAN:\r\n                return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.MYANMAR:\r\n                return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.ORIYA:\r\n                return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.PERSIAN:\r\n                return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.TAMIL:\r\n                return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.TELUGU:\r\n                return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.THAI:\r\n                return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.TIBETAN:\r\n                return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix);\r\n            case LIST_STYLE_TYPE.DECIMAL:\r\n            default:\r\n                return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);\r\n        }\r\n    };\r\n\r\n    var IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';\r\n    var DocumentCloner = /** @class */ (function () {\r\n        function DocumentCloner(element, options) {\r\n            this.options = options;\r\n            this.scrolledElements = [];\r\n            this.referenceElement = element;\r\n            this.counters = new CounterState();\r\n            this.quoteDepth = 0;\r\n            if (!element.ownerDocument) {\r\n                throw new Error('Cloned element does not have an owner document');\r\n            }\r\n            this.documentElement = this.cloneNode(element.ownerDocument.documentElement);\r\n        }\r\n        DocumentCloner.prototype.toIFrame = function (ownerDocument, windowSize) {\r\n            var _this = this;\r\n            var iframe = createIFrameContainer(ownerDocument, windowSize);\r\n            if (!iframe.contentWindow) {\r\n                return Promise.reject(\"Unable to find iframe window\");\r\n            }\r\n            var scrollX = ownerDocument.defaultView.pageXOffset;\r\n            var scrollY = ownerDocument.defaultView.pageYOffset;\r\n            var cloneWindow = iframe.contentWindow;\r\n            var documentClone = cloneWindow.document;\r\n            /* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle\r\n             if window url is about:blank, we can assign the url to current by writing onto the document\r\n             */\r\n            var iframeLoad = iframeLoader(iframe).then(function () {\r\n                return __awaiter(_this, void 0, void 0, function () {\r\n                    var onclone;\r\n                    return __generator(this, function (_a) {\r\n                        switch (_a.label) {\r\n                            case 0:\r\n                                this.scrolledElements.forEach(restoreNodeScroll);\r\n                                if (cloneWindow) {\r\n                                    cloneWindow.scrollTo(windowSize.left, windowSize.top);\r\n                                    if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) &&\r\n                                        (cloneWindow.scrollY !== windowSize.top || cloneWindow.scrollX !== windowSize.left)) {\r\n                                        documentClone.documentElement.style.top = -windowSize.top + 'px';\r\n                                        documentClone.documentElement.style.left = -windowSize.left + 'px';\r\n                                        documentClone.documentElement.style.position = 'absolute';\r\n                                    }\r\n                                }\r\n                                onclone = this.options.onclone;\r\n                                if (typeof this.clonedReferenceElement === 'undefined') {\r\n                                    return [2 /*return*/, Promise.reject(\"Error finding the \" + this.referenceElement.nodeName + \" in the cloned document\")];\r\n                                }\r\n                                if (!(documentClone.fonts && documentClone.fonts.ready)) return [3 /*break*/, 2];\r\n                                return [4 /*yield*/, documentClone.fonts.ready];\r\n                            case 1:\r\n                                _a.sent();\r\n                                _a.label = 2;\r\n                            case 2:\r\n                                if (typeof onclone === 'function') {\r\n                                    return [2 /*return*/, Promise.resolve()\r\n                                        .then(function () { return onclone(documentClone); })\r\n                                        .then(function () { return iframe; })];\r\n                                }\r\n                                return [2 /*return*/, iframe];\r\n                        }\r\n                    });\r\n                });\r\n            });\r\n            documentClone.open();\r\n            documentClone.write(serializeDoctype(document.doctype) + \"<html></html>\");\r\n            // Chrome scrolls the parent document for some reason after the write to the cloned window???\r\n            restoreOwnerScroll(this.referenceElement.ownerDocument, scrollX, scrollY);\r\n            documentClone.replaceChild(documentClone.adoptNode(this.documentElement), documentClone.documentElement);\r\n            documentClone.close();\r\n            return iframeLoad;\r\n        };\r\n        DocumentCloner.prototype.createElementClone = function (node) {\r\n            if (isCanvasElement(node)) {\r\n                return this.createCanvasClone(node);\r\n            }\r\n            /*\r\n            if (isIFrameElement(node)) {\r\n                return this.createIFrameClone(node);\r\n            }\r\n    */\r\n            if (isStyleElement(node)) {\r\n                return this.createStyleClone(node);\r\n            }\r\n            return node.cloneNode(false);\r\n        };\r\n        DocumentCloner.prototype.createStyleClone = function (node) {\r\n            try {\r\n                var sheet = node.sheet;\r\n                if (sheet && sheet.cssRules) {\r\n                    var css = [].slice.call(sheet.cssRules, 0).reduce(function (css, rule) {\r\n                        if (rule && typeof rule.cssText === 'string') {\r\n                            return css + rule.cssText;\r\n                        }\r\n                        return css;\r\n                    }, '');\r\n                    var style = node.cloneNode(false);\r\n                    style.textContent = css;\r\n                    return style;\r\n                }\r\n            }\r\n            catch (e) {\r\n                // accessing node.sheet.cssRules throws a DOMException\r\n                Logger.getInstance(this.options.id).error('Unable to access cssRules property', e);\r\n                if (e.name !== 'SecurityError') {\r\n                    throw e;\r\n                }\r\n            }\r\n            return node.cloneNode(false);\r\n        };\r\n        DocumentCloner.prototype.createCanvasClone = function (canvas) {\r\n            if (this.options.inlineImages && canvas.ownerDocument) {\r\n                var img = canvas.ownerDocument.createElement('img');\r\n                try {\r\n                    img.src = canvas.toDataURL();\r\n                    return img;\r\n                }\r\n                catch (e) {\r\n                    Logger.getInstance(this.options.id).info(\"Unable to clone canvas contents, canvas is tainted\");\r\n                }\r\n            }\r\n            var clonedCanvas = canvas.cloneNode(false);\r\n            try {\r\n                clonedCanvas.width = canvas.width;\r\n                clonedCanvas.height = canvas.height;\r\n                var ctx = canvas.getContext('2d');\r\n                var clonedCtx = clonedCanvas.getContext('2d');\r\n                if (clonedCtx) {\r\n                    if (ctx) {\r\n                        clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0);\r\n                    }\r\n                    else {\r\n                        clonedCtx.drawImage(canvas, 0, 0);\r\n                    }\r\n                }\r\n                return clonedCanvas;\r\n            }\r\n            catch (e) { }\r\n            return clonedCanvas;\r\n        };\r\n        /*\r\n        createIFrameClone(iframe: HTMLIFrameElement) {\r\n            const tempIframe = <HTMLIFrameElement>iframe.cloneNode(false);\r\n            const iframeKey = generateIframeKey();\r\n            tempIframe.setAttribute('data-html2canvas-internal-iframe-key', iframeKey);\r\n\r\n            const {width, height} = parseBounds(iframe);\r\n\r\n            this.resourceLoader.cache[iframeKey] = getIframeDocumentElement(iframe, this.options)\r\n                .then(documentElement => {\r\n                    return this.renderer(\r\n                        documentElement,\r\n                        {\r\n                            allowTaint: this.options.allowTaint,\r\n                            backgroundColor: '#ffffff',\r\n                            canvas: null,\r\n                            imageTimeout: this.options.imageTimeout,\r\n                            logging: this.options.logging,\r\n                            proxy: this.options.proxy,\r\n                            removeContainer: this.options.removeContainer,\r\n                            scale: this.options.scale,\r\n                            foreignObjectRendering: this.options.foreignObjectRendering,\r\n                            useCORS: this.options.useCORS,\r\n                            target: new CanvasRenderer(),\r\n                            width,\r\n                            height,\r\n                            x: 0,\r\n                            y: 0,\r\n                            windowWidth: documentElement.ownerDocument.defaultView.innerWidth,\r\n                            windowHeight: documentElement.ownerDocument.defaultView.innerHeight,\r\n                            scrollX: documentElement.ownerDocument.defaultView.pageXOffset,\r\n                            scrollY: documentElement.ownerDocument.defaultView.pageYOffset\r\n                        },\r\n                    );\r\n                })\r\n                .then(\r\n                    (canvas: HTMLCanvasElement) =>\r\n                        new Promise((resolve, reject) => {\r\n                            const iframeCanvas = document.createElement('img');\r\n                            iframeCanvas.onload = () => resolve(canvas);\r\n                            iframeCanvas.onerror = (event) => {\r\n                                // Empty iframes may result in empty \"data:,\" URLs, which are invalid from the <img>'s point of view\r\n                                // and instead of `onload` cause `onerror` and unhandled rejection warnings\r\n                                // https://github.com/niklasvh/html2canvas/issues/1502\r\n                                iframeCanvas.src == 'data:,' ? resolve(canvas) : reject(event);\r\n                            };\r\n                            iframeCanvas.src = canvas.toDataURL();\r\n                            if (tempIframe.parentNode && iframe.ownerDocument && iframe.ownerDocument.defaultView) {\r\n                                tempIframe.parentNode.replaceChild(\r\n                                    copyCSSStyles(\r\n                                        iframe.ownerDocument.defaultView.getComputedStyle(iframe),\r\n                                        iframeCanvas\r\n                                    ),\r\n                                    tempIframe\r\n                                );\r\n                            }\r\n                        })\r\n                );\r\n            return tempIframe;\r\n        }\r\n    */\r\n        DocumentCloner.prototype.cloneNode = function (node) {\r\n            if (isTextNode(node)) {\r\n                return document.createTextNode(node.data);\r\n            }\r\n            if (!node.ownerDocument) {\r\n                return node.cloneNode(false);\r\n            }\r\n            var window = node.ownerDocument.defaultView;\r\n            if (isHTMLElementNode(node) && window) {\r\n                var clone = this.createElementClone(node);\r\n                var style = window.getComputedStyle(node);\r\n                var styleBefore = window.getComputedStyle(node, ':before');\r\n                var styleAfter = window.getComputedStyle(node, ':after');\r\n                if (this.referenceElement === node) {\r\n                    this.clonedReferenceElement = clone;\r\n                }\r\n                if (isBodyElement(clone)) {\r\n                    createPseudoHideStyles(clone);\r\n                }\r\n                var counters = this.counters.parse(new CSSParsedCounterDeclaration(style));\r\n                var before = this.resolvePseudoContent(node, clone, styleBefore, PseudoElementType.BEFORE);\r\n                for (var child = node.firstChild; child; child = child.nextSibling) {\r\n                    if (!isElementNode(child) ||\r\n                        (!isScriptElement(child) &&\r\n                            !child.hasAttribute(IGNORE_ATTRIBUTE) &&\r\n                            (typeof this.options.ignoreElements !== 'function' || !this.options.ignoreElements(child)))) {\r\n                        if (!this.options.copyStyles || !isElementNode(child) || !isStyleElement(child)) {\r\n                            clone.appendChild(this.cloneNode(child));\r\n                        }\r\n                    }\r\n                }\r\n                if (before) {\r\n                    clone.insertBefore(before, clone.firstChild);\r\n                }\r\n                var after = this.resolvePseudoContent(node, clone, styleAfter, PseudoElementType.AFTER);\r\n                if (after) {\r\n                    clone.appendChild(after);\r\n                }\r\n                this.counters.pop(counters);\r\n                if (style && this.options.copyStyles && !isIFrameElement(node)) {\r\n                    copyCSSStyles(style, clone);\r\n                }\r\n                //this.inlineAllImages(clone);\r\n                if (node.scrollTop !== 0 || node.scrollLeft !== 0) {\r\n                    this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]);\r\n                }\r\n                if ((isTextareaElement(node) || isSelectElement(node)) &&\r\n                    (isTextareaElement(clone) || isSelectElement(clone))) {\r\n                    clone.value = node.value;\r\n                }\r\n                return clone;\r\n            }\r\n            return node.cloneNode(false);\r\n        };\r\n        DocumentCloner.prototype.resolvePseudoContent = function (node, clone, style, pseudoElt) {\r\n            var _this = this;\r\n            if (!style) {\r\n                return;\r\n            }\r\n            var value = style.content;\r\n            var document = clone.ownerDocument;\r\n            if (!document || !value || value === 'none' || value === '-moz-alt-content' || style.display === 'none') {\r\n                return;\r\n            }\r\n            this.counters.parse(new CSSParsedCounterDeclaration(style));\r\n            var declaration = new CSSParsedPseudoDeclaration(style);\r\n            var anonymousReplacedElement = document.createElement('html2canvaspseudoelement');\r\n            copyCSSStyles(style, anonymousReplacedElement);\r\n            declaration.content.forEach(function (token) {\r\n                if (token.type === TokenType.STRING_TOKEN) {\r\n                    anonymousReplacedElement.appendChild(document.createTextNode(token.value));\r\n                }\r\n                else if (token.type === TokenType.URL_TOKEN) {\r\n                    var img = document.createElement('img');\r\n                    img.src = token.value;\r\n                    img.style.opacity = '1';\r\n                    anonymousReplacedElement.appendChild(img);\r\n                }\r\n                else if (token.type === TokenType.FUNCTION) {\r\n                    if (token.name === 'attr') {\r\n                        var attr = token.values.filter(isIdentToken);\r\n                        if (attr.length) {\r\n                            anonymousReplacedElement.appendChild(document.createTextNode(node.getAttribute(attr[0].value) || ''));\r\n                        }\r\n                    }\r\n                    else if (token.name === 'counter') {\r\n                        var _a = token.values.filter(nonFunctionArgSeparator), counter = _a[0], counterStyle = _a[1];\r\n                        if (counter && isIdentToken(counter)) {\r\n                            var counterState = _this.counters.getCounterValue(counter.value);\r\n                            var counterType = counterStyle && isIdentToken(counterStyle)\r\n                                ? listStyleType.parse(counterStyle.value)\r\n                                : LIST_STYLE_TYPE.DECIMAL;\r\n                            anonymousReplacedElement.appendChild(document.createTextNode(createCounterText(counterState, counterType, false)));\r\n                        }\r\n                    }\r\n                    else if (token.name === 'counters') {\r\n                        var _b = token.values.filter(nonFunctionArgSeparator), counter = _b[0], delim = _b[1], counterStyle = _b[2];\r\n                        if (counter && isIdentToken(counter)) {\r\n                            var counterStates = _this.counters.getCounterValues(counter.value);\r\n                            var counterType_1 = counterStyle && isIdentToken(counterStyle)\r\n                                ? listStyleType.parse(counterStyle.value)\r\n                                : LIST_STYLE_TYPE.DECIMAL;\r\n                            var separator = delim && delim.type === TokenType.STRING_TOKEN ? delim.value : '';\r\n                            var text = counterStates\r\n                                .map(function (value) { return createCounterText(value, counterType_1, false); })\r\n                                .join(separator);\r\n                            anonymousReplacedElement.appendChild(document.createTextNode(text));\r\n                        }\r\n                    }\r\n                }\r\n                else if (token.type === TokenType.IDENT_TOKEN) {\r\n                    switch (token.value) {\r\n                        case 'open-quote':\r\n                            anonymousReplacedElement.appendChild(document.createTextNode(getQuote(declaration.quotes, _this.quoteDepth++, true)));\r\n                            break;\r\n                        case 'close-quote':\r\n                            anonymousReplacedElement.appendChild(document.createTextNode(getQuote(declaration.quotes, --_this.quoteDepth, false)));\r\n                            break;\r\n                        default:\r\n                            // safari doesn't parse string tokens correctly because of lack of quotes\r\n                            anonymousReplacedElement.appendChild(document.createTextNode(token.value));\r\n                    }\r\n                }\r\n            });\r\n            anonymousReplacedElement.className = PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + \" \" + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;\r\n            clone.className +=\r\n                pseudoElt === PseudoElementType.BEFORE\r\n                    ? \" \" + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE\r\n                    : \" \" + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;\r\n            return anonymousReplacedElement;\r\n        };\r\n        DocumentCloner.destroy = function (container) {\r\n            if (container.parentNode) {\r\n                container.parentNode.removeChild(container);\r\n                return true;\r\n            }\r\n            return false;\r\n        };\r\n        return DocumentCloner;\r\n    }());\r\n    var PseudoElementType;\r\n    (function (PseudoElementType) {\r\n        PseudoElementType[PseudoElementType[\"BEFORE\"] = 0] = \"BEFORE\";\r\n        PseudoElementType[PseudoElementType[\"AFTER\"] = 1] = \"AFTER\";\r\n    })(PseudoElementType || (PseudoElementType = {}));\r\n    var createIFrameContainer = function (ownerDocument, bounds) {\r\n        var cloneIframeContainer = ownerDocument.createElement('iframe');\r\n        cloneIframeContainer.className = 'html2canvas-container';\r\n        cloneIframeContainer.style.visibility = 'hidden';\r\n        cloneIframeContainer.style.position = 'fixed';\r\n        cloneIframeContainer.style.left = '-10000px';\r\n        cloneIframeContainer.style.top = '0px';\r\n        cloneIframeContainer.style.border = '0';\r\n        cloneIframeContainer.width = bounds.width.toString();\r\n        cloneIframeContainer.height = bounds.height.toString();\r\n        cloneIframeContainer.scrolling = 'no'; // ios won't scroll without it\r\n        cloneIframeContainer.setAttribute(IGNORE_ATTRIBUTE, 'true');\r\n        ownerDocument.body.appendChild(cloneIframeContainer);\r\n        return cloneIframeContainer;\r\n    };\r\n    var iframeLoader = function (iframe) {\r\n        return new Promise(function (resolve, reject) {\r\n            var cloneWindow = iframe.contentWindow;\r\n            if (!cloneWindow) {\r\n                return reject(\"No window assigned for iframe\");\r\n            }\r\n            var documentClone = cloneWindow.document;\r\n            cloneWindow.onload = iframe.onload = documentClone.onreadystatechange = function () {\r\n                cloneWindow.onload = iframe.onload = documentClone.onreadystatechange = null;\r\n                var interval = setInterval(function () {\r\n                    if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') {\r\n                        clearInterval(interval);\r\n                        resolve(iframe);\r\n                    }\r\n                }, 50);\r\n            };\r\n        });\r\n    };\r\n    var copyCSSStyles = function (style, target) {\r\n        // Edge does not provide value for cssText\r\n        for (var i = style.length - 1; i >= 0; i--) {\r\n            var property = style.item(i);\r\n            // Safari shows pseudoelements if content is set\r\n            if (property !== 'content') {\r\n                target.style.setProperty(property, style.getPropertyValue(property));\r\n            }\r\n        }\r\n        return target;\r\n    };\r\n    var serializeDoctype = function (doctype) {\r\n        var str = '';\r\n        if (doctype) {\r\n            str += '<!DOCTYPE ';\r\n            if (doctype.name) {\r\n                str += doctype.name;\r\n            }\r\n            if (doctype.internalSubset) {\r\n                str += doctype.internalSubset;\r\n            }\r\n            if (doctype.publicId) {\r\n                str += \"\\\"\" + doctype.publicId + \"\\\"\";\r\n            }\r\n            if (doctype.systemId) {\r\n                str += \"\\\"\" + doctype.systemId + \"\\\"\";\r\n            }\r\n            str += '>';\r\n        }\r\n        return str;\r\n    };\r\n    var restoreOwnerScroll = function (ownerDocument, x, y) {\r\n        if (ownerDocument &&\r\n            ownerDocument.defaultView &&\r\n            (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) {\r\n            ownerDocument.defaultView.scrollTo(x, y);\r\n        }\r\n    };\r\n    var restoreNodeScroll = function (_a) {\r\n        var element = _a[0], x = _a[1], y = _a[2];\r\n        element.scrollLeft = x;\r\n        element.scrollTop = y;\r\n    };\r\n    var PSEUDO_BEFORE = ':before';\r\n    var PSEUDO_AFTER = ':after';\r\n    var PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before';\r\n    var PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after';\r\n    var PSEUDO_HIDE_ELEMENT_STYLE = \"{\\n    content: \\\"\\\" !important;\\n    display: none !important;\\n}\";\r\n    var createPseudoHideStyles = function (body) {\r\n        createStyles(body, \".\" + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + PSEUDO_BEFORE + PSEUDO_HIDE_ELEMENT_STYLE + \"\\n         .\" + PSEUDO_HIDE_ELEMENT_CLASS_AFTER + PSEUDO_AFTER + PSEUDO_HIDE_ELEMENT_STYLE);\r\n    };\r\n    var createStyles = function (body, styles) {\r\n        var document = body.ownerDocument;\r\n        if (document) {\r\n            var style = document.createElement('style');\r\n            style.textContent = styles;\r\n            body.appendChild(style);\r\n        }\r\n    };\r\n\r\n    var PathType;\r\n    (function (PathType) {\r\n        PathType[PathType[\"VECTOR\"] = 0] = \"VECTOR\";\r\n        PathType[PathType[\"BEZIER_CURVE\"] = 1] = \"BEZIER_CURVE\";\r\n    })(PathType || (PathType = {}));\r\n    var equalPath = function (a, b) {\r\n        if (a.length === b.length) {\r\n            return a.some(function (v, i) { return v === b[i]; });\r\n        }\r\n        return false;\r\n    };\r\n    var transformPath = function (path, deltaX, deltaY, deltaW, deltaH) {\r\n        return path.map(function (point, index) {\r\n            switch (index) {\r\n                case 0:\r\n                    return point.add(deltaX, deltaY);\r\n                case 1:\r\n                    return point.add(deltaX + deltaW, deltaY);\r\n                case 2:\r\n                    return point.add(deltaX + deltaW, deltaY + deltaH);\r\n                case 3:\r\n                    return point.add(deltaX, deltaY + deltaH);\r\n            }\r\n            return point;\r\n        });\r\n    };\r\n\r\n    var Vector = /** @class */ (function () {\r\n        function Vector(x, y) {\r\n            this.type = PathType.VECTOR;\r\n            this.x = x;\r\n            this.y = y;\r\n        }\r\n        Vector.prototype.add = function (deltaX, deltaY) {\r\n            return new Vector(this.x + deltaX, this.y + deltaY);\r\n        };\r\n        return Vector;\r\n    }());\r\n\r\n    var lerp = function (a, b, t) {\r\n        return new Vector(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);\r\n    };\r\n    var BezierCurve = /** @class */ (function () {\r\n        function BezierCurve(start, startControl, endControl, end) {\r\n            this.type = PathType.BEZIER_CURVE;\r\n            this.start = start;\r\n            this.startControl = startControl;\r\n            this.endControl = endControl;\r\n            this.end = end;\r\n        }\r\n        BezierCurve.prototype.subdivide = function (t, firstHalf) {\r\n            var ab = lerp(this.start, this.startControl, t);\r\n            var bc = lerp(this.startControl, this.endControl, t);\r\n            var cd = lerp(this.endControl, this.end, t);\r\n            var abbc = lerp(ab, bc, t);\r\n            var bccd = lerp(bc, cd, t);\r\n            var dest = lerp(abbc, bccd, t);\r\n            return firstHalf ? new BezierCurve(this.start, ab, abbc, dest) : new BezierCurve(dest, bccd, cd, this.end);\r\n        };\r\n        BezierCurve.prototype.add = function (deltaX, deltaY) {\r\n            return new BezierCurve(this.start.add(deltaX, deltaY), this.startControl.add(deltaX, deltaY), this.endControl.add(deltaX, deltaY), this.end.add(deltaX, deltaY));\r\n        };\r\n        BezierCurve.prototype.reverse = function () {\r\n            return new BezierCurve(this.end, this.endControl, this.startControl, this.start);\r\n        };\r\n        return BezierCurve;\r\n    }());\r\n    var isBezierCurve = function (path) { return path.type === PathType.BEZIER_CURVE; };\r\n\r\n    var BoundCurves = /** @class */ (function () {\r\n        function BoundCurves(element) {\r\n            var styles = element.styles;\r\n            var bounds = element.bounds;\r\n            var _a = getAbsoluteValueForTuple(styles.borderTopLeftRadius, bounds.width, bounds.height), tlh = _a[0], tlv = _a[1];\r\n            var _b = getAbsoluteValueForTuple(styles.borderTopRightRadius, bounds.width, bounds.height), trh = _b[0], trv = _b[1];\r\n            var _c = getAbsoluteValueForTuple(styles.borderBottomRightRadius, bounds.width, bounds.height), brh = _c[0], brv = _c[1];\r\n            var _d = getAbsoluteValueForTuple(styles.borderBottomLeftRadius, bounds.width, bounds.height), blh = _d[0], blv = _d[1];\r\n            var factors = [];\r\n            factors.push((tlh + trh) / bounds.width);\r\n            factors.push((blh + brh) / bounds.width);\r\n            factors.push((tlv + blv) / bounds.height);\r\n            factors.push((trv + brv) / bounds.height);\r\n            var maxFactor = Math.max.apply(Math, factors);\r\n            if (maxFactor > 1) {\r\n                tlh /= maxFactor;\r\n                tlv /= maxFactor;\r\n                trh /= maxFactor;\r\n                trv /= maxFactor;\r\n                brh /= maxFactor;\r\n                brv /= maxFactor;\r\n                blh /= maxFactor;\r\n                blv /= maxFactor;\r\n            }\r\n            var topWidth = bounds.width - trh;\r\n            var rightHeight = bounds.height - brv;\r\n            var bottomWidth = bounds.width - brh;\r\n            var leftHeight = bounds.height - blv;\r\n            var borderTopWidth = styles.borderTopWidth;\r\n            var borderRightWidth = styles.borderRightWidth;\r\n            var borderBottomWidth = styles.borderBottomWidth;\r\n            var borderLeftWidth = styles.borderLeftWidth;\r\n            var paddingTop = getAbsoluteValue(styles.paddingTop, element.bounds.width);\r\n            var paddingRight = getAbsoluteValue(styles.paddingRight, element.bounds.width);\r\n            var paddingBottom = getAbsoluteValue(styles.paddingBottom, element.bounds.width);\r\n            var paddingLeft = getAbsoluteValue(styles.paddingLeft, element.bounds.width);\r\n            this.topLeftBorderBox =\r\n                tlh > 0 || tlv > 0\r\n                    ? getCurvePoints(bounds.left, bounds.top, tlh, tlv, CORNER.TOP_LEFT)\r\n                    : new Vector(bounds.left, bounds.top);\r\n            this.topRightBorderBox =\r\n                trh > 0 || trv > 0\r\n                    ? getCurvePoints(bounds.left + topWidth, bounds.top, trh, trv, CORNER.TOP_RIGHT)\r\n                    : new Vector(bounds.left + bounds.width, bounds.top);\r\n            this.bottomRightBorderBox =\r\n                brh > 0 || brv > 0\r\n                    ? getCurvePoints(bounds.left + bottomWidth, bounds.top + rightHeight, brh, brv, CORNER.BOTTOM_RIGHT)\r\n                    : new Vector(bounds.left + bounds.width, bounds.top + bounds.height);\r\n            this.bottomLeftBorderBox =\r\n                blh > 0 || blv > 0\r\n                    ? getCurvePoints(bounds.left, bounds.top + leftHeight, blh, blv, CORNER.BOTTOM_LEFT)\r\n                    : new Vector(bounds.left, bounds.top + bounds.height);\r\n            this.topLeftPaddingBox =\r\n                tlh > 0 || tlv > 0\r\n                    ? getCurvePoints(bounds.left + borderLeftWidth, bounds.top + borderTopWidth, Math.max(0, tlh - borderLeftWidth), Math.max(0, tlv - borderTopWidth), CORNER.TOP_LEFT)\r\n                    : new Vector(bounds.left + borderLeftWidth, bounds.top + borderTopWidth);\r\n            this.topRightPaddingBox =\r\n                trh > 0 || trv > 0\r\n                    ? getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borderLeftWidth), bounds.top + borderTopWidth, topWidth > bounds.width + borderLeftWidth ? 0 : trh - borderLeftWidth, trv - borderTopWidth, CORNER.TOP_RIGHT)\r\n                    : new Vector(bounds.left + bounds.width - borderRightWidth, bounds.top + borderTopWidth);\r\n            this.bottomRightPaddingBox =\r\n                brh > 0 || brv > 0\r\n                    ? getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - borderLeftWidth), bounds.top + Math.min(rightHeight, bounds.height + borderTopWidth), Math.max(0, brh - borderRightWidth), brv - borderBottomWidth, CORNER.BOTTOM_RIGHT)\r\n                    : new Vector(bounds.left + bounds.width - borderRightWidth, bounds.top + bounds.height - borderBottomWidth);\r\n            this.bottomLeftPaddingBox =\r\n                blh > 0 || blv > 0\r\n                    ? getCurvePoints(bounds.left + borderLeftWidth, bounds.top + leftHeight, Math.max(0, blh - borderLeftWidth), blv - borderBottomWidth, CORNER.BOTTOM_LEFT)\r\n                    : new Vector(bounds.left + borderLeftWidth, bounds.top + bounds.height - borderBottomWidth);\r\n            this.topLeftContentBox =\r\n                tlh > 0 || tlv > 0\r\n                    ? getCurvePoints(bounds.left + borderLeftWidth + paddingLeft, bounds.top + borderTopWidth + paddingTop, Math.max(0, tlh - (borderLeftWidth + paddingLeft)), Math.max(0, tlv - (borderTopWidth + paddingTop)), CORNER.TOP_LEFT)\r\n                    : new Vector(bounds.left + borderLeftWidth + paddingLeft, bounds.top + borderTopWidth + paddingTop);\r\n            this.topRightContentBox =\r\n                trh > 0 || trv > 0\r\n                    ? getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borderLeftWidth + paddingLeft), bounds.top + borderTopWidth + paddingTop, topWidth > bounds.width + borderLeftWidth + paddingLeft ? 0 : trh - borderLeftWidth + paddingLeft, trv - (borderTopWidth + paddingTop), CORNER.TOP_RIGHT)\r\n                    : new Vector(bounds.left + bounds.width - (borderRightWidth + paddingRight), bounds.top + borderTopWidth + paddingTop);\r\n            this.bottomRightContentBox =\r\n                brh > 0 || brv > 0\r\n                    ? getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - (borderLeftWidth + paddingLeft)), bounds.top + Math.min(rightHeight, bounds.height + borderTopWidth + paddingTop), Math.max(0, brh - (borderRightWidth + paddingRight)), brv - (borderBottomWidth + paddingBottom), CORNER.BOTTOM_RIGHT)\r\n                    : new Vector(bounds.left + bounds.width - (borderRightWidth + paddingRight), bounds.top + bounds.height - (borderBottomWidth + paddingBottom));\r\n            this.bottomLeftContentBox =\r\n                blh > 0 || blv > 0\r\n                    ? getCurvePoints(bounds.left + borderLeftWidth + paddingLeft, bounds.top + leftHeight, Math.max(0, blh - (borderLeftWidth + paddingLeft)), blv - (borderBottomWidth + paddingBottom), CORNER.BOTTOM_LEFT)\r\n                    : new Vector(bounds.left + borderLeftWidth + paddingLeft, bounds.top + bounds.height - (borderBottomWidth + paddingBottom));\r\n        }\r\n        return BoundCurves;\r\n    }());\r\n    var CORNER;\r\n    (function (CORNER) {\r\n        CORNER[CORNER[\"TOP_LEFT\"] = 0] = \"TOP_LEFT\";\r\n        CORNER[CORNER[\"TOP_RIGHT\"] = 1] = \"TOP_RIGHT\";\r\n        CORNER[CORNER[\"BOTTOM_RIGHT\"] = 2] = \"BOTTOM_RIGHT\";\r\n        CORNER[CORNER[\"BOTTOM_LEFT\"] = 3] = \"BOTTOM_LEFT\";\r\n    })(CORNER || (CORNER = {}));\r\n    var getCurvePoints = function (x, y, r1, r2, position) {\r\n        var kappa = 4 * ((Math.sqrt(2) - 1) / 3);\r\n        var ox = r1 * kappa; // control point offset horizontal\r\n        var oy = r2 * kappa; // control point offset vertical\r\n        var xm = x + r1; // x-middle\r\n        var ym = y + r2; // y-middle\r\n        switch (position) {\r\n            case CORNER.TOP_LEFT:\r\n                return new BezierCurve(new Vector(x, ym), new Vector(x, ym - oy), new Vector(xm - ox, y), new Vector(xm, y));\r\n            case CORNER.TOP_RIGHT:\r\n                return new BezierCurve(new Vector(x, y), new Vector(x + ox, y), new Vector(xm, ym - oy), new Vector(xm, ym));\r\n            case CORNER.BOTTOM_RIGHT:\r\n                return new BezierCurve(new Vector(xm, y), new Vector(xm, y + oy), new Vector(x + ox, ym), new Vector(x, ym));\r\n            case CORNER.BOTTOM_LEFT:\r\n            default:\r\n                return new BezierCurve(new Vector(xm, ym), new Vector(xm - ox, ym), new Vector(x, y + oy), new Vector(x, y));\r\n        }\r\n    };\r\n    var calculateBorderBoxPath = function (curves) {\r\n        return [curves.topLeftBorderBox, curves.topRightBorderBox, curves.bottomRightBorderBox, curves.bottomLeftBorderBox];\r\n    };\r\n    var calculateContentBoxPath = function (curves) {\r\n        return [\r\n            curves.topLeftContentBox,\r\n            curves.topRightContentBox,\r\n            curves.bottomRightContentBox,\r\n            curves.bottomLeftContentBox\r\n        ];\r\n    };\r\n    var calculatePaddingBoxPath = function (curves) {\r\n        return [\r\n            curves.topLeftPaddingBox,\r\n            curves.topRightPaddingBox,\r\n            curves.bottomRightPaddingBox,\r\n            curves.bottomLeftPaddingBox\r\n        ];\r\n    };\r\n\r\n    var TransformEffect = /** @class */ (function () {\r\n        function TransformEffect(offsetX, offsetY, matrix) {\r\n            this.type = 0 /* TRANSFORM */;\r\n            this.offsetX = offsetX;\r\n            this.offsetY = offsetY;\r\n            this.matrix = matrix;\r\n            this.target = 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */;\r\n        }\r\n        return TransformEffect;\r\n    }());\r\n    var ClipEffect = /** @class */ (function () {\r\n        function ClipEffect(path, target) {\r\n            this.type = 1 /* CLIP */;\r\n            this.target = target;\r\n            this.path = path;\r\n        }\r\n        return ClipEffect;\r\n    }());\r\n    var isTransformEffect = function (effect) {\r\n        return effect.type === 0 /* TRANSFORM */;\r\n    };\r\n    var isClipEffect = function (effect) { return effect.type === 1 /* CLIP */; };\r\n\r\n    var StackingContext = /** @class */ (function () {\r\n        function StackingContext(container) {\r\n            this.element = container;\r\n            this.inlineLevel = [];\r\n            this.nonInlineLevel = [];\r\n            this.negativeZIndex = [];\r\n            this.zeroOrAutoZIndexOrTransformedOrOpacity = [];\r\n            this.positiveZIndex = [];\r\n            this.nonPositionedFloats = [];\r\n            this.nonPositionedInlineLevel = [];\r\n        }\r\n        return StackingContext;\r\n    }());\r\n    var ElementPaint = /** @class */ (function () {\r\n        function ElementPaint(element, parentStack) {\r\n            this.container = element;\r\n            this.effects = parentStack.slice(0);\r\n            this.curves = new BoundCurves(element);\r\n            if (element.styles.transform !== null) {\r\n                var offsetX = element.bounds.left + element.styles.transformOrigin[0].number;\r\n                var offsetY = element.bounds.top + element.styles.transformOrigin[1].number;\r\n                var matrix = element.styles.transform;\r\n                this.effects.push(new TransformEffect(offsetX, offsetY, matrix));\r\n            }\r\n            if (element.styles.overflowX !== OVERFLOW.VISIBLE) {\r\n                var borderBox = calculateBorderBoxPath(this.curves);\r\n                var paddingBox = calculatePaddingBoxPath(this.curves);\r\n                if (equalPath(borderBox, paddingBox)) {\r\n                    this.effects.push(new ClipEffect(borderBox, 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */));\r\n                }\r\n                else {\r\n                    this.effects.push(new ClipEffect(borderBox, 2 /* BACKGROUND_BORDERS */));\r\n                    this.effects.push(new ClipEffect(paddingBox, 4 /* CONTENT */));\r\n                }\r\n            }\r\n        }\r\n        ElementPaint.prototype.getParentEffects = function () {\r\n            var effects = this.effects.slice(0);\r\n            if (this.container.styles.overflowX !== OVERFLOW.VISIBLE) {\r\n                var borderBox = calculateBorderBoxPath(this.curves);\r\n                var paddingBox = calculatePaddingBoxPath(this.curves);\r\n                if (!equalPath(borderBox, paddingBox)) {\r\n                    effects.push(new ClipEffect(paddingBox, 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */));\r\n                }\r\n            }\r\n            return effects;\r\n        };\r\n        return ElementPaint;\r\n    }());\r\n    var parseStackTree = function (parent, stackingContext, realStackingContext, listItems) {\r\n        parent.container.elements.forEach(function (child) {\r\n            var treatAsRealStackingContext = contains(child.flags, 4 /* CREATES_REAL_STACKING_CONTEXT */);\r\n            var createsStackingContext = contains(child.flags, 2 /* CREATES_STACKING_CONTEXT */);\r\n            var paintContainer = new ElementPaint(child, parent.getParentEffects());\r\n            if (contains(child.styles.display, 2048 /* LIST_ITEM */)) {\r\n                listItems.push(paintContainer);\r\n            }\r\n            var listOwnerItems = contains(child.flags, 8 /* IS_LIST_OWNER */) ? [] : listItems;\r\n            if (treatAsRealStackingContext || createsStackingContext) {\r\n                var parentStack = treatAsRealStackingContext || child.styles.isPositioned() ? realStackingContext : stackingContext;\r\n                var stack = new StackingContext(paintContainer);\r\n                if (child.styles.isPositioned() || child.styles.opacity < 1 || child.styles.isTransformed()) {\r\n                    var order_1 = child.styles.zIndex.order;\r\n                    if (order_1 < 0) {\r\n                        var index_1 = 0;\r\n                        parentStack.negativeZIndex.some(function (current, i) {\r\n                            if (order_1 > current.element.container.styles.zIndex.order) {\r\n                                index_1 = i;\r\n                                return false;\r\n                            }\r\n                            else if (index_1 > 0) {\r\n                                return true;\r\n                            }\r\n                            return false;\r\n                        });\r\n                        parentStack.negativeZIndex.splice(index_1, 0, stack);\r\n                    }\r\n                    else if (order_1 > 0) {\r\n                        var index_2 = 0;\r\n                        parentStack.positiveZIndex.some(function (current, i) {\r\n                            if (order_1 > current.element.container.styles.zIndex.order) {\r\n                                index_2 = i + 1;\r\n                                return false;\r\n                            }\r\n                            else if (index_2 > 0) {\r\n                                return true;\r\n                            }\r\n                            return false;\r\n                        });\r\n                        parentStack.positiveZIndex.splice(index_2, 0, stack);\r\n                    }\r\n                    else {\r\n                        parentStack.zeroOrAutoZIndexOrTransformedOrOpacity.push(stack);\r\n                    }\r\n                }\r\n                else {\r\n                    if (child.styles.isFloating()) {\r\n                        parentStack.nonPositionedFloats.push(stack);\r\n                    }\r\n                    else {\r\n                        parentStack.nonPositionedInlineLevel.push(stack);\r\n                    }\r\n                }\r\n                parseStackTree(paintContainer, stack, treatAsRealStackingContext ? stack : realStackingContext, listOwnerItems);\r\n            }\r\n            else {\r\n                if (child.styles.isInlineLevel()) {\r\n                    stackingContext.inlineLevel.push(paintContainer);\r\n                }\r\n                else {\r\n                    stackingContext.nonInlineLevel.push(paintContainer);\r\n                }\r\n                parseStackTree(paintContainer, stackingContext, realStackingContext, listOwnerItems);\r\n            }\r\n            if (contains(child.flags, 8 /* IS_LIST_OWNER */)) {\r\n                processListItems(child, listOwnerItems);\r\n            }\r\n        });\r\n    };\r\n    var processListItems = function (owner, elements) {\r\n        var numbering = owner instanceof OLElementContainer ? owner.start : 1;\r\n        var reversed = owner instanceof OLElementContainer ? owner.reversed : false;\r\n        for (var i = 0; i < elements.length; i++) {\r\n            var item = elements[i];\r\n            if (item.container instanceof LIElementContainer &&\r\n                typeof item.container.value === 'number' &&\r\n                item.container.value !== 0) {\r\n                numbering = item.container.value;\r\n            }\r\n            item.listValue = createCounterText(numbering, item.container.styles.listStyleType, true);\r\n            numbering += reversed ? -1 : 1;\r\n        }\r\n    };\r\n    var parseStackingContexts = function (container) {\r\n        var paintContainer = new ElementPaint(container, []);\r\n        var root = new StackingContext(paintContainer);\r\n        var listItems = [];\r\n        parseStackTree(paintContainer, root, root, listItems);\r\n        processListItems(paintContainer.container, listItems);\r\n        return root;\r\n    };\r\n\r\n    var parsePathForBorder = function (curves, borderSide) {\r\n        switch (borderSide) {\r\n            case 0:\r\n                return createPathFromCurves(curves.topLeftBorderBox, curves.topLeftPaddingBox, curves.topRightBorderBox, curves.topRightPaddingBox);\r\n            case 1:\r\n                return createPathFromCurves(curves.topRightBorderBox, curves.topRightPaddingBox, curves.bottomRightBorderBox, curves.bottomRightPaddingBox);\r\n            case 2:\r\n                return createPathFromCurves(curves.bottomRightBorderBox, curves.bottomRightPaddingBox, curves.bottomLeftBorderBox, curves.bottomLeftPaddingBox);\r\n            case 3:\r\n            default:\r\n                return createPathFromCurves(curves.bottomLeftBorderBox, curves.bottomLeftPaddingBox, curves.topLeftBorderBox, curves.topLeftPaddingBox);\r\n        }\r\n    };\r\n    var createPathFromCurves = function (outer1, inner1, outer2, inner2) {\r\n        var path = [];\r\n        if (isBezierCurve(outer1)) {\r\n            path.push(outer1.subdivide(0.5, false));\r\n        }\r\n        else {\r\n            path.push(outer1);\r\n        }\r\n        if (isBezierCurve(outer2)) {\r\n            path.push(outer2.subdivide(0.5, true));\r\n        }\r\n        else {\r\n            path.push(outer2);\r\n        }\r\n        if (isBezierCurve(inner2)) {\r\n            path.push(inner2.subdivide(0.5, true).reverse());\r\n        }\r\n        else {\r\n            path.push(inner2);\r\n        }\r\n        if (isBezierCurve(inner1)) {\r\n            path.push(inner1.subdivide(0.5, false).reverse());\r\n        }\r\n        else {\r\n            path.push(inner1);\r\n        }\r\n        return path;\r\n    };\r\n\r\n    var paddingBox = function (element) {\r\n        var bounds = element.bounds;\r\n        var styles = element.styles;\r\n        return bounds.add(styles.borderLeftWidth, styles.borderTopWidth, -(styles.borderRightWidth + styles.borderLeftWidth), -(styles.borderTopWidth + styles.borderBottomWidth));\r\n    };\r\n    var contentBox = function (element) {\r\n        var styles = element.styles;\r\n        var bounds = element.bounds;\r\n        var paddingLeft = getAbsoluteValue(styles.paddingLeft, bounds.width);\r\n        var paddingRight = getAbsoluteValue(styles.paddingRight, bounds.width);\r\n        var paddingTop = getAbsoluteValue(styles.paddingTop, bounds.width);\r\n        var paddingBottom = getAbsoluteValue(styles.paddingBottom, bounds.width);\r\n        return bounds.add(paddingLeft + styles.borderLeftWidth, paddingTop + styles.borderTopWidth, -(styles.borderRightWidth + styles.borderLeftWidth + paddingLeft + paddingRight), -(styles.borderTopWidth + styles.borderBottomWidth + paddingTop + paddingBottom));\r\n    };\r\n\r\n    var calculateBackgroundPositioningArea = function (backgroundOrigin, element) {\r\n        if (backgroundOrigin === 0 /* BORDER_BOX */) {\r\n            return element.bounds;\r\n        }\r\n        if (backgroundOrigin === 2 /* CONTENT_BOX */) {\r\n            return contentBox(element);\r\n        }\r\n        return paddingBox(element);\r\n    };\r\n    var calculateBackgroundPaintingArea = function (backgroundClip, element) {\r\n        if (backgroundClip === BACKGROUND_CLIP.BORDER_BOX) {\r\n            return element.bounds;\r\n        }\r\n        if (backgroundClip === BACKGROUND_CLIP.CONTENT_BOX) {\r\n            return contentBox(element);\r\n        }\r\n        return paddingBox(element);\r\n    };\r\n    var calculateBackgroundRendering = function (container, index, intrinsicSize) {\r\n        var backgroundPositioningArea = calculateBackgroundPositioningArea(getBackgroundValueForIndex(container.styles.backgroundOrigin, index), container);\r\n        var backgroundPaintingArea = calculateBackgroundPaintingArea(getBackgroundValueForIndex(container.styles.backgroundClip, index), container);\r\n        var backgroundImageSize = calculateBackgroundSize(getBackgroundValueForIndex(container.styles.backgroundSize, index), intrinsicSize, backgroundPositioningArea);\r\n        var sizeWidth = backgroundImageSize[0], sizeHeight = backgroundImageSize[1];\r\n        var position = getAbsoluteValueForTuple(getBackgroundValueForIndex(container.styles.backgroundPosition, index), backgroundPositioningArea.width - sizeWidth, backgroundPositioningArea.height - sizeHeight);\r\n        var path = calculateBackgroundRepeatPath(getBackgroundValueForIndex(container.styles.backgroundRepeat, index), position, backgroundImageSize, backgroundPositioningArea, backgroundPaintingArea);\r\n        var offsetX = Math.round(backgroundPositioningArea.left + position[0]);\r\n        var offsetY = Math.round(backgroundPositioningArea.top + position[1]);\r\n        return [path, offsetX, offsetY, sizeWidth, sizeHeight];\r\n    };\r\n    var isAuto = function (token) { return isIdentToken(token) && token.value === BACKGROUND_SIZE.AUTO; };\r\n    var hasIntrinsicValue = function (value) { return typeof value === 'number'; };\r\n    var calculateBackgroundSize = function (size, _a, bounds) {\r\n        var intrinsicWidth = _a[0], intrinsicHeight = _a[1], intrinsicProportion = _a[2];\r\n        var first = size[0], second = size[1];\r\n        if (isLengthPercentage(first) && second && isLengthPercentage(second)) {\r\n            return [getAbsoluteValue(first, bounds.width), getAbsoluteValue(second, bounds.height)];\r\n        }\r\n        var hasIntrinsicProportion = hasIntrinsicValue(intrinsicProportion);\r\n        if (isIdentToken(first) && (first.value === BACKGROUND_SIZE.CONTAIN || first.value === BACKGROUND_SIZE.COVER)) {\r\n            if (hasIntrinsicValue(intrinsicProportion)) {\r\n                var targetRatio = bounds.width / bounds.height;\r\n                return targetRatio < intrinsicProportion !== (first.value === BACKGROUND_SIZE.COVER)\r\n                    ? [bounds.width, bounds.width / intrinsicProportion]\r\n                    : [bounds.height * intrinsicProportion, bounds.height];\r\n            }\r\n            return [bounds.width, bounds.height];\r\n        }\r\n        var hasIntrinsicWidth = hasIntrinsicValue(intrinsicWidth);\r\n        var hasIntrinsicHeight = hasIntrinsicValue(intrinsicHeight);\r\n        var hasIntrinsicDimensions = hasIntrinsicWidth || hasIntrinsicHeight;\r\n        // If the background-size is auto or auto auto:\r\n        if (isAuto(first) && (!second || isAuto(second))) {\r\n            // If the image has both horizontal and vertical intrinsic dimensions, it's rendered at that size.\r\n            if (hasIntrinsicWidth && hasIntrinsicHeight) {\r\n                return [intrinsicWidth, intrinsicHeight];\r\n            }\r\n            // If the image has no intrinsic dimensions and has no intrinsic proportions,\r\n            // it's rendered at the size of the background positioning area.\r\n            if (!hasIntrinsicProportion && !hasIntrinsicDimensions) {\r\n                return [bounds.width, bounds.height];\r\n            }\r\n            // TODO If the image has no intrinsic dimensions but has intrinsic proportions, it's rendered as if contain had been specified instead.\r\n            // If the image has only one intrinsic dimension and has intrinsic proportions, it's rendered at the size corresponding to that one dimension.\r\n            // The other dimension is computed using the specified dimension and the intrinsic proportions.\r\n            if (hasIntrinsicDimensions && hasIntrinsicProportion) {\r\n                var width_1 = hasIntrinsicWidth\r\n                    ? intrinsicWidth\r\n                    : intrinsicHeight * intrinsicProportion;\r\n                var height_1 = hasIntrinsicHeight\r\n                    ? intrinsicHeight\r\n                    : intrinsicWidth / intrinsicProportion;\r\n                return [width_1, height_1];\r\n            }\r\n            // If the image has only one intrinsic dimension but has no intrinsic proportions,\r\n            // it's rendered using the specified dimension and the other dimension of the background positioning area.\r\n            var width_2 = hasIntrinsicWidth ? intrinsicWidth : bounds.width;\r\n            var height_2 = hasIntrinsicHeight ? intrinsicHeight : bounds.height;\r\n            return [width_2, height_2];\r\n        }\r\n        // If the image has intrinsic proportions, it's stretched to the specified dimension.\r\n        // The unspecified dimension is computed using the specified dimension and the intrinsic proportions.\r\n        if (hasIntrinsicProportion) {\r\n            var width_3 = 0;\r\n            var height_3 = 0;\r\n            if (isLengthPercentage(first)) {\r\n                width_3 = getAbsoluteValue(first, bounds.width);\r\n            }\r\n            else if (isLengthPercentage(second)) {\r\n                height_3 = getAbsoluteValue(second, bounds.height);\r\n            }\r\n            if (isAuto(first)) {\r\n                width_3 = height_3 * intrinsicProportion;\r\n            }\r\n            else if (!second || isAuto(second)) {\r\n                height_3 = width_3 / intrinsicProportion;\r\n            }\r\n            return [width_3, height_3];\r\n        }\r\n        // If the image has no intrinsic proportions, it's stretched to the specified dimension.\r\n        // The unspecified dimension is computed using the image's corresponding intrinsic dimension,\r\n        // if there is one. If there is no such intrinsic dimension,\r\n        // it becomes the corresponding dimension of the background positioning area.\r\n        var width = null;\r\n        var height = null;\r\n        if (isLengthPercentage(first)) {\r\n            width = getAbsoluteValue(first, bounds.width);\r\n        }\r\n        else if (second && isLengthPercentage(second)) {\r\n            height = getAbsoluteValue(second, bounds.height);\r\n        }\r\n        if (width !== null && (!second || isAuto(second))) {\r\n            height =\r\n                hasIntrinsicWidth && hasIntrinsicHeight\r\n                    ? (width / intrinsicWidth) * intrinsicHeight\r\n                    : bounds.height;\r\n        }\r\n        if (height !== null && isAuto(first)) {\r\n            width =\r\n                hasIntrinsicWidth && hasIntrinsicHeight\r\n                    ? (height / intrinsicHeight) * intrinsicWidth\r\n                    : bounds.width;\r\n        }\r\n        if (width !== null && height !== null) {\r\n            return [width, height];\r\n        }\r\n        throw new Error(\"Unable to calculate background-size for element\");\r\n    };\r\n    var getBackgroundValueForIndex = function (values, index) {\r\n        var value = values[index];\r\n        if (typeof value === 'undefined') {\r\n            return values[0];\r\n        }\r\n        return value;\r\n    };\r\n    var calculateBackgroundRepeatPath = function (repeat, _a, _b, backgroundPositioningArea, backgroundPaintingArea) {\r\n        var x = _a[0], y = _a[1];\r\n        var width = _b[0], height = _b[1];\r\n        switch (repeat) {\r\n            case BACKGROUND_REPEAT.REPEAT_X:\r\n                return [\r\n                    new Vector(Math.round(backgroundPositioningArea.left), Math.round(backgroundPositioningArea.top + y)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width), Math.round(backgroundPositioningArea.top + y)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width), Math.round(height + backgroundPositioningArea.top + y)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left), Math.round(height + backgroundPositioningArea.top + y))\r\n                ];\r\n            case BACKGROUND_REPEAT.REPEAT_Y:\r\n                return [\r\n                    new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top))\r\n                ];\r\n            case BACKGROUND_REPEAT.NO_REPEAT:\r\n                return [\r\n                    new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top + y)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top + y)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top + y + height)),\r\n                    new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top + y + height))\r\n                ];\r\n            default:\r\n                return [\r\n                    new Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.top)),\r\n                    new Vector(Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width), Math.round(backgroundPaintingArea.top)),\r\n                    new Vector(Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width), Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top)),\r\n                    new Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top))\r\n                ];\r\n        }\r\n    };\r\n\r\n    var SMALL_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\r\n\r\n    var SAMPLE_TEXT = 'Hidden Text';\r\n    var FontMetrics = /** @class */ (function () {\r\n        function FontMetrics(document) {\r\n            this._data = {};\r\n            this._document = document;\r\n        }\r\n        FontMetrics.prototype.parseMetrics = function (fontFamily, fontSize) {\r\n            var container = this._document.createElement('div');\r\n            var img = this._document.createElement('img');\r\n            var span = this._document.createElement('span');\r\n            var body = this._document.body;\r\n            container.style.visibility = 'hidden';\r\n            container.style.fontFamily = fontFamily;\r\n            container.style.fontSize = fontSize;\r\n            container.style.margin = '0';\r\n            container.style.padding = '0';\r\n            body.appendChild(container);\r\n            img.src = SMALL_IMAGE;\r\n            img.width = 1;\r\n            img.height = 1;\r\n            img.style.margin = '0';\r\n            img.style.padding = '0';\r\n            img.style.verticalAlign = 'baseline';\r\n            span.style.fontFamily = fontFamily;\r\n            span.style.fontSize = fontSize;\r\n            span.style.margin = '0';\r\n            span.style.padding = '0';\r\n            span.appendChild(this._document.createTextNode(SAMPLE_TEXT));\r\n            container.appendChild(span);\r\n            container.appendChild(img);\r\n            var baseline = img.offsetTop - span.offsetTop + 2;\r\n            container.removeChild(span);\r\n            container.appendChild(this._document.createTextNode(SAMPLE_TEXT));\r\n            container.style.lineHeight = 'normal';\r\n            img.style.verticalAlign = 'super';\r\n            var middle = img.offsetTop - container.offsetTop + 2;\r\n            body.removeChild(container);\r\n            return { baseline: baseline, middle: middle };\r\n        };\r\n        FontMetrics.prototype.getMetrics = function (fontFamily, fontSize) {\r\n            var key = fontFamily + \" \" + fontSize;\r\n            if (typeof this._data[key] === 'undefined') {\r\n                this._data[key] = this.parseMetrics(fontFamily, fontSize);\r\n            }\r\n            return this._data[key];\r\n        };\r\n        return FontMetrics;\r\n    }());\r\n\r\n    var MASK_OFFSET = 10000;\r\n    var CanvasRenderer = /** @class */ (function () {\r\n        function CanvasRenderer(options) {\r\n            this._activeEffects = [];\r\n            this.canvas = options.canvas ? options.canvas : document.createElement('canvas');\r\n            this.ctx = this.canvas.getContext('2d');\r\n            this.options = options;\r\n            if (!options.canvas) {\r\n                this.canvas.width = Math.floor(options.width * options.scale);\r\n                this.canvas.height = Math.floor(options.height * options.scale);\r\n                this.canvas.style.width = options.width + \"px\";\r\n                this.canvas.style.height = options.height + \"px\";\r\n            }\r\n            this.fontMetrics = new FontMetrics(document);\r\n            this.ctx.scale(this.options.scale, this.options.scale);\r\n            this.ctx.translate(-options.x + options.scrollX, -options.y + options.scrollY);\r\n            this.ctx.textBaseline = 'bottom';\r\n            this._activeEffects = [];\r\n            Logger.getInstance(options.id).debug(\"Canvas renderer initialized (\" + options.width + \"x\" + options.height + \" at \" + options.x + \",\" + options.y + \") with scale \" + options.scale);\r\n        }\r\n        CanvasRenderer.prototype.applyEffects = function (effects, target) {\r\n            var _this = this;\r\n            while (this._activeEffects.length) {\r\n                this.popEffect();\r\n            }\r\n            effects.filter(function (effect) { return contains(effect.target, target); }).forEach(function (effect) { return _this.applyEffect(effect); });\r\n        };\r\n        CanvasRenderer.prototype.applyEffect = function (effect) {\r\n            this.ctx.save();\r\n            if (isTransformEffect(effect)) {\r\n                this.ctx.translate(effect.offsetX, effect.offsetY);\r\n                this.ctx.transform(effect.matrix[0], effect.matrix[1], effect.matrix[2], effect.matrix[3], effect.matrix[4], effect.matrix[5]);\r\n                this.ctx.translate(-effect.offsetX, -effect.offsetY);\r\n            }\r\n            if (isClipEffect(effect)) {\r\n                this.path(effect.path);\r\n                this.ctx.clip();\r\n            }\r\n            this._activeEffects.push(effect);\r\n        };\r\n        CanvasRenderer.prototype.popEffect = function () {\r\n            this._activeEffects.pop();\r\n            this.ctx.restore();\r\n        };\r\n        CanvasRenderer.prototype.renderStack = function (stack) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var styles;\r\n                return __generator(this, function (_a) {\r\n                    switch (_a.label) {\r\n                        case 0:\r\n                            styles = stack.element.container.styles;\r\n                            if (!styles.isVisible()) return [3 /*break*/, 2];\r\n                            this.ctx.globalAlpha = styles.opacity;\r\n                            return [4 /*yield*/, this.renderStackContent(stack)];\r\n                        case 1:\r\n                            _a.sent();\r\n                            _a.label = 2;\r\n                        case 2: return [2 /*return*/];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.renderNode = function (paint) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                return __generator(this, function (_a) {\r\n                    switch (_a.label) {\r\n                        case 0:\r\n                            if (!paint.container.styles.isVisible()) return [3 /*break*/, 3];\r\n                            return [4 /*yield*/, this.renderNodeBackgroundAndBorders(paint)];\r\n                        case 1:\r\n                            _a.sent();\r\n                            return [4 /*yield*/, this.renderNodeContent(paint)];\r\n                        case 2:\r\n                            _a.sent();\r\n                            _a.label = 3;\r\n                        case 3: return [2 /*return*/];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.renderTextWithLetterSpacing = function (text, letterSpacing) {\r\n            var _this = this;\r\n            if (letterSpacing === 0) {\r\n                this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);\r\n            }\r\n            else {\r\n                var letters = toCodePoints(text.text).map(function (i) { return fromCodePoint(i); });\r\n                letters.reduce(function (left, letter) {\r\n                    _this.ctx.fillText(letter, left, text.bounds.top + text.bounds.height);\r\n                    return left + _this.ctx.measureText(letter).width;\r\n                }, text.bounds.left);\r\n            }\r\n        };\r\n        CanvasRenderer.prototype.createFontStyle = function (styles) {\r\n            var fontVariant = styles.fontVariant\r\n                .filter(function (variant) { return variant === 'normal' || variant === 'small-caps'; })\r\n                .join('');\r\n            var fontFamily = styles.fontFamily.join(', ');\r\n            var fontSize = isDimensionToken(styles.fontSize)\r\n                ? \"\" + styles.fontSize.number + styles.fontSize.unit\r\n                : styles.fontSize.number + \"px\";\r\n            return [\r\n                [styles.fontStyle, fontVariant, styles.fontWeight, fontSize, fontFamily].join(' '),\r\n                fontFamily,\r\n                fontSize\r\n            ];\r\n        };\r\n        CanvasRenderer.prototype.renderTextNode = function (text, styles) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var _a, font, fontFamily, fontSize;\r\n                var _this = this;\r\n                return __generator(this, function (_b) {\r\n                    _a = this.createFontStyle(styles), font = _a[0], fontFamily = _a[1], fontSize = _a[2];\r\n                    this.ctx.font = font;\r\n                    text.textBounds.forEach(function (text) {\r\n                        _this.ctx.fillStyle = asString(styles.color);\r\n                        _this.renderTextWithLetterSpacing(text, styles.letterSpacing);\r\n                        var textShadows = styles.textShadow;\r\n                        if (textShadows.length && text.text.trim().length) {\r\n                            textShadows\r\n                                .slice(0)\r\n                                .reverse()\r\n                                .forEach(function (textShadow) {\r\n                                    _this.ctx.shadowColor = asString(textShadow.color);\r\n                                    _this.ctx.shadowOffsetX = textShadow.offsetX.number * _this.options.scale;\r\n                                    _this.ctx.shadowOffsetY = textShadow.offsetY.number * _this.options.scale;\r\n                                    _this.ctx.shadowBlur = textShadow.blur.number;\r\n                                    _this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);\r\n                                });\r\n                            _this.ctx.shadowColor = '';\r\n                            _this.ctx.shadowOffsetX = 0;\r\n                            _this.ctx.shadowOffsetY = 0;\r\n                            _this.ctx.shadowBlur = 0;\r\n                        }\r\n                        if (styles.textDecorationLine.length) {\r\n                            _this.ctx.fillStyle = asString(styles.textDecorationColor || styles.color);\r\n                            styles.textDecorationLine.forEach(function (textDecorationLine) {\r\n                                switch (textDecorationLine) {\r\n                                    case 1 /* UNDERLINE */:\r\n                                        // Draws a line at the baseline of the font\r\n                                        // TODO As some browsers display the line as more than 1px if the font-size is big,\r\n                                        // need to take that into account both in position and size\r\n                                        var baseline = _this.fontMetrics.getMetrics(fontFamily, fontSize).baseline;\r\n                                        _this.ctx.fillRect(text.bounds.left, Math.round(text.bounds.top + baseline), text.bounds.width, 1);\r\n                                        break;\r\n                                    case 2 /* OVERLINE */:\r\n                                        _this.ctx.fillRect(text.bounds.left, Math.round(text.bounds.top), text.bounds.width, 1);\r\n                                        break;\r\n                                    case 3 /* LINE_THROUGH */:\r\n                                        // TODO try and find exact position for line-through\r\n                                        var middle = _this.fontMetrics.getMetrics(fontFamily, fontSize).middle;\r\n                                        _this.ctx.fillRect(text.bounds.left, Math.ceil(text.bounds.top + middle), text.bounds.width, 1);\r\n                                        break;\r\n                                }\r\n                            });\r\n                        }\r\n                    });\r\n                    return [2 /*return*/];\r\n                });\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.renderReplacedElement = function (container, curves, image) {\r\n            if (image && container.intrinsicWidth > 0 && container.intrinsicHeight > 0) {\r\n                var box = contentBox(container);\r\n                var path = calculatePaddingBoxPath(curves);\r\n                this.path(path);\r\n                this.ctx.save();\r\n                this.ctx.clip();\r\n                this.ctx.drawImage(image, 0, 0, container.intrinsicWidth, container.intrinsicHeight, box.left, box.top, box.width, box.height);\r\n                this.ctx.restore();\r\n            }\r\n        };\r\n        CanvasRenderer.prototype.renderNodeContent = function (paint) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var container, curves, styles, _i, _a, child, image, e_1, image, e_2, iframeRenderer, canvas, size, bounds, x, textBounds, img, image, url, e_3, bounds;\r\n                return __generator(this, function (_b) {\r\n                    switch (_b.label) {\r\n                        case 0:\r\n                            this.applyEffects(paint.effects, 4 /* CONTENT */);\r\n                            container = paint.container;\r\n                            curves = paint.curves;\r\n                            styles = container.styles;\r\n                            _i = 0, _a = container.textNodes;\r\n                            _b.label = 1;\r\n                        case 1:\r\n                            if (!(_i < _a.length)) return [3 /*break*/, 4];\r\n                            child = _a[_i];\r\n                            return [4 /*yield*/, this.renderTextNode(child, styles)];\r\n                        case 2:\r\n                            _b.sent();\r\n                            _b.label = 3;\r\n                        case 3:\r\n                            _i++;\r\n                            return [3 /*break*/, 1];\r\n                        case 4:\r\n                            if (!(container instanceof ImageElementContainer)) return [3 /*break*/, 8];\r\n                            _b.label = 5;\r\n                        case 5:\r\n                            _b.trys.push([5, 7, , 8]);\r\n                            return [4 /*yield*/, this.options.cache.match(container.src)];\r\n                        case 6:\r\n                            image = _b.sent();\r\n                            this.renderReplacedElement(container, curves, image);\r\n                            return [3 /*break*/, 8];\r\n                        case 7:\r\n                            e_1 = _b.sent();\r\n                            Logger.getInstance(this.options.id).error(\"Error loading image \" + container.src);\r\n                            return [3 /*break*/, 8];\r\n                        case 8:\r\n                            if (container instanceof CanvasElementContainer) {\r\n                                this.renderReplacedElement(container, curves, container.canvas);\r\n                            }\r\n                            if (!(container instanceof SVGElementContainer)) return [3 /*break*/, 12];\r\n                            _b.label = 9;\r\n                        case 9:\r\n                            _b.trys.push([9, 11, , 12]);\r\n                            return [4 /*yield*/, this.options.cache.match(container.svg)];\r\n                        case 10:\r\n                            image = _b.sent();\r\n                            this.renderReplacedElement(container, curves, image);\r\n                            return [3 /*break*/, 12];\r\n                        case 11:\r\n                            e_2 = _b.sent();\r\n                            Logger.getInstance(this.options.id).error(\"Error loading svg \" + container.svg.substring(0, 255));\r\n                            return [3 /*break*/, 12];\r\n                        case 12:\r\n                            if (!(container instanceof IFrameElementContainer && container.tree)) return [3 /*break*/, 14];\r\n                            iframeRenderer = new CanvasRenderer({\r\n                                id: this.options.id,\r\n                                scale: this.options.scale,\r\n                                backgroundColor: container.backgroundColor,\r\n                                x: 0,\r\n                                y: 0,\r\n                                scrollX: 0,\r\n                                scrollY: 0,\r\n                                width: container.width,\r\n                                height: container.height,\r\n                                cache: this.options.cache,\r\n                                windowWidth: container.width,\r\n                                windowHeight: container.height\r\n                            });\r\n                            return [4 /*yield*/, iframeRenderer.render(container.tree)];\r\n                        case 13:\r\n                            canvas = _b.sent();\r\n                            if (container.width && container.height) {\r\n                                this.ctx.drawImage(canvas, 0, 0, container.width, container.height, container.bounds.left, container.bounds.top, container.bounds.width, container.bounds.height);\r\n                            }\r\n                            _b.label = 14;\r\n                        case 14:\r\n                            if (container instanceof InputElementContainer) {\r\n                                size = Math.min(container.bounds.width, container.bounds.height);\r\n                                if (container.type === CHECKBOX) {\r\n                                    if (container.checked) {\r\n                                        this.ctx.save();\r\n                                        this.path([\r\n                                            new Vector(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79),\r\n                                            new Vector(container.bounds.left + size * 0.16, container.bounds.top + size * 0.5549),\r\n                                            new Vector(container.bounds.left + size * 0.27347, container.bounds.top + size * 0.44071),\r\n                                            new Vector(container.bounds.left + size * 0.39694, container.bounds.top + size * 0.5649),\r\n                                            new Vector(container.bounds.left + size * 0.72983, container.bounds.top + size * 0.23),\r\n                                            new Vector(container.bounds.left + size * 0.84, container.bounds.top + size * 0.34085),\r\n                                            new Vector(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79)\r\n                                        ]);\r\n                                        this.ctx.fillStyle = asString(INPUT_COLOR);\r\n                                        this.ctx.fill();\r\n                                        this.ctx.restore();\r\n                                    }\r\n                                }\r\n                                else if (container.type === RADIO) {\r\n                                    if (container.checked) {\r\n                                        this.ctx.save();\r\n                                        this.ctx.beginPath();\r\n                                        this.ctx.arc(container.bounds.left + size / 2, container.bounds.top + size / 2, size / 4, 0, Math.PI * 2, true);\r\n                                        this.ctx.fillStyle = asString(INPUT_COLOR);\r\n                                        this.ctx.fill();\r\n                                        this.ctx.restore();\r\n                                    }\r\n                                }\r\n                            }\r\n                            if (isTextInputElement(container) && container.value.length) {\r\n                                this.ctx.font = this.createFontStyle(styles)[0];\r\n                                this.ctx.fillStyle = asString(styles.color);\r\n                                this.ctx.textBaseline = 'middle';\r\n                                this.ctx.textAlign = canvasTextAlign(container.styles.textAlign);\r\n                                bounds = contentBox(container);\r\n                                x = 0;\r\n                                switch (container.styles.textAlign) {\r\n                                    case TEXT_ALIGN.CENTER:\r\n                                        x += bounds.width / 2;\r\n                                        break;\r\n                                    case TEXT_ALIGN.RIGHT:\r\n                                        x += bounds.width;\r\n                                        break;\r\n                                }\r\n                                textBounds = bounds.add(x, 0, 0, -bounds.height / 2 + 1);\r\n                                this.ctx.save();\r\n                                this.path([\r\n                                    new Vector(bounds.left, bounds.top),\r\n                                    new Vector(bounds.left + bounds.width, bounds.top),\r\n                                    new Vector(bounds.left + bounds.width, bounds.top + bounds.height),\r\n                                    new Vector(bounds.left, bounds.top + bounds.height)\r\n                                ]);\r\n                                this.ctx.clip();\r\n                                this.renderTextWithLetterSpacing(new TextBounds(container.value, textBounds), styles.letterSpacing);\r\n                                this.ctx.restore();\r\n                                this.ctx.textBaseline = 'bottom';\r\n                                this.ctx.textAlign = 'left';\r\n                            }\r\n                            if (!contains(container.styles.display, 2048 /* LIST_ITEM */)) return [3 /*break*/, 20];\r\n                            if (!(container.styles.listStyleImage !== null)) return [3 /*break*/, 19];\r\n                            img = container.styles.listStyleImage;\r\n                            if (!(img.type === CSSImageType.URL)) return [3 /*break*/, 18];\r\n                            image = void 0;\r\n                            url = img.url;\r\n                            _b.label = 15;\r\n                        case 15:\r\n                            _b.trys.push([15, 17, , 18]);\r\n                            return [4 /*yield*/, this.options.cache.match(url)];\r\n                        case 16:\r\n                            image = _b.sent();\r\n                            this.ctx.drawImage(image, container.bounds.left - (image.width + 10), container.bounds.top);\r\n                            return [3 /*break*/, 18];\r\n                        case 17:\r\n                            e_3 = _b.sent();\r\n                            Logger.getInstance(this.options.id).error(\"Error loading list-style-image \" + url);\r\n                            return [3 /*break*/, 18];\r\n                        case 18: return [3 /*break*/, 20];\r\n                        case 19:\r\n                            if (paint.listValue && container.styles.listStyleType !== LIST_STYLE_TYPE.NONE) {\r\n                                this.ctx.font = this.createFontStyle(styles)[0];\r\n                                this.ctx.fillStyle = asString(styles.color);\r\n                                this.ctx.textBaseline = 'middle';\r\n                                this.ctx.textAlign = 'right';\r\n                                bounds = new Bounds(container.bounds.left, container.bounds.top + getAbsoluteValue(container.styles.paddingTop, container.bounds.width), container.bounds.width, computeLineHeight(styles.lineHeight, styles.fontSize.number) / 2 + 1);\r\n                                this.renderTextWithLetterSpacing(new TextBounds(paint.listValue, bounds), styles.letterSpacing);\r\n                                this.ctx.textBaseline = 'bottom';\r\n                                this.ctx.textAlign = 'left';\r\n                            }\r\n                            _b.label = 20;\r\n                        case 20: return [2 /*return*/];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.renderStackContent = function (stack) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var _i, _a, child, _b, _c, child, _d, _e, child, _f, _g, child, _h, _j, child, _k, _l, child, _m, _o, child;\r\n                return __generator(this, function (_p) {\r\n                    switch (_p.label) {\r\n                        case 0:\r\n                            // https://www.w3.org/TR/css-position-3/#painting-order\r\n                            // 1. the background and borders of the element forming the stacking context.\r\n                            return [4 /*yield*/, this.renderNodeBackgroundAndBorders(stack.element)];\r\n                        case 1:\r\n                            // https://www.w3.org/TR/css-position-3/#painting-order\r\n                            // 1. the background and borders of the element forming the stacking context.\r\n                            _p.sent();\r\n                            _i = 0, _a = stack.negativeZIndex;\r\n                            _p.label = 2;\r\n                        case 2:\r\n                            if (!(_i < _a.length)) return [3 /*break*/, 5];\r\n                            child = _a[_i];\r\n                            return [4 /*yield*/, this.renderStack(child)];\r\n                        case 3:\r\n                            _p.sent();\r\n                            _p.label = 4;\r\n                        case 4:\r\n                            _i++;\r\n                            return [3 /*break*/, 2];\r\n                        case 5:\r\n                            // 3. For all its in-flow, non-positioned, block-level descendants in tree order:\r\n                            return [4 /*yield*/, this.renderNodeContent(stack.element)];\r\n                        case 6:\r\n                            // 3. For all its in-flow, non-positioned, block-level descendants in tree order:\r\n                            _p.sent();\r\n                            _b = 0, _c = stack.nonInlineLevel;\r\n                            _p.label = 7;\r\n                        case 7:\r\n                            if (!(_b < _c.length)) return [3 /*break*/, 10];\r\n                            child = _c[_b];\r\n                            return [4 /*yield*/, this.renderNode(child)];\r\n                        case 8:\r\n                            _p.sent();\r\n                            _p.label = 9;\r\n                        case 9:\r\n                            _b++;\r\n                            return [3 /*break*/, 7];\r\n                        case 10:\r\n                            _d = 0, _e = stack.nonPositionedFloats;\r\n                            _p.label = 11;\r\n                        case 11:\r\n                            if (!(_d < _e.length)) return [3 /*break*/, 14];\r\n                            child = _e[_d];\r\n                            return [4 /*yield*/, this.renderStack(child)];\r\n                        case 12:\r\n                            _p.sent();\r\n                            _p.label = 13;\r\n                        case 13:\r\n                            _d++;\r\n                            return [3 /*break*/, 11];\r\n                        case 14:\r\n                            _f = 0, _g = stack.nonPositionedInlineLevel;\r\n                            _p.label = 15;\r\n                        case 15:\r\n                            if (!(_f < _g.length)) return [3 /*break*/, 18];\r\n                            child = _g[_f];\r\n                            return [4 /*yield*/, this.renderStack(child)];\r\n                        case 16:\r\n                            _p.sent();\r\n                            _p.label = 17;\r\n                        case 17:\r\n                            _f++;\r\n                            return [3 /*break*/, 15];\r\n                        case 18:\r\n                            _h = 0, _j = stack.inlineLevel;\r\n                            _p.label = 19;\r\n                        case 19:\r\n                            if (!(_h < _j.length)) return [3 /*break*/, 22];\r\n                            child = _j[_h];\r\n                            return [4 /*yield*/, this.renderNode(child)];\r\n                        case 20:\r\n                            _p.sent();\r\n                            _p.label = 21;\r\n                        case 21:\r\n                            _h++;\r\n                            return [3 /*break*/, 19];\r\n                        case 22:\r\n                            _k = 0, _l = stack.zeroOrAutoZIndexOrTransformedOrOpacity;\r\n                            _p.label = 23;\r\n                        case 23:\r\n                            if (!(_k < _l.length)) return [3 /*break*/, 26];\r\n                            child = _l[_k];\r\n                            return [4 /*yield*/, this.renderStack(child)];\r\n                        case 24:\r\n                            _p.sent();\r\n                            _p.label = 25;\r\n                        case 25:\r\n                            _k++;\r\n                            return [3 /*break*/, 23];\r\n                        case 26:\r\n                            _m = 0, _o = stack.positiveZIndex;\r\n                            _p.label = 27;\r\n                        case 27:\r\n                            if (!(_m < _o.length)) return [3 /*break*/, 30];\r\n                            child = _o[_m];\r\n                            return [4 /*yield*/, this.renderStack(child)];\r\n                        case 28:\r\n                            _p.sent();\r\n                            _p.label = 29;\r\n                        case 29:\r\n                            _m++;\r\n                            return [3 /*break*/, 27];\r\n                        case 30: return [2 /*return*/];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.mask = function (paths) {\r\n            this.ctx.beginPath();\r\n            this.ctx.moveTo(0, 0);\r\n            this.ctx.lineTo(this.canvas.width, 0);\r\n            this.ctx.lineTo(this.canvas.width, this.canvas.height);\r\n            this.ctx.lineTo(0, this.canvas.height);\r\n            this.ctx.lineTo(0, 0);\r\n            this.formatPath(paths.slice(0).reverse());\r\n            this.ctx.closePath();\r\n        };\r\n        CanvasRenderer.prototype.path = function (paths) {\r\n            this.ctx.beginPath();\r\n            this.formatPath(paths);\r\n            this.ctx.closePath();\r\n        };\r\n        CanvasRenderer.prototype.formatPath = function (paths) {\r\n            var _this = this;\r\n            paths.forEach(function (point, index) {\r\n                var start = isBezierCurve(point) ? point.start : point;\r\n                if (index === 0) {\r\n                    _this.ctx.moveTo(start.x, start.y);\r\n                }\r\n                else {\r\n                    _this.ctx.lineTo(start.x, start.y);\r\n                }\r\n                if (isBezierCurve(point)) {\r\n                    _this.ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y);\r\n                }\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.renderRepeat = function (path, pattern, offsetX, offsetY) {\r\n            this.path(path);\r\n            this.ctx.fillStyle = pattern;\r\n            this.ctx.translate(offsetX, offsetY);\r\n            this.ctx.fill();\r\n            this.ctx.translate(-offsetX, -offsetY);\r\n        };\r\n        CanvasRenderer.prototype.resizeImage = function (image, width, height) {\r\n            if (image.width === width && image.height === height) {\r\n                return image;\r\n            }\r\n            var canvas = this.canvas.ownerDocument.createElement('canvas');\r\n            canvas.width = width;\r\n            canvas.height = height;\r\n            var ctx = canvas.getContext('2d');\r\n            ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, width, height);\r\n            return canvas;\r\n        };\r\n        CanvasRenderer.prototype.renderBackgroundImage = function (container) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var index, _loop_1, this_1, _i, _a, backgroundImage;\r\n                return __generator(this, function (_b) {\r\n                    switch (_b.label) {\r\n                        case 0:\r\n                            index = container.styles.backgroundImage.length - 1;\r\n                            _loop_1 = function (backgroundImage) {\r\n                                var image, url, e_4, _a, path, x, y, width, height, pattern, _b, path, x, y, width, height, _c, lineLength, x0, x1, y0, y1, canvas, ctx, gradient_1, pattern, _d, path, left, top_1, width, height, position, x, y, _e, rx, ry, radialGradient_1, midX, midY, f, invF;\r\n                                return __generator(this, function (_f) {\r\n                                    switch (_f.label) {\r\n                                        case 0:\r\n                                            if (!(backgroundImage.type === CSSImageType.URL)) return [3 /*break*/, 5];\r\n                                            image = void 0;\r\n                                            url = backgroundImage.url;\r\n                                            _f.label = 1;\r\n                                        case 1:\r\n                                            _f.trys.push([1, 3, , 4]);\r\n                                            return [4 /*yield*/, this_1.options.cache.match(url)];\r\n                                        case 2:\r\n                                            image = _f.sent();\r\n                                            return [3 /*break*/, 4];\r\n                                        case 3:\r\n                                            e_4 = _f.sent();\r\n                                            Logger.getInstance(this_1.options.id).error(\"Error loading background-image \" + url);\r\n                                            return [3 /*break*/, 4];\r\n                                        case 4:\r\n                                            if (image) {\r\n                                                _a = calculateBackgroundRendering(container, index, [\r\n                                                    image.width,\r\n                                                    image.height,\r\n                                                    image.width / image.height\r\n                                                ]), path = _a[0], x = _a[1], y = _a[2], width = _a[3], height = _a[4];\r\n                                                pattern = this_1.ctx.createPattern(this_1.resizeImage(image, width, height), 'repeat');\r\n                                                this_1.renderRepeat(path, pattern, x, y);\r\n                                            }\r\n                                            return [3 /*break*/, 6];\r\n                                        case 5:\r\n                                            if (isLinearGradient(backgroundImage)) {\r\n                                                _b = calculateBackgroundRendering(container, index, [null, null, null]), path = _b[0], x = _b[1], y = _b[2], width = _b[3], height = _b[4];\r\n                                                _c = calculateGradientDirection(backgroundImage.angle, width, height), lineLength = _c[0], x0 = _c[1], x1 = _c[2], y0 = _c[3], y1 = _c[4];\r\n                                                canvas = document.createElement('canvas');\r\n                                                canvas.width = width;\r\n                                                canvas.height = height;\r\n                                                ctx = canvas.getContext('2d');\r\n                                                gradient_1 = ctx.createLinearGradient(x0, y0, x1, y1);\r\n                                                processColorStops(backgroundImage.stops, lineLength).forEach(function (colorStop) {\r\n                                                    return gradient_1.addColorStop(colorStop.stop, asString(colorStop.color));\r\n                                                });\r\n                                                ctx.fillStyle = gradient_1;\r\n                                                ctx.fillRect(0, 0, width, height);\r\n                                                if (width > 0 && height > 0) {\r\n                                                    pattern = this_1.ctx.createPattern(canvas, 'repeat');\r\n                                                    this_1.renderRepeat(path, pattern, x, y);\r\n                                                }\r\n                                            }\r\n                                            else if (isRadialGradient(backgroundImage)) {\r\n                                                _d = calculateBackgroundRendering(container, index, [\r\n                                                    null,\r\n                                                    null,\r\n                                                    null\r\n                                                ]), path = _d[0], left = _d[1], top_1 = _d[2], width = _d[3], height = _d[4];\r\n                                                position = backgroundImage.position.length === 0 ? [FIFTY_PERCENT] : backgroundImage.position;\r\n                                                x = getAbsoluteValue(position[0], width);\r\n                                                y = getAbsoluteValue(position[position.length - 1], height);\r\n                                                _e = calculateRadius(backgroundImage, x, y, width, height), rx = _e[0], ry = _e[1];\r\n                                                if (rx > 0 && rx > 0) {\r\n                                                    radialGradient_1 = this_1.ctx.createRadialGradient(left + x, top_1 + y, 0, left + x, top_1 + y, rx);\r\n                                                    processColorStops(backgroundImage.stops, rx * 2).forEach(function (colorStop) {\r\n                                                        return radialGradient_1.addColorStop(colorStop.stop, asString(colorStop.color));\r\n                                                    });\r\n                                                    this_1.path(path);\r\n                                                    this_1.ctx.fillStyle = radialGradient_1;\r\n                                                    if (rx !== ry) {\r\n                                                        midX = container.bounds.left + 0.5 * container.bounds.width;\r\n                                                        midY = container.bounds.top + 0.5 * container.bounds.height;\r\n                                                        f = ry / rx;\r\n                                                        invF = 1 / f;\r\n                                                        this_1.ctx.save();\r\n                                                        this_1.ctx.translate(midX, midY);\r\n                                                        this_1.ctx.transform(1, 0, 0, f, 0, 0);\r\n                                                        this_1.ctx.translate(-midX, -midY);\r\n                                                        this_1.ctx.fillRect(left, invF * (top_1 - midY) + midY, width, height * invF);\r\n                                                        this_1.ctx.restore();\r\n                                                    }\r\n                                                    else {\r\n                                                        this_1.ctx.fill();\r\n                                                    }\r\n                                                }\r\n                                            }\r\n                                            _f.label = 6;\r\n                                        case 6:\r\n                                            index--;\r\n                                            return [2 /*return*/];\r\n                                    }\r\n                                });\r\n                            };\r\n                            this_1 = this;\r\n                            _i = 0, _a = container.styles.backgroundImage.slice(0).reverse();\r\n                            _b.label = 1;\r\n                        case 1:\r\n                            if (!(_i < _a.length)) return [3 /*break*/, 4];\r\n                            backgroundImage = _a[_i];\r\n                            return [5 /*yield**/, _loop_1(backgroundImage)];\r\n                        case 2:\r\n                            _b.sent();\r\n                            _b.label = 3;\r\n                        case 3:\r\n                            _i++;\r\n                            return [3 /*break*/, 1];\r\n                        case 4: return [2 /*return*/];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.renderBorder = function (color, side, curvePoints) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                return __generator(this, function (_a) {\r\n                    this.path(parsePathForBorder(curvePoints, side));\r\n                    this.ctx.fillStyle = asString(color);\r\n                    this.ctx.fill();\r\n                    return [2 /*return*/];\r\n                });\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.renderNodeBackgroundAndBorders = function (paint) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var styles, hasBackground, borders, backgroundPaintingArea, side, _i, borders_1, border;\r\n                var _this = this;\r\n                return __generator(this, function (_a) {\r\n                    switch (_a.label) {\r\n                        case 0:\r\n                            this.applyEffects(paint.effects, 2 /* BACKGROUND_BORDERS */);\r\n                            styles = paint.container.styles;\r\n                            hasBackground = !isTransparent(styles.backgroundColor) || styles.backgroundImage.length;\r\n                            borders = [\r\n                                { style: styles.borderTopStyle, color: styles.borderTopColor },\r\n                                { style: styles.borderRightStyle, color: styles.borderRightColor },\r\n                                { style: styles.borderBottomStyle, color: styles.borderBottomColor },\r\n                                { style: styles.borderLeftStyle, color: styles.borderLeftColor }\r\n                            ];\r\n                            backgroundPaintingArea = calculateBackgroundCurvedPaintingArea(getBackgroundValueForIndex(styles.backgroundClip, 0), paint.curves);\r\n                            if (!(hasBackground || styles.boxShadow.length)) return [3 /*break*/, 2];\r\n                            this.ctx.save();\r\n                            this.path(backgroundPaintingArea);\r\n                            this.ctx.clip();\r\n                            if (!isTransparent(styles.backgroundColor)) {\r\n                                this.ctx.fillStyle = asString(styles.backgroundColor);\r\n                                this.ctx.fill();\r\n                            }\r\n                            return [4 /*yield*/, this.renderBackgroundImage(paint.container)];\r\n                        case 1:\r\n                            _a.sent();\r\n                            this.ctx.restore();\r\n                            styles.boxShadow\r\n                                .slice(0)\r\n                                .reverse()\r\n                                .forEach(function (shadow) {\r\n                                    _this.ctx.save();\r\n                                    var borderBoxArea = calculateBorderBoxPath(paint.curves);\r\n                                    var maskOffset = shadow.inset ? 0 : MASK_OFFSET;\r\n                                    var shadowPaintingArea = transformPath(borderBoxArea, -maskOffset + (shadow.inset ? 1 : -1) * shadow.spread.number, (shadow.inset ? 1 : -1) * shadow.spread.number, shadow.spread.number * (shadow.inset ? -2 : 2), shadow.spread.number * (shadow.inset ? -2 : 2));\r\n                                    if (shadow.inset) {\r\n                                        _this.path(borderBoxArea);\r\n                                        _this.ctx.clip();\r\n                                        _this.mask(shadowPaintingArea);\r\n                                    }\r\n                                    else {\r\n                                        _this.mask(borderBoxArea);\r\n                                        _this.ctx.clip();\r\n                                        _this.path(shadowPaintingArea);\r\n                                    }\r\n                                    _this.ctx.shadowOffsetX = shadow.offsetX.number + maskOffset;\r\n                                    _this.ctx.shadowOffsetY = shadow.offsetY.number;\r\n                                    _this.ctx.shadowColor = asString(shadow.color);\r\n                                    _this.ctx.shadowBlur = shadow.blur.number;\r\n                                    _this.ctx.fillStyle = shadow.inset ? asString(shadow.color) : 'rgba(0,0,0,1)';\r\n                                    _this.ctx.fill();\r\n                                    _this.ctx.restore();\r\n                                });\r\n                            _a.label = 2;\r\n                        case 2:\r\n                            side = 0;\r\n                            _i = 0, borders_1 = borders;\r\n                            _a.label = 3;\r\n                        case 3:\r\n                            if (!(_i < borders_1.length)) return [3 /*break*/, 7];\r\n                            border = borders_1[_i];\r\n                            if (!(border.style !== BORDER_STYLE.NONE && !isTransparent(border.color))) return [3 /*break*/, 5];\r\n                            return [4 /*yield*/, this.renderBorder(border.color, side, paint.curves)];\r\n                        case 4:\r\n                            _a.sent();\r\n                            _a.label = 5;\r\n                        case 5:\r\n                            side++;\r\n                            _a.label = 6;\r\n                        case 6:\r\n                            _i++;\r\n                            return [3 /*break*/, 3];\r\n                        case 7: return [2 /*return*/];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        CanvasRenderer.prototype.render = function (element) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var stack;\r\n                return __generator(this, function (_a) {\r\n                    switch (_a.label) {\r\n                        case 0:\r\n                            if (this.options.backgroundColor) {\r\n                                this.ctx.fillStyle = asString(this.options.backgroundColor);\r\n                                this.ctx.fillRect(this.options.x - this.options.scrollX, this.options.y - this.options.scrollY, this.options.width, this.options.height);\r\n                            }\r\n                            stack = parseStackingContexts(element);\r\n                            return [4 /*yield*/, this.renderStack(stack)];\r\n                        case 1:\r\n                            _a.sent();\r\n                            this.applyEffects([], 2 /* BACKGROUND_BORDERS */);\r\n                            return [2 /*return*/, this.canvas];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        return CanvasRenderer;\r\n    }());\r\n    var isTextInputElement = function (container) {\r\n        if (container instanceof TextareaElementContainer) {\r\n            return true;\r\n        }\r\n        else if (container instanceof SelectElementContainer) {\r\n            return true;\r\n        }\r\n        else if (container instanceof InputElementContainer && container.type !== RADIO && container.type !== CHECKBOX) {\r\n            return true;\r\n        }\r\n        return false;\r\n    };\r\n    var calculateBackgroundCurvedPaintingArea = function (clip, curves) {\r\n        switch (clip) {\r\n            case BACKGROUND_CLIP.BORDER_BOX:\r\n                return calculateBorderBoxPath(curves);\r\n            case BACKGROUND_CLIP.CONTENT_BOX:\r\n                return calculateContentBoxPath(curves);\r\n            case BACKGROUND_CLIP.PADDING_BOX:\r\n            default:\r\n                return calculatePaddingBoxPath(curves);\r\n        }\r\n    };\r\n    var canvasTextAlign = function (textAlign) {\r\n        switch (textAlign) {\r\n            case TEXT_ALIGN.CENTER:\r\n                return 'center';\r\n            case TEXT_ALIGN.RIGHT:\r\n                return 'right';\r\n            case TEXT_ALIGN.LEFT:\r\n            default:\r\n                return 'left';\r\n        }\r\n    };\r\n\r\n    var ForeignObjectRenderer = /** @class */ (function () {\r\n        function ForeignObjectRenderer(options) {\r\n            this.canvas = options.canvas ? options.canvas : document.createElement('canvas');\r\n            this.ctx = this.canvas.getContext('2d');\r\n            this.options = options;\r\n            this.canvas.width = Math.floor(options.width * options.scale);\r\n            this.canvas.height = Math.floor(options.height * options.scale);\r\n            this.canvas.style.width = options.width + \"px\";\r\n            this.canvas.style.height = options.height + \"px\";\r\n            this.ctx.scale(this.options.scale, this.options.scale);\r\n            this.ctx.translate(-options.x + options.scrollX, -options.y + options.scrollY);\r\n            Logger.getInstance(options.id).debug(\"EXPERIMENTAL ForeignObject renderer initialized (\" + options.width + \"x\" + options.height + \" at \" + options.x + \",\" + options.y + \") with scale \" + options.scale);\r\n        }\r\n        ForeignObjectRenderer.prototype.render = function (element) {\r\n            return __awaiter(this, void 0, void 0, function () {\r\n                var svg, img;\r\n                return __generator(this, function (_a) {\r\n                    switch (_a.label) {\r\n                        case 0:\r\n                            svg = createForeignObjectSVG(Math.max(this.options.windowWidth, this.options.width) * this.options.scale, Math.max(this.options.windowHeight, this.options.height) * this.options.scale, this.options.scrollX * this.options.scale, this.options.scrollY * this.options.scale, element);\r\n                            return [4 /*yield*/, loadSerializedSVG$1(svg)];\r\n                        case 1:\r\n                            img = _a.sent();\r\n                            if (this.options.backgroundColor) {\r\n                                this.ctx.fillStyle = asString(this.options.backgroundColor);\r\n                                this.ctx.fillRect(0, 0, this.options.width * this.options.scale, this.options.height * this.options.scale);\r\n                            }\r\n                            this.ctx.drawImage(img, -this.options.x * this.options.scale, -this.options.y * this.options.scale);\r\n                            return [2 /*return*/, this.canvas];\r\n                    }\r\n                });\r\n            });\r\n        };\r\n        return ForeignObjectRenderer;\r\n    }());\r\n    var loadSerializedSVG$1 = function (svg) {\r\n        return new Promise(function (resolve, reject) {\r\n            var img = new Image();\r\n            img.onload = function () {\r\n                resolve(img);\r\n            };\r\n            img.onerror = reject;\r\n            img.src = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(new XMLSerializer().serializeToString(svg));\r\n        });\r\n    };\r\n\r\n    var _this = undefined;\r\n    var parseColor$1 = function (value) { return color.parse(Parser.create(value).parseComponentValue()); };\r\n    var html2canvas = function (element, options) {\r\n        if (options === void 0) { options = {}; }\r\n        return renderElement(element, options);\r\n    };\r\n    CacheStorage.setContext(window);\r\n    var renderElement = function (element, opts) {\r\n        return __awaiter(_this, void 0, void 0, function () {\r\n            var ownerDocument, defaultView, instanceName, _a, width, height, left, top, defaultResourceOptions, resourceOptions, defaultOptions, options, windowBounds, documentCloner, clonedElement, container, documentBackgroundColor, bodyBackgroundColor, bgColor, defaultBackgroundColor, backgroundColor, renderOptions, canvas, renderer, root, renderer;\r\n            return __generator(this, function (_b) {\r\n                switch (_b.label) {\r\n                    case 0:\r\n                        ownerDocument = element.ownerDocument;\r\n                        if (!ownerDocument) {\r\n                            throw new Error(\"Element is not attached to a Document\");\r\n                        }\r\n                        defaultView = ownerDocument.defaultView;\r\n                        if (!defaultView) {\r\n                            throw new Error(\"Document is not attached to a Window\");\r\n                        }\r\n                        instanceName = (Math.round(Math.random() * 1000) + Date.now()).toString(16);\r\n                        _a = isBodyElement(element) || isHTMLElement(element) ? parseDocumentSize(ownerDocument) : parseBounds(element), width = _a.width, height = _a.height, left = _a.left, top = _a.top;\r\n                        defaultResourceOptions = {\r\n                            allowTaint: false,\r\n                            imageTimeout: 15000,\r\n                            proxy: undefined,\r\n                            useCORS: false\r\n                        };\r\n                        resourceOptions = __assign({}, defaultResourceOptions, opts);\r\n                        defaultOptions = {\r\n                            backgroundColor: '#ffffff',\r\n                            cache: opts.cache ? opts.cache : CacheStorage.create(instanceName, resourceOptions),\r\n                            logging: true,\r\n                            removeContainer: true,\r\n                            foreignObjectRendering: false,\r\n                            scale: defaultView.devicePixelRatio || 1,\r\n                            windowWidth: defaultView.innerWidth,\r\n                            windowHeight: defaultView.innerHeight,\r\n                            scrollX: defaultView.pageXOffset,\r\n                            scrollY: defaultView.pageYOffset,\r\n                            x: left,\r\n                            y: top,\r\n                            width: Math.ceil(width),\r\n                            height: Math.ceil(height),\r\n                            id: instanceName\r\n                        };\r\n                        options = __assign({}, defaultOptions, resourceOptions, opts);\r\n                        windowBounds = new Bounds(options.scrollX, options.scrollY, options.windowWidth, options.windowHeight);\r\n                        Logger.create({ id: instanceName, enabled: options.logging });\r\n                        Logger.getInstance(instanceName).debug(\"Starting document clone\");\r\n                        documentCloner = new DocumentCloner(element, {\r\n                            id: instanceName,\r\n                            onclone: options.onclone,\r\n                            ignoreElements: options.ignoreElements,\r\n                            inlineImages: options.foreignObjectRendering,\r\n                            copyStyles: options.foreignObjectRendering\r\n                        });\r\n                        clonedElement = documentCloner.clonedReferenceElement;\r\n                        if (!clonedElement) {\r\n                            return [2 /*return*/, Promise.reject(\"Unable to find element in cloned iframe\")];\r\n                        }\r\n                        return [4 /*yield*/, documentCloner.toIFrame(ownerDocument, windowBounds)];\r\n                    case 1:\r\n                        container = _b.sent();\r\n                        documentBackgroundColor = ownerDocument.documentElement\r\n                            ? parseColor$1(getComputedStyle(ownerDocument.documentElement).backgroundColor)\r\n                            : COLORS.TRANSPARENT;\r\n                        bodyBackgroundColor = ownerDocument.body\r\n                            ? parseColor$1(getComputedStyle(ownerDocument.body).backgroundColor)\r\n                            : COLORS.TRANSPARENT;\r\n                        bgColor = opts.backgroundColor;\r\n                        defaultBackgroundColor = typeof bgColor === 'string' ? parseColor$1(bgColor) : bgColor === null ? COLORS.TRANSPARENT : 0xffffffff;\r\n                        backgroundColor = element === ownerDocument.documentElement\r\n                            ? isTransparent(documentBackgroundColor)\r\n                                ? isTransparent(bodyBackgroundColor)\r\n                                    ? defaultBackgroundColor\r\n                                    : bodyBackgroundColor\r\n                                : documentBackgroundColor\r\n                            : defaultBackgroundColor;\r\n                        renderOptions = {\r\n                            id: instanceName,\r\n                            cache: options.cache,\r\n                            canvas: options.canvas,\r\n                            backgroundColor: backgroundColor,\r\n                            scale: options.scale,\r\n                            x: options.x,\r\n                            y: options.y,\r\n                            scrollX: options.scrollX,\r\n                            scrollY: options.scrollY,\r\n                            width: options.width,\r\n                            height: options.height,\r\n                            windowWidth: options.windowWidth,\r\n                            windowHeight: options.windowHeight\r\n                        };\r\n                        if (!options.foreignObjectRendering) return [3 /*break*/, 3];\r\n                        Logger.getInstance(instanceName).debug(\"Document cloned, using foreign object rendering\");\r\n                        renderer = new ForeignObjectRenderer(renderOptions);\r\n                        return [4 /*yield*/, renderer.render(clonedElement)];\r\n                    case 2:\r\n                        canvas = _b.sent();\r\n                        return [3 /*break*/, 5];\r\n                    case 3:\r\n                        Logger.getInstance(instanceName).debug(\"Document cloned, using computed rendering\");\r\n                        CacheStorage.attachInstance(options.cache);\r\n                        Logger.getInstance(instanceName).debug(\"Starting DOM parsing\");\r\n                        root = parseTree(clonedElement);\r\n                        CacheStorage.detachInstance();\r\n                        if (backgroundColor === root.styles.backgroundColor) {\r\n                            root.styles.backgroundColor = COLORS.TRANSPARENT;\r\n                        }\r\n                        Logger.getInstance(instanceName).debug(\"Starting renderer\");\r\n                        renderer = new CanvasRenderer(renderOptions);\r\n                        return [4 /*yield*/, renderer.render(root)];\r\n                    case 4:\r\n                        canvas = _b.sent();\r\n                        _b.label = 5;\r\n                    case 5:\r\n                        if (options.removeContainer === true) {\r\n                            if (!DocumentCloner.destroy(container)) {\r\n                                Logger.getInstance(instanceName).error(\"Cannot detach cloned iframe as it is not in the DOM anymore\");\r\n                            }\r\n                        }\r\n                        Logger.getInstance(instanceName).debug(\"Finished rendering\");\r\n                        Logger.destroy(instanceName);\r\n                        CacheStorage.destroy(instanceName);\r\n                        return [2 /*return*/, canvas];\r\n                }\r\n            });\r\n        });\r\n    };\r\n\r\n    return html2canvas;\r\n\r\n}));\r\n//# sourceMappingURL=html2canvas.js.map\r\n","/**\r\n * Localization.ts\r\n *\r\n * Module for Localization\r\n */\r\n\r\n/**\r\n * List of supported Locales\r\n * REMINDER: update readme to match the list below if change is made\r\n */\r\nlet supportedLocales: string[] = [\r\n\t\"af\",\r\n\t\"am\",\r\n\t\"ar\",\r\n\t\"as\",\r\n\t\"az\",\r\n\t\"be\",\r\n\t\"bg\",\r\n\t\"bn-BD\",\r\n\t\"bn-IN\",\r\n\t\"bs\",\r\n\t\"ca\",\r\n\t\"ca-Es-VALENCIA\",\r\n\t\"chr-Cher\",\r\n\t\"cs\",\r\n\t\"cy\",\r\n\t\"da\",\r\n\t\"de\",\r\n\t\"el\",\r\n\t\"en-GB\",\r\n\t\"es\",\r\n\t\"es-MX\",\r\n\t\"et\",\r\n\t\"eu\",\r\n\t\"fa\",\r\n\t\"fi\",\r\n\t\"fil\",\r\n\t\"fr\",\r\n\t\"fr-CA\",\r\n\t\"ga\",\r\n\t\"gd\",\r\n\t\"gl\",\r\n\t\"gu\",\r\n\t\"ha-Latn-NG\",\r\n\t\"he\",\r\n\t\"hi\",\r\n\t\"hr\",\r\n\t\"hu\",\r\n\t\"hy\",\r\n\t\"id\",\r\n\t\"is\",\r\n\t\"it\",\r\n\t\"ja\",\r\n\t\"ka\",\r\n\t\"kk\",\r\n\t\"km-KH\",\r\n\t\"kn\",\r\n\t\"ko\",\r\n\t\"kok\",\r\n\t\"ky\",\r\n\t\"lb\",\r\n\t\"lo\",\r\n\t\"lt\",\r\n\t\"lv\",\r\n\t\"mi\",\r\n\t\"mk\",\r\n\t\"ml\",\r\n\t\"mn\",\r\n\t\"mr\",\r\n\t\"ms\",\r\n\t\"mt\",\r\n\t\"nb-NO\",\r\n\t\"ne\",\r\n\t\"nl\",\r\n\t\"nn-NO\",\r\n\t\"or\",\r\n\t\"pa\",\r\n\t\"pl\",\r\n\t\"prs\",\r\n\t\"pt-BR\",\r\n\t\"pt-PT\",\r\n\t\"quz\",\r\n\t\"ro\",\r\n\t\"ru\",\r\n\t\"sd\",\r\n\t\"si\",\r\n\t\"sk\",\r\n\t\"sl\",\r\n\t\"sq\",\r\n\t\"sr-Cyrl-BA\",\r\n\t\"sr-Cyrl-RS\",\r\n\t\"sr-Latn-RS\",\r\n\t\"sv\",\r\n\t\"sw\",\r\n\t\"ta\",\r\n\t\"te\",\r\n\t\"th\",\r\n\t\"tk\",\r\n\t\"tr\",\r\n\t\"tt\",\r\n\t\"ug\",\r\n\t\"uk\",\r\n\t\"ur\",\r\n\t\"uz-Latn-UZ\",\r\n\t\"vi\",\r\n\t\"zh-Hans\",\r\n\t\"zh-Hant\",\r\n];\r\n\r\nconst localeVariantToSupportedlocaleMap: { [key: string]: string } = {\r\n\t\"ZH-CN\": \"zh-Hans\",\r\n\t\"ZH-HK\": \"zh-Hant\",\r\n\t\"ZH-MO\": \"zh-Hant\",\r\n\t\"ZH-SG\": \"zh-Hans\",\r\n\t\"ZH-TW\": \"zh-Hant\",\r\n};\r\n\r\nexport function validate(locale: string): string {\r\n\tlet localeUpperCase = locale.toLocaleUpperCase();\r\n\r\n\t// support for Chinese ll-cc, VSO Bug 1583389\r\n\tif (localeUpperCase in localeVariantToSupportedlocaleMap) {\r\n\t\treturn localeVariantToSupportedlocaleMap[localeUpperCase];\r\n\t}\r\n\r\n\t// return supported locale if exact match found\r\n\tfor (let supportedLocale of supportedLocales) {\r\n\t\tif (supportedLocale.toUpperCase() === localeUpperCase) {\r\n\t\t\treturn supportedLocale;\r\n\t\t}\r\n\t}\r\n\r\n\tlet localePartOne = localeUpperCase.split(\"-\")[0];\r\n\t// return supported \"ll\" if exact match not found, but \"ll\" matches\r\n\tfor (let supportedLocale of supportedLocales) {\r\n\t\tif (supportedLocale.toUpperCase() === localePartOne) {\r\n\t\t\treturn supportedLocale;\r\n\t\t}\r\n\t}\r\n\r\n\t// default everything else to en\r\n\treturn \"en\";\r\n}\r\n","// This file can be required in Browserify and Node.js for automatic polyfill\n// To use it:  require('es6-promise/auto');\n'use strict';\nmodule.exports = require('./').polyfill();\n","export function objectOrFunction(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nexport function isFunction(x) {\n  return typeof x === 'function';\n}\n\nexport function isMaybeThenable(x) {\n  return x !== null && typeof x === 'object';\n}\n\nvar _isArray = void 0;\nif (Array.isArray) {\n  _isArray = Array.isArray;\n} else {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n}\n\nexport var isArray = _isArray;","var len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nexport var asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nexport function setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nexport function setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var vertx = Function('return this')().require('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}","import { invokeCallback, subscribe, FULFILLED, REJECTED, noop, makePromise, PROMISE_ID } from './-internal';\n\nimport { asap } from './asap';\n\nexport default function then(onFulfillment, onRejection) {\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n\n  if (_state) {\n    var callback = arguments[_state - 1];\n    asap(function () {\n      return invokeCallback(_state, child, callback, parent._result);\n    });\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}","import { noop, resolve as _resolve } from '../-internal';\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nexport default function resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}","import { objectOrFunction, isFunction } from './utils';\n\nimport { asap } from './asap';\n\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nexport var PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n  if (maybeThenable.constructor === promise.constructor && then === originalThen && maybeThenable.constructor.resolve === originalResolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then)) {\n      handleForeignThenable(promise, maybeThenable, then);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    var then = void 0;\n    try {\n      then = value.then;\n    } catch (error) {\n      reject(promise, error);\n      return;\n    }\n    handleMaybeThenable(promise, value, then);\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = void 0,\n      callback = void 0,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = void 0,\n      error = void 0,\n      succeeded = true;\n\n  if (hasCallback) {\n    try {\n      value = callback(detail);\n    } catch (e) {\n      succeeded = false;\n      error = e;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n    resolve(promise, value);\n  } else if (succeeded === false) {\n    reject(promise, error);\n  } else if (settled === FULFILLED) {\n    fulfill(promise, value);\n  } else if (settled === REJECTED) {\n    reject(promise, value);\n  }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nexport { nextId, makePromise, noop, resolve, reject, fulfill, subscribe, publish, publishRejection, initializePromise, invokeCallback, FULFILLED, REJECTED, PENDING, handleMaybeThenable };","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isArray, isMaybeThenable } from './utils';\nimport { noop, reject, fulfill, subscribe, FULFILLED, REJECTED, PENDING, handleMaybeThenable } from './-internal';\n\nimport then from './then';\nimport Promise from './promise';\nimport originalResolve from './promise/resolve';\nimport originalThen from './then';\nimport { makePromise, PROMISE_ID } from './-internal';\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nvar Enumerator = function () {\n  function Enumerator(Constructor, input) {\n    this._instanceConstructor = Constructor;\n    this.promise = new Constructor(noop);\n\n    if (!this.promise[PROMISE_ID]) {\n      makePromise(this.promise);\n    }\n\n    if (isArray(input)) {\n      this.length = input.length;\n      this._remaining = input.length;\n\n      this._result = new Array(this.length);\n\n      if (this.length === 0) {\n        fulfill(this.promise, this._result);\n      } else {\n        this.length = this.length || 0;\n        this._enumerate(input);\n        if (this._remaining === 0) {\n          fulfill(this.promise, this._result);\n        }\n      }\n    } else {\n      reject(this.promise, validationError());\n    }\n  }\n\n  Enumerator.prototype._enumerate = function _enumerate(input) {\n    for (var i = 0; this._state === PENDING && i < input.length; i++) {\n      this._eachEntry(input[i], i);\n    }\n  };\n\n  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n    var c = this._instanceConstructor;\n    var resolve = c.resolve;\n\n\n    if (resolve === originalResolve) {\n      var _then = void 0;\n      var error = void 0;\n      var didError = false;\n      try {\n        _then = entry.then;\n      } catch (e) {\n        didError = true;\n        error = e;\n      }\n\n      if (_then === originalThen && entry._state !== PENDING) {\n        this._settledAt(entry._state, i, entry._result);\n      } else if (typeof _then !== 'function') {\n        this._remaining--;\n        this._result[i] = entry;\n      } else if (c === Promise) {\n        var promise = new c(noop);\n        if (didError) {\n          reject(promise, error);\n        } else {\n          handleMaybeThenable(promise, entry, _then);\n        }\n        this._willSettleAt(promise, i);\n      } else {\n        this._willSettleAt(new c(function (resolve) {\n          return resolve(entry);\n        }), i);\n      }\n    } else {\n      this._willSettleAt(resolve(entry), i);\n    }\n  };\n\n  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n    var promise = this.promise;\n\n\n    if (promise._state === PENDING) {\n      this._remaining--;\n\n      if (state === REJECTED) {\n        reject(promise, value);\n      } else {\n        this._result[i] = value;\n      }\n    }\n\n    if (this._remaining === 0) {\n      fulfill(promise, this._result);\n    }\n  };\n\n  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n    var enumerator = this;\n\n    subscribe(promise, undefined, function (value) {\n      return enumerator._settledAt(FULFILLED, i, value);\n    }, function (reason) {\n      return enumerator._settledAt(REJECTED, i, reason);\n    });\n  };\n\n  return Enumerator;\n}();\n\nexport default Enumerator;\n;","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isFunction } from './utils';\nimport { noop, nextId, PROMISE_ID, initializePromise } from './-internal';\nimport { asap, setAsap, setScheduler } from './asap';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\nimport then from './then';\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {Function} resolver\n  Useful for tooling.\n  @constructor\n*/\n\nvar Promise = function () {\n  function Promise(resolver) {\n    this[PROMISE_ID] = nextId();\n    this._result = this._state = undefined;\n    this._subscribers = [];\n\n    if (noop !== resolver) {\n      typeof resolver !== 'function' && needsResolver();\n      this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n    }\n  }\n\n  /**\n  The primary way of interacting with a promise is through its `then` method,\n  which registers callbacks to receive either a promise's eventual value or the\n  reason why the promise cannot be fulfilled.\n   ```js\n  findUser().then(function(user){\n    // user is available\n  }, function(reason){\n    // user is unavailable, and you are given the reason why\n  });\n  ```\n   Chaining\n  --------\n   The return value of `then` is itself a promise.  This second, 'downstream'\n  promise is resolved with the return value of the first promise's fulfillment\n  or rejection handler, or rejected if the handler throws an exception.\n   ```js\n  findUser().then(function (user) {\n    return user.name;\n  }, function (reason) {\n    return 'default name';\n  }).then(function (userName) {\n    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n    // will be `'default name'`\n  });\n   findUser().then(function (user) {\n    throw new Error('Found user, but still unhappy');\n  }, function (reason) {\n    throw new Error('`findUser` rejected and we're unhappy');\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n  });\n  ```\n  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n   ```js\n  findUser().then(function (user) {\n    throw new PedagogicalException('Upstream error');\n  }).then(function (value) {\n    // never reached\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // The `PedgagocialException` is propagated all the way down to here\n  });\n  ```\n   Assimilation\n  ------------\n   Sometimes the value you want to propagate to a downstream promise can only be\n  retrieved asynchronously. This can be achieved by returning a promise in the\n  fulfillment or rejection handler. The downstream promise will then be pending\n  until the returned promise is settled. This is called *assimilation*.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // The user's comments are now available\n  });\n  ```\n   If the assimliated promise rejects, then the downstream promise will also reject.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // If `findCommentsByAuthor` fulfills, we'll have the value here\n  }, function (reason) {\n    // If `findCommentsByAuthor` rejects, we'll have the reason here\n  });\n  ```\n   Simple Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let result;\n   try {\n    result = findResult();\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n  findResult(function(result, err){\n    if (err) {\n      // failure\n    } else {\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findResult().then(function(result){\n    // success\n  }, function(reason){\n    // failure\n  });\n  ```\n   Advanced Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let author, books;\n   try {\n    author = findAuthor();\n    books  = findBooksByAuthor(author);\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n   function foundBooks(books) {\n   }\n   function failure(reason) {\n   }\n   findAuthor(function(author, err){\n    if (err) {\n      failure(err);\n      // failure\n    } else {\n      try {\n        findBoooksByAuthor(author, function(books, err) {\n          if (err) {\n            failure(err);\n          } else {\n            try {\n              foundBooks(books);\n            } catch(reason) {\n              failure(reason);\n            }\n          }\n        });\n      } catch(error) {\n        failure(err);\n      }\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findAuthor().\n    then(findBooksByAuthor).\n    then(function(books){\n      // found books\n  }).catch(function(reason){\n    // something went wrong\n  });\n  ```\n   @method then\n  @param {Function} onFulfilled\n  @param {Function} onRejected\n  Useful for tooling.\n  @return {Promise}\n  */\n\n  /**\n  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n  as the catch block of a try/catch statement.\n  ```js\n  function findAuthor(){\n  throw new Error('couldn't find that author');\n  }\n  // synchronous\n  try {\n  findAuthor();\n  } catch(reason) {\n  // something went wrong\n  }\n  // async with promises\n  findAuthor().catch(function(reason){\n  // something went wrong\n  });\n  ```\n  @method catch\n  @param {Function} onRejection\n  Useful for tooling.\n  @return {Promise}\n  */\n\n\n  Promise.prototype.catch = function _catch(onRejection) {\n    return this.then(null, onRejection);\n  };\n\n  /**\n    `finally` will be invoked regardless of the promise's fate just as native\n    try/catch/finally behaves\n  \n    Synchronous example:\n  \n    ```js\n    findAuthor() {\n      if (Math.random() > 0.5) {\n        throw new Error();\n      }\n      return new Author();\n    }\n  \n    try {\n      return findAuthor(); // succeed or fail\n    } catch(error) {\n      return findOtherAuther();\n    } finally {\n      // always runs\n      // doesn't affect the return value\n    }\n    ```\n  \n    Asynchronous example:\n  \n    ```js\n    findAuthor().catch(function(reason){\n      return findOtherAuther();\n    }).finally(function(){\n      // author was either found, or not\n    });\n    ```\n  \n    @method finally\n    @param {Function} callback\n    @return {Promise}\n  */\n\n\n  Promise.prototype.finally = function _finally(callback) {\n    var promise = this;\n    var constructor = promise.constructor;\n\n    if (isFunction(callback)) {\n      return promise.then(function (value) {\n        return constructor.resolve(callback()).then(function () {\n          return value;\n        });\n      }, function (reason) {\n        return constructor.resolve(callback()).then(function () {\n          throw reason;\n        });\n      });\n    }\n\n    return promise.then(callback, callback);\n  };\n\n  return Promise;\n}();\n\nPromise.prototype.then = then;\nexport default Promise;\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;","import Enumerator from '../enumerator';\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nexport default function all(entries) {\n  return new Enumerator(this, entries).promise;\n}","import { isArray } from \"../utils\";\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nexport default function race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}","import { noop, reject as _reject } from '../-internal';\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nexport default function reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}","import Promise from './es6-promise/promise';\nimport polyfill from './es6-promise/polyfill';\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\nexport default Promise;","/*global self*/\nimport Promise from './promise';\n\nexport default function polyfill() {\n  var local = void 0;\n\n  if (typeof global !== 'undefined') {\n    local = global;\n  } else if (typeof self !== 'undefined') {\n    local = self;\n  } else {\n    try {\n      local = Function('return this')();\n    } catch (e) {\n      throw new Error('polyfill failed because global object is unavailable in this environment');\n    }\n  }\n\n  var P = local.Promise;\n\n  if (P) {\n    var promiseToString = null;\n    try {\n      promiseToString = Object.prototype.toString.call(P.resolve());\n    } catch (e) {\n      // silently ignored\n    }\n\n    if (promiseToString === '[object Promise]' && !P.cast) {\n      return;\n    }\n  }\n\n  local.Promise = Promise;\n}","/**\r\n * The main interface to use when instrumenting survey activities in app code\r\n */\r\ninterface IActivityListener {\r\n\t/**\r\n\t * Log an activity to Floodgate, incrementing its occurrence count by the given number if specified,\r\n\t * otherwise incrementing its occurrence count by one as default\r\n\t */\r\n\tlogActivity(activityName: string, increment?: number, context?: IActivityListener.IActivityContext): void;\r\n\r\n\t/**\r\n\t * Start an activity timer (overwriting any previously unclosed start).\r\n\t * NOTE: Does not increment the activity count.\r\n\t */\r\n\tlogActivityStartTime(activityName: string, startTime?: Date): void;\r\n\r\n\t/**\r\n\t * Stop an activity timer and clears the previous start time.\r\n\t * Adds the elapsed seconds between this stop and the previous start into the count for this activity\r\n\t * \\note If no previous start was logged, or start is somehow in the future, results in 0 count increment\r\n\t */\r\n\tlogActivityStopTime(activityName: string, stopTime?: Date): void;\r\n}\r\n\r\nmodule IActivityListener {\r\n\texport interface IActivityContext {\r\n\t\tdata?: unknown;\r\n\t}\r\n\r\n\texport class ActivityName {\r\n\t\tpublic static readonly AppLaunch = \"AppLaunch\";\r\n\t\tpublic static readonly AppUsageTime = \"AppUsageTime\";\r\n\t\tpublic static readonly AppResume = \"AppResume\";\r\n\t}\r\n}\r\n\r\nexport = IActivityListener;\r\n","/**\r\n * Interface for a collection of Floodgate setting names and ids\r\n */\r\ninterface IFloodgateSettingIdMap {\r\n\treadonly [key: string]: number;\r\n}\r\n\r\nmodule IFloodgateSettingIdMap {\r\n\t/**\r\n\t * Collection of setting names and ids\r\n\t */\r\n\texport const RoamingSettingIdMap = {\r\n\t\tCampaignStates: 1258,\r\n\t\tGovernedChannelStates: 1257,\r\n\t\tSurveyActivationStats: 1259,\r\n\t};\r\n}\r\n\r\nexport = IFloodgateSettingIdMap;\r\n","import { IFloodgateEnvironmentProvider } from \"../Api/IFloodgateEnvironmentProvider\";\r\nimport * as IFloodgateStringProvider from \"../Api/IFloodgateStringProvider\";\r\nimport * as ISurvey from \"../Api/ISurvey\";\r\nimport { IDictionary } from \"../Common\";\r\nimport { FloodgateEngine } from \"../FloodgateEngine\";\r\nimport { GovernedChannelType } from \"../GovernedChannel\";\r\nimport { ISurveyClient } from \"../ISurveyClient\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport * as Utils from \"../Utils\";\r\nimport {\r\n\tCampaignDefinition, CampaignDuration, CampaignDurationSingleBuildChange,\r\n\tCampaignDurationTimeInterval, CampaignScopeEnvironmentCrossProduct, CampaignScopeUserFactAll, CampaignScopeUserFactAny, ICampaignDefinitionProvider,\r\n} from \"./CampaignDefinitionProvider\";\r\nimport { CampaignState, ICampaignStateProvider } from \"./CampaignStateProvider\";\r\nimport { CampaignSurveyFactory } from \"./CampaignSurveyFactory\";\r\n\r\nimport { IUserFact, IUserFactProvider } from \"../Api/Api\";\r\nimport { TelemetryEvent } from \"../Constants\";\r\nimport { BusinessLevel } from \"../ISurveyInfo\";\r\n\r\nconst { getDistantFuture, getDistantPast, isArray, isNOU } = Utils;\r\n\r\n/**\r\n * The CampaignManager is responsible for combining read-only campaign definitions with previously stored campaign state,\r\n * running re-nomination elections, and ultimately generating surveys\r\n */\r\nexport interface ICampaignManager {\r\n\t// Get the list of active surveys targeting this user\r\n\tgetActiveSurveys(): IDictionary<ISurvey>;\r\n\r\n\t// Updates the campaign state based on the fact that the user just took that campaign's survey\r\n\tonCampaignSurveyActivated(campaignId: string, date: Date, isSurveyComplete: boolean): void;\r\n}\r\n\r\n/**\r\n * The standard campaign manager implementation.\r\n */\r\nexport class CampaignManager implements ICampaignManager, ISurveyClient {\r\n\tpublic static isStateUpForNomination(state: CampaignState, definition: CampaignDefinition, date: Date, buildNumber: string): boolean {\r\n\t\tif (!state || !definition) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tdate = date ? date : new Date();\r\n\r\n\t\t// Check manual override\r\n\t\tif (state.ForceCandidacy) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Figure out which duration we're using based on whether or not the user triggered the survey\r\n\t\tconst campaignCooldownDuration: CampaignDuration\r\n\t\t\t= definition.nominationScheme.getCampaignCooldown(state.IsCandidate && state.DidCandidateTriggerSurvey);\r\n\r\n\t\tif (!campaignCooldownDuration) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t// First check for build-based rules. Eventually this could get more complex if we supported counting differently seen build numbers\r\n\t\tif (CampaignManager.hasBuildChangeDurationElapsed(campaignCooldownDuration, state.LastNominationBuildNumber, buildNumber)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Next check date rules\r\n\t\treturn CampaignManager.hasTimeIntervalDurationElapsed(campaignCooldownDuration, state.getCooldownStartDate(), date);\r\n\t}\r\n\r\n\tpublic static isDateInRange(date: Date, startDate: Date, endDate: Date): boolean {\r\n\t\tdate = date ? date : new Date();\r\n\t\tstartDate = startDate ? startDate : getDistantPast();\r\n\t\tendDate = endDate ? endDate : getDistantFuture();\r\n\r\n\t\t// Check Start/Expire date range\r\n\t\tif (startDate.getTime() <= date.getTime() && endDate.getTime() >= date.getTime()) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic static hasTimeIntervalDurationElapsed(duration: CampaignDuration, startDate: Date, date: Date): boolean {\r\n\t\tif (isNOU(duration) || !(duration instanceof CampaignDurationTimeInterval)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (!startDate || !date) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst endDate: Date = Utils.addSecondsWithoutOverflow(startDate, duration.intervalSeconds);\r\n\t\treturn date.getTime() >= endDate.getTime();\r\n\t}\r\n\r\n\tpublic static hasBuildChangeDurationElapsed(duration: CampaignDuration, startBuild: string, build: string): boolean {\r\n\t\tif (isNOU(duration) || !(duration instanceof CampaignDurationSingleBuildChange)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (isNOU(startBuild) || isNOU(build)) {\r\n\t\t\treturn (startBuild === null) !== (build === null);\r\n\t\t}\r\n\r\n\t\treturn !(startBuild === build);\r\n\t}\r\n\r\n\tprivate static isCampaignInScope(\r\n\t\tdefinition: CampaignDefinition,\r\n\t\tdate: Date,\r\n\t\tenvironmentProvider: IFloodgateEnvironmentProvider,\r\n\t\tuserFactsProvider: IUserFactProvider): boolean {\r\n\t\tif (!definition) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tdate = date ? date : new Date();\r\n\r\n\t\t// Check Start/Expire date range\r\n\t\tif (!CampaignManager.isDateInRangeWithDefinition(date, definition)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (definition.scope) {\r\n\t\t\tif (definition.scope instanceof CampaignScopeUserFactAny || definition.scope instanceof CampaignScopeUserFactAll) {\r\n\t\t\t\tdefinition.scope.setUserFactsProvider(userFactsProvider);\r\n\t\t\t}\r\n\t\t\tif (definition.scope instanceof CampaignScopeEnvironmentCrossProduct) {\r\n\t\t\t\tdefinition.scope.setEnvironmentProvider(environmentProvider);\r\n\t\t\t}\r\n\t\t\tif (!definition.scope.isInScope()) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If we get here, the definition is relevant\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate static isDateInRangeWithDefinition(date: Date, definition: CampaignDefinition): boolean {\r\n\t\tif (!definition) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tdate = date ? date : new Date();\r\n\r\n\t\treturn CampaignManager.isDateInRange(date,\r\n\t\t\t// null start dates should be impossible, but if set, should mean the campaign is disabled\r\n\t\t\tdefinition.startTime ? definition.startTime : getDistantFuture(),\r\n\t\t\tdefinition.endTime);\r\n\t}\r\n\r\n\tprivate campaignStates: IDictionary<CampaignState>;\r\n\tprivate campaignDefinitions: IDictionary<CampaignDefinition>;\r\n\tprivate userFacts: IUserFact[];\r\n\tprivate currentBuildNumber: string;\r\n\tprivate stateProvider: ICampaignStateProvider;\r\n\tprivate definitionProviders: ICampaignDefinitionProvider[];\r\n\tprivate stringProvider: IFloodgateStringProvider;\r\n\tprivate environmentProvider: IFloodgateEnvironmentProvider;\r\n\tprivate userFactsProvider: IUserFactProvider;\r\n\r\n\tpublic constructor(stateProvider: ICampaignStateProvider,\r\n\t\tdefinitionProviders: ICampaignDefinitionProvider[],\r\n\t\tstringProvider: IFloodgateStringProvider,\r\n\t\tenvironmentProvider: IFloodgateEnvironmentProvider,\r\n\t\tcurrentBuildNumber: string,\r\n\t\tcurrentDate: Date,\r\n\t\tuserFactsProvider?: IUserFactProvider) {\r\n\r\n\t\tif (!stateProvider) {\r\n\t\t\tthrow new Error(\"stateProvider must not be null\");\r\n\t\t}\r\n\r\n\t\tif (!isArray(definitionProviders)) {\r\n\t\t\tthrow new Error(\"definitionProviders is either null or not an array type\");\r\n\t\t}\r\n\r\n\t\tif (!stringProvider) {\r\n\t\t\tthrow new Error(\"stringProvider must not be null\");\r\n\t\t}\r\n\r\n\t\tif (isNOU(currentBuildNumber)) {\r\n\t\t\tthrow new Error(\"currentBuildNumber must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.campaignStates = {};\r\n\t\tthis.campaignDefinitions = {};\r\n\t\tthis.userFacts = [];\r\n\t\tthis.stateProvider = stateProvider;\r\n\t\tthis.definitionProviders = definitionProviders;\r\n\t\tthis.stringProvider = stringProvider;\r\n\t\tthis.userFactsProvider = userFactsProvider;\r\n\t\tthis.environmentProvider = environmentProvider; // Can be null\r\n\t\tthis.currentBuildNumber = currentBuildNumber;\r\n\r\n\t\tcurrentDate = currentDate ? currentDate : new Date();\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getActiveSurveys(): IDictionary<ISurvey> {\r\n\t\tconst surveys: IDictionary<ISurvey> = {};\r\n\t\tconst prioritizedCampaigns = this.getPrioritizedCampaigns();\r\n\r\n\t\tfor (const key in this.campaignStates) {\r\n\t\t\tif (this.campaignStates.hasOwnProperty(key)) {\r\n\t\t\t\tconst state: CampaignState = this.campaignStates[key];\r\n\t\t\t\tif (!state.IsCandidate) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// This is a requirement because we keep some otherwise \"stale\" campaigns around for the save routine\r\n\t\t\t\tconst definition: CampaignDefinition = prioritizedCampaigns[state.CampaignId];\r\n\t\t\t\tif (!definition) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst survey: ISurvey = CampaignSurveyFactory.makeSurvey(state, definition, this.stringProvider);\r\n\t\t\t\tif (!survey) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsurveys[survey.getSurveyInfo().getId()] = survey;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn surveys;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic onCampaignSurveyActivated(campaignId: string, takenDate: Date, isSurveyComplete: boolean): void {\r\n\t\tconst state: CampaignState = this.campaignStates[campaignId];\r\n\t\tif (!state) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttakenDate = takenDate ? takenDate : new Date();\r\n\r\n\t\tconst cooldownSeconds = this.campaignDefinitions[campaignId].nominationScheme.cooldownPeriod.asTimeIntervalSeconds();\r\n\t\tstate.markCurrentSurveyTakenOnDate(takenDate, cooldownSeconds, isSurveyComplete);\r\n\r\n\t\tthis.saveCurrentState();\r\n\t}\r\n\r\n\tpublic getCampaignStates(): IDictionary<CampaignState> {\r\n\t\treturn this.campaignStates;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getCampaignDefinitions(): IDictionary<CampaignDefinition> {\r\n\t\treturn this.campaignDefinitions;\r\n\t}\r\n\r\n\tpublic getUserFacts(): IUserFact[] {\r\n\t\treturn this.userFacts;\r\n\t}\r\n\r\n\t// region ISurveyClient methods\r\n\r\n\t// @Override\r\n\tpublic onSurveyActivated(surveyInfo: ISurveyInfo, isSurveyComplete: boolean): void {\r\n\t\tif (!surveyInfo) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.onCampaignSurveyActivated(surveyInfo.getBackEndId(), new Date(), isSurveyComplete);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic refreshSurveyDefinitions(channelTypes?: GovernedChannelType[], date?: Date): void {\r\n\t\tthis.refreshSurveyDefinitionsPrivate(channelTypes, (date ? date : new Date()));\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic refreshSurveyDefinitionsAsync(channelTypes?: GovernedChannelType[], date?: Date): Promise<void> {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tthis.refreshSurveyDefinitionsPrivateAsync(channelTypes, (date ? date : new Date())).then(\r\n\t\t\t\tfunction onFulfilled() {\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t},\r\n\t\t\t).catch(\r\n\t\t\t\tfunction OnRejected(errReason) {\r\n\t\t\t\t\treject(errReason);\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getAppSurveys(): { [id: string]: ISurvey } {\r\n\t\treturn this.getActiveSurveys();\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic saveCurrentState(): void {\r\n\t\t// Sort by campaignId, ascending for uniformity\r\n\t\tconst states: CampaignState[] = Utils.makeArrayFromObjectValuesSortedByKeyString(this.campaignStates);\r\n\r\n\t\tthis.stateProvider.save(states);\r\n\t}\r\n\r\n\t// endregion\r\n\r\n\tprivate refreshSurveyDefinitionsPrivate(channelTypes: GovernedChannelType[], date: Date): void {\r\n\t\tthis.campaignStates = {};\r\n\t\tthis.campaignDefinitions = {};\r\n\t\tthis.userFacts = [];\r\n\r\n\t\tthis.loadAndFilterCampaignData(date, channelTypes);\r\n\t\tthis.evaluateCampaigns(date);\r\n\t}\r\n\r\n\tprivate refreshSurveyDefinitionsPrivateAsync(channelTypes: GovernedChannelType[], date: Date): Promise<void> {\r\n\t\tthis.campaignStates = {};\r\n\t\tthis.campaignDefinitions = {};\r\n\t\tthis.userFacts = [];\r\n\r\n\t\tconst thisCampaignManager = this;\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tthisCampaignManager.loadAndFilterCampaignDataAsync(date, channelTypes).then(\r\n\t\t\t\tfunction onFulfilled() {\r\n\t\t\t\t\tthisCampaignManager.evaluateCampaigns(date);\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t},\r\n\t\t\t).catch(\r\n\t\t\t\tfunction OnRejected(errReason) {\r\n\t\t\t\t\treject(errReason);\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Load and filter the campaigns definitions and states\r\n\t */\r\n\tprivate loadAndFilterCampaignDataAsync(currentDate: Date, channelTypes: GovernedChannelType[]): Promise<void> {\r\n\t\tcurrentDate = currentDate ? currentDate : new Date();\r\n\t\tlet loadedDefinitions: CampaignDefinition[] = [];\r\n\t\tconst promises = [];\r\n\r\n\t\tconst userFactsPromise = this.userFactsProvider && this.userFactsProvider.loadAsync() as Promise<IUserFact[]>;\r\n\r\n\t\tfor (const i of Object.keys(this.definitionProviders)) {\r\n\t\t\tconst provider = this.definitionProviders[i];\r\n\t\t\tlet promise: any = provider && provider.loadAsync();\r\n\t\t\tif (!isNOU(promise)) {\r\n\t\t\t\t// Promise.all fails even if one promise fails.\r\n\t\t\t\t// We want to ignore the promise that failed and continue with the ones\r\n\t\t\t\t// those are succesful, hence overriding the catch to always resolve.\r\n\t\t\t\t// responsibility of logging failures should be with the provider.\r\n\t\t\t\tpromise = promise.catch(() => {\r\n\t\t\t\t\tFloodgateEngine.getTelemetryLogger().log_CampaignLoad_Failed(\"Failed to load from campaign definition provider\");\r\n\t\t\t\t\tPromise.resolve();\r\n\t\t\t\t});\r\n\t\t\t\tpromises.push(promise);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst thisCampaignManager = this;\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tPromise.all(promises).then(\r\n\t\t\t\tfunction onFulfilled(values) {\r\n\t\t\t\t\tfor (const i of Object.keys(values)) {\r\n\t\t\t\t\t\tconst campaignDefinitions = values[i];\r\n\t\t\t\t\t\tif (isArray(campaignDefinitions)) {\r\n\t\t\t\t\t\t\t// If there are campaign defintions with duplicate campaign Id's\r\n\t\t\t\t\t\t\t// Floodgate will load the last one it found. FilterCampaignData does this filteration\r\n\t\t\t\t\t\t\tloadedDefinitions = loadedDefinitions.concat(campaignDefinitions);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst setUserFacts = (userFacts?: IUserFact[]) => {\r\n\t\t\t\t\t\tthisCampaignManager.userFacts = userFacts || [];\r\n\t\t\t\t\t\tthisCampaignManager.FilterCampaignData(currentDate, channelTypes, loadedDefinitions);\r\n\t\t\t\t\t\tresolve();\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// Before filtering and evaluating the campaign definitions,\r\n\t\t\t\t\t// wait until the user facts are loaded as they will be used in evaluating campaign scopes\r\n\t\t\t\t\tif (!isNOU(userFactsPromise)) {\r\n\t\t\t\t\t\tuserFactsPromise.then((userFacts: IUserFact[]) => {\r\n\t\t\t\t\t\t\tsetUserFacts(userFacts);\r\n\t\t\t\t\t\t}).catch(() => {\r\n\t\t\t\t\t\t\t// this should never happen as user facts promise will always be resolved by the user facts provider\r\n\t\t\t\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(TelemetryEvent.Floodgate.UserFactsLoad.Failed, \"Failed to load from user facts provider\");\r\n\t\t\t\t\t\t\tsetUserFacts();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsetUserFacts();\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t).catch(\r\n\t\t\t\tfunction OnRejected(error) {\r\n\t\t\t\t\t// this should never happen as Promise.all will always be resolved\r\n\t\t\t\t\t// because of hack at the top of the function.\r\n\t\t\t\t\tFloodgateEngine.getTelemetryLogger().log_CampaignLoad_Failed(\"Failed to load from campaign definition provider\");\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate loadAndFilterCampaignData(currentDate: Date, channelTypes: GovernedChannelType[]): void {\r\n\t\tcurrentDate = currentDate ? currentDate : new Date();\r\n\t\tlet loadedDefinitions: CampaignDefinition[] = [];\r\n\r\n\t\tfor (const index of Object.keys(this.definitionProviders)) {\r\n\t\t\ttry {\r\n\t\t\t\tconst definitions = this.definitionProviders[index] && this.definitionProviders[index].load();\r\n\t\t\t\tif (isArray(definitions)) {\r\n\t\t\t\t\t// If there are campaign defintions with duplicate campaign Id's\r\n\t\t\t\t\t// Floodgate will load the last one it found. FilterCampaignData does this filteration\r\n\t\t\t\t\tloadedDefinitions = loadedDefinitions.concat(definitions);\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {\r\n\t\t\t\t// Log error, but continue with other providers\r\n\t\t\t\t// It should be the responsibility of provider to log detailed errors\r\n\t\t\t\tFloodgateEngine.getTelemetryLogger().log_CampaignLoad_Failed(\"Failed to load from campaign definition provider. \" + error.toString());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Load the user facts before all the campaign definitions are evaluated\r\n\t\ttry {\r\n\t\t\tthis.userFacts = (this.userFactsProvider && this.userFactsProvider.load()) || [];\r\n\t\t} catch (error) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsLoad.Failed, \"Failed to load from user facts provider. \" + error);\r\n\t\t}\r\n\r\n\t\tthis.FilterCampaignData(currentDate, channelTypes, loadedDefinitions);\r\n\t}\r\n\r\n\t/**\r\n\t * Load and filter the campaigns definitions and states\r\n\t */\r\n\tprivate FilterCampaignData(currentDate: Date, channelTypes: GovernedChannelType[], loadedDefinitions: CampaignDefinition[]): void {\r\n\t\tconst loadedDefinitionsMap: IDictionary<CampaignDefinition> = {};\r\n\r\n\t\t// Load filtered campaign definitions\r\n\t\tfor (const key in loadedDefinitions) {\r\n\t\t\tif (loadedDefinitions.hasOwnProperty(key)) {\r\n\t\t\t\tconst definition: CampaignDefinition = loadedDefinitions[key];\r\n\r\n\t\t\t\tloadedDefinitionsMap[definition.campaignId] = definition;\r\n\r\n\t\t\t\tif (channelTypes &&\r\n\t\t\t\t\t(channelTypes.indexOf(definition.governedChannelType) < 0) &&\r\n\t\t\t\t\t(definition.businessLevel !== BusinessLevel.Critical)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!CampaignManager.isCampaignInScope(definition, currentDate, this.environmentProvider, this.userFactsProvider)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.campaignDefinitions[definition.campaignId] = definition;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Load campaign state, filtering out the expired definitions\r\n\t\tconst loadedStates: CampaignState[] = this.stateProvider.load();\r\n\t\tconst staleLoadedStates: CampaignState[] = [];\r\n\r\n\t\tfor (const key in loadedStates) {\r\n\t\t\tif (loadedStates.hasOwnProperty(key)) {\r\n\t\t\t\tconst state: CampaignState = loadedStates[key];\r\n\r\n\t\t\t\tif (!this.campaignDefinitions.hasOwnProperty(state.CampaignId)) {\r\n\t\t\t\t\tstaleLoadedStates.push(state);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.campaignStates[state.CampaignId] = state;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/*\r\n\t\t * Stale State data cleanup\r\n\t\t * State needs to be cleaned up when:\r\n\t\t * 1) The campaign has expired\r\n\t\t * 2) The campaign is no longer present in the definitions (think ECS or other outages or very old expirations)\r\n\t\t *    In this case the state should still be cleaned up on it's reelection date\r\n\t\t * 3) When the user is out of scope (for an otherwise active campaign) and is up for nomination\r\n\r\n\t\t * This optimizes the user experience in case the campaign pops up or gets renewed when we would have preferred the user remain in cool down\r\n\r\n\t\t * 2&3 are basically the same, and 1 is a special case optimization on top of 2&3 for earlier clean up\r\n\r\n\t\t * To do 2 & 3, we just look at states with no matching definition (after filtering), and reject them if they are past their nomination period\r\n\t\t * To do 1, we just need to keep a list/hash of the definitions that we filtered out this load cycle, specifically for expiration dates, and bypass\r\n\t\t * the cool down \"wait\" for these specifically\r\n\r\n\t\t * For now, allowing some \"grace\" for \"missing\"/\"blippy\" campaign definitions (in case they pop in and out of ECS) by deferring missing\r\n\t\t * deletion by a delay-time specified by the original campaign.\r\n\t\t */\r\n\t\tfor (const key in staleLoadedStates) {\r\n\t\t\tif (staleLoadedStates.hasOwnProperty(key)) {\r\n\t\t\t\tconst state: CampaignState = staleLoadedStates[key];\r\n\t\t\t\tif (!state) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst definition: CampaignDefinition = loadedDefinitionsMap[state.CampaignId];\r\n\t\t\t\tlet shouldRemove = false;\r\n\r\n\t\t\t\tif (!definition) {\r\n\t\t\t\t\tif (state.LastNominationTimeUtc.getTime() <= Utils.subtractSecondsWithoutOverflow(currentDate, state.DeleteAfterSecondsWhenStale).getTime()) {\r\n\t\t\t\t\t\tshouldRemove = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (CampaignManager.isStateUpForNomination(state, definition, currentDate, this.currentBuildNumber)) {\r\n\t\t\t\t\tshouldRemove = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// The next time we write to storage, these will be removed\r\n\t\t\t\tif (shouldRemove) {\r\n\t\t\t\t\tdelete this.campaignStates[state.CampaignId];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Filter lower priority campaigns that are on same channel and have a matching tag\r\n\tprivate getPrioritizedCampaigns() {\r\n\t\tconst prioritizedCampaigns: IDictionary<CampaignDefinition> = {};\r\n\r\n\t\t// build <tagId_channel, campaign[]> map\r\n\t\tconst matchingTagCampaigns: IDictionary<CampaignDefinition[]> = {};\r\n\t\tObject.keys(this.campaignDefinitions || []).forEach((key) => {\r\n\t\t\tconst definition: CampaignDefinition = this.campaignDefinitions[key];\r\n\t\t\tprioritizedCampaigns[key] = definition;\r\n\r\n\t\t\t// if tags are not defined, use empty tag to fallback to channel level aggregation\r\n\t\t\tconst definitionTags = definition.tags && definition.tags.length > 0 ? definition.tags : [\"\"];\r\n\t\t\tdefinitionTags.forEach((tagId) => {\r\n\t\t\t\tconst mapKey = `${tagId}_${definition.governedChannelType}`;\r\n\t\t\t\tmatchingTagCampaigns[mapKey] = matchingTagCampaigns[mapKey] || [];\r\n\t\t\t\tmatchingTagCampaigns[mapKey].push(definition);\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t// remove lower priority campaigns\r\n\t\tObject.keys(matchingTagCampaigns).forEach((key) => {\r\n\t\t\tconst definitions = matchingTagCampaigns[key];\r\n\t\t\tif (definitions.length <= 1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Get definition that has max priority value (0/null/undefined has highest prioirty)\r\n\t\t\tconst maxPriorityDefinition = definitions.reduce((prev, cur) => {\r\n\t\t\t\tconst curPriority = cur.primaryPriority || 0;\r\n\t\t\t\tconst prevPriority = prev.primaryPriority || 0;\r\n\r\n\t\t\t\treturn curPriority < prevPriority ? cur : prev;\r\n\t\t\t}, definitions[0]);\r\n\r\n\t\t\tconst maxPriority = maxPriorityDefinition.primaryPriority;\r\n\t\t\tif (isNOU(maxPriority)) {\r\n\t\t\t\t// nothing to filter because all priorities are null/undefined\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// delete lower priority campaigns while preserving all the matching higher priority items\r\n\t\t\tdefinitions.forEach((current) => {\r\n\t\t\t\tconst currentPriority = current.primaryPriority;\r\n\r\n\t\t\t\t// for mso compatability ignore campaigns without priority set so that they are always considered\r\n\t\t\t\tif (!isNOU(current.primaryPriority) && currentPriority > maxPriority) {\r\n\t\t\t\t\tdelete prioritizedCampaigns[current.campaignId];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\treturn prioritizedCampaigns;\r\n\t}\r\n\r\n\t/**\r\n\t * Given the loaded campaign definitions and states from previous sessions, run anything up for nomination\r\n\t */\r\n\tprivate evaluateCampaigns(currentDate: Date): void {\r\n\t\t// Loop through campaigns definitions, and update their state if necessary\r\n\t\tcurrentDate = currentDate ? currentDate : new Date();\r\n\r\n\t\tfor (const key in this.campaignDefinitions) {\r\n\t\t\tif (this.campaignDefinitions.hasOwnProperty(key)) {\r\n\t\t\t\tconst definition: CampaignDefinition = this.campaignDefinitions[key];\r\n\t\t\t\tconst state: CampaignState = this.campaignStates[definition.campaignId];\r\n\r\n\t\t\t\tif (!state || CampaignManager.isStateUpForNomination(state, definition, currentDate, this.currentBuildNumber)) {\r\n\t\t\t\t\tlet lastSurveyId: string = state ? state.LastSurveyId : \"\";\r\n\t\t\t\t\tlet lastSurveyStartTime: Date = state ? state.LastSurveyStartTimeUtc : getDistantPast();\r\n\t\t\t\t\tlet lastSurveyExpirationTime: Date = state ? state.LastSurveyExpirationTimeUtc : getDistantPast();\r\n\t\t\t\t\tconst lastSurveyActivatedTime: Date = state ? state.LastSurveyActivatedTimeUtc : getDistantPast();\r\n\t\t\t\t\tconst lastCooldownEndTimeUtc: Date = state ? state.LastCooldownEndTimeUtc : getDistantPast();\r\n\r\n\t\t\t\t\t// Run the nomination\r\n\t\t\t\t\tconst isCandidate: boolean = (state && state.ForceCandidacy) || definition.nominationScheme.evaluateNominationRules();\r\n\t\t\t\t\tif (isCandidate) {\r\n\t\t\t\t\t\t// Make new survey properties for the next call to get the active surveys\r\n\t\t\t\t\t\tlastSurveyId = Utils.guid();\r\n\t\t\t\t\t\tlastSurveyStartTime = definition.nominationScheme.calculateSurveyStartTimeFromDate(currentDate);\r\n\t\t\t\t\t\tlastSurveyExpirationTime = definition.nominationScheme.calculateSurveyExpirationTimeFromSurveyStartTime(lastSurveyStartTime);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst newState: CampaignState = new CampaignState(\r\n\t\t\t\t\t\tdefinition.campaignId,\r\n\t\t\t\t\t\tcurrentDate,\r\n\t\t\t\t\t\tthis.currentBuildNumber,\r\n\t\t\t\t\t\tdefinition.nominationScheme.getActiveSurveyTimeIntervalSeconds(),\r\n\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t\tisCandidate,\r\n\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t\tlastSurveyActivatedTime,\r\n\t\t\t\t\t\tlastSurveyId,\r\n\t\t\t\t\t\tlastSurveyStartTime,\r\n\t\t\t\t\t\tlastSurveyExpirationTime,\r\n\t\t\t\t\t\tlastCooldownEndTimeUtc,\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\t// Save the new state to our local cache\r\n\t\t\t\t\tthis.campaignStates[newState.CampaignId] = newState;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","import * as IFloodgateStringProvider from \"../Api/IFloodgateStringProvider\";\r\nimport * as ISurvey from \"../Api/ISurvey\";\r\nimport { GovernedChannelType } from \"../GovernedChannel\";\r\nimport * as ISurveyEvent from \"../ISurveyEvent\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport { ISurveyMetadata } from \"../ISurveyMetadata\";\r\nimport {\r\n\tCountedActivityEvent, CountedActivityEventData, CountedActivitySequenceEvent, CountedActivitySequenceEventData,\r\n\tICountedActivityEvent, ICountedActivitySequenceEvent,\r\n} from \"../SurveyEvents\";\r\nimport { Metadata, SurveyMetadata } from \"../SurveyMetadata\";\r\nimport * as FpsSurvey from \"../Surveys/FpsSurvey\";\r\nimport * as GenericMessagingSurfaceSurvey from \"../Surveys/GenericMessagingSurfaceSurvey\";\r\nimport * as InterceptSurvey from \"../Surveys/InterceptSurvey\";\r\nimport * as NlqsSurvey from \"../Surveys/NlqsSurvey\";\r\nimport * as NpsSurvey from \"../Surveys/NpsSurvey\";\r\nimport * as SurveyDataSource from \"../Surveys/SurveyDataSource\";\r\nimport * as Utils from \"../Utils\";\r\nimport {\r\n\tCampaignDefinition,\r\n\tCampaignSurveyEvent, CampaignSurveyEventCountedActivity, CampaignSurveyEventCountedActivitySequence, CampaignSurveyMetadata,\r\n\tCampaignSurveyTemplate, CampaignSurveyTemplateFps, CampaignSurveyTemplateGenericMessagingSurface, CampaignSurveyTemplateIntercept,\r\n\tCampaignSurveyTemplateNlqs, CampaignSurveyTemplateNps, CampaignSurveyTemplateNps11PointStatic, CampaignSurveyTemplateNps5PointStatic,\r\n} from \"./CampaignDefinitionProvider\";\r\nimport { CampaignState } from \"./CampaignStateProvider\";\r\n\r\nconst { dateToShortUtcString, isNOU } = Utils;\r\n\r\n/**\r\n * Contains methods to take a campaign definition + state and generate an ISurvey\r\n */\r\nexport class CampaignSurveyFactory {\r\n\tpublic static makeSurvey(state: CampaignState, definition: CampaignDefinition, stringProvider: IFloodgateStringProvider): ISurvey {\r\n\t\tif (!state || !definition || !definition.surveyTemplate || !stringProvider) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst surveyDataSource = CampaignSurveyFactory.makeSurveyDataSourceData(state, definition);\r\n\t\tconst surveyModel = definition.surveyTemplate;\r\n\t\tif (surveyModel instanceof CampaignSurveyTemplateNps5PointStatic) {\r\n\t\t\treturn NpsSurvey.make5Point(surveyDataSource, stringProvider);\r\n\t\t} else if (surveyModel instanceof CampaignSurveyTemplateNps11PointStatic) {\r\n\t\t\treturn NpsSurvey.make11Point(surveyDataSource, stringProvider);\r\n\t\t} else if (surveyModel instanceof CampaignSurveyTemplateFps) {\r\n\t\t\treturn FpsSurvey.makeFps(surveyDataSource, stringProvider, surveyModel);\r\n\t\t} else if (surveyModel instanceof CampaignSurveyTemplateNlqs) {\r\n\t\t\treturn NlqsSurvey.makeNlqs(surveyDataSource, stringProvider, surveyModel);\r\n\t\t} else if (surveyModel instanceof CampaignSurveyTemplateNps) {\r\n\t\t\treturn NpsSurvey.makeCustom(surveyDataSource, stringProvider, surveyModel);\r\n\t\t} else if (surveyModel instanceof CampaignSurveyTemplateGenericMessagingSurface) {\r\n\t\t\treturn GenericMessagingSurfaceSurvey.makeCustom(surveyDataSource);\r\n\t\t} else if (surveyModel instanceof CampaignSurveyTemplateIntercept) {\r\n\t\t\treturn InterceptSurvey.makeIntercept(surveyDataSource, stringProvider, surveyModel);\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static makeSurveyDataSourceData(state: CampaignState, definition: CampaignDefinition): SurveyDataSource.SurveyDataSourceData {\r\n\t\tif (!state || !definition || !definition.surveyTemplate) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst surveyModel = definition.surveyTemplate;\r\n\t\tconst surveyData = new SurveyDataSource.SurveyDataSourceData();\r\n\t\tsurveyData.activationEvent = CampaignSurveyFactory.makeEvent(state, surveyModel.activationEvent);\r\n\t\tsurveyData.metadata = CampaignSurveyFactory.makeMetadata(surveyModel.metadata);\r\n\t\tsurveyData.id = state.LastSurveyId;\r\n\t\tsurveyData.backEndIdentifier = state.CampaignId;\r\n\t\tsurveyData.expirationTimeUtc = dateToShortUtcString(state.LastSurveyExpirationTimeUtc);\r\n\t\tsurveyData.governedChannelType = definition.governedChannelType;\r\n\t\tsurveyData.startTimeUtc = dateToShortUtcString(state.LastSurveyStartTimeUtc);\r\n\t\tsurveyData.additionalDataRequested = definition.additionalDataRequested  || [];\r\n\t\tsurveyData.launcherType = definition.launcherType || ISurvey.LAUNCHER_TYPE_DEFAULT;\r\n\t\tsurveyData.preferredLaunchType = definition.surveyTemplate.preferredLaunchType || ISurveyInfo.LaunchType.Default;\r\n\t\tsurveyData.businessLevel = definition.businessLevel;\r\n\r\n\t\tif (!isNOU(surveyModel.maxLaunches)) {\r\n\t\t\tsurveyData.maxLaunches = surveyModel.maxLaunches;\r\n\t\t}\r\n\r\n\t\tif (!isNOU(surveyModel.maxLaunchesPerSession)) {\r\n\t\t\tsurveyData.maxLaunchesPerSession = surveyModel.maxLaunchesPerSession;\r\n\t\t}\r\n\r\n\t\treturn surveyData;\r\n\t}\r\n\r\n\tprivate static makeCountedActivityEventData(eventModel: CampaignSurveyEventCountedActivity): CountedActivityEventData {\r\n\t\tif (!eventModel) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst eventData = new CountedActivityEventData();\r\n\t\teventData.activity = eventModel.activity;\r\n\t\teventData.count = eventModel.count;\r\n\t\teventData.isAggregate = eventModel.isAggregate;\r\n\r\n\t\treturn eventData;\r\n\t}\r\n\r\n\tprivate static makeCountedActivityEvent(state: CampaignState, eventModel: CampaignSurveyEventCountedActivity): ICountedActivityEvent {\r\n\t\tif (!state || !eventModel) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst eventData: CountedActivityEventData = CampaignSurveyFactory.makeCountedActivityEventData(eventModel);\r\n\t\tif (!eventData) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn new CountedActivityEvent(eventData);\r\n\t}\r\n\r\n\tprivate static makeCountedActivitySequenceEvent(state: CampaignState,\r\n\t\teventModel: CampaignSurveyEventCountedActivitySequence): ICountedActivitySequenceEvent {\r\n\r\n\t\tif (!state || !eventModel) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst sequenceEventData = new CountedActivitySequenceEventData();\r\n\t\tsequenceEventData.sequence = [];\r\n\r\n\t\tfor (const event of eventModel.sequence) {\r\n\t\t\tconst eventData: CountedActivityEventData = CampaignSurveyFactory.makeCountedActivityEventData(event);\r\n\t\t\tif (!eventData) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tsequenceEventData.sequence.push(eventData);\r\n\t\t}\r\n\r\n\t\treturn new CountedActivitySequenceEvent(sequenceEventData);\r\n\t}\r\n\r\n\tprivate static makeEvent(state: CampaignState, eventModel: CampaignSurveyEvent): ISurveyEvent {\r\n\t\tif (eventModel instanceof CampaignSurveyEventCountedActivity) {\r\n\t\t\treturn CampaignSurveyFactory.makeCountedActivityEvent(state, eventModel as CampaignSurveyEventCountedActivity);\r\n\t\t} else if (eventModel instanceof CampaignSurveyEventCountedActivitySequence) {\r\n\t\t\treturn CampaignSurveyFactory.makeCountedActivitySequenceEvent(state, eventModel as CampaignSurveyEventCountedActivitySequence);\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static makeMetadata(metadataModel: CampaignSurveyMetadata): ISurveyMetadata {\r\n\t\tif (isNOU(metadataModel) || isNOU(metadataModel.contentMetadata)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst metadata = new Metadata();\r\n\t\tmetadata.contentMetadata = metadataModel.contentMetadata;\r\n\r\n\t\treturn new SurveyMetadata(metadata);\r\n\t}\r\n}\r\n","import { ActivityTrackingData } from \"./ActivityTrackingData\";\r\nimport { ActivityTrackingSet } from \"./ActivityTrackingSet\";\r\nimport * as ISurveyEvent from \"./ISurveyEvent\";\r\n\r\n/**\r\n * A SurveyEvent that counts occurrences of a literal string logged by the product.\r\n * Survey is activated once the activity occurs Count times.\r\n */\r\nexport interface ICountedActivityEvent extends ISurveyEvent {\r\n\t/**\r\n\t * Name of the activity to listen for\r\n\t */\r\n\tgetActivity(): string;\r\n\r\n\t/**\r\n\t * Number of times the named activity must be logged to activate\r\n\t */\r\n\tgetCount(): number;\r\n\r\n\t/**\r\n\t * Whether or not the count should be persisted across app sessions\r\n\t */\r\n\tisAggregate(): boolean;\r\n}\r\n\r\nexport interface ICountedActivitySequenceEvent extends ISurveyEvent {\r\n\tgetSequence(): ICountedActivityEvent[];\r\n}\r\n\r\nexport class CountedActivityEvent implements ICountedActivityEvent {\r\n\tpublic static make(data: CountedActivityEventData): ICountedActivityEvent {\r\n\t\ttry {\r\n\t\t\treturn new CountedActivityEvent(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: CountedActivityEventData;\r\n\r\n\tpublic constructor(data: CountedActivityEventData) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (data.count <= 0) {\r\n\t\t\tthrow new Error(\"count must be greater than 0\");\r\n\t\t}\r\n\t\tif (!data.activity || data.activity.length === 0) {\r\n\t\t\tthrow new Error(\"activity must not be null or an empty string\");\r\n\t\t}\r\n\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\tpublic getActivity(): string {\r\n\t\treturn this.data.activity;\r\n\t}\r\n\r\n\tpublic getCount(): number {\r\n\t\treturn this.data.count;\r\n\t}\r\n\r\n\tpublic isAggregate(): boolean {\r\n\t\treturn this.data.isAggregate;\r\n\t}\r\n\r\n\tpublic getType(): ISurveyEvent.Type {\r\n\t\treturn ISurveyEvent.Type.CountedActivity;\r\n\t}\r\n\r\n\tpublic getTrackingSet(): ActivityTrackingSet {\r\n\t\tconst trackingDataList = new Array<ActivityTrackingData>();\r\n\t\ttrackingDataList.push(new ActivityTrackingData(this.data.activity, this.data.count, this.data.isAggregate));\r\n\t\treturn new ActivityTrackingSet(false, trackingDataList);\r\n\t}\r\n}\r\n\r\n/**\r\n * Data class for serialization and deserialization. Do not add logic in here.\r\n */\r\nexport class CountedActivityEventData {\r\n\tpublic activity: string;\r\n\tpublic count: number;\r\n\tpublic isAggregate: boolean;\r\n}\r\n\r\nexport class CountedActivitySequenceEvent implements ICountedActivitySequenceEvent {\r\n\tpublic static make(data: CountedActivitySequenceEventData): ICountedActivitySequenceEvent {\r\n\t\ttry {\r\n\t\t\treturn new CountedActivitySequenceEvent(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: ICountedActivityEvent[];\r\n\r\n\tpublic constructor(data: CountedActivitySequenceEventData) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (!data.sequence) {\r\n\t\t\tthrow new Error(\"data.sequence must not be null\");\r\n\t\t}\r\n\t\tif (data.sequence.length === 0) {\r\n\t\t\tthrow new Error(\"data.sequence size must be greater than 0\");\r\n\t\t}\r\n\r\n\t\tthis.data = [];\r\n\t\tfor (const countedActivityEventData of data.sequence) {\r\n\t\t\tthis.data.push(new CountedActivityEvent(countedActivityEventData));\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getSequence(): ICountedActivityEvent[] {\r\n\t\treturn this.data;\r\n\t}\r\n\r\n\tpublic getType(): ISurveyEvent.Type {\r\n\t\treturn ISurveyEvent.Type.CountedActivitySequence;\r\n\t}\r\n\r\n\tpublic getTrackingSet(): ActivityTrackingSet {\r\n\t\tconst trackingDataList = new Array<ActivityTrackingData>();\r\n\r\n\t\tfor (const countedActivityEvent of this.data) {\r\n\t\t\ttrackingDataList.push(new ActivityTrackingData(countedActivityEvent.getActivity(), countedActivityEvent.getCount(),\r\n\t\t\t\tcountedActivityEvent.isAggregate()));\r\n\t\t}\r\n\r\n\t\treturn new ActivityTrackingSet(true, trackingDataList);\r\n\t}\r\n}\r\n\r\n/**\r\n * Data class for serialization and deserialization. Do not add logic in here.\r\n */\r\nexport class CountedActivitySequenceEventData {\r\n\tpublic sequence: CountedActivityEventData[];\r\n\r\n\t/**\r\n\t * No args constructor needed for serialization.\r\n\t */\r\n\tpublic CountedActivitySequenceEventData() {\r\n\t}\r\n}\r\n","/**\r\n * Basic structure used to configure an ActivityTracker\r\n */\r\nexport class ActivityTrackingData {\r\n\tprivate activity: string;\r\n\tprivate count: number;\r\n\tprivate isAggregate: boolean;\r\n\r\n\tpublic constructor(activity: string, count: number, isAggregate: boolean) {\r\n\t\tthis.activity = activity;\r\n\t\tthis.count = count;\r\n\t\tthis.isAggregate = isAggregate;\r\n\t}\r\n\r\n\tpublic getActivity(): string {\r\n\t\treturn this.activity;\r\n\t}\r\n\r\n\tpublic getCount(): number {\r\n\t\treturn this.count;\r\n\t}\r\n\r\n\tpublic setCount(count: number): void {\r\n\t\tthis.count = count;\r\n\t}\r\n\r\n\tpublic getIsAggregate(): boolean {\r\n\t\treturn this.isAggregate;\r\n\t}\r\n}\r\n","import { ActivityTrackingData } from \"./ActivityTrackingData\";\r\nimport SurveyActivityListener = require(\"./SurveyActivityListener\");\r\nimport { isNOU } from \"./Utils\";\r\n\r\n/**\r\n * Class to hold a collection of Activity Tracking Data\r\n */\r\nexport class ActivityTrackingSet {\r\n\tprivate isOrdered: boolean;\r\n\tprivate list: ActivityTrackingData[];\r\n\r\n\tpublic constructor(isOrdered: boolean, list: ActivityTrackingData[]) {\r\n\t\tthis.isOrdered = isOrdered;\r\n\t\tthis.list = list;\r\n\t}\r\n\r\n\tpublic getIsOrdered(): boolean {\r\n\t\treturn this.isOrdered;\r\n\t}\r\n\r\n\tpublic getList(): ActivityTrackingData[] {\r\n\t\treturn this.list;\r\n\t}\r\n\r\n\t// returns a stringified json with the list and isOrdered info.\r\n\tpublic getActivityTrackingInfo(activityListener: SurveyActivityListener, surveyId: string): string {\r\n\r\n\t\tlet activitiesInfoObject: {\r\n\t\t\tActivities: Array<{ Activity: string, Count: number, IsAggregate: boolean }>,\r\n\t\t\tIsListOrdered: boolean,\r\n\t\t};\r\n\r\n\t\tif (this.list.length === 0) {\r\n\t\t\tactivitiesInfoObject = {\r\n\t\t\t\tActivities: [],\r\n\t\t\t\tIsListOrdered: this.isOrdered,\r\n\t\t\t};\r\n\r\n\t\t\treturn JSON.stringify(activitiesInfoObject);\r\n\t\t}\r\n\r\n\t\tfor (const trackingData of this.list) {\r\n\r\n\t\t\tconst actualCount = activityListener.getCount(trackingData.getActivity(), surveyId);\r\n\t\t\tconst tempActivities = {\r\n\t\t\t\t\t\tActivity: trackingData.getActivity(),\r\n\t\t\t\t\t\tActualCount: actualCount,\r\n\t\t\t\t\t\tCount: trackingData.getCount(),\r\n\t\t\t\t\t\tIsAggregate: trackingData.getIsAggregate(),\r\n\t\t\t\t\t\tIsDiscrete: actualCount % 1 === 0,\r\n\t\t\t\t\t};\r\n\r\n\t\t\tif (isNOU(activitiesInfoObject)) {\r\n\t\t\t\tactivitiesInfoObject = {\r\n\t\t\t\t\t\t\t\tActivities: [tempActivities],\r\n\t\t\t\t\t\t\t\tIsListOrdered: this.isOrdered,\r\n\t\t\t\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\tactivitiesInfoObject.Activities.push(tempActivities);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn JSON.stringify(activitiesInfoObject);\r\n\t}\r\n}\r\n","import { ISurveyMetadata } from \"./ISurveyMetadata\";\r\nimport * as Utils from \"./Utils\";\r\n\r\nexport class SurveyMetadata implements ISurveyMetadata {\r\n\tpublic static make(data: Metadata): ISurveyMetadata {\r\n\t\ttry {\r\n\t\t\treturn new SurveyMetadata(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: Metadata;\r\n\r\n\tpublic constructor(data: Metadata) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (!data.contentMetadata) {\r\n\t\t\tthrow new Error(\"content metadata must not be null\");\r\n\t\t}\r\n\t\tif (!Utils.isObject(data.contentMetadata)) {\r\n\t\t\tthrow new Error(\"content metadata must be of object type\");\r\n\t\t}\r\n\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\tpublic getContentMetadata(): object {\r\n\t\treturn this.data.contentMetadata;\r\n\t}\r\n}\r\n\r\n/**\r\n * Data class for serialization and deserialization. Do not add logic in here.\r\n */\r\nexport class Metadata {\r\n\tpublic contentMetadata: object;\r\n}\r\n","import * as IFloodgateStringProvider from \"../Api/IFloodgateStringProvider\";\r\nimport { IFpsSurvey } from \"../Api/IFpsSurvey\";\r\nimport * as ISurvey from \"../Api/ISurvey\";\r\nimport * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport { CampaignSurveyContent, CampaignSurveyTemplate } from \"../Campaign/CampaignDefinitionProvider\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport * as CommentComponent from \"../SurveyComponents/CommentComponent\";\r\nimport * as CVSurveyComponent from \"../SurveyComponents/CVSurveyComponent\";\r\nimport * as MultipleChoiceComponent from \"../SurveyComponents/MultipleChoiceComponent\";\r\nimport * as PromptComponent from \"../SurveyComponents/PromptComponent\";\r\nimport * as RatingComponent from \"../SurveyComponents/RatingComponent\";\r\nimport * as Utils from \"../Utils\";\r\nimport { Survey } from \"./Survey\";\r\nimport * as SurveyDataSource from \"./SurveyDataSource\";\r\n\r\nconst { isNOU } = Utils;\r\n\r\nclass FpsSurvey extends Survey implements IFpsSurvey {\r\n\tpublic static make(data: FpsSurvey.FpsSurveyData): IFpsSurvey {\r\n\t\ttry {\r\n\t\t\treturn new FpsSurvey(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static makeFps(baseData: SurveyDataSource.SurveyDataSourceData, sp: IFloodgateStringProvider,\r\n\t\tsurveyModel: CampaignSurveyTemplate): IFpsSurvey {\r\n\r\n\t\tif (isNOU(baseData) || isNOU(sp) || isNOU(surveyModel)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst ratingValuesAscending: string[] = [];\r\n\t\tconst availableOptions: string[] = [];\r\n\t\tconst content: CampaignSurveyContent = surveyModel.content;\r\n\r\n\t\t// Prompt is required and at least one of the other components are required\r\n\t\tif (isNOU(content) || isNOU(content.prompt) ||\r\n\t\t\t(isNOU(content.rating) && isNOU(content.multipleChoice) &&\r\n\t\t\tisNOU(content.comment))) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst data = new FpsSurvey.FpsSurveyData();\r\n\t\tdata.baseData = baseData;\r\n\t\tdata.promptData = new PromptComponent.PromptComponentData();\r\n\t\tdata.promptData.title = sp.getCustomString(content.prompt.title);\r\n\t\tdata.promptData.question = sp.getCustomString(content.prompt.question);\r\n\t\tdata.promptData.yesButtonLabel = sp.getCustomString(content.prompt.yesLabel);\r\n\t\tdata.promptData.noButtonLabel = sp.getCustomString(content.prompt.noLabel);\r\n\r\n\t\tif ( isNOU(data.promptData.title)\r\n\t\t\t|| isNOU(data.promptData.question)\r\n\t\t\t|| isNOU(data.promptData.yesButtonLabel)\r\n\t\t\t|| isNOU(data.promptData.noButtonLabel)) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (content.rating) {\r\n\t\t\tdata.ratingData = new RatingComponent.RatingComponentData();\r\n\t\t\tdata.ratingData.question = sp.getCustomString(content.rating.question);\r\n\t\t\tdata.ratingData.isZeroBased = content.rating.isZeroBased;\r\n\r\n\t\t\tfor (const value of content.rating.ratingValuesAscending) {\r\n\t\t\t\tconst customString: string = sp.getCustomString(value);\r\n\r\n\t\t\t\tif (isNOU(customString)) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tratingValuesAscending.push(customString);\r\n\t\t\t}\r\n\r\n\t\t\tdata.ratingData.ratingValuesAscending = ratingValuesAscending;\r\n\r\n\t\t\tif (isNOU(data.ratingData.question)\r\n\t\t\t\t|| isNOU(data.ratingData.ratingValuesAscending)) {\r\n\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (content.multipleChoice) {\r\n\t\t\tdata.multipleChoiceData = new MultipleChoiceComponent.MultipleChoiceComponentData();\r\n\t\t\tdata.multipleChoiceData.question = sp.getCustomString(content.multipleChoice.question);\r\n\t\t\tdata.multipleChoiceData.minNumberOfSelectedOptions = content.multipleChoice.minNumberOfSelectedOptions;\r\n\t\t\tdata.multipleChoiceData.maxNumberOfSelectedOptions = content.multipleChoice.maxNumberOfSelectedOptions;\r\n\r\n\t\t\tfor (const value of content.multipleChoice.availableOptions) {\r\n\t\t\t\tconst customString: string = sp.getCustomString(value);\r\n\r\n\t\t\t\tif (isNOU(customString)) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tavailableOptions.push(customString);\r\n\t\t\t}\r\n\r\n\t\t\tdata.multipleChoiceData.availableOptions = availableOptions;\r\n\r\n\t\t\tif (isNOU(data.multipleChoiceData.question)\r\n\t\t\t\t|| isNOU(data.multipleChoiceData.availableOptions)) {\r\n\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (content.comment) {\r\n\t\t\tdata.commentData = new CommentComponent.CommentComponentData();\r\n\t\t\tdata.commentData.question = sp.getCustomString(content.comment.question);\r\n\r\n\t\t\tif (isNOU(data.commentData.question)) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// cvsurvey data is not required on all surveys.\r\n\t\tif (content.cvSurvey) {\r\n\t\t\tdata.cvSurveyData = new CVSurveyComponent.CVSurveyComponentData();\r\n\t\t\tdata.cvSurveyData.customerVoiceFormId =  content.cvSurvey.customerVoiceFormId;\r\n\r\n\t\t\tif (isNOU(data.cvSurveyData.customerVoiceFormId)) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.make(data);\r\n\t}\r\n\r\n\tprivate surveyInfo: SurveyDataSource;\r\n\tprivate question: CommentComponent;\r\n\tprivate prompt: PromptComponent;\r\n\tprivate rating: RatingComponent;\r\n\tprivate multipleChoice: MultipleChoiceComponent;\r\n\tprivate cvSurvey: CVSurveyComponent;\r\n\r\n\tprivate constructor(data: FpsSurvey.FpsSurveyData) {\r\n\t\tsuper();\r\n\t\tif (isNOU(data)) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.surveyInfo = new SurveyDataSource(data.baseData);\r\n\t\tthis.prompt = new PromptComponent(data.promptData);\r\n\t\tthis.question = data.commentData ? (new CommentComponent(data.commentData)) : null;\r\n\t\tthis.rating = data.ratingData ? (new RatingComponent(data.ratingData)) : null;\r\n\t\tthis.multipleChoice = data.multipleChoiceData ? (new MultipleChoiceComponent(data.multipleChoiceData)) : null;\r\n\t\tthis.cvSurvey = data.cvSurveyData ? (new CVSurveyComponent(data.cvSurveyData)) : null;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): ISurvey.Type {\r\n\t\treturn ISurvey.Type.Fps;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getSurveyInfo(): ISurveyInfo {\r\n\t\treturn this.surveyInfo;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getCommentComponent(): CommentComponent {\r\n\t\treturn this.question;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getPromptComponent(): PromptComponent {\r\n\t\treturn this.prompt;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getRatingComponent(): RatingComponent {\r\n\t\treturn this.rating;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getMultipleChoiceComponent(): MultipleChoiceComponent {\r\n\t\treturn this.multipleChoice;\r\n\t}\r\n\r\n\tpublic getCVSurveyComponent(): CVSurveyComponent {\r\n\t\treturn this.cvSurvey;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponent(componentType: ISurveyComponent.Type): ISurveyComponent {\r\n\t\tswitch (componentType) {\r\n\t\t\tcase ISurveyComponent.Type.Comment:\r\n\t\t\t\treturn this.getCommentComponent();\r\n\t\t\tcase ISurveyComponent.Type.Prompt:\r\n\t\t\t\treturn this.getPromptComponent();\r\n\t\t\tcase ISurveyComponent.Type.Rating:\r\n\t\t\t\treturn this.getRatingComponent();\r\n\t\t\tcase ISurveyComponent.Type.MultipleChoice:\r\n\t\t\t\treturn this.getMultipleChoiceComponent();\r\n\t\t\tcase ISurveyComponent.Type.CVSurvey:\r\n\t\t\t\treturn this.getCVSurveyComponent();\r\n\t\t\tdefault:\r\n\t\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\tif (isNOU(doc)) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\r\n\t\tconst element: Element = doc.createElement(ISurvey.DOM_FPS_TAGNAME);\r\n\r\n\t\tthis.getSurveyInfo().getDomElements(doc).forEach((child) => {\r\n\t\t\tif (!isNOU(child)) {\r\n\t\t\t\telement.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.getCommentComponent().getDomElements(doc).forEach((child) => {\r\n\t\t\tif (!isNOU(child)) {\r\n\t\t\t\telement.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (this.getRatingComponent()) {\r\n\t\t\tthis.getRatingComponent().getDomElements(doc).forEach((child) => {\r\n\t\t\t\tif (!isNOU(child)) {\r\n\t\t\t\t\telement.appendChild(child);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.getMultipleChoiceComponent()) {\r\n\t\t\tthis.getMultipleChoiceComponent().getDomElements(doc).forEach((child) => {\r\n\t\t\t\tif (!isNOU(child)) {\r\n\t\t\t\t\telement.appendChild(child);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn [element];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tlet result: object = {};\r\n\r\n\t\tresult = Utils.overrideValues(this.getSurveyInfo().getJsonElements(), result);\r\n\t\tresult[ISurveyComponent.JSON_APPLICATION_KEYNAME] = {};\r\n\r\n\t\tresult[ISurveyComponent.JSON_APPLICATION_KEYNAME][ISurveyComponent.JSON_EXTENDEDMANIFESTDATA_KEYNAME] =\r\n\t\t\tJSON.stringify({\r\n\t\t\t\t[ISurveyComponent.JSON_SURVEYSTRINGS_KEYNAME]: this.makeSurveyStrings(),\r\n\t\t\t\t[ISurveyComponent.JSON_SURVEYSPECIFICDATA_KEYNAME]: this.makeResponseString(),\r\n\t\t\t});\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// Makes the string to send to Manifest respecting the components present in the survey\r\n\tprivate makeResponseString(): string {\r\n\t\tconst response: object = {};\r\n\r\n\t\tif (this.question) {\r\n\t\t\tresponse[ISurveyComponent.JSON_COMMENT_KEYNAME] = [this.getCommentComponent().getSubmittedText()];\r\n\t\t}\r\n\r\n\t\tif (this.multipleChoice) {\r\n\t\t\tresponse[ISurveyComponent.JSON_MULTIPLECHOICE_KEYNAME] =\r\n\t\t\t\t[this.getMultipleChoiceComponent().getOptionSelectedStates()];\r\n\t\t}\r\n\r\n\t\tif (this.rating) {\r\n\t\t\tresponse[ISurveyComponent.JSON_RATING_KEYNAME] = [\r\n\t\t\t\t{numberOfOptions: this.getRatingComponent().getRatingValuesAscending().length,\r\n\t\t\tselectedRating: this.getRatingComponent().getSelectedRatingIndex() }];\r\n\t\t}\r\n\r\n\t\treturn JSON.stringify(response);\r\n\t}\r\n\r\n\t// Makes the string to send to Manifest respecting the components present in the survey\r\n\tprivate makeSurveyStrings(): string {\r\n\t\tconst actualStrings: object = {};\r\n\r\n\t\tif (this.prompt) {\r\n\t\t\tactualStrings[ISurveyComponent.JSON_PROMPT_KEYNAME] = this.prompt.getComponentJson();\r\n\t\t}\r\n\r\n\t\tif (this.rating) {\r\n\t\t\tactualStrings[ISurveyComponent.JSON_RATING_KEYNAME] = [this.rating.getComponentJson()];\r\n\t\t}\r\n\r\n\t\tif (this.question) {\r\n\t\t\tactualStrings[ISurveyComponent.JSON_COMMENT_KEYNAME] = [this.question.getComponentJson()];\r\n\t\t}\r\n\r\n\t\tif (this.multipleChoice) {\r\n\t\t\tactualStrings[ISurveyComponent.JSON_MULTIPLECHOICE_KEYNAME] = [this.multipleChoice.getComponentJson()];\r\n\t\t}\r\n\r\n\t\treturn JSON.stringify(actualStrings);\r\n\t}\r\n}\r\nmodule FpsSurvey {\r\n\t/**\r\n\t * Data required for a Fps Survey\r\n\t */\r\n\texport class FpsSurveyData {\r\n\t\tpublic baseData: SurveyDataSource.SurveyDataSourceData;\r\n\t\tpublic commentData: CommentComponent.CommentComponentData;\r\n\t\tpublic promptData: PromptComponent.PromptComponentData;\r\n\t\tpublic ratingData: RatingComponent.RatingComponentData;\r\n\t\tpublic multipleChoiceData: MultipleChoiceComponent.MultipleChoiceComponentData;\r\n\t\tpublic cvSurveyData: CVSurveyComponent.CVSurveyComponentData;\r\n\t}\r\n}\r\n\r\nexport = FpsSurvey;\r\n","import * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport { IMultipleChoiceComponent } from \"./../Api/IMultipleChoiceComponent\";\r\n\r\nclass MultipleChoiceComponent implements IMultipleChoiceComponent {\r\n\tpublic static make(data: MultipleChoiceComponent.MultipleChoiceComponentData): IMultipleChoiceComponent {\r\n\t\ttry {\r\n\t\t\treturn new MultipleChoiceComponent(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: MultipleChoiceComponent.MultipleChoiceComponentData;\r\n\tprivate optionStates: boolean[];\r\n\r\n\tpublic constructor(data: MultipleChoiceComponent.MultipleChoiceComponentData) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (!data.question) {\r\n\t\t\tthrow new Error(\"data.question must not be null or empty\");\r\n\t\t}\r\n\t\tif (!data.availableOptions || data.availableOptions.length < 2) {\r\n\t\t\tthrow new Error(\"data.availableOptions must not be null or have less than two choices\");\r\n\t\t}\r\n\r\n\t\tdata.availableOptions.forEach((option) => {\r\n\t\t\tif (!option) {\r\n\t\t\t\tthrow new Error(\"Option values must not contain null or empty\");\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.data = data;\r\n\t\tthis.optionStates = new Array<boolean>(data.availableOptions.length);\r\n\t\t// Initialize with all false values\r\n\t\tfor (let i = 0; i < this.optionStates.length; i++) {\r\n\t\t\tthis.optionStates[i] = false;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getType(): ISurveyComponent.Type {\r\n\t\treturn ISurveyComponent.Type.MultipleChoice;\r\n\t}\r\n\r\n\tpublic getQuestion(): string {\r\n\t\treturn this.data.question;\r\n\t}\r\n\r\n\tpublic getAvailableOptions(): string[] {\r\n\t\treturn this.data.availableOptions;\r\n\t}\r\n\r\n\tpublic getOptionSelectedStates(): boolean[] {\r\n\t\treturn this.optionStates;\r\n\t}\r\n\r\n\tpublic getMinNumberofSelectedOptions(): number {\r\n\t\treturn this.data.minNumberOfSelectedOptions;\r\n\t}\r\n\r\n\tpublic getMaxNumberofSelectedOptions(): number {\r\n\t\treturn this.data.maxNumberOfSelectedOptions;\r\n\t}\r\n\r\n\tpublic setOptionSelectedStates(selectedStates: boolean[]): void {\r\n\t\tfor (let i = 0; i < selectedStates.length; i ++) {\r\n\t\t\tthis.optionStates[i] = selectedStates[i];\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ValidateMinNumberofSelectedOptions(): boolean {\r\n\t\tlet result: number = 0;\r\n\t\tthis.optionStates.forEach((element) => {\r\n\t\t\tif (element) {\r\n\t\t\t\tresult++;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn (result >= this.getMinNumberofSelectedOptions());\r\n\t}\r\n\r\n\tpublic ValidateMaxNumberofSelectedOptions(): boolean {\r\n\t\tlet result: number = 0;\r\n\t\tthis.optionStates.forEach((element) => {\r\n\t\t\tif (element) {\r\n\t\t\t\tresult++;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn (result <= this.getMaxNumberofSelectedOptions());\r\n\t}\r\n\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\tif (!doc) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\r\n\t\tconst element: Element = doc.createElement(ISurveyComponent.DOM_MULTIPLECHOICE_TAGNAME);\r\n\r\n\t\telement.appendChild(doc.createTextNode(this.getOptionSelectedStates().toString()));\r\n\r\n\t\treturn [element];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tconst result: object = {};\r\n\t\tresult[ISurveyComponent.JSON_MULTIPLECHOICE_KEYNAME] = this.getOptionSelectedStates().toString();\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponentJson(): object {\r\n\t\treturn {\r\n\t\t\t[ISurveyComponent.JSON_QUESTION_KEYNAME]: this.getQuestion(),\r\n\t\t\t[ISurveyComponent.JSON_RATINGOPTIONS_KEYNAME]: this.getAvailableOptions(),\r\n\t\t};\r\n\t}\r\n}\r\n\r\nmodule MultipleChoiceComponent {\r\n\texport class MultipleChoiceComponentData {\r\n\t\tpublic question: string;\r\n\t\tpublic availableOptions: string[];\r\n\t\tpublic minNumberOfSelectedOptions: number;\r\n\t\tpublic maxNumberOfSelectedOptions: number;\r\n\t}\r\n}\r\n\r\nexport = MultipleChoiceComponent;\r\n","import * as ISurvey from \"../Api/ISurvey\";\r\nimport * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport * as Utils from \"../Utils\";\r\nimport { Survey } from \"./Survey\";\r\nimport * as SurveyDataSource from \"./SurveyDataSource\";\r\n\r\nconst { isNOU } = Utils;\r\n\r\nclass GenericMessagingSurfaceSurvey extends Survey {\r\n\tpublic static make(data: GenericMessagingSurfaceSurvey.GenericMessagingSurfaceSurveyData): ISurvey {\r\n\t\ttry {\r\n\t\t\treturn new GenericMessagingSurfaceSurvey(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static makeCustom(baseData: SurveyDataSource.SurveyDataSourceData): ISurvey {\r\n\t\tif (isNOU(baseData)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst data = new GenericMessagingSurfaceSurvey.GenericMessagingSurfaceSurveyData();\r\n\t\tdata.baseData = baseData;\r\n\r\n\t\treturn this.make(data);\r\n\t}\r\n\r\n\tprivate surveyInfo: SurveyDataSource;\r\n\r\n\tprivate constructor(data: GenericMessagingSurfaceSurvey.GenericMessagingSurfaceSurveyData) {\r\n\t\tsuper();\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.surveyInfo = new SurveyDataSource(data.baseData);\r\n\r\n\t\t// This check cannot be done in survey info constructor\r\n\t\t// as metadata is specific to this survey type.\r\n\t\tif (isNOU(this.surveyInfo.getMetadata())) {\r\n\t\t\tthrow new Error(\"metadata must not be null\");\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): ISurvey.Type {\r\n\t\treturn ISurvey.Type.GenericMessagingSurface;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getSurveyInfo(): ISurveyInfo {\r\n\t\treturn this.surveyInfo;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponent(componentType: ISurveyComponent.Type): ISurveyComponent {\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\treturn [];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\treturn {};\r\n\t}\r\n}\r\n\r\nmodule GenericMessagingSurfaceSurvey {\r\n\t/**\r\n\t * Data required for a Generic Surface Survey\r\n\t */\r\n\texport class GenericMessagingSurfaceSurveyData {\r\n\t\tpublic baseData: SurveyDataSource.SurveyDataSourceData;\r\n\t}\r\n}\r\n\r\nexport = GenericMessagingSurfaceSurvey;\r\n","import * as IFloodgateStringProvider from \"../Api/IFloodgateStringProvider\";\r\nimport { IInterceptSurvey } from \"../Api/IInterceptSurvey\";\r\nimport * as ISurvey from \"../Api/ISurvey\";\r\nimport * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport { CampaignSurveyContent, CampaignSurveyTemplate } from \"../Campaign/CampaignDefinitionProvider\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport * as InterceptComponent from \"../SurveyComponents/InterceptComponent\";\r\nimport * as Utils from \"../Utils\";\r\nimport { Survey } from \"./Survey\";\r\nimport * as SurveyDataSource from \"./SurveyDataSource\";\r\n\r\nconst { isNOU } = Utils;\r\n\r\nclass InterceptSurvey extends Survey implements IInterceptSurvey {\r\n\tpublic static make(data: InterceptSurvey.InterceptSurveyData): IInterceptSurvey {\r\n\t\ttry {\r\n\t\t\treturn new InterceptSurvey(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static makeIntercept(baseData: SurveyDataSource.SurveyDataSourceData, sp: IFloodgateStringProvider,\r\n\t\tsurveyModel: CampaignSurveyTemplate): IInterceptSurvey {\r\n\r\n\t\tif (isNOU(baseData) || isNOU(sp) || isNOU(surveyModel)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst content: CampaignSurveyContent = surveyModel.content;\r\n\r\n\t\t// Intercept component is required.\r\n\t\tif (isNOU(content) || isNOU(content.intercept)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst data = new InterceptSurvey.InterceptSurveyData();\r\n\t\tdata.baseData = baseData;\r\n\r\n\t\tdata.interceptData = new InterceptComponent.InterceptComponentData();\r\n\r\n\t\tdata.interceptData.title = sp.getCustomString(content.intercept.title);\r\n\t\tdata.interceptData.question = sp.getCustomString(content.intercept.question);\r\n\t\tdata.interceptData.url = sp.getCustomString(content.intercept.url);\r\n\r\n\t\tif ( isNOU(data.interceptData.title)\r\n\t\t\t|| isNOU(data.interceptData.question)\r\n\t\t\t|| isNOU(data.interceptData.url)) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn this.make(data);\r\n\t}\r\n\r\n\tprivate surveyInfo: SurveyDataSource;\r\n\tprivate intercept: InterceptComponent;\r\n\r\n\tprivate constructor(data: InterceptSurvey.InterceptSurveyData) {\r\n\t\tsuper();\r\n\t\tif (isNOU(data)) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.surveyInfo = new SurveyDataSource(data.baseData);\r\n\t\tthis.intercept = new InterceptComponent(data.interceptData);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): ISurvey.Type {\r\n\t\treturn ISurvey.Type.Intercept;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getSurveyInfo(): ISurveyInfo {\r\n\t\treturn this.surveyInfo;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getInterceptComponent(): InterceptComponent {\r\n\t\treturn this.intercept;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponent(componentType: ISurveyComponent.Type): ISurveyComponent {\r\n\t\treturn (componentType === ISurveyComponent.Type.Intercept) ? this.getInterceptComponent() : null;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\treturn [];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\treturn {};\r\n\t}\r\n}\r\nmodule InterceptSurvey {\r\n\t/**\r\n\t * Data required for an Intercept Survey\r\n\t */\r\n\texport class InterceptSurveyData {\r\n\t\tpublic baseData: SurveyDataSource.SurveyDataSourceData;\r\n\t\tpublic interceptData: InterceptComponent.InterceptComponentData;\r\n\t}\r\n}\r\n\r\nexport = InterceptSurvey;\r\n","import * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport { IInterceptComponent } from \"./../Api/IInterceptComponent\";\r\n\r\nclass InterceptComponent implements IInterceptComponent {\r\n\tpublic static make(data: InterceptComponent.InterceptComponentData): IInterceptComponent {\r\n\t\ttry {\r\n\t\t\treturn new InterceptComponent(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate data: InterceptComponent.InterceptComponentData;\r\n\r\n\tpublic constructor(data: InterceptComponent.InterceptComponentData) {\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\t\tif (!data.question) {\r\n\t\t\tthrow new Error(\"data.question must not be null or empty\");\r\n\t\t}\r\n\t\tif (!data.title) {\r\n\t\t\tthrow new Error(\"data.title must not be null or empty\");\r\n\t\t}\r\n\t\tif (!data.url) {\r\n\t\t\tthrow new Error(\"data.url must not be null or empty\");\r\n\t\t}\r\n\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): ISurveyComponent.Type {\r\n\t\treturn ISurveyComponent.Type.Intercept;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getTitle(): string {\r\n\t\treturn this.data.title;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getQuestion(): string {\r\n\t\treturn this.data.question;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getUrl(): string {\r\n\t\treturn this.data.url;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[]  {\r\n\t\tif (!doc) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\t\treturn [doc.createElement(ISurveyComponent.DOM_INTERCEPT_TAGNAME)];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\treturn {[ISurveyComponent.JSON_INTERCEPT_KEYNAME]: \"\"};\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponentJson(): object {\r\n\t\treturn {\r\n\t\t\t[ISurveyComponent.JSON_TITLE_KEYNAME]: this.getTitle(),\r\n\t\t\t[ISurveyComponent.JSON_QUESTION_KEYNAME]: this.getQuestion(),\r\n\t\t\t[ISurveyComponent.JSON_INTERCEPTURL_KEYNAME]: this.getUrl(),\r\n\t\t};\r\n\t}\r\n}\r\n\r\nmodule InterceptComponent {\r\n\texport class InterceptComponentData {\r\n\t\tpublic question: string;\r\n\t\tpublic title: string;\r\n\t\tpublic url: string;\r\n\t}\r\n}\r\n\r\nexport = InterceptComponent;\r\n","import * as IFloodgateStringProvider from \"../Api/IFloodgateStringProvider\";\r\nimport { INlqsSurvey } from \"../Api/INlqsSurvey\";\r\nimport * as ISurvey from \"../Api/ISurvey\";\r\nimport * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport { CampaignSurveyContent, CampaignSurveyTemplate } from \"../Campaign/CampaignDefinitionProvider\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport * as CommentComponent from \"../SurveyComponents/CommentComponent\";\r\nimport * as PromptComponent from \"../SurveyComponents/PromptComponent\";\r\nimport * as RatingComponent from \"../SurveyComponents/RatingComponent\";\r\nimport * as Utils from \"../Utils\";\r\nimport { Survey } from \"./Survey\";\r\nimport * as SurveyDataSource from \"./SurveyDataSource\";\r\n\r\nconst { isNOU, overrideValues } = Utils;\r\n\r\nclass NlqsSurvey extends Survey implements INlqsSurvey {\r\n\tpublic static make(data: NlqsSurvey.NlqsSurveyData): INlqsSurvey {\r\n\t\ttry {\r\n\t\t\treturn new NlqsSurvey(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static makeNlqs(baseData: SurveyDataSource.SurveyDataSourceData, sp: IFloodgateStringProvider,\r\n\t\tsurveyModel: CampaignSurveyTemplate): INlqsSurvey {\r\n\r\n\t\tif (isNOU(baseData) || isNOU(sp) || isNOU(surveyModel)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst ratingValuesAscending: string[] = [];\r\n\t\tconst content: CampaignSurveyContent = surveyModel.content;\r\n\r\n\t\tif (isNOU(content) || isNOU(content.comment)\r\n\t\t\t|| isNOU(content.prompt) || isNOU(content.rating)) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst data = new NlqsSurvey.NlqsSurveyData();\r\n\t\tdata.baseData = baseData;\r\n\t\tdata.promptData = new PromptComponent.PromptComponentData();\r\n\t\tdata.ratingData = new RatingComponent.RatingComponentData();\r\n\t\tdata.commentData = new CommentComponent.CommentComponentData();\r\n\r\n\t\tdata.promptData.title = sp.getCustomString(content.prompt.title);\r\n\t\tdata.promptData.question = sp.getCustomString(content.prompt.question);\r\n\t\tdata.promptData.yesButtonLabel = sp.getCustomString(content.prompt.yesLabel);\r\n\t\tdata.promptData.noButtonLabel = sp.getCustomString(content.prompt.noLabel);\r\n\t\tdata.ratingData.question = sp.getCustomString(content.rating.question);\r\n\t\tdata.ratingData.isZeroBased = content.rating.isZeroBased;\r\n\t\tdata.commentData.question = sp.getCustomString(content.comment.question);\r\n\r\n\t\tfor (const value of content.rating.ratingValuesAscending) {\r\n\t\t\tconst customString: string = sp.getCustomString(value);\r\n\r\n\t\t\tif (isNOU(customString)) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tratingValuesAscending.push(customString);\r\n\t\t}\r\n\r\n\t\tdata.ratingData.ratingValuesAscending = ratingValuesAscending;\r\n\r\n\t\tif (isNOU(data.ratingData.question)\r\n\t\t\t|| isNOU(data.commentData.question)\r\n\t\t\t|| isNOU(data.promptData.title)\r\n\t\t\t|| isNOU(data.promptData.question)\r\n\t\t\t|| isNOU(data.promptData.yesButtonLabel)\r\n\t\t\t|| isNOU(data.promptData.noButtonLabel)\r\n\t\t\t|| isNOU(data.ratingData.ratingValuesAscending)) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn this.make(data);\r\n\t}\r\n\r\n\tprivate surveyInfo: SurveyDataSource;\r\n\tprivate question: CommentComponent;\r\n\tprivate prompt: PromptComponent;\r\n\tprivate rating: RatingComponent;\r\n\r\n\tprivate constructor(data: NlqsSurvey.NlqsSurveyData) {\r\n\t\tsuper();\r\n\t\tif (isNOU(data)) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.surveyInfo = new SurveyDataSource(data.baseData);\r\n\t\tthis.prompt = new PromptComponent(data.promptData);\r\n\t\tthis.question = new CommentComponent(data.commentData);\r\n\t\tthis.rating = new RatingComponent(data.ratingData);\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): ISurvey.Type {\r\n\t\treturn ISurvey.Type.Nlqs;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getSurveyInfo(): ISurveyInfo {\r\n\t\treturn this.surveyInfo;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getCommentComponent(): CommentComponent {\r\n\t\treturn this.question;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getPromptComponent(): PromptComponent {\r\n\t\treturn this.prompt;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getRatingComponent(): RatingComponent {\r\n\t\treturn this.rating;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponent(componentType: ISurveyComponent.Type): ISurveyComponent {\r\n\t\tswitch (componentType) {\r\n\t\t\tcase ISurveyComponent.Type.Comment:\r\n\t\t\t\treturn this.getCommentComponent();\r\n\t\t\tcase ISurveyComponent.Type.Prompt:\r\n\t\t\t\treturn this.getPromptComponent();\r\n\t\t\tcase ISurveyComponent.Type.Rating:\r\n\t\t\t\treturn this.getRatingComponent();\r\n\t\t\tdefault:\r\n\t\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\tif (isNOU(doc)) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\r\n\t\tconst element: Element = doc.createElement(ISurvey.DOM_NLQS_TAGNAME);\r\n\r\n\t\tthis.getSurveyInfo().getDomElements(doc).forEach((child) => {\r\n\t\t\tif (!isNOU(child)) {\r\n\t\t\t\telement.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.getCommentComponent().getDomElements(doc).forEach((child) => {\r\n\t\t\tif (!isNOU(child)) {\r\n\t\t\t\telement.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.getRatingComponent().getDomElements(doc).forEach((child) => {\r\n\t\t\tif (!isNOU(child)) {\r\n\t\t\t\telement.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn [element];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tlet result: object = {};\r\n\r\n\t\tresult = overrideValues(this.getSurveyInfo().getJsonElements(), result);\r\n\t\tresult = overrideValues(this.getCommentComponent().getJsonElements(), result);\r\n\t\tresult = overrideValues(this.getRatingComponent().getJsonElements(), result);\r\n\r\n\t\treturn result;\r\n\t}\r\n}\r\n\r\nmodule NlqsSurvey {\r\n\t/**\r\n\t * Data required for a Nlqs Survey\r\n\t */\r\n\texport class NlqsSurveyData {\r\n\t\tpublic baseData: SurveyDataSource.SurveyDataSourceData;\r\n\t\tpublic commentData: CommentComponent.CommentComponentData;\r\n\t\tpublic promptData: PromptComponent.PromptComponentData;\r\n\t\tpublic ratingData: RatingComponent.RatingComponentData;\r\n\t}\r\n}\r\n\r\nexport = NlqsSurvey;\r\n","import * as IFloodgateStringProvider from \"../Api/IFloodgateStringProvider\";\r\nimport { INpsSurvey } from \"../Api/INpsSurvey\";\r\nimport * as ISurvey from \"../Api/ISurvey\";\r\nimport * as ISurveyComponent from \"../Api/ISurveyComponent\";\r\nimport { CampaignSurveyContent, CampaignSurveyTemplate } from \"../Campaign/CampaignDefinitionProvider\";\r\nimport * as ISurveyInfo from \"../ISurveyInfo\";\r\nimport * as CommentComponent from \"../SurveyComponents/CommentComponent\";\r\nimport * as CVSurveyComponent from \"../SurveyComponents/CVSurveyComponent\";\r\nimport * as PromptComponent from \"../SurveyComponents/PromptComponent\";\r\nimport * as RatingComponent from \"../SurveyComponents/RatingComponent\";\r\nimport * as Utils from \"../Utils\";\r\nimport { Survey } from \"./Survey\";\r\nimport * as SurveyDataSource from \"./SurveyDataSource\";\r\n\r\nconst { isNOU, overrideValues } = Utils;\r\n\r\nclass NpsSurvey extends Survey implements INpsSurvey {\r\n\tpublic static make(data: NpsSurvey.NpsSurveyData): INpsSurvey {\r\n\t\ttry {\r\n\t\t\treturn new NpsSurvey(data);\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static makeCustom(baseData: SurveyDataSource.SurveyDataSourceData, sp: IFloodgateStringProvider,\r\n\t\tsurveyModel: CampaignSurveyTemplate): INpsSurvey {\r\n\r\n\t\tif (isNOU(baseData) || isNOU(sp) || isNOU(surveyModel)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst ratingValuesAscending: string[] = [];\r\n\t\tconst content: CampaignSurveyContent = surveyModel.content;\r\n\r\n\t\tif (isNOU(content) || isNOU(content.comment)\r\n\t\t\t|| isNOU(content.prompt) || isNOU(content.rating)) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst data = new NpsSurvey.NpsSurveyData();\r\n\t\tdata.baseData = baseData;\r\n\t\tdata.promptData = new PromptComponent.PromptComponentData();\r\n\t\tdata.ratingData = new RatingComponent.RatingComponentData();\r\n\t\tdata.commentData = new CommentComponent.CommentComponentData();\r\n\r\n\t\tdata.promptData.title = sp.getCustomString(content.prompt.title);\r\n\t\tdata.promptData.question = sp.getCustomString(content.prompt.question);\r\n\t\tdata.promptData.yesButtonLabel = sp.getCustomString(content.prompt.yesLabel);\r\n\t\tdata.promptData.noButtonLabel = sp.getCustomString(content.prompt.noLabel);\r\n\t\tdata.ratingData.question = sp.getCustomString(content.rating.question);\r\n\t\tdata.ratingData.isZeroBased = content.rating.isZeroBased;\r\n\t\tdata.commentData.question = sp.getCustomString(content.comment.question);\r\n\r\n\t\tfor (const value of content.rating.ratingValuesAscending) {\r\n\t\t\tconst customString: string = sp.getCustomString(value);\r\n\r\n\t\t\tif (isNOU(customString)) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tratingValuesAscending.push(customString);\r\n\t\t}\r\n\r\n\t\tdata.ratingData.ratingValuesAscending = ratingValuesAscending;\r\n\r\n\t\tif (isNOU(data.ratingData.question)\r\n\t\t\t|| isNOU(data.commentData.question)\r\n\t\t\t|| isNOU(data.promptData.title)\r\n\t\t\t|| isNOU(data.promptData.question)\r\n\t\t\t|| isNOU(data.promptData.yesButtonLabel)\r\n\t\t\t|| isNOU(data.promptData.noButtonLabel)\r\n\t\t\t|| isNOU(data.ratingData.ratingValuesAscending)) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// cvsurvey data is not required on all surveys.\r\n\t\tif (content.cvSurvey) {\r\n\t\t\tdata.cvSurveyData = new CVSurveyComponent.CVSurveyComponentData();\r\n\t\t\tdata.cvSurveyData.customerVoiceFormId =  content.cvSurvey.customerVoiceFormId;\r\n\r\n\t\t\tif (isNOU(data.cvSurveyData.customerVoiceFormId)) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.make(data);\r\n\t}\r\n\r\n\tpublic static make5Point(baseData: SurveyDataSource.SurveyDataSourceData, sp: IFloodgateStringProvider): INpsSurvey {\r\n\t\tif (!baseData || !sp) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst data = new NpsSurvey.NpsSurveyData();\r\n\t\tdata.baseData = baseData;\r\n\t\tdata.ratingData = new RatingComponent.RatingComponentData();\r\n\t\tdata.ratingData.isZeroBased = false;\r\n\t\tdata.commentData = new CommentComponent.CommentComponentData();\r\n\t\tdata.promptData = new PromptComponent.PromptComponentData();\r\n\t\tdata.ratingData.question = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsRatingQuestion);\r\n\t\tdata.commentData.question = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsCommentQuestion);\r\n\t\tdata.promptData.title = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsPromptTitle);\r\n\t\tdata.promptData.question = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsPromptQuestion);\r\n\t\tdata.promptData.yesButtonLabel = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsPromptYesLabel);\r\n\t\tdata.promptData.noButtonLabel = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsPromptNotNowLabel);\r\n\t\tconst ratingValuesAscending: string[] = new Array(5);\r\n\t\tratingValuesAscending[0] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps5RatingValue1);\r\n\t\tratingValuesAscending[1] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps5RatingValue2);\r\n\t\tratingValuesAscending[2] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps5RatingValue3);\r\n\t\tratingValuesAscending[3] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps5RatingValue4);\r\n\t\tratingValuesAscending[4] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps5RatingValue5);\r\n\r\n\t\tif (!data.ratingData.question\r\n\t\t\t|| !data.commentData.question\r\n\t\t\t|| !data.promptData.title\r\n\t\t\t|| !data.promptData.question\r\n\t\t\t|| !data.promptData.yesButtonLabel\r\n\t\t\t|| !data.promptData.noButtonLabel\r\n\t\t\t|| !ratingValuesAscending[0]\r\n\t\t\t|| !ratingValuesAscending[1]\r\n\t\t\t|| !ratingValuesAscending[2]\r\n\t\t\t|| !ratingValuesAscending[3]\r\n\t\t\t|| !ratingValuesAscending[4]) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tdata.ratingData.ratingValuesAscending = ratingValuesAscending;\r\n\t\treturn this.make(data);\r\n\t}\r\n\r\n\tpublic static make11Point(baseData: SurveyDataSource.SurveyDataSourceData, sp: IFloodgateStringProvider): INpsSurvey {\r\n\t\tif (!baseData || !sp) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst data = new NpsSurvey.NpsSurveyData();\r\n\t\tdata.baseData = baseData;\r\n\t\tdata.ratingData = new RatingComponent.RatingComponentData();\r\n\t\tdata.ratingData.isZeroBased = true;\r\n\t\tdata.commentData = new CommentComponent.CommentComponentData();\r\n\t\tdata.promptData = new PromptComponent.PromptComponentData();\r\n\t\tdata.ratingData.question = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsRatingQuestion);\r\n\t\tdata.commentData.question = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsCommentQuestion);\r\n\t\tdata.promptData.title = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsPromptTitle);\r\n\t\tdata.promptData.question = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsPromptQuestion);\r\n\t\tdata.promptData.yesButtonLabel = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsPromptYesLabel);\r\n\t\tdata.promptData.noButtonLabel = sp.loadStringResource(IFloodgateStringProvider.StringType.NpsPromptNotNowLabel);\r\n\r\n\t\tconst ratingValuesAscending: string[] = new Array(11);\r\n\t\tratingValuesAscending[0] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue0);\r\n\t\tratingValuesAscending[1] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue1);\r\n\t\tratingValuesAscending[2] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue2);\r\n\t\tratingValuesAscending[3] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue3);\r\n\t\tratingValuesAscending[4] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue4);\r\n\t\tratingValuesAscending[5] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue5);\r\n\t\tratingValuesAscending[6] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue6);\r\n\t\tratingValuesAscending[7] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue7);\r\n\t\tratingValuesAscending[8] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue8);\r\n\t\tratingValuesAscending[9] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue9);\r\n\t\tratingValuesAscending[10] = sp.loadStringResource(IFloodgateStringProvider.StringType.Nps11RatingValue10);\r\n\r\n\t\tif (!data.ratingData.question\r\n\t\t\t|| !data.commentData.question\r\n\t\t\t|| !data.promptData.title\r\n\t\t\t|| !data.promptData.question\r\n\t\t\t|| !data.promptData.yesButtonLabel\r\n\t\t\t|| !data.promptData.noButtonLabel\r\n\t\t\t|| !ratingValuesAscending[0]\r\n\t\t\t|| !ratingValuesAscending[1]\r\n\t\t\t|| !ratingValuesAscending[2]\r\n\t\t\t|| !ratingValuesAscending[3]\r\n\t\t\t|| !ratingValuesAscending[4]\r\n\t\t\t|| !ratingValuesAscending[5]\r\n\t\t\t|| !ratingValuesAscending[6]\r\n\t\t\t|| !ratingValuesAscending[7]\r\n\t\t\t|| !ratingValuesAscending[8]\r\n\t\t\t|| !ratingValuesAscending[9]\r\n\t\t\t|| !ratingValuesAscending[10]) {\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tdata.ratingData.ratingValuesAscending = ratingValuesAscending;\r\n\t\treturn this.make(data);\r\n\t}\r\n\r\n\tprivate surveyInfo: SurveyDataSource;\r\n\tprivate question: CommentComponent;\r\n\tprivate prompt: PromptComponent;\r\n\tprivate rating: RatingComponent;\r\n\tprivate cvSurvey: CVSurveyComponent;\r\n\r\n\tprivate constructor(data: NpsSurvey.NpsSurveyData) {\r\n\t\tsuper();\r\n\t\tif (!data) {\r\n\t\t\tthrow new Error(\"data must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.surveyInfo = new SurveyDataSource(data.baseData);\r\n\t\tthis.prompt = new PromptComponent(data.promptData);\r\n\t\tthis.question = new CommentComponent(data.commentData);\r\n\t\tthis.rating = new RatingComponent(data.ratingData);\r\n\t\tthis.cvSurvey = data.cvSurveyData ? (new CVSurveyComponent(data.cvSurveyData)) : null;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getType(): ISurvey.Type {\r\n\t\treturn ISurvey.Type.Nps;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getSurveyInfo(): ISurveyInfo {\r\n\t\treturn this.surveyInfo;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getCommentComponent(): CommentComponent {\r\n\t\treturn this.question;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getPromptComponent(): PromptComponent {\r\n\t\treturn this.prompt;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getRatingComponent(): RatingComponent {\r\n\t\treturn this.rating;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getCVSurveyComponent(): CVSurveyComponent {\r\n\t\treturn this.cvSurvey;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getComponent(componentType: ISurveyComponent.Type): ISurveyComponent {\r\n\t\tswitch (componentType) {\r\n\t\t\tcase ISurveyComponent.Type.Comment:\r\n\t\t\t\treturn this.getCommentComponent();\r\n\t\t\tcase ISurveyComponent.Type.Prompt:\r\n\t\t\t\treturn this.getPromptComponent();\r\n\t\t\tcase ISurveyComponent.Type.Rating:\r\n\t\t\t\treturn this.getRatingComponent();\r\n\t\t\tcase ISurveyComponent.Type.CVSurvey:\r\n\t\t\t\treturn this.getCVSurveyComponent();\r\n\t\t\tdefault:\r\n\t\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getDomElements(doc: Document): Element[] {\r\n\t\tif (!doc) {\r\n\t\t\tthrow new Error(\"Document must not be null\");\r\n\t\t}\r\n\r\n\t\tconst element: Element = doc.createElement(ISurvey.DOM_NPS_TAGNAME);\r\n\r\n\t\tthis.getSurveyInfo().getDomElements(doc).forEach((child) => {\r\n\t\t\tif (child) {\r\n\t\t\t\telement.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.getCommentComponent().getDomElements(doc).forEach((child) => {\r\n\t\t\tif (child) {\r\n\t\t\t\telement.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.getRatingComponent().getDomElements(doc).forEach((child) => {\r\n\t\t\tif (child) {\r\n\t\t\t\telement.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn [element];\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getJsonElements(): object {\r\n\t\tlet result: object = {};\r\n\r\n\t\tresult = overrideValues(this.getSurveyInfo().getJsonElements(), result);\r\n\t\tresult = overrideValues(this.getCommentComponent().getJsonElements(), result);\r\n\t\tresult = overrideValues(this.getRatingComponent().getJsonElements(), result);\r\n\r\n\t\tresult[ISurveyComponent.JSON_APPLICATION_KEYNAME] = {};\r\n\t\tresult[ISurveyComponent.JSON_APPLICATION_KEYNAME][ISurveyComponent.JSON_EXTENDEDMANIFESTDATA_KEYNAME] =\r\n\t\t\tJSON.stringify({[ISurveyComponent.JSON_SURVEYSTRINGS_KEYNAME]: this.makeSurveyStrings()});\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// Makes the string to send to Manifest respecting the components present in the survey\r\n\tprivate makeSurveyStrings(): string {\r\n\t\tconst actualStrings: object = {};\r\n\r\n\t\tif (this.prompt) {\r\n\t\t\tactualStrings[ISurveyComponent.JSON_PROMPT_KEYNAME] = this.prompt.getComponentJson();\r\n\t\t}\r\n\r\n\t\tif (this.rating) {\r\n\t\t\tactualStrings[ISurveyComponent.JSON_RATING_KEYNAME] = [this.rating.getComponentJson()];\r\n\t\t}\r\n\r\n\t\tif (this.question) {\r\n\t\t\tactualStrings[ISurveyComponent.JSON_COMMENT_KEYNAME] = [this.question.getComponentJson()];\r\n\t\t}\r\n\r\n\t\treturn JSON.stringify(actualStrings);\r\n\t}\r\n}\r\n\r\nmodule NpsSurvey {\r\n\t/**\r\n\t * Data required for a Nps Survey\r\n\t */\r\n\texport class NpsSurveyData {\r\n\t\tpublic baseData: SurveyDataSource.SurveyDataSourceData;\r\n\t\tpublic commentData: CommentComponent.CommentComponentData;\r\n\t\tpublic promptData: PromptComponent.PromptComponentData;\r\n\t\tpublic ratingData: RatingComponent.RatingComponentData;\r\n\t\tpublic cvSurveyData: CVSurveyComponent.CVSurveyComponentData;\r\n\t}\r\n}\r\n\r\nexport = NpsSurvey;\r\n","/**\r\n * General floodgate settings\r\n */\r\nexport class FloodgateSettings {\r\n\t/**\r\n\t * Convert to Json\r\n\t */\r\n\tpublic static toJson(object: FloodgateSettings): string {\r\n\t\treturn JSON.stringify(object);\r\n\t}\r\n\r\n\t/**\r\n\t * Load from Json\r\n\t */\r\n\tpublic static fromJson(json: string): FloodgateSettings {\r\n\t\treturn JSON.parse(json);\r\n\t}\r\n}\r\n","import { GovernedChannel, GovernedChannelType, IGovernedChannelData } from \"./GovernedChannel\";\r\nimport { GovernedChannelState, IGovernedChannelStateProvider } from \"./GovernedChannelStateProvider\";\r\nimport * as Utils from \"./Utils\";\r\n\r\nconst { isNOU } = Utils;\r\n\r\nexport const DEFAULT_TEACHING_MESSAGE_COOLDOWN = 15;\r\n\r\nexport interface IGovernor {\r\n\tgetAvailableChannelData(): IGovernedChannelData[];\r\n\r\n\tisChannelOpen(type: GovernedChannelType): boolean;\r\n\r\n\tstartChannelCooldown(type: GovernedChannelType, date?: Date): void;\r\n\r\n\trefreshChannelData(): void;\r\n\r\n\tsaveChannelStates(): void;\r\n}\r\n\r\nclass DefaultChannelData {\r\n\tpublic cooldownSeconds: number;\r\n\tpublic name: string;\r\n\r\n\tpublic constructor(name: string, cooldownSeconds: number) {\r\n\t\tthis.name = name;\r\n\t\tthis.cooldownSeconds = cooldownSeconds;\r\n\t}\r\n}\r\n\r\nexport class Governor implements IGovernor {\r\n\tpublic static GetChannelCoolDown(channelType: GovernedChannelType) {\r\n\t\tconst channelData = Governor.defaultChannelData[channelType];\r\n\t\treturn channelData ? channelData.cooldownSeconds : 0;\r\n\t}\r\n\r\n\tpublic static SetDefaultChannelCoolDown(channelType: GovernedChannelType, cooldownSeconds: number) {\r\n\t\tconst channelData = Governor.defaultChannelData[channelType];\r\n\t\tif (channelData) {\r\n\t\t\tchannelData.cooldownSeconds = cooldownSeconds;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static minute: number = 60;\r\n\tprivate static hour: number = 60 * Governor.minute;\r\n\tprivate static day: number = 24 * Governor.hour;\r\n\r\n\t// Array of default values for each channel type. Indexed by the GovernedChannelType enum name.\r\n\tprivate static defaultChannelData: DefaultChannelData[] = [\r\n\t\tnew DefaultChannelData(GovernedChannelType[GovernedChannelType.Standard], 14 * Governor.day),\r\n\t\tnew DefaultChannelData(GovernedChannelType[GovernedChannelType.Urgent], 0),\r\n\t\tnew DefaultChannelData(GovernedChannelType[GovernedChannelType.Banner], 15 * Governor.day),\r\n\t\tnew DefaultChannelData(GovernedChannelType[GovernedChannelType.TeachingMessage], DEFAULT_TEACHING_MESSAGE_COOLDOWN * Governor.day),\r\n\t];\r\n\r\n\tprivate channelStateProvider: IGovernedChannelStateProvider;\r\n\tprivate channels: GovernedChannel[] = [];\r\n\r\n\tpublic constructor(channelStateProvider: IGovernedChannelStateProvider) {\r\n\t\tif (!channelStateProvider) {\r\n\t\t\tthrow new Error(\"channelStateProvider must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.channelStateProvider = channelStateProvider;\r\n\t\tthis.loadChannels();\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic refreshChannelData(): void {\r\n\t\tthis.loadChannels();\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic getAvailableChannelData(): IGovernedChannelData[] {\r\n\t\tconst channelData: IGovernedChannelData[] = [];\r\n\r\n\t\tfor (const key in this.channels) {\r\n\t\t\tif (this.channels.hasOwnProperty(key)) {\r\n\t\t\t\tconst channel: GovernedChannel = this.channels[key];\r\n\r\n\t\t\t\tif (channel.isOpen()) {\r\n\t\t\t\t\tchannelData.push(channel);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn channelData;\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic isChannelOpen(type: GovernedChannelType): boolean {\r\n\t\tif (isNOU(type)) {\r\n\t\t\tthrow new Error(\"type must not be null\");\r\n\t\t}\r\n\r\n\t\treturn this.channels[type].isOpen();\r\n\t}\r\n\r\n\t// @Override\r\n\tpublic startChannelCooldown(type: GovernedChannelType, date?: Date): void {\r\n\t\tif (isNOU(type)) {\r\n\t\t\tthrow new Error(\"type must not be null\");\r\n\t\t}\r\n\r\n\t\tdate = date ? date : new Date();\r\n\r\n\t\t// Start the cool down\r\n\t\tthis.channels[type].setCooldownStartTime(date);\r\n\r\n\t\t// Save the new channel state for future sessions\r\n\t\tthis.saveChannelStates();\r\n\t}\r\n\r\n\tpublic saveChannelStates(): void {\r\n\t\t// Build up the list of channel states\r\n\t\tconst channelStates: GovernedChannelState[] = [];\r\n\r\n\t\tfor (const key in this.channels) {\r\n\t\t\tif (this.channels.hasOwnProperty(key)) {\r\n\t\t\t\tconst channel: GovernedChannel = this.channels[key];\r\n\t\t\t\tconst channelState: GovernedChannelState =\r\n\t\t\t\t\tnew GovernedChannelState(channel.getType(), channel.getCooldownStartTime());\r\n\r\n\t\t\t\tchannelStates.push(channelState);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.channelStateProvider.save(channelStates);\r\n\t}\r\n\r\n\tprivate loadChannels(): void {\r\n\t\t// Load up state from previous sessions\r\n\t\tthis.loadChannelStatesFromProvider();\r\n\r\n\t\t// For any missing channels, init them from scratch\r\n\t\t// There's no straightforward way to iterate enums, we need to iterate through the enum array\r\n\t\t//    filtering out just the numeric enum values (excluding enum names).\r\n\t\tfor (const item in GovernedChannelType) {\r\n\t\t\tif (GovernedChannelType.hasOwnProperty(item)) {\r\n\t\t\t\tconst key: number = Number(item);\r\n\r\n\t\t\t\t// skip if key is not numeric enum value, or if already exists\r\n\t\t\t\tif (isNaN(key) || this.channels[key]) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst defaultData: DefaultChannelData = Governor.defaultChannelData[key];\r\n\t\t\t\tconst newChannel: GovernedChannel =\r\n\t\t\t\t\tnew GovernedChannel(key, defaultData.name, defaultData.cooldownSeconds, null);\r\n\t\t\t\tthis.channels[key] = newChannel;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate loadChannelStatesFromProvider(): void {\r\n\t\tthis.channels = [];\r\n\r\n\t\tconst channelStates: GovernedChannelState[] = this.channelStateProvider.load();\r\n\r\n\t\tfor (const key in channelStates) {\r\n\t\t\tif (channelStates.hasOwnProperty(key)) {\r\n\t\t\t\tconst channelState: GovernedChannelState = channelStates[key];\r\n\r\n\t\t\t\tconst type: GovernedChannelType = channelState.getType();\r\n\t\t\t\tconst defaultData: DefaultChannelData = Governor.defaultChannelData[type];\r\n\t\t\t\tconst newChannel: GovernedChannel =\r\n\t\t\t\t\tnew GovernedChannel(type, defaultData.name, defaultData.cooldownSeconds, channelState.getCooldownStartTime());\r\n\r\n\t\t\t\tthis.channels[newChannel.getType()] = newChannel;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","import * as ActivityTracker from \"./ActivityTracker\";\r\nimport { ActivityTrackingContract } from \"./ActivityTrackingContract\";\r\nimport { ActivityTrackingSet } from \"./ActivityTrackingSet\";\r\nimport * as IActivityListener from \"./Api/IActivityListener\";\r\nimport { IFloodgateTelemetryLogger } from \"./Api/IFloodgateTelemetryLogger\";\r\nimport { IContextData } from \"./Api/IOnSurveyActivatedCallback\";\r\nimport ISurvey = require(\"./Api/ISurvey\");\r\nimport { IDictionary } from \"./Common\";\r\nimport { TelemetryEvent } from \"./Constants\";\r\nimport { IndexedTracker } from \"./IndexedTracker\";\r\nimport { SurveyEventActivityStats, SurveyStatCollectionEventActivity } from \"./SurveyStatCollectionEventActivity\";\r\nimport { fyShuffle, isNOU } from \"./Utils\";\r\n\r\nlet queuedActivities: SurveyActivityListener.IQueuedActivityParams[] = [];\r\nlet pendingActivityCount: number = 0;\r\nlet previousTrackedActivityMap: { [id: string]: IndexedTracker[] } = {};\r\n\r\n/**\r\n * This class tracks log calls against named activity strings (matched on strict case-sensitive equality)\r\n * and calls the provided callback when all activity thresholds for a given survey have been crossed\r\n */\r\nclass SurveyActivityListener implements IActivityListener {\r\n\tpublic static FloodgateStartActivityName = \"FloodgateFirstStart\";\r\n\t// The size of the dropped activities is set to 100 due to the following two reasons.\r\n\t// 1) To prevent the array growing too big and causing memory issues.\r\n\t// 2) Based on the telemetry analysis of number of dropped activities, the count is very small and much lesser than 100.\r\n\tpublic static MaxPendingActivitiesQueueSize = 100;\r\n\r\n\tpublic static resetSessionActivity(): void {\r\n\t\tpreviousTrackedActivityMap = {};\r\n\t}\r\n\r\n\t// Save incoming activity context data in a dictionary with SurveyID as key, activity data array as value\r\n\tprivate activityContext: Record<string, IContextData[]> = {};\r\n\r\n\tprivate trackedActivityMap: { [id: string]: IndexedTracker[] };\r\n\tprivate callback: SurveyActivityListener.IActivityListenerCallback;\r\n\tprivate loggerCallback: () => IFloodgateTelemetryLogger;\r\n\r\n\tpublic constructor(callback: SurveyActivityListener.IActivityListenerCallback, loggerCallback?: () => IFloodgateTelemetryLogger) {\r\n\t\tif (!callback) {\r\n\t\t\tthrow new Error(\"callback must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.trackedActivityMap = {};\r\n\t\tthis.callback = callback;\r\n\t\tthis.loggerCallback = loggerCallback;\r\n\t}\r\n\r\n\tpublic logActivity(activityName: string, increment: number = 1, context?: IActivityListener.IActivityContext): void {\r\n\t\tthis.logActivity_private(activityName, SurveyActivityListener.LogActionType.Increment, increment, null, context);\r\n\t}\r\n\r\n\tpublic logActivityStartTime(activityName: string, startTime?: Date): void {\r\n\t\tthis.logActivity_private(activityName, SurveyActivityListener.LogActionType.StartTime, 0, startTime, null);\r\n\t}\r\n\r\n\tpublic logActivityStopTime(activityName: string, stopTime?: Date): void {\r\n\t\tthis.logActivity_private(activityName, SurveyActivityListener.LogActionType.StopTime, 0, stopTime, null);\r\n\t}\r\n\r\n\tpublic SetActivityTrackingContracts(activityTrackingContracts: ActivityTrackingContract[],\r\n\t\tbaseline = new SurveyStatCollectionEventActivity()): void {\r\n\r\n\t\tlet duplicateCounter = 0;\r\n\r\n\t\tif (!activityTrackingContracts || activityTrackingContracts.length === 0 || !baseline) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Populate a new map based on the passed in surveys, but propagating and tracking activity counts\r\n\t\t// we may have seen against those events\r\n\t\t// NOTE: We will lose activity counts for survey events that are no longer relevant.\r\n\t\tconst newMap: { [id: string]: IndexedTracker[] } = {};\r\n\t\tconst trackedSurveyIds: string[] = [];\r\n\r\n\t\tfor (const activityTrackingContract of activityTrackingContracts) {\r\n\t\t\tconst trackingSet: ActivityTrackingSet = activityTrackingContract.trackingSet;\r\n\r\n\t\t\t// Added to the new set to make sure they are not duplicated. Based on MSO.\r\n\t\t\tif (trackedSurveyIds.indexOf(activityTrackingContract.surveyId) === -1) {\r\n\t\t\t\ttrackedSurveyIds.push(activityTrackingContract.surveyId);\r\n\t\t\t} else {\r\n\t\t\t\t// Duplicate surveyId being added, count it for the log.\r\n\t\t\t\tduplicateCounter++;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// At this point, the survey's activities are safe to add.\r\n\t\t\t// Set up the structures we need to transfer baseline counts (from previous sessions) or current counts (from previous trackers)\r\n\t\t\t// Both vectors must be sorted in the same order as the trackingSet.List items\r\n\t\t\tconst baselineStats: SurveyEventActivityStats = baseline.getBySurveyId(activityTrackingContract.surveyId);\r\n\t\t\tconst baselineCounts: number[] = [trackingSet.getList().length];\r\n\t\t\tconst currentIndexedTrackers: IndexedTracker[] = new Array<IndexedTracker>(trackingSet.getList().length);\r\n\r\n\t\t\tlet currentBaselineIndex = 0;\r\n\t\t\tlet currentIndex = 0;\r\n\r\n\t\t\tfor (const trackingData of trackingSet.getList()) {\r\n\t\t\t\t// Baseline stats count is 0 for events with \"IsAggregate = false\"\r\n\t\t\t\tbaselineCounts[currentIndex] = 0;\r\n\t\t\t\tif (trackingData.getIsAggregate() && baselineStats && currentBaselineIndex < baselineStats.Counts.length) {\r\n\t\t\t\t\tbaselineCounts[currentIndex] = baselineStats.Counts[currentBaselineIndex++];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Session stats may be available in the previous trackedActivityMap\r\n\t\t\t\t// Transfer the old \"current session\" count to the new tracker\r\n\t\t\t\t// Is set to null if not available\r\n\t\t\t\tif (previousTrackedActivityMap[trackingData.getActivity()]) {\r\n\t\t\t\t\tfor (const tracker of previousTrackedActivityMap[trackingData.getActivity()]) {\r\n\t\t\t\t\t\tif (tracker.surveyId === activityTrackingContract.surveyId) {\r\n\t\t\t\t\t\t\tcurrentIndexedTrackers[currentIndex] = tracker;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcurrentIndex++;\r\n\t\t\t}\r\n\r\n\t\t\t// Make a new tracker and init the counts appropriately.\r\n\t\t\tconst newTracker = new ActivityTracker(trackingSet);\r\n\t\t\t// If in a future change we start keeping trackers registered past activation, this will change\r\n\t\t\tnewTracker.initCounts(baselineCounts, currentIndexedTrackers, false /*wasActivatedThisSession*/);\r\n\r\n\t\t\t// Setup the indexed trackers\r\n\t\t\tfor (const activityIndex of newTracker.generateActivityIndexList()) {\r\n\t\t\t\tconst indexedTracker = new IndexedTracker();\r\n\t\t\t\tindexedTracker.index = activityIndex.index;\r\n\t\t\t\tindexedTracker.surveyId = activityTrackingContract.surveyId;\r\n\t\t\t\tindexedTracker.tracker = newTracker;\r\n\r\n\t\t\t\tif (!newMap[activityIndex.activity]) {\r\n\t\t\t\t\tnewMap[activityIndex.activity] = [];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Register the new tracker in our new map\r\n\t\t\t\tnewMap[activityIndex.activity].push(indexedTracker);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (duplicateCounter > 0) {\r\n\t\t\tconst telemetryLogger = this.loggerCallback && this.loggerCallback();\r\n\t\t\tif (telemetryLogger) {\r\n\t\t\t\ttelemetryLogger.log_Error(TelemetryEvent.SurveyActivity.SetActivityTrackingContracts.DuplicateSurveyID,\r\n\t\t\t\t\t\"Duplicate surveyId passed in activityTrackingContracts. Duplicate count: \" + duplicateCounter);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set the new map in place of the old\r\n\t\tthis.copyObject(this.trackedActivityMap, newMap);\r\n\t}\r\n\r\n\tpublic clearSurveys(): void {\r\n\t\tObject.getOwnPropertyNames(this.trackedActivityMap).forEach((key) => {\r\n\t\t\tdelete this.trackedActivityMap[key];\r\n\t\t});\r\n\t}\r\n\r\n\tpublic saveSessionTrackingActivity(activity: string): void {\r\n\t\t// Set the new activity in place of the old\r\n\t\tpreviousTrackedActivityMap[activity] = this.trackedActivityMap[activity];\r\n\t}\r\n\r\n\t// Get the indexedTracker that corresponds to the SurveyID and return that count. otherwise return 0.\r\n\tpublic getCount(activity: string, surveyId: string): number {\r\n\t\tconst indexedTracker = this.getIndexedTracker(activity, surveyId);\r\n\t\tif (!indexedTracker) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn indexedTracker.tracker.getCount(indexedTracker.index);\r\n\t}\r\n\r\n\tpublic getSessionCount(activity: string, surveyId: string): number {\r\n\t\tconst indexedTracker = this.getIndexedTracker(activity, surveyId);\r\n\t\tif (!indexedTracker) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn indexedTracker.tracker.getSessionCount(indexedTracker.index);\r\n\t}\r\n\r\n\t/**\r\n\t * An atomic get-and-set method.  Returns the current SessionCount, resetting it to zero and adding it into the established baseline\r\n\t */\r\n\tpublic moveSessionCountIntoBaseCount(activity: string, surveyId: string): number {\r\n\t\tconst indexedTracker = this.getIndexedTracker(activity, surveyId);\r\n\t\tif (!indexedTracker) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn indexedTracker.tracker.moveSessionCountIntoBaseCount(indexedTracker.index);\r\n\t}\r\n\r\n\tpublic getSurveyIds(activity: string): string[] | undefined {\r\n\t\tif (isNOU(activity)) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tconst indexedTrackers = this.trackedActivityMap[activity];\r\n\t\tif (!indexedTrackers) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tconst surveyIds = indexedTrackers.map((indexedTracker) => indexedTracker.surveyId);\r\n\t\treturn surveyIds;\r\n\t}\r\n\r\n\tpublic setCallback(callback: SurveyActivityListener.IActivityListenerCallback): void {\r\n\t\tthis.callback = callback;\r\n\t}\r\n\r\n\tpublic UpdateActivityTrackingContracts(surveyList: IDictionary<ISurvey>): void {\r\n\t\tif (isNOU(surveyList) || Object.keys(surveyList).length === 0) {\r\n\t\t\tthis.clearSurveys();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (const key in this.trackedActivityMap) {\r\n\t\t\tif (this.trackedActivityMap.hasOwnProperty(key)) {\r\n\t\t\t\tconst tracker: IndexedTracker[] = this.trackedActivityMap[key];\r\n\r\n\t\t\t\t// loop through tracker and remove the ones not associate with given surveys\r\n\t\t\t\tfor (let i = tracker.length - 1; i >= 0; --i) {\r\n\t\t\t\t\tif (surveyList.hasOwnProperty(tracker[i].surveyId)) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttracker.splice(i, 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getIndexedTracker(activity: string, surveyId: string): IndexedTracker | undefined {\r\n\t\tconst indexedTrackers = this.trackedActivityMap[activity];\r\n\r\n\t\tif (!indexedTrackers) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tlet indexedTracker: IndexedTracker | undefined;\r\n\t\tfor (const tracker of indexedTrackers) {\r\n\t\t\tif (tracker.surveyId === surveyId) {\r\n\t\t\t\tindexedTracker = tracker;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn indexedTracker;\r\n\t}\r\n\r\n\tprivate resetQueuedActivities(): void {\r\n\t\tqueuedActivities = [];\r\n\t}\r\n\r\n\tprivate logActivity_private(activityName: string,\r\n\t\tlogType: SurveyActivityListener.LogActionType,\r\n\t\tincrement: number,\r\n\t\ttimestamp: Date,\r\n\t\tcontext: IActivityListener.IActivityContext): void {\r\n\t\tif (this.callback && !this.callback.shouldAcceptActivity(activityName)) {\r\n\t\t\tpendingActivityCount++;\r\n\t\t\tif (queuedActivities.length < SurveyActivityListener.MaxPendingActivitiesQueueSize) {\r\n\t\t\t\tqueuedActivities.push({activityName, logType, increment, timestamp});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Count any activities that are posted before 'FloodgateFirstStart' activity happens\r\n\t\tif (activityName === SurveyActivityListener.FloodgateStartActivityName) {\r\n\t\t\tif (pendingActivityCount > 0) {\r\n\t\t\t\t// Get the activity names of the queued activities for telemetry, send only first 25.\r\n\t\t\t\tconst activityNames = queuedActivities.slice(0, 25).map((queuedActivity) => queuedActivity.activityName);\r\n\r\n\t\t\t\tconst telemetryLogger = this.loggerCallback && this.loggerCallback();\r\n\t\t\t\tif (telemetryLogger) {\r\n\t\t\t\t\t// Sampling this telemetry event to 5%\r\n\t\t\t\t\ttelemetryLogger.log_Event(TelemetryEvent.SurveyActivity.LogActivity.EventsReprocessed,\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tActivityNames: JSON.stringify(activityNames),\r\n\t\t\t\t\t\t\tCount: queuedActivities.length,\r\n\t\t\t\t\t\t\tDropped: pendingActivityCount - queuedActivities.length,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t0.05);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// replay all the queued activities one by one as the floodgate engine has started now\r\n\t\t\t\tqueuedActivities.map((queuedActivity) => this.logActivity_core(\r\n\t\t\t\t\tqueuedActivity.activityName, queuedActivity.logType, queuedActivity.increment, queuedActivity.timestamp, context));\r\n\t\t\t}\r\n\r\n\t\t\tpendingActivityCount = 0;\r\n\t\t\tthis.resetQueuedActivities();\r\n\t\t}\r\n\r\n\t\tthis.logActivity_core(activityName, logType, increment, timestamp, context);\r\n\t}\r\n\r\n\tprivate logActivity_core(activityName: string,\r\n\t\tlogType: SurveyActivityListener.LogActionType,\r\n\t\tincrement: number,\r\n\t\ttimestamp: Date,\r\n\t\tcontext: IActivityListener.IActivityContext): void {\r\n\t\tconst indexedTrackers: IndexedTracker[] = this.trackedActivityMap[activityName];\r\n\t\tif (!indexedTrackers || indexedTrackers.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet indices: number[] = [];\r\n\r\n\t\t// If we have more than one tracker shuffle trackers to randomize which is evaluated first\r\n\t\tif (indexedTrackers.length > 1) {\r\n\t\t\tindices = new Array<number>(indexedTrackers.length);\r\n\t\t\tfor (let i = 0; i < indices.length; i++) {\r\n\t\t\t\tindices[i] = i;\r\n\t\t\t}\r\n\t\t\tindices = fyShuffle(indices); // shuffle and reassign\r\n\t\t} else {\r\n\t\t\tindices.push(0); // just have a zero. Shuffling is not needed.\r\n\t\t}\r\n\r\n\t\t// Loop through trackers in shuffled order\r\n\t\tfor (const index of indices) {\r\n\t\t\tconst tracker: IndexedTracker = indexedTrackers[index];\r\n\t\t\tswitch (logType) {\r\n\t\t\t\tcase SurveyActivityListener.LogActionType.StartTime: {\r\n\t\t\t\t\ttracker.tracker.startTime(tracker.index, timestamp);\r\n\t\t\t\t\tcontinue; // Look at the next tracker. Increment not needed.\r\n\t\t\t\t}\r\n\t\t\t\tcase SurveyActivityListener.LogActionType.StopTime: {\r\n\t\t\t\t\tincrement = tracker.tracker.stopTime(tracker.index, timestamp);\r\n\t\t\t\t\t// fall through to increment the activity as well.\r\n\t\t\t\t}\r\n\t\t\t\tcase SurveyActivityListener.LogActionType.Increment: {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefault: {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (context) {\r\n\t\t\t\tconst trackerSurveyId = tracker.surveyId;\r\n\t\t\t\tthis.activityContext[trackerSurveyId] = this.activityContext[trackerSurveyId] || [];\r\n\t\t\t\tthis.activityContext[trackerSurveyId].push({ activityName, context });\r\n\t\t\t}\r\n\r\n\t\t\tconst result: ActivityTracker.IncrementResult = tracker.tracker.incrementActivity(tracker.index, increment);\r\n\t\t\tif (result === ActivityTracker.IncrementResult.AllActivitiesActivated) {\r\n\t\t\t\t// Check the activated surveys list to ensure whether any previous survey is still in process\r\n\t\t\t\t// If not, the length should be 1 and call to execute this survey right away\r\n\t\t\t\t// This should only happen if calling to Governance Service, due to the call is asynchronous\r\n\t\t\t\tthis.executeCallback(tracker.surveyId);\r\n\t\t\t\tbreak;\r\n\t\t\t\t/* Breaking here to let one and only one callback to be made from a logActivity call.\r\n\t\t\t\tThis ensures only one survey can fully 'trigger' for a logActivity call. Others that would also\r\n\t\t\t\thave triggered must wait until the next call to trigger (without there being a cooldown, of course).\r\n\t\t\t\t*/\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate executeCallback(surveyId: string): void {\r\n\t\tthis.callback.run(surveyId, this.activityContext[surveyId]);\r\n\t}\r\n\r\n\tprivate copyObject(target: {}, source: {}) {\r\n\t\tObject.keys(source).forEach((key) => {\r\n\t\t\ttarget[key] = source[key];\r\n\t\t});\r\n\t}\r\n}\r\n\r\nmodule SurveyActivityListener {\r\n\texport interface IActivityListenerCallback {\r\n\t\trun(surveyId: string, contextData: IContextData[]): void;\r\n\t\tshouldAcceptActivity(activityName: string): boolean;\r\n\t}\r\n\r\n\texport const enum LogActionType {\r\n\t\tIncrement,\r\n\t\tStartTime,\r\n\t\tStopTime,\r\n\t}\r\n\r\n\texport interface IQueuedActivityParams {\r\n\t\tactivityName: string;\r\n\t\tlogType: SurveyActivityListener.LogActionType;\r\n\t\tincrement: number;\r\n\t\ttimestamp: Date;\r\n\t}\r\n}\r\n\r\nexport = SurveyActivityListener;\r\n","import { ActivityTrackingData } from \"./ActivityTrackingData\";\r\nimport { ActivityTrackingSet } from \"./ActivityTrackingSet\";\r\nimport { IndexedTracker } from \"./IndexedTracker\";\r\n\r\n/**\r\n * Class to track ticks against a list of expected counts in a thread-safe way\r\n * Main API of interest is incrementActivity, which returns an enumerated value indicating\r\n * whether or not the increment resulted in no thresholds crossed, a single activity threshold crossed,\r\n * or the final activity threshold crossed.\r\n */\r\nclass ActivityTracker {\r\n\tprivate isOrdered: boolean;\r\n\tprivate trackedActivities: ActivityTrackingData[];\r\n\tprivate currentIndex: number;\r\n\tprivate activationMask: number;\r\n\tprivate currentActivationFlags: number;\r\n\tprivate isActivationByInitPending: boolean;\r\n\tprivate currentCounts: number[];\r\n\tprivate currentSessionCounts: number[];\r\n\tprivate currentStartTimes: Date[];\r\n\r\n\tpublic constructor(trackingSet: ActivityTrackingSet) {\r\n\t\tif (!trackingSet) {\r\n\t\t\tthrow new Error(\"trackingSet must not be null\");\r\n\t\t}\r\n\t\tif (trackingSet.getList().length > 32) {\r\n\t\t\tthrow new Error(\"trackingSet list size must be less than 32\");\r\n\t\t}\r\n\r\n\t\tthis.isOrdered = trackingSet.getIsOrdered();\r\n\t\tthis.trackedActivities = trackingSet.getList();\r\n\r\n\t\t/**\r\n\t\t * For ordered sets, the current index.\r\n\t\t */\r\n\t\tthis.currentIndex = 0;\r\n\t\tthis.activationMask = 0;\r\n\t\tthis.currentActivationFlags = 0;\r\n\t\tthis.isActivationByInitPending = false;\r\n\r\n\t\tthis.currentCounts = new Array<number>(this.trackedActivities.length);\r\n\t\tthis.currentStartTimes = new Array<Date>(this.trackedActivities.length);\r\n\t\tthis.currentSessionCounts = new Array<number>(this.trackedActivities.length);\r\n\r\n\t\tfor (let i = 0; i < this.trackedActivities.length; i++) {\r\n\t\t\tthis.currentCounts[i] = 0;\r\n\t\t\tthis.currentSessionCounts[i] = 0;\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < this.trackedActivities.length; i++) {\r\n\t\t\tthis.activationMask |= 0x1 << i;\r\n\r\n\t\t\tif (this.trackedActivities[i].getCount() < 1) {\r\n\t\t\t\tthis.trackedActivities[i].setCount(1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Get the count for the activity at the specified index. Returns 0 for out-of-range indices\r\n\t *\r\n\t * @param index index\r\n\t */\r\n\tpublic getCount(index: number): number {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn this.currentCounts[index];\r\n\t}\r\n\r\n\t/**\r\n\t * Get the count for the activity at the specified index, as tracked only for this session.\r\n\t * Returns 0 for out-of-range indices\r\n\t *\r\n\t * @param index index\r\n\t */\r\n\tpublic getSessionCount(index: number): number {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn this.currentSessionCounts[index];\r\n\t}\r\n\r\n\t/**\r\n\t * Get the StartTime for the activity at the specified index. Returns null for out-of-range indices\r\n\t *\r\n\t * @param index index\r\n\t */\r\n\tpublic getStartTime(index: number): Date {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn this.currentStartTimes[index];\r\n\t}\r\n\r\n\t/**\r\n\t * A get-and-set method. Returns the current SessionCount, resetting it to zero and adding it into\r\n\t * the established baseline.\r\n\t *\r\n\t * @param index index\r\n\t */\r\n\tpublic moveSessionCountIntoBaseCount(index: number): number {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tconst sessionCount: number = this.currentSessionCounts[index];\r\n\t\tthis.currentSessionCounts[index] = 0;\r\n\r\n\t\treturn sessionCount;\r\n\t}\r\n\r\n\t/**\r\n\t * Forcibly set the counts for the activities in the trackingSet.\r\n\t * Unlike other APIs, this expects vector indices to match the order\r\n\t * of the ActivityTrackingSet.List initially used to construct this tracker.\r\n\t * (When data is copied from a different IndexedTracker, it will properly use the IndexedTracker.Index to query internals)\r\n\t * Note:\r\n\t * 1) Assumes a count of 0 for any missing index in undersized arrays.\r\n\t * 2) Respects and enforces ordered list initialization (i.e. all init values are ignored once a unfinished activity is\r\n\t * encountered in an ordered tracking list).\r\n\t * 3) If the tracker is fully Activated as a result of this call, the next call to IncrementActivity will raise the\r\n\t * IncrementEdgeResult.AllActivitiesActivated, for any valid index accepted by IsPermittedIndexForActivationByInit().\r\n\t */\r\n\tpublic initCounts(baselineCounts: number[], otherTrackers: IndexedTracker[], wasAlreadyActivatedThisSession: boolean = false): void {\r\n\t\t// NOTE: baselineIncrements and sessionIncrements are sorted the same as the initial trackedActivity set, which\r\n\t\t// for this class is the same as trackedActivities\r\n\r\n\t\tfor (let i = 0; i < this.trackedActivities.length; i++) {\r\n\t\t\t// Only accept values up to the current index, when ordered\r\n\t\t\tif (this.isOrdered && i > this.currentIndex) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// Start off by pulling values from this session\r\n\t\t\tif (i < otherTrackers.length && otherTrackers[i]) {\r\n\t\t\t\tthis.currentSessionCounts[i] = this.currentCounts[i] = otherTrackers[i].tracker.getSessionCount(otherTrackers[i].index);\r\n\t\t\t\tthis.currentStartTimes[i] = otherTrackers[i].tracker.getStartTime(otherTrackers[i].index);\r\n\t\t\t}\r\n\r\n\t\t\t// If we've got a baseline from previous sessions, add it in as well\r\n\t\t\tif (this.trackedActivities[i].getIsAggregate() && i < baselineCounts.length) {\r\n\t\t\t\tthis.currentCounts[i] += baselineCounts[i];\r\n\t\t\t}\r\n\r\n\t\t\tif (this.hasCountCrossedThreshold(i)) {\r\n\t\t\t\tthis.finishActivityAtIndex(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.isActivated() && !wasAlreadyActivatedThisSession) {\r\n\t\t\t// Mark this object so that the next time any permitted activation event is logged, the survey will activate\r\n\t\t\tthis.isActivationByInitPending = true;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic generateActivityIndexList(): ActivityTracker.ActivityIndex[] {\r\n\t\tconst indexList = new Array<ActivityTracker.ActivityIndex>();\r\n\t\tfor (let i = 0; i < this.trackedActivities.length; i++) {\r\n\t\t\tconst current = new ActivityTracker.ActivityIndex();\r\n\t\t\tcurrent.activity = this.trackedActivities[i].getActivity();\r\n\t\t\tcurrent.index = i;\r\n\t\t\tindexList.push(current);\r\n\t\t}\r\n\r\n\t\treturn indexList;\r\n\t}\r\n\r\n\t/**\r\n\t * Increments the count at the specified index by the given increment.  Returns a value indicating whether\r\n\t * or not this call triggered a transition edge (activating the activity at 'index', or finishing the activation\r\n\t * of the final pending activity)\r\n\t */\r\n\tpublic incrementActivity(index: number, increment: number): ActivityTracker.IncrementResult {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\treturn ActivityTracker.IncrementResult.Pending;\r\n\t\t}\r\n\r\n\t\tif (increment < 0) {\r\n\t\t\tthrow new Error(\"increment must be non-negative\");\r\n\t\t}\r\n\r\n\t\t// Ordered sets must be triggered in order.  We can only track at the current index, or before\r\n\t\tif (this.isOrdered && index > this.currentIndex) {\r\n\t\t\treturn ActivityTracker.IncrementResult.Pending;\r\n\t\t}\r\n\r\n\t\t// Add to our counts after storing off our current state\r\n\t\tconst startedLessThanThreshold = !this.hasCountCrossedThreshold(index);\r\n\t\tthis.currentCounts[index] += increment;\r\n\t\tthis.currentSessionCounts[index] += increment;\r\n\r\n\t\tif (this.isActivationByInitPending) {\r\n\t\t\tif (this.isPermittedIndexForActivationByInit(index)) {\r\n\t\t\t\t// This tracker was completed due to the initialization from previous increment data\r\n\t\t\t\t// now that we've store this activities increments, raise the AllActivitiesActivated signal\r\n\t\t\t\treturn this.commitActivation();\r\n\t\t\t} else {\r\n\t\t\t\t// Still waiting for a valid re-activation activity\r\n\t\t\t\treturn ActivityTracker.IncrementResult.Pending;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!(startedLessThanThreshold && this.hasCountCrossedThreshold(index))) {\r\n\t\t\t// Still waiting for this activity to finish\r\n\t\t\treturn ActivityTracker.IncrementResult.Pending;\r\n\t\t}\r\n\r\n\t\t// Mark this activity as complete in our flag collection\r\n\t\tthis.finishActivityAtIndex(index);\r\n\r\n\t\tif (this.isActivated()) {\r\n\t\t\treturn this.commitActivation();\r\n\t\t}\r\n\r\n\t\treturn ActivityTracker.IncrementResult.SingleActivityActivated;\r\n\t}\r\n\r\n\t/**\r\n\t * Explicitly sets a start timestamp (now if startTime is null) for the specified activity index. Overwrites any previous StartTime.\r\n\t */\r\n\tpublic startTime(index: number, startTime?: Date): void {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.currentStartTimes[index] = (!startTime) ? new Date() : startTime;\r\n\t}\r\n\r\n\t/**\r\n\t * Computes the \"count\" delta (delta in whatever units are appropriate for a subsequent call to IncrementActivity)\r\n\t * elapsed between now and a previously logged StartTime for this activity index.\r\n\t * Always clears the previous StartTime.\r\n\t * Returns 0 if no previous StartTime was logged, or if StartTime > StopTime\r\n\t */\r\n\tpublic stopTime(index: number, stopTime?: Date): number {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tconst startTime = this.currentStartTimes[index];\r\n\t\tthis.currentStartTimes[index] = null;\r\n\r\n\t\tif (!startTime) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tstopTime = (!stopTime) ? new Date() : stopTime;\r\n\t\tif (startTime > stopTime) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tconst deltaMS = stopTime.getTime() - startTime.getTime();\r\n\t\t// Currently all timer activities return seconds as the increment unit\r\n\t\tlet diff = deltaMS / 1000;\r\n\r\n\t\t// Adding 1ms to the count so it can have the decimal place\r\n\t\t// So that we can distinguish the Time activity\r\n\t\tif (diff % 1 === 0) {\r\n\t\t\tdiff += 0.001;\r\n\t\t}\r\n\r\n\t\treturn diff;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns true if the index is valid for accessing the stored activity counts, false otherwise\r\n\t */\r\n\tpublic isValidIndex(index: number): boolean {\r\n\t\treturn index < this.trackedActivities.length;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets whether or not the full set of activities for this tracker have exceeded their trigger thresholds\r\n\t */\r\n\tpublic isActivated(): boolean {\r\n\t\treturn (this.currentActivationFlags & this.activationMask) === this.activationMask;\r\n\t}\r\n\r\n\t/**\r\n\t\t* Marks the activity at the index as finished. Includes setting the proper\r\n\t\t* activation flags and potentially advancing the current index for ordered tracking sets\r\n\t\t*/\r\n\tprivate finishActivityAtIndex(index: number): void {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\tthrow new Error(\"Index is not valid\");\r\n\t\t}\r\n\r\n\t\tthis.currentActivationFlags |= 0x1 << index;\r\n\r\n\t\tif (index + 1 < this.trackedActivities.length) {\r\n\t\t\tthis.currentIndex = index + 1;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @param index index\r\n\t * @return true if the counts for the activity at the specified index have met or exceeded the threshold count.\r\n\t */\r\n\tprivate hasCountCrossedThreshold(index: number): boolean {\r\n\t\tif (!this.isValidIndex(index)) {\r\n\t\t\tthrow new Error(\"Index is not valid\");\r\n\t\t}\r\n\r\n\t\treturn this.currentCounts[index] >= this.trackedActivities[index].getCount();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns true if the index refers to an activity that can re-activate a tracked object (aka return AllActivitiesActivated)\r\n\t * that was initialized as \"complete\" via initCounts.\r\n\t * Note: For unordered sets, any activity is valid. For ordered sequences, only the final activity is valid\r\n\t */\r\n\tprivate isPermittedIndexForActivationByInit(index: number): boolean {\r\n\t\treturn !this.isOrdered || ((index + 1) === this.currentCounts.length);\r\n\t}\r\n\r\n\tprivate commitActivation(): ActivityTracker.IncrementResult {\r\n\t\tthis.isActivationByInitPending = false;\r\n\t\treturn ActivityTracker.IncrementResult.AllActivitiesActivated;\r\n\t}\r\n}\r\n\r\nmodule ActivityTracker {\r\n\t/**\r\n\t * Structure returned by an ActivityTracker to call back into\r\n\t * IncrementActivity with valid index values\r\n\t */\r\n\texport class ActivityIndex {\r\n\t\tpublic activity: string;\r\n\t\tpublic index: number;\r\n\t}\r\n\r\n\texport const enum IncrementResult {\r\n\t\t/**\r\n\t\t * No thresholds crossed as a result of this increment operation\r\n\t\t */\r\n\t\tPending,\r\n\r\n\t\t/**\r\n\t\t * The threshold for the targeted activity index was crossed as a result of this increment operation\r\n\t\t */\r\n\t\tSingleActivityActivated,\r\n\r\n\t\t/**\r\n\t\t * The threshold for the targeted activity index was crossed as a result of this increment operation\r\n\t\t * and this was the final activity being tracked\r\n\t\t */\r\n\t\tAllActivitiesActivated,\r\n\t}\r\n}\r\n\r\nexport = ActivityTracker;\r\n","import ActivityTracker = require(\"./ActivityTracker\");\r\nimport ISurvey = require(\"./Api/ISurvey\");\r\n\r\nexport class IndexedTracker {\r\n\tpublic index: number;\r\n\tpublic surveyId: string;\r\n\tpublic tracker: ActivityTracker;\r\n}\r\n","import { ActivityTrackingSet } from \"./ActivityTrackingSet\";\r\n\r\nexport class ActivityTrackingContract {\r\n\tpublic surveyId: string;\r\n\tpublic trackingSet: ActivityTrackingSet;\r\n\r\n\tpublic constructor(surveyId: string, trackingSet: ActivityTrackingSet) {\r\n\t\tthis.surveyId = surveyId;\r\n\t\tthis.trackingSet = trackingSet;\r\n\t}\r\n}\r\n","import { ISurveyInfo } from \"./Api/Api\";\r\nimport { IDictionary } from \"./Common\";\r\nimport { SurveyActivationStats } from \"./SurveyStatCollectionActivation\";\r\nimport { isNOU, isNumber } from \"./Utils\";\r\n\r\nexport function isMultiLaunchSurvey(surveyInfo: ISurveyInfo): boolean {\r\n\tconst maxLaunches = surveyInfo?.getMaxLaunches();\r\n\treturn isNumber(maxLaunches) && maxLaunches > 1;\r\n}\r\n\r\nexport function isBusinessCriticalSurvey(surveyInfo: ISurveyInfo): boolean {\r\n\tconst businessLevel = surveyInfo?.getBusinessLevel();\r\n\treturn !isNOU(businessLevel) && businessLevel === ISurveyInfo.BusinessLevel.Critical;\r\n}\r\n\r\nexport function isCriticalSurvey(surveyInfo: ISurveyInfo): boolean {\r\n\treturn isMultiLaunchSurvey(surveyInfo) || isBusinessCriticalSurvey(surveyInfo);\r\n}\r\n\r\nexport function hasSurveyReachedMaxLaunchesPerSession(surveyInfo: ISurveyInfo, surveyActivationStats: IDictionary<number>): boolean {\r\n\tif (isMultiLaunchSurvey(surveyInfo) && isNumber(surveyInfo.getMaxLaunchesPerSession())) {\r\n\t\tconst surveyLaunchCountInSession = surveyActivationStats[surveyInfo.getId()] ?? 0;\r\n\t\tconst maxLaunchesPerSession = surveyInfo.getMaxLaunchesPerSession();\r\n\t\treturn surveyLaunchCountInSession >= maxLaunchesPerSession;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\nexport function hasSurveyReachedMaxLaunches(surveyInfo: ISurveyInfo, surveyActivationStats: SurveyActivationStats): boolean {\r\n\tif (isMultiLaunchSurvey(surveyInfo)) {\r\n\t\tconst surveyLaunchCount = surveyActivationStats?.SurveyLaunchCount || 0;\r\n\t\treturn surveyLaunchCount >= surveyInfo.getMaxLaunches();\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n","import { UserFact } from \"./UserFact\";\r\n\r\nexport const deserializeUserFacts = (input: any): UserFact[] => {\r\n\tlet userFacts: UserFact[] = [];\r\n\tfor (const key in input.UserFacts) {\r\n\t\tif (input.UserFacts.hasOwnProperty(key)) {\r\n\t\t\tconst userFactInput = input.UserFacts[key];\r\n\r\n\t\t\tif (userFactInput) {\r\n\t\t\t\tuserFacts.push(UserFact.deserialize(userFactInput));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (userFacts.length === 0) {\r\n\t\tuserFacts = null;\r\n\t}\r\n\r\n\treturn userFacts;\r\n\r\n};\r\n\r\nexport const validateUserFacts = (userFacts: UserFact[]): boolean => {\r\n\tif (userFacts) {\r\n\t\tfor (const key in userFacts) {\r\n\t\t\tif (userFacts.hasOwnProperty(key) && !userFacts[key]) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn true;\r\n};\r\n","import { TelemetryEvent } from \"../Constants\";\r\nimport { FloodgateEngine } from \"../FloodgateEngine\";\r\nimport * as Utils from \"../Utils\";\r\nimport { IUserFact } from \"./IUserFact\";\r\nimport { ComparatorType, CurrentTimeIntervalType, IUserFactInput, UserFactLatencyType, UserFactType } from \"./UserFactModel\";\r\n\r\nconst { isNOU, isNumber, isArray } = Utils;\r\nconst commonComparatorTypes: ComparatorType[] = [\r\n\tComparatorType.Equal,\r\n\tComparatorType.NotEqual,\r\n\tComparatorType.GreaterThan,\r\n\tComparatorType.GreaterThanOrEqual,\r\n\tComparatorType.LessThan,\r\n\tComparatorType.LessThanOrEqual,\r\n];\r\n\r\nexport class UserFact {\r\n\tpublic static deserialize(rawUserFactSpec: any): UserFact {\r\n\t\treturn this.validate(rawUserFactSpec) ? new UserFact(rawUserFactSpec) : null;\r\n\t}\r\n\r\n\tprivate static validate(input: any) {\r\n\t\tif (!input) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecDeserialization.Failed,\r\n\t\t\t\t\"Input is null or undefined for user fact\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Values is used for type UserFactType.ListOfStrings\r\n\t\tif (!input.Value && input.Values) {\r\n\t\t\tinput.Value = input.Values;\r\n\t\t}\r\n\r\n\t\tif (isNOU(input.Name) || isNOU(input.Type) || isNOU(input.Value)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecDeserialization.Failed,\r\n\t\t\t\t`Either of the required parameters Name: ${input.Name}, Type: ${input.Type} or Value: ${input.Value} are not provided for the user fact`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!this.validateUserFactType(input.Type)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecDeserialization.Failed,\r\n\t\t\t\t`Invalid UserFactType value ${input.Type} is provided for user fact`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (input.Type === UserFactType.ListFile) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecDeserialization.Failed,\r\n\t\t\t\t`Unsupported UserFactType value ${input.Type} is provided for user fact`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (input.LatencyType && !this.validateLatencyType(input.LatencyType)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecDeserialization.Failed,\r\n\t\t\t\t`Invalid LatencyType value ${input.LatencyType} is provided for user fact of type ${input.Type}`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (input.LatencyType && input.LatencyType !== UserFactLatencyType.None && isNOU(input.LatencyDurationInSeconds)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecDeserialization.Failed,\r\n\t\t\t\t`LatencyDurationInSeconds value ${input.LatencyDurationInSeconds} is not provided for user fact of type ${input.Type}`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (input.LatencyDurationInSeconds && !isNumber(input.LatencyDurationInSeconds)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecDeserialization.Failed,\r\n\t\t\t\t`Invalid LatencyDurationInSeconds value ${input.LatencyDurationInSeconds} is provided for user fact of type ${input.Type}`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (input.Type === UserFactType.TimeIntervalInSeconds && isNOU(input.IntervalType)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecDeserialization.Failed,\r\n\t\t\t\t`Required parameter intervalType is not provided for user fact of type ${input.Type}`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst supportedComparatorTypes = this.getComparatorTypes(input.Type);\r\n\t\tif (input.Comparator && !isComparatorTypeSupported(input.Comparator, supportedComparatorTypes)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecIsAMatch.Failed,\r\n\t\t\t\t`Unsupported comparator type for user fact of type ${input.Type}`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate static getComparatorTypes(userFactType: UserFactType): ComparatorType[]  {\r\n\t\tswitch (userFactType) {\r\n\t\t\tcase UserFactType.Boolean:\r\n\t\t\t\treturn [ComparatorType.Equal, ComparatorType.NotEqual];\r\n\t\t\tcase UserFactType.String:\r\n\t\t\t\treturn [ComparatorType.Equal,\r\n\t\t\t\t\t\tComparatorType.NotEqual,\r\n\t\t\t\t\t\tComparatorType.In,\r\n\t\t\t\t\t\tComparatorType.NotIn,\r\n\t\t\t\t\t\tComparatorType.InverseIn,\r\n\t\t\t\t\t\tComparatorType.InverseNotIn];\r\n\t\t\tcase UserFactType.ListOfStrings:\r\n\t\t\t\treturn [ComparatorType.In, ComparatorType.NotIn, ComparatorType.InverseIn, ComparatorType.InverseNotIn];\r\n\t\t\tcase UserFactType.TimeIntervalInSeconds:\r\n\t\t\tcase UserFactType.DateTimeUTC:\r\n\t\t\tcase UserFactType.Number:\r\n\t\t\tcase UserFactType.ListFile:\r\n\t\t\t\treturn commonComparatorTypes;\r\n\t\t\tdefault:\r\n\t\t\t\tassertNever(userFactType);\r\n\t\t}\r\n\r\n\t\treturn commonComparatorTypes;\r\n\t}\r\n\r\n\tprivate static validateLatencyType(latency: UserFactLatencyType) {\r\n\t\treturn (\r\n\t\t\tlatency === UserFactLatencyType.None ||\r\n\t\t\tlatency === UserFactLatencyType.ClientIngestionDateTime ||\r\n\t\t\tlatency === UserFactLatencyType.SourceDateTime ||\r\n\t\t\tlatency === UserFactLatencyType.StorageDateTime\r\n\t\t) ? true : assertNever(latency);\r\n\t}\r\n\r\n\tprivate static validateUserFactType(factType: UserFactType) {\r\n\t\treturn (\r\n\t\t\tfactType === UserFactType.Boolean ||\r\n\t\t\tfactType === UserFactType.DateTimeUTC ||\r\n\t\t\tfactType === UserFactType.Number ||\r\n\t\t\tfactType === UserFactType.String ||\r\n\t\t\tfactType === UserFactType.TimeIntervalInSeconds ||\r\n\t\t\tfactType === UserFactType.ListOfStrings ||\r\n\t\t\tfactType === UserFactType.ListFile\r\n\t\t) ? true : assertNever(factType);\r\n\t}\r\n\r\n\tprivate input: IUserFactInput;\r\n\r\n\tconstructor(input: IUserFactInput) {\r\n\t\tthis.input = input;\r\n\t}\r\n\r\n\tpublic isAMatch(rawUserFact: IUserFact): boolean {\r\n\t\tif (!rawUserFact || !rawUserFact.userFactValue) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!this.isLatencyAcceptable(rawUserFact)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst factType = this.getType();\r\n\t\t\tif (factType === UserFactType.Boolean) {\r\n\t\t\t\treturn compareBooleanValues(this.getValue(), rawUserFact, this.getComparator());\r\n\t\t\t} else if (factType === UserFactType.DateTimeUTC) {\r\n\t\t\t\treturn compareDateTimeUTCValues(this.getValue() as string, rawUserFact, this.getComparator());\r\n\t\t\t} else if (factType === UserFactType.Number) {\r\n\t\t\t\treturn compareNumberValues(this.getValue() as number, rawUserFact, this.getComparator());\r\n\t\t\t} else if (factType === UserFactType.String) {\r\n\t\t\t\treturn compareStringValues(this.getValue() as string, rawUserFact, this.getComparator());\r\n\t\t\t} else if (factType === UserFactType.TimeIntervalInSeconds) {\r\n\t\t\t\treturn compareTimeIntervalValues(this.getValue() as number, rawUserFact, this.getComparator(), this.getIntervalType());\r\n\t\t\t} else if (factType === UserFactType.ListOfStrings) {\r\n\t\t\t\treturn compareListValues(this.getValue() as unknown as string[], rawUserFact, this.getComparator());\r\n\t\t\t} else {\r\n\t\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecIsAMatch.Failed,\r\n\t\t\t\t\t`Unsupported type of user fact was provided ${factType}`);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecIsAMatch.Failed,\r\n\t\t\t\terror);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getType() {\r\n\t\treturn this.input.Type;\r\n\t}\r\n\r\n\tpublic getName() {\r\n\t\treturn this.input.Name;\r\n\t}\r\n\r\n\tpublic getValue() {\r\n\t\treturn this.input.Value;\r\n\t}\r\n\r\n\tpublic getComparator() {\r\n\t\treturn this.input.Comparator || ComparatorType.Equal;\r\n\t}\r\n\r\n\tpublic getLatencyType() {\r\n\t\treturn this.input.LatencyType || UserFactLatencyType.None;\r\n\t}\r\n\r\n\tpublic getLatencyDurationInSeconds() {\r\n\t\treturn this.input.LatencyDurationInSeconds;\r\n\t}\r\n\r\n\tpublic getIntervalType() {\r\n\t\treturn this.input.IntervalType;\r\n\t}\r\n\r\n\tprivate isLatencyAcceptable(rawUserFact: IUserFact) {\r\n\t\tconst factType = this.getType();\r\n\r\n\t\tif (!isNOU(this.getLatencyDurationInSeconds()) &&\r\n\t\t\t!evaluateFactCandidacy(this.getLatencyType(), this.getLatencyDurationInSeconds(), rawUserFact)) {\r\n\t\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\t\tTelemetryEvent.Floodgate.UserFactsSpecIsAMatch.Mismatch, {\r\n\t\t\t\t\tErrorMessage: `Latency duration not acceptable - { Name: \"${rawUserFact.userFactName}\" }`,\r\n\t\t\t\t\tTimeMilliseconds: this.getLatencyDurationInSeconds(),\r\n\t\t\t\t\tType: `${factType}`,\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nfunction evaluateFactCandidacy(latencyType: UserFactLatencyType, latencyDurationInSeconds: number, userFact: IUserFact) {\r\n\tlet userFactTime: string;\r\n\tswitch (latencyType) {\r\n\t\tcase UserFactLatencyType.None:\r\n\t\t\tbreak;\r\n\t\tcase UserFactLatencyType.SourceDateTime:\r\n\t\t\tuserFactTime = userFact.sourceDateTime;\r\n\t\t\tbreak;\r\n\t\tcase UserFactLatencyType.StorageDateTime:\r\n\t\t\tuserFactTime = userFact.storageDateTime;\r\n\t\t\tbreak;\r\n\t\tcase UserFactLatencyType.ClientIngestionDateTime:\r\n\t\t\tuserFactTime = userFact.clientIngestionDateTime;\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tassertNever(latencyType);\r\n\t\t}\r\n\r\n\tif (!isNOU(userFactTime)) {\r\n\t\tconst userFactTimeInMilliseconds = Date.parse(userFactTime);\r\n\t\tconst currentTimeInMilliseconds = Date.now();\r\n\r\n\t\treturn currentTimeInMilliseconds - userFactTimeInMilliseconds <= (latencyDurationInSeconds * 1000);\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\nfunction compareBooleanValues(userFactSpecValue: any, rawUserFact: IUserFact, comparator: ComparatorType) {\r\n\tconst rawUserFactValueInBoolean = JSON.parse(rawUserFact.userFactValue.toLowerCase());\r\n\treturn compareValues(!!userFactSpecValue, !!rawUserFactValueInBoolean, comparator);\r\n}\r\n\r\nfunction compareDateTimeUTCValues(userFactSpecValue: string, rawUserFact: IUserFact, comparator: ComparatorType) {\r\n\tconst rawUserFactValueInMilliseconds = Date.parse(rawUserFact.userFactValue);\r\n\tif (!isAValidNumber(rawUserFactValueInMilliseconds, rawUserFact.userFactValue, rawUserFact.userFactName)) {\r\n\t\treturn false;\r\n\t}\r\n\tconst userFactSpecValueInMilliseconds = Date.parse(userFactSpecValue);\r\n\tif (!isAValidNumber(userFactSpecValueInMilliseconds, userFactSpecValue, null, UserFactType.DateTimeUTC)) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn compareValues(userFactSpecValueInMilliseconds, rawUserFactValueInMilliseconds, comparator);\r\n}\r\n\r\nfunction compareNumberValues(userFactSpecValue: number, rawUserFact: IUserFact, comparator: ComparatorType) {\r\n\tconst rawUserFactValueInNumber = parseInt(rawUserFact.userFactValue, 10);\r\n\tif (!isAValidNumber(rawUserFactValueInNumber, rawUserFact.userFactValue, rawUserFact.userFactName)) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn compareValues(userFactSpecValue, rawUserFactValueInNumber, comparator);\r\n}\r\n\r\nfunction compareStringValues(userFactSpecValue: string, rawUserFact: IUserFact, comparator: ComparatorType) {\r\n\treturn compareValues(userFactSpecValue.toLowerCase(), rawUserFact.userFactValue.toLowerCase(), comparator);\r\n}\r\n\r\nfunction compareTimeIntervalValues(\r\n\tuserFactSpecValue: number, rawUserFact: IUserFact, comparator: ComparatorType, intervalType: CurrentTimeIntervalType) {\r\n\tconst rawUserFactValueInMilliseconds = Date.parse(rawUserFact.userFactValue);\r\n\tif (!isAValidNumber(rawUserFactValueInMilliseconds, rawUserFact.userFactValue, rawUserFact.userFactName)) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// Diff from now and users input date\r\n\t// IntervalTo - Internval to current date from fact date (fact date is expected to be before current date)\r\n\t// IntervalFrom - Interval from current date to fact date (fact date is expected to be after current date)\r\n\tconst currentTimeInMilliseconds = Date.now();\r\n\tconst currentDateDiff = intervalType === CurrentTimeIntervalType.IntervalTo ?\r\n\t\t(currentTimeInMilliseconds - rawUserFactValueInMilliseconds) : (rawUserFactValueInMilliseconds - currentTimeInMilliseconds);\r\n\tif (currentDateDiff < 0) {\r\n\t\tFloodgateEngine.getTelemetryLogger().log_Event(\r\n\t\t\tTelemetryEvent.Floodgate.UserFactsSpecIsAMatch.Mismatch, {\r\n\t\t\t\tErrorMessage: `Interval type not acceptable - { Spec: ${userFactSpecValue}, Name: \"${rawUserFact.userFactName}\" }`,\r\n\t\t\t\tTimeMilliseconds: currentDateDiff,\r\n\t\t\t\tType: `${intervalType}`,\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst dayInMilliseconds = 86400000;\r\n\tconst userFactSpecValueInMilliseconds = userFactSpecValue * dayInMilliseconds;\r\n\r\n\t// check if the above diff satisfies the comparison criteria\r\n\treturn compareValues(userFactSpecValueInMilliseconds, currentDateDiff, comparator);\r\n}\r\n\r\nfunction compareListValues<T extends string | boolean | number>(userFactSpecValue: T[], rawUserFact: IUserFact, comparator: ComparatorType) {\r\n\treturn compareValues(userFactSpecValue, rawUserFact.userFactValue as T, comparator);\r\n}\r\n\r\nfunction isComparatorTypeSupported(comparator: ComparatorType, supportedComparatorTypes: ComparatorType[]) {\r\n\treturn supportedComparatorTypes.indexOf(comparator) !== -1;\r\n}\r\n\r\nfunction compareValues<T extends string | boolean | number>(\r\n\tuserFactSpecValue: T | T[], userFactRawValue: T, comparator: ComparatorType): boolean {\r\n\tswitch (comparator) {\r\n\t\tcase ComparatorType.Equal:\r\n\t\t\treturn userFactRawValue === userFactSpecValue;\r\n\t\tcase ComparatorType.NotEqual:\r\n\t\t\treturn userFactRawValue !== userFactSpecValue;\r\n\t\tcase ComparatorType.GreaterThan:\r\n\t\t\treturn userFactRawValue > userFactSpecValue;\r\n\t\tcase ComparatorType.GreaterThanOrEqual:\r\n\t\t\treturn userFactRawValue >= userFactSpecValue;\r\n\t\tcase ComparatorType.LessThan:\r\n\t\t\treturn userFactRawValue < userFactSpecValue;\r\n\t\tcase ComparatorType.LessThanOrEqual:\r\n\t\t\treturn userFactRawValue <= userFactSpecValue;\r\n\t\tcase ComparatorType.In:\r\n\t\t\treturn isFactValueInTargetItem(userFactSpecValue, userFactRawValue);\r\n\t\tcase ComparatorType.NotIn:\r\n\t\t\treturn !isFactValueInTargetItem(userFactSpecValue, userFactRawValue);\r\n\t\tcase ComparatorType.InverseIn:\r\n\t\t\treturn isFactValueInTargetItem(userFactRawValue, userFactSpecValue as T);\r\n\t\tcase ComparatorType.InverseNotIn:\r\n\t\t\treturn !isFactValueInTargetItem(userFactRawValue, userFactSpecValue as T);\r\n\t\tdefault:\r\n\t\t\tassertNever(comparator);\r\n\t}\r\n}\r\n\r\nfunction assertNever(_: never) {\r\n\treturn false;\r\n}\r\n\r\nfunction isFactValueInTargetItem<T>(userFactTargetValues: T | T[], userFactRawValue: T): boolean {\r\n\tif (typeof userFactRawValue === \"string\") {\r\n\t\tconst factValue = userFactRawValue.toLowerCase();\r\n\t\tif (typeof userFactTargetValues === \"string\") {\r\n\t\t\t// both the inputs are strings, do a plain indexOf\r\n\t\t\treturn (userFactTargetValues as string).toLowerCase().indexOf(factValue) !== -1;\r\n\t\t}\r\n\r\n\t\tif (isArray(userFactTargetValues)) {\r\n\t\t\tconst specValues = userFactTargetValues as T[];\r\n\t\t\treturn specValues.some((specValue) => specValue && specValue.toString().toLowerCase() === factValue);\r\n\t\t}\r\n\t}\r\n\r\n\tif (isArray(userFactTargetValues)) {\r\n\t\treturn (userFactTargetValues as T[]).indexOf(userFactRawValue) !== -1;\r\n\t}\r\n\r\n\treturn false;\r\n}\r\n\r\nfunction isAValidNumber(numberValue: number, value: string, rawUserFactName: string, factType?: UserFactType) {\r\n\tif (!isNumber(numberValue)) {\r\n\t\tlet errorMessage = `User fact ${rawUserFactName} has invalid value ${value}`;\r\n\t\tif (factType) {\r\n\t\t\terrorMessage = `Invalid value ${value} was provided for user fact of type ${factType}`;\r\n\t\t}\r\n\r\n\t\tFloodgateEngine.getTelemetryLogger().log_Error(\r\n\t\t\tTelemetryEvent.Floodgate.UserFactsSpecIsAMatch.Failed,\r\n\t\t\terrorMessage);\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n","(function webpackUniversalModuleDefinition(root, factory) {\r\n\tif(typeof exports === 'object' && typeof module === 'object')\r\n\t\tmodule.exports = factory();\r\n\telse if(typeof define === 'function' && define.amd)\r\n\t\tdefine([], factory);\r\n\telse {\r\n\t\tvar a = factory();\r\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\r\n\t}\r\n})(this, function() {\r\nreturn /******/ (function(modules) { // webpackBootstrap\r\n/******/ \t// The module cache\r\n/******/ \tvar installedModules = {};\r\n/******/\r\n/******/ \t// The require function\r\n/******/ \tfunction __webpack_require__(moduleId) {\r\n/******/\r\n/******/ \t\t// Check if module is in cache\r\n/******/ \t\tif(installedModules[moduleId]) {\r\n/******/ \t\t\treturn installedModules[moduleId].exports;\r\n/******/ \t\t}\r\n/******/ \t\t// Create a new module (and put it into the cache)\r\n/******/ \t\tvar module = installedModules[moduleId] = {\r\n/******/ \t\t\ti: moduleId,\r\n/******/ \t\t\tl: false,\r\n/******/ \t\t\texports: {}\r\n/******/ \t\t};\r\n/******/\r\n/******/ \t\t// Execute the module function\r\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\r\n/******/\r\n/******/ \t\t// Flag the module as loaded\r\n/******/ \t\tmodule.l = true;\r\n/******/\r\n/******/ \t\t// Return the exports of the module\r\n/******/ \t\treturn module.exports;\r\n/******/ \t}\r\n/******/\r\n/******/\r\n/******/ \t// expose the modules object (__webpack_modules__)\r\n/******/ \t__webpack_require__.m = modules;\r\n/******/\r\n/******/ \t// expose the module cache\r\n/******/ \t__webpack_require__.c = installedModules;\r\n/******/\r\n/******/ \t// identity function for calling harmony imports with the correct context\r\n/******/ \t__webpack_require__.i = function(value) { return value; };\r\n/******/\r\n/******/ \t// define getter function for harmony exports\r\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\r\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\r\n/******/ \t\t\tObject.defineProperty(exports, name, {\r\n/******/ \t\t\t\tconfigurable: false,\r\n/******/ \t\t\t\tenumerable: true,\r\n/******/ \t\t\t\tget: getter\r\n/******/ \t\t\t});\r\n/******/ \t\t}\r\n/******/ \t};\r\n/******/\r\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\r\n/******/ \t__webpack_require__.n = function(module) {\r\n/******/ \t\tvar getter = module && module.__esModule ?\r\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\r\n/******/ \t\t\tfunction getModuleExports() { return module; };\r\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\r\n/******/ \t\treturn getter;\r\n/******/ \t};\r\n/******/\r\n/******/ \t// Object.prototype.hasOwnProperty.call\r\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\r\n/******/\r\n/******/ \t// __webpack_public_path__\r\n/******/ \t__webpack_require__.p = \"\";\r\n/******/\r\n/******/ \t// Load entry module and return exports\r\n/******/ \treturn __webpack_require__(__webpack_require__.s = 15);\r\n/******/ })\r\n/************************************************************************/\r\n/******/ ([\r\n/* 0 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\n/**\r\n* microsoft.bond.primitives.ts\r\n* Copyright: Microsoft 2016\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Int64 = /** @class */ (function () {\r\n    // BUG!!: need implement, currently, just handle 32bits number\r\n    function Int64(numberStr) {\r\n        this.low = 0;\r\n        this.high = 0;\r\n        this.low = parseInt(numberStr, 10);\r\n        if (this.low < 0) {\r\n            this.high = -1;\r\n        }\r\n    }\r\n    Int64.prototype.Equals = function (numberStr) {\r\n        var tmp = new Int64(numberStr);\r\n        return this.low === tmp.low && this.high === tmp.high;\r\n    };\r\n    return Int64;\r\n}());\r\nexports.Int64 = Int64;\r\nvar UInt64 = /** @class */ (function () {\r\n    // BUG!!: need implement, currently, just handle 32bits number\r\n    function UInt64(numberStr) {\r\n        this.low = 0;\r\n        this.high = 0;\r\n        this.low = parseInt(numberStr, 10);\r\n    }\r\n    UInt64.prototype.Equals = function (numberStr) {\r\n        var tmp = new UInt64(numberStr);\r\n        return this.low === tmp.low && this.high === tmp.high;\r\n    };\r\n    return UInt64;\r\n}());\r\nexports.UInt64 = UInt64;\r\nvar Number = /** @class */ (function () {\r\n    function Number() {\r\n    }\r\n    Number.ToByte = function (value) {\r\n        return this.ToUInt8(value);\r\n    };\r\n    Number.ToInt16 = function (value) {\r\n        var signMask = (value & 0x8000) << 16 >> 16;\r\n        return (value & 0x7fff) | signMask;\r\n    };\r\n    Number.ToInt32 = function (value) {\r\n        var signMask = (value & 0x80000000);\r\n        return (value & 0x7fffffff) | signMask;\r\n    };\r\n    Number.ToUInt8 = function (value) {\r\n        return value & 0xff;\r\n    };\r\n    Number.ToUInt32 = function (value) {\r\n        return value & 0xffffffff;\r\n    };\r\n    return Number;\r\n}());\r\nexports.Number = Number;\r\n\r\n\r\n/***/ }),\r\n/* 1 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\n/**\r\n* Enums.ts\r\n* Author: Abhilash Panwar (abpanwar)\r\n* Copyright: Microsoft 2016\r\n* Common enum values used in the SDK.\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar AWTPiiKind;\r\n(function (AWTPiiKind) {\r\n    AWTPiiKind[AWTPiiKind[\"NotSet\"] = 0] = \"NotSet\";\r\n    AWTPiiKind[AWTPiiKind[\"DistinguishedName\"] = 1] = \"DistinguishedName\";\r\n    AWTPiiKind[AWTPiiKind[\"GenericData\"] = 2] = \"GenericData\";\r\n    AWTPiiKind[AWTPiiKind[\"IPV4Address\"] = 3] = \"IPV4Address\";\r\n    AWTPiiKind[AWTPiiKind[\"IPv6Address\"] = 4] = \"IPv6Address\";\r\n    AWTPiiKind[AWTPiiKind[\"MailSubject\"] = 5] = \"MailSubject\";\r\n    AWTPiiKind[AWTPiiKind[\"PhoneNumber\"] = 6] = \"PhoneNumber\";\r\n    AWTPiiKind[AWTPiiKind[\"QueryString\"] = 7] = \"QueryString\";\r\n    AWTPiiKind[AWTPiiKind[\"SipAddress\"] = 8] = \"SipAddress\";\r\n    AWTPiiKind[AWTPiiKind[\"SmtpAddress\"] = 9] = \"SmtpAddress\";\r\n    AWTPiiKind[AWTPiiKind[\"Identity\"] = 10] = \"Identity\";\r\n    AWTPiiKind[AWTPiiKind[\"Uri\"] = 11] = \"Uri\";\r\n    AWTPiiKind[AWTPiiKind[\"Fqdn\"] = 12] = \"Fqdn\";\r\n    // Supports scrubbing of the last octet in a IPV4 address. E.g. 10.121.227.147 becomes 10.121.227.*\r\n    AWTPiiKind[AWTPiiKind[\"IPV4AddressLegacy\"] = 13] = \"IPV4AddressLegacy\";\r\n})(AWTPiiKind = exports.AWTPiiKind || (exports.AWTPiiKind = {}));\r\n\r\n\r\n/***/ }),\r\n/* 2 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\n/**\r\n* AWTBondSerializer.ts\r\n* Author: Brent Erickson (brericks) and Abhilash Panwar (abpanwar)\r\n* Copyright: Microsoft 2016\r\n* Class to handler bond serialization.\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Bond = __webpack_require__(9);\r\nvar Enums_1 = __webpack_require__(1);\r\nvar Utils = __webpack_require__(3);\r\nvar AWTBondSerializer = /** @class */ (function () {\r\n    function AWTBondSerializer() {\r\n    }\r\n    AWTBondSerializer.getPayloadBlob = function (requestDictionary, tokenCount) {\r\n        var stream = new Bond.IO.MemoryStream();\r\n        var writer = new Bond.CompactBinaryProtocolWriter(stream);\r\n        // Begin ClientCollector request\r\n        //Write TokenToDataPackagesMap\r\n        writer.WriteFieldBegin(Bond.BondDataType.BT_MAP, 3);\r\n        writer.WriteMapContainerBegin(tokenCount, Bond.BondDataType.BT_STRING, Bond.BondDataType.BT_LIST);\r\n        Object.keys(requestDictionary).forEach(function (token) {\r\n            //write token\r\n            writer.WriteString(token);\r\n            var dataPackage = requestDictionary[token];\r\n            // Write list of DataPackages\r\n            writer.WriteContainerBegin(1, Bond.BondDataType.BT_STRUCT);\r\n            // Source\r\n            writer.WriteFieldBegin(Bond.BondDataType.BT_STRING, 2);\r\n            writer.WriteString('act_default_source');\r\n            // DataPackageId\r\n            writer.WriteFieldBegin(Bond.BondDataType.BT_STRING, 5);\r\n            writer.WriteString(Utils.newGuid());\r\n            // Timestamp\r\n            writer.WriteFieldBegin(Bond.BondDataType.BT_INT64, 6);\r\n            writer.WriteInt64(Utils.numberToBondInt64(Date.now()));\r\n            // Records\r\n            writer.WriteFieldBegin(Bond.BondDataType.BT_LIST, 8);\r\n            writer.WriteContainerBegin(dataPackage.length, Bond.BondDataType.BT_STRUCT);\r\n            for (var i = 0; i < dataPackage.length; ++i) {\r\n                writer.WriteBlob(dataPackage[i]);\r\n            }\r\n            writer.WriteStructEnd(false);\r\n        });\r\n        // End ClientCollector\r\n        writer.WriteStructEnd(false);\r\n        return stream.GetBuffer();\r\n    };\r\n    // As per mappings at https://skype.visualstudio.com/SCC/F.S4L.FUNDAMENTALS/_git/infrastructure_data_clienttelemetry?\r\n    // path=%2Fclienttelemetry%2Fsrc%2Fbond%2FDataPackage.bond&version=GBdev2&_a=contents\r\n    // Requires that the values of AWTEventData.properties must all be AWTEventProperty\r\n    AWTBondSerializer.getEventBlob = function (eventData) {\r\n        var stream = new Bond.IO.MemoryStream();\r\n        var writer = new Bond.CompactBinaryProtocolWriter(stream);\r\n        // ID\r\n        writer.WriteFieldBegin(Bond.BondDataType.BT_STRING, 1);\r\n        writer.WriteString(eventData.id);\r\n        // Timestamp\r\n        writer.WriteFieldBegin(Bond.BondDataType.BT_INT64, 3);\r\n        writer.WriteInt64(Utils.numberToBondInt64(eventData.timestamp));\r\n        // Type\r\n        writer.WriteFieldBegin(Bond.BondDataType.BT_STRING, 5);\r\n        writer.WriteString(eventData.type);\r\n        // Event Type\r\n        writer.WriteFieldBegin(Bond.BondDataType.BT_STRING, 6);\r\n        writer.WriteString(eventData.name);\r\n        var propsString = [];\r\n        var piiProps = [];\r\n        // Iterate across event data properties and separate based on pii\r\n        Object.keys(eventData.properties).forEach(function (key) {\r\n            var property = eventData.properties[key];\r\n            if (property.pii === Enums_1.AWTPiiKind.NotSet) {\r\n                propsString.push(key);\r\n            }\r\n            else {\r\n                piiProps.push(key);\r\n            }\r\n        });\r\n        //Extension map\r\n        if (propsString.length) {\r\n            writer.WriteFieldBegin(Bond.BondDataType.BT_MAP, 13);\r\n            writer.WriteMapContainerBegin(propsString.length, Bond.BondDataType.BT_STRING, Bond.BondDataType.BT_STRING);\r\n            propsString.forEach(function (name) {\r\n                writer.WriteString(name);\r\n                writer.WriteString(eventData.properties[name].value);\r\n            });\r\n        }\r\n        // Pii\r\n        if (piiProps.length) {\r\n            writer.WriteFieldBegin(Bond.BondDataType.BT_MAP, 30);\r\n            writer.WriteMapContainerBegin(piiProps.length, Bond.BondDataType.BT_STRING, Bond.BondDataType.BT_STRUCT);\r\n            piiProps.forEach(function (name) {\r\n                writer.WriteString(name);\r\n                // PII Data\r\n                // O365 scrubber type\r\n                writer.WriteFieldBegin(Bond.BondDataType.BT_INT32, 1);\r\n                writer.WriteInt32(1);\r\n                // PII Kind\r\n                writer.WriteFieldBegin(Bond.BondDataType.BT_INT32, 2);\r\n                writer.WriteInt32(eventData.properties[name].pii);\r\n                // Value\r\n                writer.WriteFieldBegin(Bond.BondDataType.BT_STRING, 3);\r\n                writer.WriteString(eventData.properties[name].value);\r\n                writer.WriteStructEnd(false);\r\n            });\r\n        }\r\n        writer.WriteStructEnd(false);\r\n        return stream.GetBuffer();\r\n    };\r\n    AWTBondSerializer.base64Encode = function (data) {\r\n        return Bond.Encoding.Base64.GetString(data);\r\n    };\r\n    return AWTBondSerializer;\r\n}());\r\nexports.default = AWTBondSerializer;\r\n\r\n\r\n/***/ }),\r\n/* 3 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/**\r\n* Utils.ts\r\n* Author: Brent Erickson (brericks) and Abhilash Panwar (abpanwar)\r\n* Copyright: Microsoft 2016\r\n* Common functions used in the SDK.\r\n*/\r\nvar microsoft_bond_primitives_1 = __webpack_require__(0);\r\nvar GuidRegex = /[xy]/g;\r\nfunction numberToBondInt64(value) {\r\n    // Construct bond timestamp for aria\r\n    var bond_value = new microsoft_bond_primitives_1.Int64('0');\r\n    bond_value.low = value & 0xffffffff;\r\n    bond_value.high = Math.floor(value / 0x100000000);\r\n    return bond_value;\r\n}\r\nexports.numberToBondInt64 = numberToBondInt64;\r\nfunction newGuid() {\r\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(GuidRegex, function (c) {\r\n        var r = (Math.random() * 16 | 0), v = (c === 'x' ? r : r & 0x3 | 0x8);\r\n        return v.toString(16);\r\n    });\r\n}\r\nexports.newGuid = newGuid;\r\nfunction isPii(value) {\r\n    if (!isNaN(value) && value !== null && value >= 0 && value <= 13) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\nexports.isPii = isPii;\r\n\r\n\r\n/***/ }),\r\n/* 4 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/**\r\n* Version.ts\r\n* Author: Abhilash Panwar (abpanwar)\r\n* Copyright: Microsoft 2016\r\n* Class for SDK version.\r\n*/\r\nexports.Version = '1.2.2';\r\nexports.FullVersionString = 'AWT-Web-CJS-' + exports.Version;\r\n\r\n\r\n/***/ }),\r\n/* 5 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/**\r\n* AriaSDK.ts\r\n* Author: Abhilash Panwar (abpanwar)\r\n* Copyright: Microsoft 2016\r\n*/\r\nvar Enums_1 = __webpack_require__(1);\r\nexports.AWTPiiKind = Enums_1.AWTPiiKind;\r\nvar AWT_1 = __webpack_require__(13);\r\nexports.AWT = AWT_1.default;\r\nexports.AWT_COLLECTOR_URL_UNITED_STATES = 'https://us.pipe.aria.microsoft.com/Collector/3.0/';\r\nexports.AWT_COLLECTOR_URL_GERMANY = 'https://de.pipe.aria.microsoft.com/Collector/3.0/';\r\nexports.AWT_COLLECTOR_URL_JAPAN = 'https://jp.pipe.aria.microsoft.com/Collector/3.0/';\r\nexports.AWT_COLLECTOR_URL_AUSTRALIA = 'https://au.pipe.aria.microsoft.com/Collector/3.0/';\r\nexports.AWT_COLLECTOR_URL_EUROPE = 'https://eu.pipe.aria.microsoft.com/Collector/3.0/';\r\n\r\n\r\n/***/ }),\r\n/* 6 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\n/**\r\n* bond_const.ts\r\n* Copyright: Microsoft 2016\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//\r\n//     Tool     : bondc, Version=3.0.1, Build=bond-git.debug.not\r\n//     Template : Microsoft.Bond.Rules.dll#TypeScript.tt\r\n//     File     : bond_const.ts\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost when\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\nvar BondDataType;\r\n(function (BondDataType) {\r\n    BondDataType[BondDataType[\"BT_STOP\"] = 0] = \"BT_STOP\";\r\n    BondDataType[BondDataType[\"BT_STOP_BASE\"] = 1] = \"BT_STOP_BASE\";\r\n    BondDataType[BondDataType[\"BT_UINT8\"] = 3] = \"BT_UINT8\";\r\n    BondDataType[BondDataType[\"BT_UINT32\"] = 5] = \"BT_UINT32\";\r\n    BondDataType[BondDataType[\"BT_UINT64\"] = 6] = \"BT_UINT64\";\r\n    BondDataType[BondDataType[\"BT_STRING\"] = 9] = \"BT_STRING\";\r\n    BondDataType[BondDataType[\"BT_STRUCT\"] = 10] = \"BT_STRUCT\";\r\n    BondDataType[BondDataType[\"BT_LIST\"] = 11] = \"BT_LIST\";\r\n    BondDataType[BondDataType[\"BT_MAP\"] = 13] = \"BT_MAP\";\r\n    BondDataType[BondDataType[\"BT_INT32\"] = 16] = \"BT_INT32\";\r\n    BondDataType[BondDataType[\"BT_INT64\"] = 17] = \"BT_INT64\";\r\n    BondDataType[BondDataType[\"BT_UNAVAILABLE\"] = 127] = \"BT_UNAVAILABLE\";\r\n})(BondDataType = exports.BondDataType || (exports.BondDataType = {}));\r\n\r\n\r\n/***/ }),\r\n/* 7 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\n/**\r\n* microsoft.bond.encoding.ts\r\n* Copyright: Microsoft 2016\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar microsoft_bond_primitives_1 = __webpack_require__(0);\r\nvar Utf8 = /** @class */ (function () {\r\n    function Utf8() {\r\n    }\r\n    Utf8.GetBytes = function (value) {\r\n        var array = [];\r\n        for (var i = 0; i < value.length; ++i) {\r\n            var char = value.charCodeAt(i);\r\n            if (char < 0x80) {\r\n                array.push(char);\r\n            }\r\n            else if (char < 0x800) {\r\n                array.push(0xc0 | (char >> 6), 0x80 | (char & 0x3f));\r\n            }\r\n            else if (char < 0xd800 || char >= 0xe000) {\r\n                array.push(0xe0 | (char >> 12), 0x80 | ((char >> 6) & 0x3f), 0x80 | (char & 0x3f));\r\n            }\r\n            else {\r\n                char = 0x10000 + (((char & 0x3ff) << 10) | (value.charCodeAt(++i) & 0x3ff));\r\n                array.push(0xf0 | (char >> 18), 0x80 | ((char >> 12) & 0x3f), 0x80 | ((char >> 6) & 0x3f), 0x80 | (char & 0x3f));\r\n            }\r\n        }\r\n        return array;\r\n    };\r\n    return Utf8;\r\n}());\r\nexports.Utf8 = Utf8;\r\nvar Base64 = /** @class */ (function () {\r\n    function Base64() {\r\n    }\r\n    Base64.GetString = function (inArray) {\r\n        var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n        var output = [];\r\n        var paddingBytes = inArray.length % 3;\r\n        var toBase64 = function (num) {\r\n            return [lookup.charAt((num >> 18) & 0x3F),\r\n                lookup.charAt((num >> 12) & 0x3F),\r\n                lookup.charAt((num >> 6) & 0x3F),\r\n                lookup.charAt(num & 0x3F)].join('');\r\n        };\r\n        for (var i = 0, length_1 = inArray.length - paddingBytes; i < length_1; i += 3) {\r\n            var temp = (inArray[i] << 16) + (inArray[i + 1] << 8) + (inArray[i + 2]);\r\n            output.push(toBase64(temp));\r\n        }\r\n        switch (paddingBytes) {\r\n            case 1:\r\n                var temp = inArray[inArray.length - 1];\r\n                output.push(lookup.charAt(temp >> 2));\r\n                output.push(lookup.charAt((temp << 4) & 0x3F));\r\n                output.push('==');\r\n                break;\r\n            case 2:\r\n                var temp2 = (inArray[inArray.length - 2] << 8) + (inArray[inArray.length - 1]);\r\n                output.push(lookup.charAt(temp2 >> 10));\r\n                output.push(lookup.charAt((temp2 >> 4) & 0x3F));\r\n                output.push(lookup.charAt((temp2 << 2) & 0x3F));\r\n                output.push('=');\r\n                break;\r\n        }\r\n        return output.join('');\r\n    };\r\n    return Base64;\r\n}());\r\nexports.Base64 = Base64;\r\nvar Varint = /** @class */ (function () {\r\n    function Varint() {\r\n    }\r\n    Varint.GetBytes = function (value) {\r\n        var array = [];\r\n        while (value & 0xffffff80) {\r\n            array.push((value & 0x7f) | 0x80);\r\n            value >>>= 7;\r\n        }\r\n        array.push(value & 0x7f);\r\n        return array;\r\n    };\r\n    return Varint;\r\n}());\r\nexports.Varint = Varint;\r\nvar Varint64 = /** @class */ (function () {\r\n    function Varint64() {\r\n    }\r\n    Varint64.GetBytes = function (value) {\r\n        var low = value.low;\r\n        var high = value.high;\r\n        var array = [];\r\n        while (high || (0xffffff80 & low)) {\r\n            array.push((low & 0x7f) | 0x80);\r\n            low = ((high & 0x7f) << 25) | (low >>> 7);\r\n            high >>>= 7;\r\n        }\r\n        array.push(low & 0x7f);\r\n        return array;\r\n    };\r\n    return Varint64;\r\n}());\r\nexports.Varint64 = Varint64;\r\nvar Zigzag = /** @class */ (function () {\r\n    function Zigzag() {\r\n    }\r\n    Zigzag.EncodeZigzag32 = function (value) {\r\n        value = microsoft_bond_primitives_1.Number.ToInt32(value);\r\n        return ((value << 1) ^ (value >> (4 /*sizeof(int)*/ * 8 - 1)));\r\n    };\r\n    Zigzag.EncodeZigzag64 = function (value) {\r\n        var low = value.low;\r\n        var high = value.high;\r\n        var tmpH = (high << 1) | (low >>> 31);\r\n        var tmpL = low << 1;\r\n        if (high & 0x80000000) {\r\n            tmpH = ~tmpH;\r\n            tmpL = ~tmpL;\r\n        }\r\n        var res = new microsoft_bond_primitives_1.UInt64('0');\r\n        res.low = tmpL;\r\n        res.high = tmpH;\r\n        return res;\r\n    };\r\n    return Zigzag;\r\n}());\r\nexports.Zigzag = Zigzag;\r\n\r\n\r\n/***/ }),\r\n/* 8 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\n/**\r\n* microsoft.bond.io.ts\r\n* Copyright: Microsoft 2016\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar microsoft_bond_primitives_1 = __webpack_require__(0);\r\nvar MemoryStream = /** @class */ (function () {\r\n    function MemoryStream() {\r\n        this._buffer = [];\r\n    }\r\n    /*override*/\r\n    MemoryStream.prototype.WriteByte = function (byte) {\r\n        this._buffer.push(microsoft_bond_primitives_1.Number.ToByte(byte));\r\n    };\r\n    /*override*/\r\n    MemoryStream.prototype.Write = function (buffer, offset, count) {\r\n        while (count--) {\r\n            this.WriteByte(buffer[offset++]);\r\n        }\r\n    };\r\n    /**\r\n     * Returns the array of unsigned bytes from which this stream was created.\r\n     */\r\n    MemoryStream.prototype.GetBuffer = function () {\r\n        return this._buffer;\r\n    };\r\n    return MemoryStream;\r\n}());\r\nexports.MemoryStream = MemoryStream;\r\n\r\n\r\n/***/ }),\r\n/* 9 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\n/**\r\n* microsoft.bond.ts\r\n* Copyright: Microsoft 2016\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar bond_const_1 = __webpack_require__(6);\r\nexports.BondDataType = bond_const_1.BondDataType;\r\nvar Encoding = __webpack_require__(7);\r\nexports.Encoding = Encoding;\r\nvar IO = __webpack_require__(8);\r\nexports.IO = IO;\r\nvar microsoft_bond_primitives_1 = __webpack_require__(0);\r\nexports.Int64 = microsoft_bond_primitives_1.Int64;\r\nexports.UInt64 = microsoft_bond_primitives_1.UInt64;\r\nexports.Number = microsoft_bond_primitives_1.Number;\r\nvar CompactBinaryProtocolWriter = /** @class */ (function () {\r\n    function CompactBinaryProtocolWriter(stream) {\r\n        this._stream = stream;\r\n    }\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteBlob = function (blob) {\r\n        this._stream.Write(blob, 0, blob.length);\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteContainerBegin = function (size, elementType) {\r\n        this.WriteUInt8(elementType);\r\n        this.WriteUInt32(size);\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteMapContainerBegin = function (size, keyType, valueType) {\r\n        this.WriteUInt8(keyType);\r\n        this.WriteUInt8(valueType);\r\n        this.WriteUInt32(size);\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteFieldBegin = function (type, id) {\r\n        if (id <= 5) {\r\n            this._stream.WriteByte(type | (id << 5));\r\n        }\r\n        else if (id <= 0xff) {\r\n            this._stream.WriteByte(type | (6 << 5));\r\n            this._stream.WriteByte(id);\r\n        }\r\n        else {\r\n            this._stream.WriteByte(type | (7 << 5));\r\n            this._stream.WriteByte(id);\r\n            this._stream.WriteByte(id >> 8);\r\n        }\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteInt32 = function (value) {\r\n        value = Encoding.Zigzag.EncodeZigzag32(value);\r\n        this.WriteUInt32(value);\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteInt64 = function (value) {\r\n        this.WriteUInt64(Encoding.Zigzag.EncodeZigzag64(value));\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteString = function (value) {\r\n        if (value === '') {\r\n            this.WriteUInt32(0 /*length*/);\r\n        }\r\n        else {\r\n            var array = Encoding.Utf8.GetBytes(value);\r\n            this.WriteUInt32(array.length);\r\n            this._stream.Write(array, 0, array.length);\r\n        }\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteStructEnd = function (isBase) {\r\n        this.WriteUInt8(isBase ? bond_const_1.BondDataType.BT_STOP_BASE : bond_const_1.BondDataType.BT_STOP);\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteUInt32 = function (value) {\r\n        var array = Encoding.Varint.GetBytes(microsoft_bond_primitives_1.Number.ToUInt32(value));\r\n        this._stream.Write(array, 0, array.length);\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteUInt64 = function (value) {\r\n        var array = Encoding.Varint64.GetBytes(value);\r\n        this._stream.Write(array, 0, array.length);\r\n    };\r\n    /*override*/\r\n    CompactBinaryProtocolWriter.prototype.WriteUInt8 = function (value) {\r\n        this._stream.WriteByte(microsoft_bond_primitives_1.Number.ToUInt8(value));\r\n    };\r\n    return CompactBinaryProtocolWriter;\r\n}());\r\nexports.CompactBinaryProtocolWriter = CompactBinaryProtocolWriter;\r\n\r\n\r\n/***/ }),\r\n/* 10 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar SecToMsMultiplier = 1000;\r\nvar AWTKillSwitch = /** @class */ (function () {\r\n    function AWTKillSwitch() {\r\n        this._killedTokenDictionary = {};\r\n    }\r\n    AWTKillSwitch.prototype.setKillSwitchTenants = function (killTokens, killDuration) {\r\n        var _this = this;\r\n        if (killTokens && killDuration) {\r\n            try {\r\n                var killedTokens = killTokens.split(',');\r\n                if (killDuration === 'this-request-only') {\r\n                    return killedTokens;\r\n                }\r\n                var durationMs_1 = parseInt(killDuration, 10) * SecToMsMultiplier;\r\n                killedTokens.forEach(function (token) {\r\n                    _this._killedTokenDictionary[token] = Date.now() + durationMs_1;\r\n                });\r\n            }\r\n            catch (ex) {\r\n                return [];\r\n            }\r\n        }\r\n        return [];\r\n    };\r\n    AWTKillSwitch.prototype.isTenantKilled = function (tenantToken) {\r\n        if (this._killedTokenDictionary[tenantToken] !== undefined && this._killedTokenDictionary[tenantToken] > Date.now()) {\r\n            return true;\r\n        }\r\n        delete this._killedTokenDictionary[tenantToken];\r\n        return false;\r\n    };\r\n    return AWTKillSwitch;\r\n}());\r\nexports.default = AWTKillSwitch;\r\n\r\n\r\n/***/ }),\r\n/* 11 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar AWTBondSerializer_1 = __webpack_require__(2);\r\nvar AWTRecordBatcher = /** @class */ (function () {\r\n    function AWTRecordBatcher(_maxRequestSize, _outboundQueue) {\r\n        this._maxRequestSize = _maxRequestSize;\r\n        this._outboundQueue = _outboundQueue;\r\n        this._currentBatch = {};\r\n        this._currentBatchSize = 0;\r\n    }\r\n    AWTRecordBatcher.prototype.addEventToBatch = function (event) {\r\n        var serializedEvent = AWTBondSerializer_1.default.getEventBlob(event);\r\n        if (serializedEvent.length > this._maxRequestSize) {\r\n            //single event too big\r\n            return;\r\n        }\r\n        if (this._currentBatchSize + serializedEvent.length > this._maxRequestSize) {\r\n            this.flushBatch();\r\n        }\r\n        else {\r\n            if (this._currentBatch[event.tenantToken] === undefined) {\r\n                this._currentBatch[event.tenantToken] = [];\r\n            }\r\n            this._currentBatch[event.tenantToken].push(serializedEvent);\r\n            this._currentBatchSize += serializedEvent.length;\r\n        }\r\n    };\r\n    AWTRecordBatcher.prototype.flushBatch = function () {\r\n        if (this._currentBatchSize > 0) {\r\n            this._outboundQueue.push(this._currentBatch);\r\n            this._currentBatch = {};\r\n            this._currentBatchSize = 0;\r\n        }\r\n    };\r\n    return AWTRecordBatcher;\r\n}());\r\nexports.default = AWTRecordBatcher;\r\n\r\n\r\n/***/ }),\r\n/* 12 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/**\r\n* AWTRetryPolicy.ts\r\n* Author: Abhilash Panwar (abpanwar)\r\n* Copyright: Microsoft 2016\r\n* Class for retry policy.\r\n*/\r\nvar RandomizationLowerThreshold = 0.8;\r\nvar RandomizationUpperThreshold = 1.2;\r\nvar BaseBackoff = 3000;\r\nvar MaxBackoff = 120000;\r\nvar AWTRetryPolicy = /** @class */ (function () {\r\n    function AWTRetryPolicy() {\r\n    }\r\n    AWTRetryPolicy.shouldRetryForStatus = function (httpStatusCode) {\r\n        /* The below expression reads that we should only retry for:\r\n            - HttpStatusCodes that are smaller than 300.\r\n            - HttpStatusCodes greater or equal to 500 (except for 501-NotImplement\r\n              and 505-HttpVersionNotSupport).\r\n            - HttpStatusCode 408-RequestTimeout.\r\n           This is based on Microsoft.WindowsAzure.Storage.RetryPolicies.ExponentialRetry class */\r\n        return !((httpStatusCode >= 300 && httpStatusCode < 500 && httpStatusCode !== 408)\r\n            || (httpStatusCode === 501)\r\n            || (httpStatusCode === 505));\r\n    };\r\n    AWTRetryPolicy.getMillisToBackoffForRetry = function (retriesSoFar) {\r\n        var waitDuration = 0;\r\n        var minBackoff = BaseBackoff * RandomizationLowerThreshold;\r\n        var maxBackoff = BaseBackoff * RandomizationUpperThreshold;\r\n        var randomBackoff = Math.floor(Math.random() * (maxBackoff - minBackoff)) + minBackoff;\r\n        waitDuration = Math.pow(4, retriesSoFar) * randomBackoff;\r\n        return Math.min(waitDuration, MaxBackoff);\r\n    };\r\n    return AWTRetryPolicy;\r\n}());\r\nexports.default = AWTRetryPolicy;\r\n\r\n\r\n/***/ }),\r\n/* 13 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Enums_1 = __webpack_require__(1);\r\nvar AWTTransmissionManager_1 = __webpack_require__(14);\r\nvar Utils = __webpack_require__(3);\r\nvar Version = __webpack_require__(4);\r\nvar AllTokens = 'allTkns';\r\nvar EventNameAndTypeRegex = /^[a-zA-Z0-9]([a-zA-Z0-9]|_){2,98}[a-zA-Z0-9]$/;\r\nvar EventNameDotRegex = /\\./g;\r\nvar PropertyNameRegex = /^[a-zA-Z0-9](([a-zA-Z0-9|_|\\.]){0,98}[a-zA-Z0-9])?$/;\r\nvar AWT = /** @class */ (function () {\r\n    function AWT() {\r\n    }\r\n    AWT.initialize = function (tenantToken, configuration) {\r\n        if (configuration === void 0) { configuration = {}; }\r\n        if (this._isInitialized) {\r\n            // tslint:disable-next-line\r\n            throw 'Already Initialized';\r\n        }\r\n        this._defaultTenantToken = tenantToken;\r\n        this._overrideValuesFromConfig(configuration);\r\n        //Create sender\r\n        AWTTransmissionManager_1.default.initialize(this._config);\r\n        this._isInitialized = true;\r\n    };\r\n    AWT.flush = function (callback) {\r\n        if (this._isInitialized && !this._isDestroyed) {\r\n            AWTTransmissionManager_1.default.flush(callback);\r\n        }\r\n    };\r\n    AWT.flushAndTeardown = function () {\r\n        if (this._isInitialized && !this._isDestroyed) {\r\n            this._isDestroyed = true;\r\n            AWTTransmissionManager_1.default.flushAndTeardown();\r\n        }\r\n    };\r\n    AWT.setContext = function (name, property, tenantToken) {\r\n        if (tenantToken === void 0) { tenantToken = AllTokens; }\r\n        property = this._sanitizeProperty(name, property);\r\n        if (property === null) {\r\n            return;\r\n        }\r\n        if (!this._contextProperties[tenantToken]) {\r\n            this._contextProperties[tenantToken] = {};\r\n        }\r\n        this._contextProperties[tenantToken][name] = property;\r\n    };\r\n    AWT.logEvent = function (event) {\r\n        var _this = this;\r\n        if (this._isInitialized) {\r\n            if (!event.name || !event.properties) {\r\n                return;\r\n            }\r\n            event.name = event.name.toLowerCase();\r\n            event.name.replace(EventNameDotRegex, '_');\r\n            var typePrefix = '';\r\n            if (!event.type) {\r\n                event.type = 'custom';\r\n            }\r\n            else {\r\n                event.type.toLowerCase();\r\n                typePrefix = 'custom.';\r\n            }\r\n            if (!EventNameAndTypeRegex.test(event.name) || !EventNameAndTypeRegex.test(event.type)) {\r\n                return;\r\n            }\r\n            event.type = typePrefix + event.type;\r\n            if (isNaN(event.timestamp)) {\r\n                event.timestamp = (new Date()).getTime();\r\n            }\r\n            if (!event.tenantToken) {\r\n                event.tenantToken = this._defaultTenantToken;\r\n            }\r\n            event.id = Utils.newGuid();\r\n            Object.keys(event.properties).forEach(function (name) {\r\n                event.properties[name] = _this._sanitizeProperty(name, event.properties[name]);\r\n                if (event.properties[name] === null) {\r\n                    delete event.properties[name];\r\n                }\r\n            });\r\n            this._addContextIfAbsent(event, event.tenantToken);\r\n            this._addContextIfAbsent(event, AllTokens);\r\n            if (Object.keys(event.properties).length === 0) {\r\n                return;\r\n            }\r\n            this._setDefaultProperty(event, 'EventInfo.InitId', this._getInitId(event.tenantToken));\r\n            this._setDefaultProperty(event, 'EventInfo.Sequence', this._getSequenceId(event.tenantToken));\r\n            this._setDefaultProperty(event, 'EventInfo.SdkVersion', Version.FullVersionString);\r\n            this._setDefaultProperty(event, 'EventInfo.Name', event.name);\r\n            this._setDefaultProperty(event, 'EventInfo.Time', (new Date(event.timestamp)).toISOString());\r\n            AWTTransmissionManager_1.default.sendEvent(event);\r\n        }\r\n    };\r\n    AWT._overrideValuesFromConfig = function (config) {\r\n        if (config.collectorUrl) {\r\n            this._config.collectorUrl = config.collectorUrl;\r\n        }\r\n        if (config.sendingTimer > 1000) {\r\n            this._config.sendingTimer = config.sendingTimer;\r\n        }\r\n    };\r\n    AWT._getInitId = function (tenantToken) {\r\n        if (this._initIdMap[tenantToken] === undefined) {\r\n            this._initIdMap[tenantToken] = Utils.newGuid();\r\n        }\r\n        return this._initIdMap[tenantToken];\r\n    };\r\n    AWT._getSequenceId = function (tenantToken) {\r\n        if (this._sequenceIdMap[tenantToken] === undefined) {\r\n            this._sequenceIdMap[tenantToken] = 0;\r\n        }\r\n        return (++this._sequenceIdMap[tenantToken]).toString();\r\n    };\r\n    AWT._setDefaultProperty = function (event, name, value) {\r\n        event.properties[name] = { value: value, pii: Enums_1.AWTPiiKind.NotSet };\r\n    };\r\n    AWT._addContextIfAbsent = function (event, tenantToken) {\r\n        if (this._contextProperties[tenantToken]) {\r\n            var context_1 = this._contextProperties[tenantToken];\r\n            Object.keys(context_1).forEach(function (name) {\r\n                if (!event.properties[name]) {\r\n                    event.properties[name] = context_1[name];\r\n                }\r\n            });\r\n        }\r\n    };\r\n    AWT._sanitizeProperty = function (name, property) {\r\n        if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') {\r\n            property = { value: property };\r\n        }\r\n        if (!PropertyNameRegex.test(name) || property === undefined || property === null\r\n            || property.value === null || property.value === undefined || property.value === '') {\r\n            return null;\r\n        }\r\n        if (typeof property.pii === 'undefined') {\r\n            property.pii = Enums_1.AWTPiiKind.NotSet;\r\n        }\r\n        property.value = property.value.toString();\r\n        return Utils.isPii(property.pii) ? property : null;\r\n    };\r\n    AWT._isInitialized = false;\r\n    AWT._isDestroyed = false;\r\n    AWT._contextProperties = {};\r\n    AWT._sequenceIdMap = {};\r\n    AWT._initIdMap = {};\r\n    AWT._config = {\r\n        collectorUrl: 'https://browser.pipe.aria.microsoft.com/Collector/3.0/',\r\n        sendingTimer: 1000\r\n    };\r\n    return AWT;\r\n}());\r\nexports.default = AWT;\r\n\r\n\r\n/***/ }),\r\n/* 14 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\"use strict\";\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar AWTRecordBatcher_1 = __webpack_require__(11);\r\nvar AWTBondSerializer_1 = __webpack_require__(2);\r\nvar AWTRetryPolicy_1 = __webpack_require__(12);\r\nvar AWTKillSwitch_1 = __webpack_require__(10);\r\nvar Version = __webpack_require__(4);\r\nvar FlushCheckTimer = 250;\r\nvar RequestSizeLimitBytes = 2936012; //approx 2.8 Mb\r\nvar MaxRetries = 4;\r\nvar AWTTransmissionManager = /** @class */ (function () {\r\n    function AWTTransmissionManager() {\r\n    }\r\n    AWTTransmissionManager.initialize = function (config) {\r\n        this._inboundQueues.push([]);\r\n        this._recordBatcher = new AWTRecordBatcher_1.default(RequestSizeLimitBytes, this._outboundQueue);\r\n        this._newEventsAllowed = true;\r\n        if (typeof Uint8Array === 'undefined') {\r\n            this._urlString += '&content-encoding=base64';\r\n        }\r\n        this._sendingTimer = config.sendingTimer;\r\n        this._urlString = config.collectorUrl + this._urlString + '&x-apikey=';\r\n    };\r\n    //Push the event into the inbound queue and return\r\n    AWTTransmissionManager.sendEvent = function (event) {\r\n        var _this = this;\r\n        if (this._newEventsAllowed) {\r\n            //Add event to the last inbound queue\r\n            this._inboundQueues[this._inboundQueues.length - 1].push(event);\r\n            if (!this._running && this._timeout < 0 && !this._isCurrentlyFlushing) {\r\n                this._timeout = setTimeout(function () { return _this._batchAndSendEvents(false); }, this._sendingTimer);\r\n            }\r\n        }\r\n    };\r\n    AWTTransmissionManager.flushAndTeardown = function () {\r\n        this._newEventsAllowed = false;\r\n        this._batchAndSendEvents(true);\r\n    };\r\n    AWTTransmissionManager.flush = function (callback) {\r\n        this._inboundQueues.push([]);\r\n        if (!this._isCurrentlyFlushing) {\r\n            this._isCurrentlyFlushing = true;\r\n            this._flush(callback);\r\n        }\r\n        else {\r\n            this._flushQueue.push(callback);\r\n        }\r\n    };\r\n    AWTTransmissionManager._batchAndSendEvents = function (isTeardown) {\r\n        this._running = true;\r\n        while (this._inboundQueues[0].length > 0 && this._outboundQueue.length < 1) {\r\n            this._recordBatcher.addEventToBatch(this._inboundQueues[0].pop());\r\n        }\r\n        if (this._outboundQueue.length === 0) {\r\n            this._recordBatcher.flushBatch();\r\n        }\r\n        this._sendRequest(this._outboundQueue.pop(), 0, isTeardown);\r\n    };\r\n    AWTTransmissionManager._retryRequestIfNeeded = function (conn, request, tokenCount, apikey, retryCount) {\r\n        var _this = this;\r\n        var shouldRetry = true;\r\n        if (conn && typeof conn.status !== 'undefined') {\r\n            var killedTokens = this._killSwitch.setKillSwitchTenants(conn.getResponseHeader('kill-tokens'), conn.getResponseHeader('kill-duration-seconds'));\r\n            killedTokens.forEach(function (key) {\r\n                delete request[key];\r\n                tokenCount--;\r\n            });\r\n            if (!AWTRetryPolicy_1.default.shouldRetryForStatus(conn.status) || tokenCount <= 0) {\r\n                shouldRetry = false;\r\n            }\r\n        }\r\n        if (shouldRetry && retryCount < MaxRetries) {\r\n            setTimeout(function () { return _this._sendRequest(request, retryCount + 1, false); }, AWTRetryPolicy_1.default.getMillisToBackoffForRetry(retryCount));\r\n        }\r\n        else {\r\n            this._handleRequestFinished(null);\r\n        }\r\n    };\r\n    AWTTransmissionManager._sendRequest = function (request, retryCount, isTeardown) {\r\n        var _this = this;\r\n        try {\r\n            var conn_1 = new XMLHttpRequest();\r\n            var tokenCount_1 = 0;\r\n            var apikey_1 = '';\r\n            Object.keys(request).forEach(function (token) {\r\n                if (!_this._killSwitch.isTenantKilled(token)) {\r\n                    if (apikey_1.length > 0) {\r\n                        apikey_1 += ',';\r\n                    }\r\n                    apikey_1 += token;\r\n                    tokenCount_1++;\r\n                }\r\n                else {\r\n                    delete request[token];\r\n                }\r\n            });\r\n            conn_1.open('POST', this._urlString + apikey_1, !isTeardown);\r\n            if (!isTeardown) {\r\n                conn_1.ontimeout = function () {\r\n                    _this._retryRequestIfNeeded(conn_1, request, tokenCount_1, apikey_1, retryCount);\r\n                };\r\n                conn_1.onerror = function () {\r\n                    _this._retryRequestIfNeeded(conn_1, request, tokenCount_1, apikey_1, retryCount);\r\n                };\r\n                conn_1.onload = function () {\r\n                    _this._handleRequestFinished(conn_1);\r\n                };\r\n            }\r\n            if (tokenCount_1 > 0) {\r\n                var blob = AWTBondSerializer_1.default.getPayloadBlob(request, tokenCount_1);\r\n                if (typeof Uint8Array === 'undefined') {\r\n                    conn_1.send(AWTBondSerializer_1.default.base64Encode(blob));\r\n                }\r\n                else {\r\n                    conn_1.send(new Uint8Array(blob));\r\n                }\r\n            }\r\n            else if (isTeardown) {\r\n                this._handleRequestFinished(null);\r\n            }\r\n        }\r\n        catch (e) {\r\n            this._handleRequestFinished(null);\r\n        }\r\n    };\r\n    AWTTransmissionManager._handleRequestFinished = function (conn) {\r\n        var _this = this;\r\n        if (conn) {\r\n            this._killSwitch.setKillSwitchTenants(conn.getResponseHeader('kill-tokens'), conn.getResponseHeader('kill-duration-seconds'));\r\n        }\r\n        if (this._inboundQueues[0].length > 0) {\r\n            this._timeout = setTimeout(function () { return _this._batchAndSendEvents(false); }, this._sendingTimer);\r\n        }\r\n        else {\r\n            this._timeout = -1;\r\n            this._running = false;\r\n        }\r\n    };\r\n    AWTTransmissionManager._flush = function (callback) {\r\n        var _this = this;\r\n        if (!this._running) {\r\n            if (this._timeout > -1) {\r\n                clearTimeout(this._timeout);\r\n                this._timeout = -1;\r\n            }\r\n            if (this._inboundQueues[0].length > 0) {\r\n                this._batchAndSendEvents(false);\r\n            }\r\n        }\r\n        this._checkPrimaryInboundQueueEmpty(function () {\r\n            //Move the next queue to be primary\r\n            _this._inboundQueues.shift();\r\n            if (callback !== null && callback !== undefined) {\r\n                callback();\r\n            }\r\n            if (_this._flushQueue.length > 0) {\r\n                setTimeout(function () { return _this._flush(_this._flushQueue.shift()); }, _this._sendingTimer);\r\n            }\r\n            else {\r\n                _this._isCurrentlyFlushing = false;\r\n                if (_this._inboundQueues[0].length > 0) {\r\n                    _this._timeout = setTimeout(function () { return _this._batchAndSendEvents(false); }, _this._sendingTimer);\r\n                }\r\n            }\r\n        });\r\n    };\r\n    AWTTransmissionManager._checkPrimaryInboundQueueEmpty = function (callback) {\r\n        var _this = this;\r\n        if (this._inboundQueues[0].length === 0) {\r\n            this._checkOutboundQueueEmptyAndSent(callback);\r\n        }\r\n        else {\r\n            setTimeout(function () { return _this._checkPrimaryInboundQueueEmpty(callback); }, FlushCheckTimer);\r\n        }\r\n    };\r\n    AWTTransmissionManager._checkOutboundQueueEmptyAndSent = function (callback) {\r\n        var _this = this;\r\n        if (!this._running) {\r\n            callback();\r\n        }\r\n        else {\r\n            setTimeout(function () { return _this._checkOutboundQueueEmptyAndSent(callback); }, FlushCheckTimer);\r\n        }\r\n    };\r\n    AWTTransmissionManager._outboundQueue = [];\r\n    AWTTransmissionManager._inboundQueues = [];\r\n    AWTTransmissionManager._newEventsAllowed = false;\r\n    AWTTransmissionManager._killSwitch = new AWTKillSwitch_1.default();\r\n    AWTTransmissionManager._isCurrentlyFlushing = false;\r\n    AWTTransmissionManager._flushQueue = [];\r\n    AWTTransmissionManager._running = false;\r\n    AWTTransmissionManager._timeout = -1;\r\n    AWTTransmissionManager._urlString = '?qsp=true&content-type=application%2Fbond-compact-binary&client-id=NO_AUTH&sdk-version='\r\n        + Version.FullVersionString;\r\n    return AWTTransmissionManager;\r\n}());\r\nexports.default = AWTTransmissionManager;\r\n\r\n\r\n/***/ }),\r\n/* 15 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nmodule.exports = __webpack_require__(5);\r\n\r\n\r\n/***/ })\r\n/******/ ]);\r\n});\r\n//# sourceMappingURL=aria-webjs-compact-sdk-1.2.2.js.map","/**\r\n * Window.ts\r\n *\r\n * Module wrapping around the global window object\r\n */\r\n\r\nimport * as Configuration from \"./../Configuration/Configuration\";\r\nimport { ILaunchOptionsInAppFeedback } from \"./../Configuration/ILaunchOptions\";\r\nimport ICustomSurvey from \"./../FloodgateCore/ICustomSurvey\";\r\nimport IUISurvey from \"./../FloodgateCore/UISurvey/IUISurvey\";\r\nimport { FloodgateEngine } from \"@ms-ofb/officefloodgatecore\";\r\nimport { IFloodgateSettingIdMap } from \"@ms-ofb/officefloodgatecore/dist/src/Api/Api\";\r\nimport { FeedbackStatus } from \"./../Constants\";\r\n\r\nconst w = window as any;\r\nconst officeBrowserFeedback = w.OfficeBrowserFeedback = w.OfficeBrowserFeedback || {};\r\nconst floodgate = officeBrowserFeedback.floodgate = officeBrowserFeedback.floodgate || {};\r\n\r\n/**\r\n * Get the IWindow object\r\n */\r\nexport function get(): IWindow { return w; }\r\n\r\n/**\r\n * Get the IWindow object\r\n */\r\nexport function getGlobal(): IWindow { return w; }\r\n\r\n/**\r\n * Set the setUiStrings() method\r\n * @param setUiStrings the method\r\n */\r\nexport function setSetUiStrings(setUiStrings: (data: any) => void) {\r\n\tofficeBrowserFeedback.setUiStrings = setUiStrings;\r\n}\r\n\r\n/**\r\n * Set the singleFeedback() method\r\n * @param singleFeedback the method\r\n */\r\nexport function setSingleFeedback(\r\n\tsingleFeedback: (feedbackType: string, launchOptions: ILaunchOptionsInAppFeedback) => Promise<any>) {\r\n\t\tofficeBrowserFeedback.singleFeedback = singleFeedback;\r\n}\r\n\r\n/**\r\n * Set the multiFeedback() method\r\n * @param multiFeedback the method\r\n */\r\nexport function setMultiFeedback(\r\n\tmultiFeedback: (launchOptions: ILaunchOptionsInAppFeedback) => Promise<any>) {\r\n\t\tofficeBrowserFeedback.multiFeedback = multiFeedback;\r\n}\r\n\r\n/**\r\n * Set the getFeedbackStatus() method\r\n * @param getFeedbackStatus the method\r\n */\r\nexport function setFeedbackStatus(\r\n\tgetFeedbackStatus: () => FeedbackStatus) {\r\n\t\tofficeBrowserFeedback.getFeedbackStatus = getFeedbackStatus;\r\n}\r\n\r\n/**\r\n * Set the createScreenshot() method\r\n * @param createScreenshot the method\r\n */\r\nexport function setCreateScreenshot(\r\n\tcreateScreenshot: (domElement?: object, options?: any) => Promise<any>) {\r\n\t\tofficeBrowserFeedback.createScreenshot = createScreenshot;\r\n}\r\n\r\n/**\r\n * Set the isFeedbackSurveyEnabledByAADC() method\r\n * @param isFeedbackSurveyEnabledByAADC the method\r\n */\r\nexport function setIsFeedbackSurveyEnabledByAADC(\r\n\tisFeedbackSurveyEnabledByAADC: () => boolean) {\r\n\t\tofficeBrowserFeedback.isFeedbackSurveyEnabledByAADC = isFeedbackSurveyEnabledByAADC;\r\n}\r\n\r\n/**\r\n * Set the floodgate showSurvey() method\r\n * @param floodgateShowSurvey the method\r\n */\r\nexport function setFloodgateShowSurvey(floodgateShowSurvey: (survey: IUISurvey) => Promise<any>) {\r\n\tfloodgate.showSurvey = floodgateShowSurvey;\r\n}\r\n\r\n/**\r\n * Set the floodgate showCustomSurvey() method\r\n * @param floodgateShowSurvey the method\r\n */\r\nexport function setFloodgateShowCustomSurvey(floodgateShowCustomSurvey: (survey: ICustomSurvey) => Promise<any>) {\r\n\tfloodgate.showCustomSurvey = floodgateShowCustomSurvey;\r\n}\r\n\r\n/**\r\n * Set the floodgate initialize() method\r\n * @param floodgateInitialize the method\r\n */\r\nexport function setFloodgateInitialize(floodgateInitialize: () => Promise<any>) {\r\n\tfloodgate.initialize = floodgateInitialize;\r\n}\r\n\r\n/**\r\n * Set the floodgate start() method\r\n * @param floodgateStart the method\r\n */\r\nexport function setFloodgateStart(floodgateStart: () => Promise<any>) {\r\n\tfloodgate.start = floodgateStart;\r\n}\r\n\r\n/**\r\n * Set the floodgate stop() method\r\n * @param floodgateStop the method\r\n */\r\nexport function setFloodgateStop(floodgateStop: () => void) {\r\n\tfloodgate.stop = floodgateStop;\r\n}\r\n\r\n/**\r\n * Set the floodgate getEngine() method\r\n * @param floodgateGetEngine the method\r\n */\r\nexport function setFloodgateGetEngine(floodgateGetEngine: () => FloodgateEngine) {\r\n\tfloodgate.getEngine = floodgateGetEngine;\r\n}\r\n\r\n/**\r\n * Set the floodgate getSettingIdMap() method\r\n * @param floodgateSettingIdMap the method\r\n */\r\nexport function getSettingIdMap(floodgateSettingIdMap: () => IFloodgateSettingIdMap) {\r\n\tfloodgate.getSettingIdMap = floodgateSettingIdMap;\r\n}\r\n\r\nexport interface IInitOptions extends Configuration.IInitOptionsCommon, Configuration.IInitOptionsInAppFeedback {\r\n}\r\n\r\nexport interface IFloodgate {\r\n\tinitOptions: Configuration.IInitOptionsFloodgate;\r\n\tshowSurvey: (survey: IUISurvey) => Promise<any>;\r\n\tinitialize: () => Promise<any>;\r\n\tstart: () => Promise<any>;\r\n\tstop: () => void;\r\n\tgetEngine: () => FloodgateEngine;\r\n}\r\n\r\nexport interface IWindow extends WindowLocalStorage {\r\n\tOfficeBrowserFeedback: {\r\n\t\tinitOptions: IInitOptions;\r\n\t\tmultiFeedback: (launchOptions: ILaunchOptionsInAppFeedback) => Promise<any>;\r\n\t\tsdkVersion: string;\r\n\t\tsingleFeedback: (feedbackType: string, launchOptions: ILaunchOptionsInAppFeedback) => Promise<any>;\r\n\t\tsetUiStrings: (data: any) => void;\r\n\t\thtml2canvas: () => ((domElement?: object, options?: any) => Promise<HTMLCanvasElement>);\r\n\t\tcreateScreenshot: (domElement?: object, options?: any) => Promise<HTMLCanvasElement>;\r\n\t\tfloodgate: IFloodgate;\r\n\t\tisFeedbackSurveyEnabledByAADC: () => boolean;\r\n\t\tgetFeedbackStatus: () => FeedbackStatus;\r\n\t};\r\n}\r\n","/**\r\n * Contracts enforced by OfficeEventSchema (OES)\r\n */\r\n\r\nexport class App {\r\n\tprivate static PLATFORM: string = \"Web\";\r\n\r\n\tprivate name: string;\r\n\tprivate version: string;\r\n\r\n\tpublic constructor(name: string, version: string) {\r\n\t\tif (!name) {\r\n\t\t\tthrow new Error(\"name must not be null\");\r\n\t\t}\r\n\t\tif (!version) {\r\n\t\t\tthrow new Error(\"version must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.name = name;\r\n\t\tthis.version = version;\r\n\t}\r\n\r\n\tpublic getName(): string {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\tpublic getPlatform(): string {\r\n\t\treturn App.PLATFORM;\r\n\t}\r\n\r\n\tpublic getVersion(): string {\r\n\t\treturn this.version;\r\n\t}\r\n}\r\n\r\nexport class Session {\r\n\tprivate id: string;\r\n\r\n\tpublic constructor(id: string) {\r\n\t\tif (!id) {\r\n\t\t\tthrow new Error(\"id must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic getId(): string {\r\n\t\treturn this.id;\r\n\t}\r\n}\r\n\r\nexport class Host {\r\n\tprivate id: string;\r\n\tprivate locale: string;\r\n\tprivate sessionId: string;\r\n\tprivate version: string;\r\n\r\n\tconstructor(id: string, locale: string, sessionId: string, version: string) {\r\n\t\tthis.id = id;\r\n\t\tthis.locale = locale;\r\n\t\tthis.sessionId = sessionId;\r\n\t\tthis.version = version;\r\n\t}\r\n\r\n\tpublic getId(): string {\r\n\t\treturn this.id;\r\n\t}\r\n\r\n\tpublic getLocale(): string {\r\n\t\treturn this.locale;\r\n\t}\r\n\r\n\tpublic getSessionId(): string {\r\n\t\treturn this.sessionId;\r\n\t}\r\n\r\n\tpublic getVersion(): string {\r\n\t\treturn this.version;\r\n\t}\r\n}\r\n\r\nexport class Event {\r\n\t// Id is set to sessionId<DELIMITER>sequence\r\n\tprivate static ID_DELIMITER = \".\";\r\n\tprivate static SOURCE: string = \"MsoThin\";\r\n\tprivate static SCHEMA_VERSION: number = 1;\r\n\r\n\tprivate name: string;\r\n\tprivate id: string;\r\n\tprivate sequence: number;\r\n\tprivate sampleRate: number;\r\n\r\n\tpublic constructor(name: string, sessionId: string, sequence: number, sampleRate: number) {\r\n\t\tif (!name) {\r\n\t\t\tthrow new Error(\"name must not be null\");\r\n\t\t}\r\n\t\tif (!sessionId) {\r\n\t\t\tthrow new Error(\"sessionId must not be null\");\r\n\t\t}\r\n\t\tif ((!sequence && sequence !== 0) || sequence < 0) {\r\n\t\t\tthrow new Error(\"sequence must not be negative\");\r\n\t\t}\r\n\r\n\t\tthis.name = name;\r\n\t\tthis.id = sessionId + Event.ID_DELIMITER + sequence;\r\n\t\tthis.sequence = sequence;\r\n\t\tthis.sampleRate = sampleRate;\r\n\t}\r\n\r\n\tpublic getName(): string {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\tpublic getId(): string {\r\n\t\treturn this.id;\r\n\t}\r\n\r\n\tpublic getSource(): string {\r\n\t\treturn Event.SOURCE;\r\n\t}\r\n\r\n\tpublic getSchemaVersion(): number {\r\n\t\treturn Event.SCHEMA_VERSION;\r\n\t}\r\n\r\n\tpublic getSequence(): number {\r\n\t\treturn this.sequence;\r\n\t}\r\n\r\n\tpublic getSampleRate(): number {\r\n\t\treturn this.sampleRate;\r\n\t}\r\n}\r\n\r\nexport class Release {\r\n\tprivate audienceGroup: string;\r\n\r\n\tpublic constructor(audienceGroup: string) {\r\n\t\tthis.audienceGroup = audienceGroup;\r\n\t}\r\n\r\n\tpublic getAudienceGroup(): string {\r\n\t\treturn this.audienceGroup;\r\n\t}\r\n}\r\n\r\nexport class Browser {\r\n\tprivate name: string;\r\n\tprivate version: string;\r\n\r\n\tpublic constructor(name: string, version: string) {\r\n\t\tthis.name = name;\r\n\t\tthis.version = version;\r\n\t}\r\n\r\n\tpublic getName(): string {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\tpublic getVersion(): string {\r\n\t\treturn this.version;\r\n\t}\r\n}\r\n\r\nexport class Device {\r\n\tprivate id: string;\r\n\r\n\tpublic constructor(id: string) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic getId(): string {\r\n\t\treturn this.id;\r\n\t}\r\n}\r\n\r\nexport class User {\r\n\tprivate primaryIdentityHash: string;\r\n\tprivate primaryIdentitySpace: string;\r\n\tprivate tenantId: string;\r\n\r\n\tpublic constructor(primaryIdentityHash: string, tenantId: string) {\r\n\t\tthis.tenantId = tenantId;\r\n\t\tthis.primaryIdentityHash = primaryIdentityHash ? primaryIdentityHash.trim() : primaryIdentityHash;\r\n\t\tthis.primaryIdentitySpace = this.generatePrimaryIdentitySpace();\r\n\t}\r\n\r\n\tpublic getTenantId(): string {\r\n\t\treturn this.tenantId;\r\n\t}\r\n\r\n\tpublic getPrimaryIdentityHash(): string {\r\n\t\treturn this.primaryIdentityHash;\r\n\t}\r\n\r\n\tpublic getPrimaryIdentitySpace(): string {\r\n\t\treturn this.primaryIdentitySpace;\r\n\t}\r\n\r\n\tprivate generatePrimaryIdentitySpace(): string {\r\n\t\tif (this.primaryIdentityHash) {\r\n\t\t\tif (this.primaryIdentityHash.startsWith(\"a:\")) {\r\n\t\t\t\treturn \"UserObjectId\";\r\n\t\t\t}\r\n\t\t\tif (this.primaryIdentityHash.startsWith(\"p:\")) {\r\n\t\t\t\treturn \"MsaPuid\";\r\n\t\t\t}\r\n\t\t\tif (this.primaryIdentityHash.startsWith(\"ap:\")) {\r\n\t\t\t\treturn \"OrgIdPuid\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n}\r\n","/**\r\n * Aria.ts\r\n *\r\n * Module for wrapper around Aria\r\n */\r\n\r\nlet aria: any = require(\"./../../thirdparty/aria-webjs-compact-sdk-1.2.2\");\r\n\r\nexport function AWT() { return aria.AWT; };\r\n","/**\r\n * An Aria-based logger\r\n */\r\n\r\nimport * as Aria from \"./Aria\";\r\nimport { App, Browser, Device, Event, Host, Release, Session, User } from \"./Contracts\";\r\nimport ITelemetryLogger from \"./ITelemetryLogger\";\r\n\r\nexport default class AriaTelemetryLogger implements ITelemetryLogger {\r\n\t// Event.name is set as namespace<DELIMITER>eventName\r\n\tprivate static EVENT_NAME_DELIMITER: string = \"_\";\r\n\tprivate static CUSTOM_PROPERTIES_FIELD_PREFIX: string = \"Data.\";\r\n\r\n\tprivate static setApp(properties: any, app: App): void {\r\n\t\tproperties[\"App.Name\"] = app.getName();\r\n\t\tproperties[\"App.Platform\"] = app.getPlatform();\r\n\t\tproperties[\"App.Version\"] = app.getVersion();\r\n\t}\r\n\r\n\tprivate static setSession(properties: any, session: Session) {\r\n\t\tproperties[\"Session.Id\"] = session.getId();\r\n\t}\r\n\r\n\tprivate static setHost(properties: any, host: Host) {\r\n\t\tif (host) {\r\n\t\t\tproperties[\"Host.Id\"] = host.getId();\r\n\t\t\tproperties[\"Host.SessionId2\"] = host.getSessionId();\r\n\t\t\tproperties[\"Host.Version\"] = host.getVersion();\r\n\t\t\tproperties[\"Host.Locale\"] = host.getLocale();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static setEvent(properties: any, event: Event) {\r\n\t\tproperties[\"Event.Name\"] = event.getName();\r\n\t\tproperties[\"Event.Id\"] = event.getId();\r\n\t\tproperties[\"Event.Source\"] = event.getSource();\r\n\t\tproperties[\"Event.SchemaVersion\"] = event.getSchemaVersion();\r\n\t\tproperties[\"Event.Sequence\"] = event.getSequence();\r\n\t\tproperties[\"Event.SampleRate\"] = event.getSampleRate();\r\n\t}\r\n\r\n\tprivate static setRelease(properties: any, release: Release) {\r\n\t\tif (release) {\r\n\t\t\tproperties[\"Release.AudienceGroup\"] = release.getAudienceGroup();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static setBrowser(properties: any, browser: Browser) {\r\n\t\tif (browser) {\r\n\t\t\tproperties[\"Browser.Name\"] = browser.getName();\r\n\t\t\tproperties[\"Browser.Version\"] = browser.getVersion();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static setDevice(properties: any, device: Device) {\r\n\t\tif (device) {\r\n\t\t\tproperties[\"Device.Id\"] = device.getId();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static setUser(properties: any, user: User) {\r\n\t\tif (user) {\r\n\t\t\tproperties[\"User.PrimaryIdentityHash\"] = user.getPrimaryIdentityHash();\r\n\t\t\tproperties[\"User.PrimaryIdentitySpace\"] = user.getPrimaryIdentitySpace();\r\n\t\t\tproperties[\"User.TenantId\"] = user.getTenantId();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate oesApp: App;\r\n\tprivate oesSession: Session;\r\n\tprivate oesHost: Host;\r\n\tprivate oesRelease: Release;\r\n\tprivate oesBrowser: Browser;\r\n\tprivate oesDevice: Device;\r\n\tprivate oesUser: User;\r\n\r\n\tprivate namespace: string;\r\n\tprivate sequence: number;\r\n\r\n\tconstructor(tenantToken: string, namespace: string, app: App, session: Session, host?: Host, release?: Release,\r\n\t\tbrowser?: Browser, device?: Device, user?: User) {\r\n\r\n\t\tif (!tenantToken) {\r\n\t\t\tthrow new Error(\"tenantToken must not be null\");\r\n\t\t}\r\n\t\tif (!namespace) {\r\n\t\t\tthrow new Error(\"namespace must not be null\");\r\n\t\t}\r\n\t\tif (!app) {\r\n\t\t\tthrow new Error(\"app must not be null\");\r\n\t\t}\r\n\t\tif (!session) {\r\n\t\t\tthrow new Error(\"session must not be null\");\r\n\t\t}\r\n\r\n\t\tAria.AWT().initialize(tenantToken);\r\n\t\tthis.namespace = namespace;\r\n\t\tthis.oesApp = app;\r\n\t\tthis.oesSession = session;\r\n\t\tthis.oesHost = host;\r\n\t\tthis.oesRelease = release;\r\n\t\tthis.oesBrowser = browser;\r\n\t\tthis.oesDevice = device;\r\n\t\tthis.oesUser = user;\r\n\t\tthis.sequence = 1; // Sequence starts at 1 not 0\r\n\t}\r\n\r\n\tpublic logEvent(eventName: string, customProperties?: { [customField: string]: any }, sampleRate: number = 1) {\r\n\t\tif (!eventName) {\r\n\t\t\tthrow new Error(\"eventName must not be null\");\r\n\t\t}\r\n\r\n\t\tlet oesEvent: Event = new Event(\r\n\t\t\tthis.namespace + AriaTelemetryLogger.EVENT_NAME_DELIMITER + eventName,\r\n\t\t\tthis.oesSession.getId(),\r\n\t\t\tthis.sequence,\r\n\t\t\tsampleRate\r\n\t\t);\r\n\r\n\t\tlet ariaProperties: any = {};\r\n\r\n\t\tif (customProperties != null) {\r\n\t\t\tfor (const key in customProperties) {\r\n\t\t\t\tif (customProperties.hasOwnProperty(key)) {\r\n\t\t\t\t\tariaProperties[AriaTelemetryLogger.CUSTOM_PROPERTIES_FIELD_PREFIX + key] = customProperties[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tAriaTelemetryLogger.setApp(ariaProperties, this.oesApp);\r\n\t\tAriaTelemetryLogger.setSession(ariaProperties, this.oesSession);\r\n\t\tAriaTelemetryLogger.setHost(ariaProperties, this.oesHost);\r\n\t\tAriaTelemetryLogger.setRelease(ariaProperties, this.oesRelease);\r\n\t\tAriaTelemetryLogger.setEvent(ariaProperties, oesEvent);\r\n\t\tAriaTelemetryLogger.setBrowser(ariaProperties, this.oesBrowser);\r\n\t\tAriaTelemetryLogger.setDevice(ariaProperties, this.oesDevice);\r\n\t\tAriaTelemetryLogger.setUser(ariaProperties, this.oesUser);\r\n\r\n\t\tAria.AWT().logEvent({\r\n\t\t\tname: oesEvent.getName(),\r\n\t\t\tproperties: ariaProperties,\r\n\t\t});\r\n\r\n\t\tthis.sequence++;\r\n\t}\r\n}\r\n","/**\r\n * Factory to return ITelemetryLogger objects\r\n */\r\n\r\nimport { App, Browser, Device, Host, Release, Session, User } from \"./Contracts\";\r\nimport ITelemetryLogger from \"./ITelemetryLogger\";\r\nimport AriaTelemetryLogger from \"./AriaTelemetryLogger\";\r\n\r\nexport default class TelemetryLoggerFactory {\r\n\tpublic static create(tenantToken: string, namespace: string, app: App, session: Session,\r\n\t\thost: Host, release: Release, browser: Browser, device: Device, user: User): ITelemetryLogger {\r\n\t\t\treturn new AriaTelemetryLogger(tenantToken, namespace, app, session, host, release, browser, device, user);\r\n\t\t}\r\n}\r\n","/**\r\n * Implementation of IFloodgateStorageProvider for Web SDK\r\n */\r\n\r\nimport { IFloodgateStorageProvider } from \"@ms-ofb/officefloodgatecore/dist/src/Api/Api\";\r\nimport * as Window from \"./../Window/Window\";\r\nimport * as Logging from \"./../Logging/Logging\";\r\nimport FileType = IFloodgateStorageProvider.FileType;\r\n\r\nconst fileTypeToKeyMap: { [k in FileType]: string } = {\r\n\t[FileType.CampaignDefinitions]: \"obf-CampaignDefinitions\",\r\n\t[FileType.CampaignStates]: \"obf-CampaignStates\",\r\n\t[FileType.FloodgateSettings]: \"obf-FloodgateSettings\",\r\n\t[FileType.GovernedChannelStates]: \"obf-GovernedChannelStates\",\r\n\t[FileType.SurveyActivationStats]: \"obf-SurveyActivationStats\",\r\n\t[FileType.SurveyEventActivityStats]: \"obf-SurveyEventActivityStats\",\r\n\t[FileType.TmsCache_CampaignContent]: \"obf-TmsCampaignContent\",\r\n\t[FileType.TmsCache_MessageMetadata]: \"obf-TmsMessageMetadata\",\r\n\t[FileType.TmsCache_UserGovernance]: \"obf-TmsUserGovernance\",\r\n\t[FileType.Tms_DynamicSettings]: \"obf-TmsDynamicSettings\",\r\n\t[FileType.LogLevelSettings]: \"obf-LogLevelSettings\",\r\n\t[FileType.UserFacts]: \"obf-UserFacts\",\r\n\t[FileType.DebugOverrides]: \"obf-DebugOverrides\",\r\n};\r\n\r\nexport default class FloodgateStorageProvider implements IFloodgateStorageProvider {\r\n\t/**\r\n\t * Code to detect localStorage presence.\r\n\t * Copied from MDN: https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\r\n\t */\r\n\tpublic static isStorageAvailable(): boolean {\r\n\t\ttry {\r\n\t\t\tlet x = \"__storage_test__\";\r\n\t\t\tWindow.getGlobal().localStorage.setItem(x, x);\r\n\t\t\tWindow.getGlobal().localStorage.removeItem(x);\r\n\t\t\treturn true;\r\n\t\t} catch (e) {\r\n\t\t\treturn e instanceof DOMException && (\r\n\t\t\t\t// everything except Firefox\r\n\t\t\t\te.code === 22 ||\r\n\t\t\t\t// Firefox\r\n\t\t\t\te.code === 1014 ||\r\n\t\t\t\t// test name field too, because code might not be present\r\n\t\t\t\t// everything except Firefox\r\n\t\t\t\te.name === \"QuotaExceededError\" ||\r\n\t\t\t\t// Firefox\r\n\t\t\t\te.name === \"NS_ERROR_DOM_QUOTA_REACHED\") &&\r\n\t\t\t\t// acknowledge QuotaExceededError only if there's something already stored\r\n\t\t\t\tWindow.getGlobal().localStorage.length !== 0;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Safely read an object\r\n\t */\r\n\tpublic static safeReadObject<T>(fileType: FileType, defaultValue: T = undefined): T {\r\n\t\tif (!(fileType in FileType)) {\r\n\t\t\treturn defaultValue;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tlet storageKey = fileTypeToKeyMap[fileType];\r\n\t\t\tconst result = Window.getGlobal().localStorage.getItem(storageKey);\r\n\t\t\tconst parsedObject = result && (result[0] === \"{\" || result[0] === \"[\") ? JSON.parse(result) : result;\r\n\t\t\treturn parsedObject ?? defaultValue;\r\n\t\t} catch (e) {\r\n\t\t\t// ignore\r\n\t\t}\r\n\r\n\t\treturn defaultValue;\r\n\t}\r\n\r\n\t/**\r\n\t * Lock the file to prevent access from another process.\r\n\t */\r\n\tpublic fileLock(fileType: FileType): void {\r\n\t\t// JS runs on a single thread in the browser.\r\n\t\treturn;\r\n\t}\r\n\r\n\t/**\r\n\t * Unlock the file.\r\n\t */\r\n\tpublic fileUnlock(fileType: FileType): void {\r\n\t\t// JS runs on a single thread in the browser.\r\n\t\treturn;\r\n\t}\r\n\r\n\t/**\r\n\t * Read the file\r\n\t */\r\n\tpublic read(fileType: FileType): string {\r\n\t\tif (!(fileType in FileType)) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\r\n\t\tlet storageKey = fileTypeToKeyMap[fileType];\r\n\t\tlet result: string;\r\n\t\ttry {\r\n\t\t\tresult = Window.getGlobal().localStorage.getItem(storageKey);\r\n\t\t} catch (e) {\r\n\t\t\tLogging.getLogger().logEvent(Logging.EventIds.SURVEY_FLOODGATE_FILEREAD_FAILED,\r\n\t\t\t\tLogging.LogLevel.Error,\r\n\t\t\t\t{\r\n\t\t\t\t\tErrorMessage: e.toString(),\r\n\t\t\t\t\tFileName: storageKey,\r\n\t\t\t\t});\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * Write to the file\r\n\t */\r\n\tpublic write(fileType: FileType, content: string): void {\r\n\t\tif (!(fileType in FileType)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet storageKey = fileTypeToKeyMap[fileType];\r\n\t\ttry {\r\n\t\t\tWindow.getGlobal().localStorage.setItem(storageKey, content);\r\n\t\t} catch (e) {\r\n\t\t\tLogging.getLogger().logEvent(Logging.EventIds.SURVEY_FLOODGATE_FILEWRITE_FAILED,\r\n\t\t\t\tLogging.LogLevel.Error,\r\n\t\t\t\t{\r\n\t\t\t\t\tErrorMessage: e.toString(),\r\n\t\t\t\t\tFileName: storageKey,\r\n\t\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * Constants.ts\r\n *\r\n * Module to hold logging-related constants\r\n */\r\n\r\nexport interface ICustomProperties {\r\n\tCampaignId?: string;\r\n\tCorrelationId?: string;\r\n\tCount?: number;\r\n\tData?: string;\r\n\tErrorMessage?: string;\r\n\tFeedbackType?: number;\r\n\tPanelType?: number;\r\n\tFileName?: string;\r\n\tFlights?: string;\r\n\tHttpStatusCode?: number;\r\n\tHttpStatusText?: string;\r\n\tIsBugEnabled?: boolean;\r\n\tIsDiagnosticsIncluded?: boolean;\r\n\tIsEmailIncluded?: boolean;\r\n\tIsEmailPolicyEnabled?: boolean;\r\n\tIsIdeaEnabled?: boolean;\r\n\tIsScreenshotIncluded?: boolean;\r\n\tMessage?: string;\r\n\tSessionId?: string;\r\n\tSurveyId?: string;\r\n\tSurveyType?: number;\r\n\tTimeMilliseconds?: number;\r\n\tType?: string;\r\n\tClientFeedbackId?: string;\r\n\tPromptAutoDismiss?: string;\r\n\tAdditionalSurveyInfo?: string;\r\n\tSurveyActivityInfo?: string;\r\n\tPersonalizerUserAction?: number;\r\n\tPersonalizerEventId?: string;\r\n\tGovernanceRequestBody?: string;\r\n\tGovernanceResponseText?: string;\r\n\tActualSetAutoDismissValue?: number;\r\n\tCVFormId?: string;\r\n}\r\n\r\nexport interface IEventId {\r\n\tname: string;\r\n}\r\n\r\nexport class EventIds {\r\n\tpublic static InApp = class {\r\n\t\tpublic static UI = class {\r\n\t\t\tpublic static Picker = class {\r\n\t\t\t\tpublic static Shown = class {\r\n\t\t\t\t\tpublic static VALUE: IEventId = { name: \"InApp_UI_Picker_Shown\" };\r\n\t\t\t\t};\r\n\t\t\t};\r\n\r\n\t\t\tpublic static Form = class {\r\n\t\t\t\tpublic static Shown = class {\r\n\t\t\t\t\tpublic static VALUE: IEventId = { name: \"InApp_UI_Form_Shown\" };\r\n\t\t\t\t};\r\n\r\n\t\t\t\tpublic static Submit = class {\r\n\t\t\t\t\tpublic static VALUE: IEventId = { name: \"InApp_UI_Form_Submit\" };\r\n\t\t\t\t};\r\n\t\t\t};\r\n\t\t};\r\n\t};\r\n\r\n\t// This saves ~400 bytes (minified) vs nested classes\r\n\tpublic static SURVEY_FLOODGATE_CAMPAIGNLOAD_FAILED: IEventId = { name: \"Survey_Floodgate_CampaignLoad_Failed\" };\r\n\tpublic static SURVEY_FLOODGATE_FILEREAD_FAILED: IEventId = { name: \"Survey_Floodgate_FileRead_Failed\" };\r\n\tpublic static SURVEY_FLOODGATE_FILEWRITE_FAILED: IEventId = { name: \"Survey_Floodgate_FileWrite_Failed\" };\r\n\tpublic static SURVEY_FLOODGATE_TRIGGERMET: IEventId = { name: \"Survey_Floodgate_TriggerMet\" };\r\n\tpublic static SURVEY_FLOODGATE_USERSELECTED: IEventId = { name: \"Survey_Floodgate_UserSelected\" };\r\n\tpublic static SURVEY_UI_FORM_SHOWN: IEventId = { name: \"Survey_UI_Form_Shown\" };\r\n\tpublic static SURVEY_UI_FORM_SUBMIT: IEventId = { name: \"Survey_UI_Form_Submit\" };\r\n\tpublic static SURVEY_UI_FORM_SECONDARY_SUBMIT: IEventId = { name: \"Survey_UI_Form_Secondary_Submit\" };\r\n\tpublic static SURVEY_UI_FORM_SUBMIT_ERROR: IEventId = { name: \"Survey_UI_Form_Submit_Error\" };\r\n\tpublic static SURVEY_UI_FORM_USERCLOSED: IEventId = { name: \"Survey_UI_Form_UserClosed\" };\r\n\tpublic static SURVEY_UI_FORM_NO_RETURN_TYPE: IEventId = { name: \"Survey_UI_Form_No_Return_Type\"};\r\n\r\n\tpublic static SURVEY_UI_PROMPT_AUTODISMISSED: IEventId = { name: \"Survey_UI_Prompt_AutoDismissed\" };\r\n\tpublic static SURVEY_UI_PROMPT_SHOWN: IEventId = { name: \"Survey_UI_Prompt_Shown\" };\r\n\tpublic static SURVEY_UI_PROMPT_USERCLOSED: IEventId = { name: \"Survey_UI_Prompt_UserClosed\" };\r\n\tpublic static SURVEY_UI_PROMPT_CLICKED: IEventId = { name: \"Survey_UI_Prompt_Clicked\" };\r\n\tpublic static SURVEY_UI_REDIRECTIONFAILURE: IEventId = { name: \"Survey_UI_RedirectionFailure\" };\r\n\tpublic static GOVERNANCE_SERVICEFAILURE: IEventId = { name: \"Gorvenance_ServiceFailure\" };\r\n\tpublic static GOVERNANCE_SERVICERESULT: IEventId = { name: \"Gorvenance_ServiceResult\" };\r\n\tpublic static DYNAMICTRANSPORT_POST_ERROR: IEventId = { name: \"DynamicTransport_Post_Error\" };\r\n\tpublic static FEEDBACK_SURVEYSDISABLED_AADC: IEventId = {name: \"Feedback_SurveysDisabled_AADC\"};\r\n\tpublic static SURVEY_UI_DISABLED_AADC: IEventId = { name: \"Survey_UI_Prevented_AADC\" };\r\n\tpublic static PERSONALIZER_SERVICEREWARDRESULT: IEventId = { name: \"Personalizer_ServiceRewardResult\" };\r\n\tpublic static PERSONALIZER_CLIENTFAILURE: IEventId = { name: \"Personalizer_ClientFailure\" };\r\n\r\n\tpublic static Shared = class {\r\n\t\tpublic static Upload = class {\r\n\t\t\tpublic static Failed = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"Shared_Upload_Failed\" };\r\n\t\t\t};\r\n\t\t\tpublic static Prevented = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"Shared_Upload_Prevented_AADC\" };\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tpublic static Screenshot = class {\r\n\t\t\tpublic static Render = class {\r\n\t\t\t\tpublic static Failed = class {\r\n\t\t\t\t\tpublic static VALUE: IEventId = { name: \"Shared_Screenshot_Render_Failed\" };\r\n\t\t\t\t};\r\n\t\t\t\tpublic static Success = class {\r\n\t\t\t\t\tpublic static VALUE: IEventId = { name: \"Shared_Screenshot_Render_Success\" };\r\n\t\t\t\t};\r\n\t\t\t};\r\n\r\n\t\t\tpublic static GetContent = class {\r\n\t\t\t\tpublic static Failed = class {\r\n\t\t\t\t\tpublic static DefaultImage = class {\r\n\t\t\t\t\t\tpublic static Returned = class {\r\n\t\t\t\t\t\t\tpublic static VALUE: IEventId = { name: \"Shared_Screenshot_GetContent_Failed_DefaultImage_Returned\" };\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t};\r\n\t\t\t\t};\r\n\t\t\t};\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static WebSurfaces = class {\r\n\t\tpublic static Common = class {\r\n\t\t\tpublic static Error = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"WebSurfaces_Common_Error\" };\r\n\t\t\t};\r\n\t\t\tpublic static Info = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"WebSurfaces_Common_Info\" };\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tpublic static Messaging = class {\r\n\t\t\tpublic static Requests = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"WebSurfaces_Messaging_Requests\" };\r\n\t\t\t};\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static UserFacts = class {\r\n\t\tpublic static Common = class {\r\n\t\t\tpublic static Error = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"UserFacts_Common_Error\" };\r\n\t\t\t};\r\n\t\t\tpublic static Info = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"UserFacts_Common_Info\" };\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tpublic static LocalFact = class {\r\n\t\t\tpublic static Error = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"UserFacts_LocalFact_Error\" };\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tpublic static Messaging = class {\r\n\t\t\tpublic static Requests = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"UserFacts_Messaging_Requests\" };\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tpublic static AugLoop = class {\r\n\t\t\tpublic static Requests = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"UserFacts_AugLoop_Requests\" };\r\n\t\t\t};\r\n\t\t\tpublic static Error = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"UserFacts_AugLoop_Error\" };\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tpublic static Provider = class {\r\n\t\t\tpublic static Info = class {\r\n\t\t\t\tpublic static VALUE: IEventId = { name: \"UserFacts_Provider_Summary\" };\r\n\t\t\t};\r\n\t\t};\r\n\t};\r\n\r\n\tpublic static Common = class {\r\n\t\tpublic static Error = class {\r\n\t\t\tpublic static VALUE: IEventId = { name: \"Common_Error\" };\r\n\t\t};\r\n\t\tpublic static Info = class {\r\n\t\t\tpublic static VALUE: IEventId = { name: \"Common_Info\" };\r\n\t\t};\r\n\t};\r\n}\r\n","import { ContentType } from \"./TargetedMessagingContentType\";\r\nimport FloodgateStorageProvider from \"../FloodgateCore/FloodgateStorageProvider\";\r\nimport * as Utils from \"../Utils\";\r\nimport { FileType } from \"@ms-ofb/officefloodgatecore/dist/src/Api/IFloodgateStorageProvider\";\r\n\r\nconst { isNOU } = Utils;\r\n\r\nexport interface ICacheItem {\r\n\tcontentType: ContentType;\r\n\tcontent: any;\r\n\texpiryDate: Date;\r\n\tlastRetrievedDate: Date;\r\n}\r\n\r\nexport class TargetedMessagingCache {\r\n\tprivate useLocalStorage: boolean = false;\r\n\tprivate cachedItems: { [key: string]: ICacheItem } = {};\r\n\tprivate floodgateStorage: FloodgateStorageProvider;\r\n\r\n\tconstructor(items: Array<ContentType>) {\r\n\t\tthis.initialize(items);\r\n\t}\r\n\r\n\tpublic setContentItem(contentType: ContentType, content: any, expiryTime: number): ICacheItem {\r\n\t\tconst cacheItem = this.createItem(contentType, content, expiryTime);\r\n\t\tthis.setItem(cacheItem);\r\n\t\treturn cacheItem;\r\n\t}\r\n\r\n\tpublic getItemContent<T>(contentType: ContentType): T {\r\n\t\tconst cacheItem = this.getItem(contentType);\r\n\t\treturn cacheItem && cacheItem.content;\r\n\t}\r\n\r\n\tpublic has(contentType: ContentType): boolean {\r\n\t\treturn contentType in this.cachedItems;\r\n\t}\r\n\r\n\tpublic isItemExpired(contentType: ContentType): boolean {\r\n\t\tconst cacheItem = this.getItem(contentType);\r\n\t\treturn !cacheItem\r\n\t\t\t|| !cacheItem.expiryDate\r\n\t\t\t|| cacheItem.expiryDate < new Date();\r\n\t}\r\n\r\n\tprivate createItem(contentType: ContentType, content: any, expiryTime: number): ICacheItem {\r\n\t\tconst cacheItem: ICacheItem = {\r\n\t\t\tcontentType,\r\n\t\t\tcontent,\r\n\t\t\texpiryDate:  new Date(Date.now() + expiryTime),\r\n\t\t\tlastRetrievedDate: new Date(),\r\n\t\t};\r\n\r\n\t\treturn cacheItem;\r\n\t}\r\n\r\n\tprivate setItem(cacheItem: ICacheItem): void {\r\n\t\tthis.cachedItems[cacheItem.contentType] = cacheItem;\r\n\t\tthis.updateItemInLocalStorage(cacheItem);\r\n\t}\r\n\r\n\tprivate getItem(contentType: ContentType): ICacheItem {\r\n\t\treturn this.cachedItems[contentType];\r\n\t}\r\n\r\n\tprivate initialize(items: Array<ContentType>): void {\r\n\t\tthis.cachedItems = {};\r\n\t\tif (FloodgateStorageProvider.isStorageAvailable()) {\r\n\t\t\tthis.floodgateStorage = new FloodgateStorageProvider();\r\n\t\t\tthis.useLocalStorage = true;\r\n\r\n\t\t\t// try to fetch items from local storage if available from prior sessions\r\n\t\t\tthis.initCachedItemsFromLocalStorage(items);\r\n\t\t} else {\r\n\t\t\t// no LocalStorage support, only active object cache only\r\n\t\t}\r\n\t}\r\n\r\n\tprivate initCachedItemsFromLocalStorage(items: Array<ContentType>): void {\r\n\t\tif (this.useLocalStorage) {\r\n\t\t\tif (!isNOU(items)) {\r\n\t\t\t\tfor (let contentKey of items) {\r\n\t\t\t\t\tlet tempStorageItem: string = this.floodgateStorage.read(this.mapContentTypeToFloodgateProviderKey(contentKey));\r\n\t\t\t\t\tif (!isNOU(tempStorageItem)) {\r\n\t\t\t\t\t\tconst tempCacheItem: ICacheItem = this.parseObjectFromCache(tempStorageItem);\r\n\t\t\t\t\t\tif (!isNOU(tempCacheItem)) {\r\n\t\t\t\t\t\t\ttempCacheItem.expiryDate = typeof tempCacheItem.expiryDate === \"string\" ?\r\n\t\t\t\t\t\t\t\tnew Date(tempCacheItem.expiryDate) : tempCacheItem.expiryDate;\r\n\t\t\t\t\t\t\tthis.cachedItems[tempCacheItem.contentType] = tempCacheItem;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate updateItemInLocalStorage(cacheItem: ICacheItem): void {\r\n\t\tif (this.useLocalStorage) {\r\n\t\t\tthis.floodgateStorage.write(\r\n\t\t\t\tthis.mapContentTypeToFloodgateProviderKey(cacheItem.contentType),\r\n\t\t\t\tJSON.stringify(cacheItem));\r\n\t\t}\r\n\t}\r\n\r\n\tprivate parseObjectFromCache(tempItem: string): ICacheItem {\r\n\t\ttry {\r\n\t\t\tconst tempCacheItem: ICacheItem = JSON.parse(tempItem);\r\n\t\t\treturn tempCacheItem;\r\n\t\t} catch (e) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate mapContentTypeToFloodgateProviderKey(contentType: ContentType): FileType {\r\n\t\tswitch (contentType) {\r\n\t\t\tcase ContentType.campaignContent:\r\n\t\t\t\treturn FileType.TmsCache_CampaignContent;\r\n\t\t\tcase ContentType.messageMetadata:\r\n\t\t\t\treturn FileType.TmsCache_MessageMetadata;\r\n\t\t\tcase ContentType.userGovernanceRules:\r\n\t\t\t\treturn FileType.TmsCache_UserGovernance;\r\n\t\t\tcase ContentType.dynamicSettings:\r\n\t\t\t\treturn FileType.Tms_DynamicSettings;\r\n\t\t\tcase ContentType.logLevelSettings:\r\n\t\t\t\treturn FileType.LogLevelSettings;\r\n\t\t\tcase ContentType.userFacts:\r\n\t\t\t\treturn FileType.UserFacts;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(\"Unmapped ContentType in TmsCache\");\r\n\t\t}\r\n\t}\r\n}\r\n","import * as Utils from \"../Utils\";\r\nimport FloodgateStorageProvider from \"../FloodgateCore/FloodgateStorageProvider\";\r\nimport { TargetedMessagingCache } from \"../TargetedMessaging/TargetedMessagingCache\";\r\nimport { ContentType } from \"../TargetedMessaging/TargetedMessagingContentType\";\r\n\r\nimport * as Logging from \"../Logging/Logging\";\r\n\r\nconst { isNOU } = Utils;\r\n\r\nexport const enum SettingKey {\r\n\t// General\r\n\tlogLevelSettings = \"LogLevelSettings\",\r\n\r\n\t// Web surfaces\r\n\tteachingMessageCooldown = \"TeachingMessageCooldown\",\r\n\twebSurfacesIntLink = \"WebSurfacesIntLink\",\r\n\twebSurfacesProdLink = \"WebSurfacesProdLink\",\r\n\r\n\t// TMS settings\r\n\ttmsAppId = \"TmsAppId\",\r\n\ttmsServiceUrl = \"TmsServiceUrl\",\r\n\ttmsActionUrl = \"TmsActionUrl\",\r\n\ttmsLoadTimeout = \"TmsLoadTimeout\",\r\n\ttmsMessageMetadataExpiry = \"TmsMessageMetadataExpiry\",\r\n\ttmsUserGovernanceRulesExpiry = \"TmsUserGovernanceRulesExpiry\",\r\n\ttmsCampaignContentExpiry = \"TmsCampaignContentExpiry\",\r\n\ttmsDynamicSettingsExpiry = \"TmsDynamicSettingsExpiry\",\r\n\ttmsLogLevelSettingsExpiry = \"TmsLogLevelSettingsExpiry\",\r\n\ttmsUserFactsExpiry = \"TmsUserFactsExpiry\",\r\n\r\n\t// Tulips\r\n\ttulipsAppId = \"TulipsAppId\",\r\n\ttulipsLoadTimeout = \"TulipsLoadTimeout\",\r\n\ttulipsServiceUrl = \"TulipsServiceUrl\",\r\n\ttulipsIngestionTimeInterval = \"TulipsIngestionTimeInterval\",\r\n\r\n\t// AugLoop\r\n\ttulipsAugLoopAnnotationName = \"TulipsAugLoopAnnotationName\",\r\n\ttulipsAugLoopPackageDelayLoad = \"TulipsAugLoopPackageDelayLoad\",\r\n\ttulipsAugLoopLoadRetryTimes = \"TulipsAugLoopLoadRetryTimes\",\r\n\ttulipsAugLoopLoadTimeout = \"TulipsAugLoopLoadTimeout\",\r\n}\r\n\r\nlet dynamicSettingsTmsgCache: TargetedMessagingCache = null;\r\n\r\nexport function getDynamicSetting<T>(key: SettingKey, defaultValue: T): T {\r\n\ttry\t{\r\n\t\tif (!dynamicSettingsTmsgCache && FloodgateStorageProvider.isStorageAvailable()) {\r\n\t\t\tdynamicSettingsTmsgCache =  new TargetedMessagingCache([ContentType.dynamicSettings]);\r\n\t\t}\r\n\r\n\t\tif (!dynamicSettingsTmsgCache) {\r\n\t\t\treturn defaultValue;\r\n\t\t}\r\n\r\n\t\tconst settingsObj = dynamicSettingsTmsgCache.getItemContent<Record<string, T>>(ContentType.dynamicSettings);\r\n\t\tif (!isNOU(settingsObj)\r\n\t\t\t&& settingsObj.hasOwnProperty(key)\r\n\t\t\t&& !isNOU(settingsObj[key])) {\r\n\t\t\tconst settingValue = settingsObj[key];\r\n\r\n\t\t\t// parse types\r\n\t\t\tif (typeof defaultValue === \"number\" && typeof settingValue !== \"number\") {\r\n\t\t\t\tif (typeof settingValue === \"string\") {\r\n\t\t\t\t\tconst returnValue = settingValue.indexOf(\".\") === -1 ? parseInt(settingValue, 10) : parseFloat(settingValue);\r\n\t\t\t\t\treturn isNaN(returnValue) ? defaultValue : returnValue as unknown as T;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\r\n\t\t\treturn settingValue;\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tLogging.getLogger().logEvent(\r\n\t\t\tLogging.EventIds.Common.Error.VALUE,\r\n\t\t\tLogging.LogLevel.Error,\r\n\t\t\t{\r\n\t\t\t\tErrorMessage: `Error reading dynamic setting ${error && error.message}`,\r\n\t\t\t\tType: key,\r\n\t\t\t});\r\n\t}\r\n\r\n\treturn defaultValue;\r\n}\r\n\r\nexport function resetDynamicSettingsTmsgCache() {\r\n\tdynamicSettingsTmsgCache = null;\r\n}\r\n","import { IInitOptionsCommon, ISamplingInitOption } from \"./../Configuration/IInitOptions\";\r\nimport { IEventId, ICustomProperties } from \"./Constants\";\r\nimport { Environment } from \"./../Constants\";\r\nimport { App, Browser, Device, Host, Release, Session, User } from \"./Telemetry/Contracts\";\r\nimport * as Utils from \"./../Utils\";\r\nimport ITelemetryLogger from \"./Telemetry/ITelemetryLogger\";\r\nimport TelemetryLoggerFactory from \"./Telemetry/TelemetryLoggerFactory\";\r\nimport FloodgateStorageProvider from \"../FloodgateCore/FloodgateStorageProvider\";\r\nimport { FileType } from \"@ms-ofb/officefloodgatecore/dist/src/Api/IFloodgateStorageProvider\";\r\n\r\nexport { ICustomProperties, IEventId, EventIds } from \"./Constants\";\r\nimport { getDynamicSetting, SettingKey } from \"../Configuration/DynamicConfiguration\";\r\n\r\nconst { isNOU } = Utils;\r\nconst NAMESPACE: string = \"Office_Feedback\";\r\n\r\nlet logger: ILogger;\r\nlet env: Environment;\r\n\r\n/**\r\n * Initialize the logging module\r\n * @param initOptionsCommon object contains common init options\r\n * @param appName app name\r\n * @param appVersion app version\r\n * @param logSessionId local SDK session id\r\n */\r\nexport function initialize(initOptionsCommon: IInitOptionsCommon, appName: string, appVersion: string,\r\n\tlogSessionId: string, samplingOption: ISamplingInitOption): void {\r\n\r\n\tconst telemetryGroup = initOptionsCommon.telemetryGroup ? initOptionsCommon.telemetryGroup : {};\r\n\tconst webGroup = initOptionsCommon.webGroup ? initOptionsCommon.webGroup : {};\r\n\r\n\tlogger = new Logger(\r\n\t\tTelemetryLoggerFactory.create(\r\n\t\t\tTokenManager.getTenantToken(initOptionsCommon.environment),\r\n\t\t\tNAMESPACE,\r\n\t\t\tnew App(appName, appVersion),\r\n\t\t\tnew Session(logSessionId),\r\n\t\t\tnew Host(initOptionsCommon.appId.toString(), initOptionsCommon.originalLocale, initOptionsCommon.sessionId, initOptionsCommon.build),\r\n\t\t\tnew Release(telemetryGroup.audienceGroup),\r\n\t\t\tnew Browser(webGroup.browser, webGroup.browserVersion),\r\n\t\t\tnew Device(telemetryGroup.deviceId),\r\n\t\t\tnew User(telemetryGroup.loggableUserId ? telemetryGroup.loggableUserId : initOptionsCommon.cid, telemetryGroup.tenantId)\r\n\t\t),\r\n\t\tsamplingOption,\r\n\t\tinitOptionsCommon\r\n\t);\r\n\r\n\tenv = initOptionsCommon.environment;\r\n}\r\n\r\n/**\r\n * Get the logger object\r\n */\r\nexport function getLogger(): ILogger {\r\n\treturn logger;\r\n}\r\n\r\n/**\r\n * Interface for a logger\r\n */\r\nexport interface ILogger {\r\n\tlogEvent(eventId: IEventId, logSeverity: LogLevel, customProperties?: ICustomProperties, internalSampleRate?: number): void;\r\n\tlogLocal?(logSeverity: LogLevel, ...others: any[]): void;\r\n}\r\n\r\n/**\r\n * Log level settings\r\n */\r\nexport const enum LogLevel {\r\n\tNone,\r\n\tCritical,\r\n\tError,\r\n\tInfo\r\n}\r\n\r\ninterface ILogSettings {\r\n\tconsoleLog?: boolean;\r\n\tisEnabled?: boolean;\r\n\tlogLevel?: LogLevel;\r\n};\r\n\r\ninterface ILogLevelSettings {\r\n\tcontent: ILogSettings;\r\n};\r\n\r\n/**\r\n * Class representing a logger for the feedback SDK\r\n */\r\nexport class Logger implements ILogger {\r\n\tprivate static EVENT_NAME: string = \"SDK\";\r\n\tprivate static EVENT_ID: string = \"EventId\";\r\n\tprivate static DEFAULT_SAMPLE_RATE: number = 1;\r\n\r\n\tprivate telemetryLogger: ITelemetryLogger;\r\n\tprivate logLevel: LogLevel;\r\n\tprivate isConsoleLogEnabled: boolean;\r\n\tprivate dynamicLogSettings: ILogLevelSettings;\r\n\r\n\tprivate eventSampling: ISamplingInitOption;\r\n\tprivate initOptionsCommon: IInitOptionsCommon;\r\n\r\n\tprivate readonly SAMPLING_RESULT = Math.random();\r\n\r\n\tconstructor(telemetryLogger: ITelemetryLogger, samplingOptions: ISamplingInitOption, initOptionsCommon?: IInitOptionsCommon) {\r\n\t\tif (!telemetryLogger) {\r\n\t\t\tthrow new Error(\"telemetryLogger must not be null\");\r\n\t\t}\r\n\r\n\t\tthis.telemetryLogger = telemetryLogger;\r\n\t\tthis.eventSampling = samplingOptions;\r\n\t\tthis.initOptionsCommon = initOptionsCommon;\r\n\t}\r\n\r\n\t/**\r\n\t * Log an event\r\n\t * @param eventId event Id\r\n\t * @param logSeverity the log level severity for the message\r\n\t * @param customProperties custom properties to add to the log\r\n\t * @param internalSampleRate sample rate for this event in decimal (example: 0.05 for 5%). (Does not override host set sampleRate)\r\n\t */\r\n\tpublic logEvent(eventId: IEventId, logSeverity: LogLevel, customProperties?: ICustomProperties, internalSampleRate?: number): boolean {\r\n\t\tif (!eventId) {\r\n\t\t\tthrow new Error(\"eventId must not be null\");\r\n\t\t}\r\n\r\n\t\tlet sampleRate = Logger.DEFAULT_SAMPLE_RATE;\r\n\r\n\t\t// Host set sample rate has precedence over internalSampleRate.\r\n\t\tif (this.isEventSampled(eventId.name)) {\r\n\t\t\tsampleRate = this.getEventSamplingRate(eventId.name);\r\n\t\t} else if (internalSampleRate !== undefined) {\r\n\t\t\tsampleRate = internalSampleRate;\r\n\t\t}\r\n\r\n\t\tif (isNOU(logSeverity) || logSeverity === LogLevel.None) {\r\n\t\t\tif (env === Environment.Production) {\r\n\t\t\t\tconst errorMessage = \"logSeverity must not be null or none\";\r\n\t\t\t\tif (this.isConsoleLogEnabled && console) {\r\n\t\t\t\t\t// tslint:disable:no-console\r\n\t\t\t\t\tconsole.log(\"Floodgate event: \", Logger.EVENT_NAME, errorMessage);\r\n\t\t\t\t}\r\n\t\t\t\tthis.telemetryLogger.logEvent(Logger.EVENT_NAME, { ErrorMessage: errorMessage }, sampleRate);\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tcustomProperties = customProperties || {};\r\n\t\t(<any> customProperties)[Logger.EVENT_ID] = eventId.name;\r\n\r\n\t\tif (this.isLoggingEnabled(logSeverity, sampleRate) || this.isEventTelemetryEnabled(eventId.name)) {\r\n\t\t\tthis.telemetryLogger.logEvent(Logger.EVENT_NAME, customProperties, sampleRate);\r\n\t\t}\r\n\r\n\t\tif (this.isConsoleLogEnabled && console) {\r\n\t\t\t// tslint:disable:no-console\r\n\t\t\tconsole.log(\"Floodgate event: \", Logger.EVENT_NAME, logSeverity, customProperties);\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic logLocal?(logSeverity: LogLevel, ...others: any[]): void {\r\n\t\tif (this.isLoggingEnabled(logSeverity) && this.isConsoleLogEnabled && console) {\r\n\t\t\t// tslint:disable:no-console\r\n\t\t\tconsole.log(\"LPP FG: \", logSeverity, others);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getUserSamplingRate(): number {\r\n\t\treturn this.SAMPLING_RESULT;\r\n\t}\r\n\r\n\tpublic isEventTelemetryEnabled(eventName: string): boolean {\r\n\t\ttry {\r\n\t\t\tif (!this.dynamicLogSettings) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tconst appId = this.initOptionsCommon?.appId?.toString();\r\n\t\t\tconst locale = this.initOptionsCommon?.originalLocale?.toLowerCase();\r\n\t\t\tconst settingName = `content_${eventName}`;\r\n\r\n\t\t\t// try settings from more specific to generic order\r\n\t\t\tconst overrideSettings =\r\n\t\t\t\tthis.dynamicLogSettings[`${settingName}_${appId}_${locale}` as keyof ILogLevelSettings] ||\r\n\t\t\t\tthis.dynamicLogSettings[`${settingName}_${appId}` as keyof ILogLevelSettings] ||\r\n\t\t\t\tthis.dynamicLogSettings[`${settingName}_${locale}` as keyof ILogLevelSettings] ||\r\n\t\t\t\tthis.dynamicLogSettings[settingName as keyof ILogLevelSettings];\r\n\r\n\t\t\treturn overrideSettings?.isEnabled;\r\n\t\t} catch (e) {\r\n\t\t\tif (this.isConsoleLogEnabled) {\r\n\t\t\t\t// tslint:disable:no-console\r\n\t\t\t\tconsole.log(\"FG: Error checking for dynamic log settings: \", e);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * This method enables logging only if the log severity of the event is less than or equal to the\r\n\t * current log level set and within the sample rate. For example, if the log severity of the event is \r\n\t * LogLevel.Error and the current log level is set as LogLevel.Critical, then isLoggingEnabled will \r\n\t * return false since the condition LogLevel.Error <= LogLevel.Critical is false. Because, the log severity \r\n\t * follows the order defined in the LogLevel enum (None < Critical < Error < Info). The sample rate is the\r\n\t * percentage of users allow to send the event back. If the random genarated number is less than the sample rate\r\n\t * and the sample rate is not full blocking (0 value)\r\n\t * If no current log level is set, then the default log level is set as LogLevel.Error so that all events\r\n\t * marked with critical and error log severity get logged.\r\n\t * @param inputLogLevel the log severity of the event\r\n\t */\r\n\tprivate isLoggingEnabled(inputLogLevel: LogLevel, sampleRate: number = 1): boolean {\r\n\t\tif (isNOU(this.logLevel)) {\r\n\t\t\tconst currentLogLevel = this.getCurrentLogLevel();\r\n\t\t\tthis.logLevel = isNOU(currentLogLevel) ? LogLevel.Error : currentLogLevel;\r\n\t\t}\r\n\r\n\t\treturn (inputLogLevel <= this.logLevel && this.SAMPLING_RESULT <= sampleRate && sampleRate !== 0);\r\n\t}\r\n\r\n\t/**\r\n\t * This method returns the current log level if it is set in either url query parameters or floodgate local storage.\r\n\t * Following table summarizes whether the log event calls with a log severity will log the events or not according\r\n\t * to the current log level set. For example, the first row in the table demonstrates that when the current log level\r\n\t * enabled is critical, then the log event will log the events only if the log severity is critical.\r\n\t *\r\n\t * Current Log Level Enabled | LogSeverity: Critical\t| LogSeverity: Error\t| LogSeverity: Info\r\n\t * --------------------------------------------------------------------------------------------\r\n\t * Critical Enabled\t\t\t | yes      \t\t\t\t| no    \t\t\t \t| no\r\n\t * Error Enabled       \t\t | yes      \t\t\t\t| yes   \t\t\t \t| no\r\n\t * Info Enabled        \t\t | yes      \t\t\t\t| yes   \t\t\t \t| yes\r\n\t * None Enabled        \t\t | no       \t\t\t\t| no    \t\t\t \t| no\r\n\t *\r\n\t * Console logging will be enabled when the current log level is set through the url query parameters or\r\n\t * when the url query parameter \"obfconsolelog\" is explicitly set to true.\r\n\t */\r\n\tprivate getCurrentLogLevel(): LogLevel {\r\n\t\ttry {\r\n\t\t\t// Check if console log is enabled in local browser session with query parameter overrides\r\n\t\t\tconst urlParams = typeof URLSearchParams !== \"undefined\" && new URLSearchParams(window.location.search) || undefined;\r\n\t\t\tlet consoleLogParam: string | boolean = urlParams && urlParams.get(\"obfconsolelog\");\r\n\t\t\tif (!consoleLogParam) {\r\n\t\t\t\t// for getting iframe host url - eg: WAC\r\n\t\t\t\tconst documentReferrer = typeof document !== \"undefined\" && document.referrer;\r\n\t\t\t\tconsoleLogParam = documentReferrer && documentReferrer.indexOf(\"obfconsolelog\") !== -1;\r\n\t\t\t}\r\n\r\n\t\t\tif (consoleLogParam) {\r\n\t\t\t\tthis.isConsoleLogEnabled = true;\r\n\t\t\t}\r\n\r\n\t\t\t// Check if log level is set in local browser session with query parameter overrides\r\n\t\t\tconst logLevelParam = urlParams && urlParams.get(\"obfloglevel\");\r\n\t\t\tif (!isNOU(logLevelParam)) {\r\n\t\t\t\tthis.isConsoleLogEnabled = true;\r\n\t\t\t\treturn parseInt(logLevelParam, 10);\r\n\t\t\t}\r\n\r\n\t\t\t// Check if log level is set in floodgate local storage (manually or with remotely fetched settings)\r\n\t\t\tif (FloodgateStorageProvider.isStorageAvailable()) {\r\n\t\t\t\tconst floodgateStorageProvider: FloodgateStorageProvider = new FloodgateStorageProvider();\r\n\t\t\t\tlet tempStorageItem: string = floodgateStorageProvider.read(FileType.LogLevelSettings);\r\n\t\t\t\tif (!tempStorageItem) {\r\n\t\t\t\t\ttempStorageItem = getDynamicSetting(SettingKey.logLevelSettings, \"\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst settingsObj = tempStorageItem && this.parseObject(tempStorageItem);\r\n\t\t\t\tif (settingsObj) {\r\n\t\t\t\t\tthis.dynamicLogSettings = settingsObj;\r\n\t\t\t\t\tlet logSettings = settingsObj.content as ILogSettings;\r\n\r\n\t\t\t\t\tif (this.initOptionsCommon) {\r\n\t\t\t\t\t\tconst appId = this.initOptionsCommon.appId && this.initOptionsCommon.appId.toString();\r\n\t\t\t\t\t\tconst locale =  this.initOptionsCommon.originalLocale && this.initOptionsCommon.originalLocale.toLowerCase();\r\n\r\n\t\t\t\t\t\t// log settings from more specific to generic order\r\n\t\t\t\t\t\tlogSettings = settingsObj[`content_${appId}_${locale}`] ||\r\n\t\t\t\t\t\t\t\t\t\tsettingsObj[`content_${appId}`] ||\r\n\t\t\t\t\t\t\t\t\t\tsettingsObj[`content_${locale}`] ||\r\n\t\t\t\t\t\t\t\t\t\tsettingsObj[`content`];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (logSettings) {\r\n\t\t\t\t\t\tif (logSettings.consoleLog) {\r\n\t\t\t\t\t\t\tthis.isConsoleLogEnabled = true;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn logSettings.logLevel;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tif (this.isConsoleLogEnabled) {\r\n\t\t\t\t// tslint:disable:no-console\r\n\t\t\t\tconsole.log(\"Error while getting the current log level: \", e);\r\n\t\t\t}\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate parseObject(tempItem: string): any {\r\n\t\ttry {\r\n\t\t\treturn JSON.parse(tempItem);\r\n\t\t} catch (e) {\r\n\t\t\tif (this.isConsoleLogEnabled) {\r\n\t\t\t\t// tslint:disable:no-console\r\n\t\t\t\tconsole.log(\"Error while parsing the json string for log level: \", e);\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getEventSamplingRate(eventId: string): number {\r\n\t\tlet sampleRate = 1;\r\n\t\tif (this.eventSampling.event) {\r\n\t\t\t// If the event is init with sample rate\r\n\t\t\t// check the sampling result against the sample rate\r\n\t\t\tif (eventId in this.eventSampling.event) {\r\n\t\t\t\tsampleRate = this.eventSampling.event[eventId];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sampleRate;\r\n\t}\r\n\r\n\tprivate isEventSampled(eventId: string): boolean {\r\n\t\tif (this.eventSampling.event) {\r\n\t\t\tif (eventId in this.eventSampling.event) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nclass TokenManager {\r\n\tpublic static getTenantToken(environment: Environment): string {\r\n\t\tif (environment === Environment.Production) {\r\n\t\t\treturn TokenManager.TENANT_TOKEN_PRODUCTION;\r\n\t\t} else {\r\n\t\t\treturn TokenManager.TENANT_TOKEN_PRE_PRODUCTION;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static TENANT_TOKEN_PRODUCTION: string =\r\n\t\"d79e824386c4441cb8c1d4ae15690526-bd443309-5494-444a-aba9-0af9eef99f84-7360\"; // \"Office Feedback\" Prod Aria tenant\r\n\tprivate static TENANT_TOKEN_PRE_PRODUCTION: string =\r\n\t\"2bf6a2ffddca4a80a892a0b182132961-625cb102-8b0c-480e-af53-92e48695d08d-7736\"; // \"Office Feedback\" Sandbox Aria tenant\r\n}\r\n","/**\r\n * UIStrings.ts\r\n *\r\n * Module for the strings to display\r\n */\r\n\r\nexport interface IUIStrings {\r\n\tFeedbackSubtitle: string;\r\n\tPrivacyStatement: string;\r\n\r\n\tForm: {\r\n\t\tCommentPlaceholder: string;\r\n\t\tCategoryPlaceholder: string;\r\n\t\tEmailPlaceholder: string;\r\n\t\tRatingLabel: string;\r\n\t\tScreenshotLabel: string;\r\n\t\tEmailCheckBoxLabel: string;\r\n\t\tSubmit: string;\r\n\t\tBasicFormTitle: string;\r\n\t\tCancel: string;\r\n\t\tScreenshotImgAltText: string;\r\n\t\tPrivacyLabel: string;\r\n\t\tPrivacyConsent: string;\r\n\t};\r\n\r\n\tSingleForm: {\r\n\t\tTitle: string;\r\n\t};\r\n\r\n\tUserVoiceForm: {\r\n\t\tTitle: string;\r\n\t\tText: string;\r\n\t\tButton: string;\r\n\t};\r\n\r\n\tSmileForm: {\r\n\t\tAnchor: string;\r\n\t\tTitle: string;\r\n\t};\r\n\r\n\tFrownForm: {\r\n\t\tAnchor: string;\r\n\t\tTitle: string;\r\n\t};\r\n\r\n\tIdeaForm: {\r\n\t\tAnchor: string;\r\n\t\tTitle: string;\r\n\t};\r\n\r\n\tBugForm: {\r\n\t\tAnchor: string;\r\n\t\tTitle: string;\r\n\t};\r\n\r\n\tThanksPanel: {\r\n\t\tTitle: string;\r\n\t\tAppreciateText: string;\r\n\t\tMyFeedbackDescription: string;\r\n\t\tMyFeedbackLinkText: string;\r\n\t\tFeedbackPortalDescription: string;\r\n\t\tFeedbackPortalLinkText: string;\r\n\t\tClose: string;\r\n\t};\r\n\r\n\tFloodgate: {\r\n\t\tNps: {\r\n\t\t\tPrompt: {\r\n\t\t\t\tTitle: string;\r\n\t\t\t\tQuestion: string;\r\n\t\t\t\tYes: string;\r\n\t\t\t\tNo: string;\r\n\t\t\t};\r\n\r\n\t\t\tComment: {\r\n\t\t\t\tQuestion: string;\r\n\t\t\t};\r\n\r\n\t\t\tRating: {\r\n\t\t\t\tQuestion: string;\r\n\t\t\t\tPoints11Value0: string;\r\n\t\t\t\tPoints11Value1: string;\r\n\t\t\t\tPoints11Value2: string;\r\n\t\t\t\tPoints11Value3: string;\r\n\t\t\t\tPoints11Value4: string;\r\n\t\t\t\tPoints11Value5: string;\r\n\t\t\t\tPoints11Value6: string;\r\n\t\t\t\tPoints11Value7: string;\r\n\t\t\t\tPoints11Value8: string;\r\n\t\t\t\tPoints11Value9: string;\r\n\t\t\t\tPoints11Value10: string;\r\n\t\t\t\tPoints5Value1: string;\r\n\t\t\t\tPoints5Value2: string;\r\n\t\t\t\tPoints5Value3: string;\r\n\t\t\t\tPoints5Value4: string;\r\n\t\t\t\tPoints5Value5: string;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tCloseLabel: string;\r\n}\r\n\r\n/**\r\n * Localized UI strings\r\n */\r\nlet uIStrings: IUIStrings;\r\n\r\n/**\r\n * Set UI strings\r\n * @param {string} data List of localized UI strings\r\n */\r\nexport function setUIStrings(data: IUIStrings) {\r\n\tuIStrings = data;\r\n}\r\n\r\n/**\r\n * Get UI strings\r\n * @returns the UIStrings\r\n */\r\nexport function getUIStrings(): IUIStrings {\r\n\treturn uIStrings;\r\n}\r\n","/**\r\n * CommonApp.ts\r\n *\r\n * Common logic for entrypoints.\r\n */\r\n\r\nimport \"./Polyfills/Promise\";\r\n\r\nimport Version from \"./Version\";\r\nimport * as Configuration from \"./Configuration/Configuration\";\r\nimport * as Window from \"./Window/Window\";\r\nimport * as Logging from \"./Logging/Logging\";\r\n\r\nconst APP_NAME: string = \"OfficeFeedbackSDK\";\r\n\r\n/**\r\n * Has the SDK been initialized\r\n */\r\nlet initialized: boolean = false;\r\n\r\n/**\r\n * Has the SDK allow AADC\r\n */\r\nlet commonPolicyAllowAADC: boolean = false;\r\n\r\n/**\r\n * Initialize\r\n */\r\nexport function initialize(): void {\r\n\tif (initialized) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!Window.get().OfficeBrowserFeedback.initOptions) {\r\n\t\tthrow new Error(\"Window.OfficeBrowserFeedback.initOptions not set\");\r\n\t}\r\n\r\n\tWindow.get().OfficeBrowserFeedback.sdkVersion = Version;\r\n\tConfiguration.get().setCommonInitOptions(Window.get().OfficeBrowserFeedback.initOptions);\r\n\tcommonPolicyAllowAADC = Configuration.get().isFeedbackSurveyEnabledByAADC();\r\n\r\n\tLogging.initialize(\r\n\t\tConfiguration.get().getCommonInitOptions(),\r\n\t\tAPP_NAME,\r\n\t\tVersion,\r\n\t\tConfiguration.get().getSdkSessionId(),\r\n\t\tConfiguration.get().getEventSampling()\r\n\t);\r\n\r\n\tinitialized = true;\r\n\r\n\tif (!commonPolicyAllowAADC) {\r\n\t\tLogging.getLogger().logEvent(Logging.EventIds.FEEDBACK_SURVEYSDISABLED_AADC,\r\n\t\t\tLogging.LogLevel.Critical,\r\n\t\t\t{\r\n\t\t\t\tData: JSON.stringify({\r\n\t\t\t\t\tageGroup: Configuration.get().getCommonInitOptions().ageGroup,\r\n\t\t\t\t\tauthenticationType: Configuration.get().getCommonInitOptions().authenticationType,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\t}\r\n}\r\n\r\n/**\r\n * Reset the module. Used in unit tests.\r\n */\r\nexport function reset() {\r\n\tinitialized = false;\r\n}\r\n\r\n/**\r\n * Return Flag to determine whether Feedback and Survey is enabled by AADC.\r\n * Return true if Feedback and Survey is enabled.\r\n * Otherwise, return false.\r\n */\r\nexport function isFeedbackSurveyEnabledByAADC(): boolean {\r\n\treturn commonPolicyAllowAADC;\r\n}\r\n\r\nWindow.setIsFeedbackSurveyEnabledByAADC(isFeedbackSurveyEnabledByAADC);\r\n","export default \"1.7.5\";","/**\r\n * Constants.ts\r\n *\r\n * A module for all UI constants.\r\n */\r\n\r\n/**\r\n * HTML attribute names\r\n */\r\nexport class AttributeName {\r\n\tpublic static Alt: string = \"alt\";\r\n\tpublic static AriaLabel: string = \"aria-label\";\r\n\tpublic static AriaSelected: string = \"aria-selected\";\r\n\tpublic static AriaOrientation: string = \"aria-orientation\";\r\n\tpublic static AriaExpanded: string = \"aria-expanded\";\r\n\tpublic static AriaControls: string = \"aria-controls\";\r\n\tpublic static AriaHasPopups: string = \"aria-haspopup\";\r\n\tpublic static AriaModal: string = \"aria-modal\";\r\n\tpublic static AriaLabelledBy: string = \"aria-labelledby\";\r\n\tpublic static AriaDescribedBy: string = \"aria-describedby\";\r\n\tpublic static Class: string = \"class\";\r\n\tpublic static DataHtml2CanvasIgnore: string = \"data-html2canvas-ignore\";\r\n\tpublic static Disabled: string = \"disabled\";\r\n\tpublic static Fill: string = \"fill\";\r\n\tpublic static For: string = \"for\";\r\n\tpublic static Preview: string = \"preview\";\r\n\tpublic static Form: string = \"form\";\r\n\tpublic static Height: string = \"height\";\r\n\tpublic static HRef: string = \"href\";\r\n\tpublic static Id: string = \"id\";\r\n\tpublic static MaxLength: string = \"maxlength\";\r\n\tpublic static Name: string = \"name\";\r\n\tpublic static Placeholder: string = \"placeholder\";\r\n\tpublic static Points: string = \"points\";\r\n\tpublic static Rel: string = \"rel\";\r\n\tpublic static Role: string = \"role\";\r\n\tpublic static Source: string = \"src\";\r\n\tpublic static Stroke: string = \"stroke\";\r\n\tpublic static TabIndex: string = \"tabindex\";\r\n\tpublic static Target: string = \"target\";\r\n\tpublic static Transform: string = \"transform\";\r\n\tpublic static Type: string = \"type\";\r\n\tpublic static Value: string = \"value\";\r\n\tpublic static ViewBox: string = \"viewBox\";\r\n\tpublic static Width: string = \"width\";\r\n\tpublic static xlinkHref: string = \"xlink:href\";\r\n\tpublic static X: string = \"x\";\r\n\tpublic static Y: string = \"y\";\r\n}\r\n\r\n/**\r\n * HTML attribute values\r\n */\r\nexport class AttributeValue {\r\n\tpublic static BlankWindow: string = \"_blank\";\r\n\tpublic static Button: string = \"button\";\r\n\tpublic static Dialog: string = \"dialog\";\r\n\tpublic static Tab: string = \"tab\";\r\n\tpublic static TabList: string = \"tablist\";\r\n\tpublic static TabPanel: string = \"tabpanel\";\r\n\tpublic static Checkbox: string = \"checkbox\";\r\n\tpublic static Checked: string = \"checked\";\r\n\tpublic static False: string = \"false\";\r\n\tpublic static Zero: string = \"0\";\r\n\tpublic static Polite: string = \"polite\";\r\n\tpublic static Radio: string = \"radio\";\r\n\tpublic static Submit: string = \"submit\";\r\n\tpublic static ScreenshotPreview: string = \"ScreenshotPreview\";\r\n\tpublic static Text: string = \"text\";\r\n\tpublic static TextAreaMaxLength: string = \"1000\";\r\n\tpublic static True: string = \"true\";\r\n\tpublic static Unchecked: string = \"unchecked\";\r\n\tpublic static NoReferrer: string = \"noreferrer\";\r\n\tpublic static AriaOrientationValueVertical = \"vertical\";\r\n}\r\n\r\n/**\r\n * URL Parameters\r\n */\r\nexport class UrlParameters {\r\n\tpublic static CLCID: string = \"CLCID\";\r\n}\r\n\r\n/**\r\n * CSS classes\r\n */\r\nexport class Classes {\r\n\tpublic static AriaLiveTemplate: string = \"obf-AriaLiveTemplate\";\r\n\tpublic static CheckBox: string = \"obf-CheckBox\";\r\n\tpublic static FontTitle: string = \"obf-FontTitle\";\r\n\tpublic static CloseButton: string = \"obf-CloseButton\";\r\n\tpublic static FontSubtitle: string = \"obf-FontSubtitle\";\r\n\tpublic static FontText: string = \"obf-FontText\";\r\n\tpublic static FontSubText: string = \"obf-FontSubText\";\r\n\tpublic static FontSubSubText: string = \"obf-FontSubSubText\";\r\n\tpublic static Hidden: string = \"obf-Hidden\";\r\n\tpublic static Link: string = \"obf-Link\";\r\n\tpublic static MarginLeft60px: string = \"obf-MarginLeft60px\";\r\n\tpublic static MarginLeft180px: string = \"obf-MarginLeft180px\";\r\n\tpublic static NarrowLayout: string = \"obf-NarrowLayout\";\r\n\tpublic static PrivacyStatementLinkDiv: string = \"obf-PrivacyStatementLinkDiv\";\r\n\tpublic static Rtl: string = \"obf-Rtl\";\r\n\tpublic static Spinner: string = \"obf-Spinner\";\r\n\tpublic static SpinnerCircle: string = \"obf-SpinnerCircle\";\r\n\tpublic static SubmitButton: string = \"obf-SubmitButton\";\r\n\tpublic static CancelButton: string = \"obf-CancelButton\";\r\n\tpublic static TextInput: string = \"obf-TextInput\";\r\n\tpublic static Visible: string = \"obf-Visible\";\r\n\r\n\t// rating control\r\n\tpublic static Rating: string = \"obf-Rating\";\r\n\tpublic static RatingGraphic: string = \"obf-RatingGraphic\";\r\n\tpublic static RatingGraphicFilled: string = \"obf-RatingGraphic-Filled\";\r\n\r\n\t// choice group control\r\n\tpublic static ChoiceGroup: string = \"obf-ChoiceGroup\";\r\n\tpublic static ChoiceGroupIcon: string = \"obf-ChoiceGroupIcon\";\r\n\r\n\t// region BellyBand\r\n\r\n\tpublic static OverallAnchor: string = \"obf-OverallAnchor\";\r\n\tpublic static OverallAnchorActive: string = \"obf-OverallAnchorActive\";\r\n\tpublic static OverallImage: string = \"obf-OverallImage\";\r\n\tpublic static OverallText: string = \"obf-OverallText\";\r\n\tpublic static SingleLayout: string = \"obf-SingleLayout\";\r\n\tpublic static ShowRightBorder: string = \"obf-ShowRightBorder\";\r\n\tpublic static SlideLeft: string = \"obf-slideLeft\";\r\n\tpublic static TextAlignLeft: string = \"obf-TextAlignLeft\";\r\n\tpublic static FormContainer: string = \"obf-FormContainer\";\r\n\tpublic static FormWideContainer: string = \"obf-FormWideContainer\";\r\n\r\n\t// region ThanksPanel\r\n\tpublic static ThanksPanelTitle: string = \"obf-ThanksPanelTitle\";\r\n\tpublic static ThanksPanelMessage: string = \"obf-ThanksPanelMessage\";\r\n\r\n\t// form classes\r\n\tpublic static FormQuestionMiddleText: string = \"obf-FormQuestionMiddleText\";\r\n\tpublic static FormMiddleText: string = \"obf-FormMiddleText\";\r\n\tpublic static FormCategoriesDropdown: string = \"obf-FormCategoriesDropdown\";\r\n\tpublic static FormComment: string = \"obf-FormComment\";\r\n\tpublic static FormRatingContainer: string = \"obf-FormRatingContainer\";\r\n\tpublic static FormRatingLabel: string = \"obf-FormRatingLabel\";\r\n\tpublic static FormRating: string = \"obf-FormRating\";\r\n\tpublic static FormEmailContainer: string = \"obf-FormEmailContainer\";\r\n\tpublic static FormEmailInput: string = \"obf-FormEmailInput\";\r\n\tpublic static FormEmailTextBox: string = \"obf-FormEmailTextBox\";\r\n\tpublic static FormEmailCheckBox: string = \"obf-FormEmailCheckBox\";\r\n\tpublic static FormEmailLabel: string = \"obf-FormEmailLabel\";\r\n\tpublic static FormBottomContainer: string = \"obf-FormBottomContainer\";\r\n\tpublic static FormSubmitButtonContainer: string = \"obf-FormSubmitButtonContainer\";\r\n\tpublic static FormScreenshotContainer: string = \"obf-FormScreenshotContainer\";\r\n\tpublic static FormScreenshotLabel: string = \"obf-FormScreenshotLabel\";\r\n\tpublic static FormScreenshotCheckbox: string = \"obf-FormScreenshotCheckbox\";\r\n\tpublic static FormScreenshotPreview: string = \"obf-FormScreenshotPreview\";\r\n\t// email textbox classes\r\n\tpublic static TFormEmailCheckbox: string = \"obf-TFormEmailCheckbox\";\r\n\tpublic static TFormEmailLabel: string = \"obf-TFormEmailLabel \";\r\n\r\n\t// email checkbox classes\r\n\tpublic static EmailCheckBoxLabel: string = \"obf-EmailCheckBoxLabel\";\r\n\r\n\t// endregion\r\n\r\n\t// region Toast\r\n\r\n\tpublic static Toast: string = \"obf-Toast\";\r\n\tpublic static ToastZoom: string = \"obf-ToastZoom\";\r\n\r\n\t// endregion\r\n}\r\n\r\n/**\r\n * HTML element ids\r\n */\r\nexport class IDs {\r\n\t// region BellyBand\r\n\tpublic static CloseButton: string = \"obf-CloseButton\";\r\n\tpublic static ColumnSeparatorDiv: string = \"obf-ColumnSeparatorDiv\";\r\n\tpublic static OverallAnchorsContainer: string = \"obf-OverallAnchorsContainer\";\r\n\tpublic static OverallFrownAnchor: string = \"obf-OverallFrownAnchor\";\r\n\tpublic static OverallFrownDiv: string = \"obf-OverallFrownDiv\";\r\n\tpublic static OverallFrownImage: string = \"obf-OverallFrownImage\";\r\n\tpublic static OverallFrownText: string = \"obf-OverallFrownText\";\r\n\tpublic static OverallSmileAnchor: string = \"obf-OverallSmileAnchor\";\r\n\tpublic static OverallSmileDiv: string = \"obf-OverallSmileDiv\";\r\n\tpublic static OverallSmileImage: string = \"obf-OverallSmileImage\";\r\n\tpublic static OverallSmileText: string = \"obf-OverallSmileText\";\r\n\tpublic static OverallIdeaAnchor: string = \"obf-OverallIdeaAnchor\";\r\n\tpublic static OverallIdeaDiv: string = \"obf-OverallIdeaDiv\";\r\n\tpublic static OverallIdeaImage: string = \"obf-OverallIdeaImage\";\r\n\tpublic static OverallIdeaText: string = \"obf-OverallIdeaText\";\r\n\tpublic static OverallBugAnchor: string = \"obf-OverallBugAnchor\";\r\n\tpublic static OverallBugDiv: string = \"obf-OverallBugDiv\";\r\n\tpublic static OverallBugImage: string = \"obf-OverallBugImage\";\r\n\tpublic static OverallBugText: string = \"obf-OverallBugText\";\r\n\tpublic static QuestionLeftText: string = \"obf-QuestionLeftText\";\r\n\tpublic static LeftFormContainer: string = \"obf-LeftFormContainer\";\r\n\tpublic static LeftPanelContainer: string = \"obf-LeftPanelContainer\";\r\n\tpublic static MainContainer: string = \"obf-MainContainer\";\r\n\tpublic static MainContentHolder: string = \"obf-MainContentHolder\";\r\n\tpublic static MiddleFormContainer: string = \"obf-MiddleFormContainer\";\r\n\tpublic static OverlayBackground: string = \"obf-OverlayBackground\";\r\n\tpublic static PrivacyStatementLink: string = \"obf-PrivacyStatementLink\";\r\n\tpublic static FirstTabbable: string = \"obf-FirstTabbable\";\r\n\tpublic static LastTabbable: string = \"obf-LastTabbable\";\r\n\tpublic static EmailCheckBox: string = \"obf-EmailCheckBox\";\r\n\r\n\t// Single form ids\r\n\tpublic static SingleFormContainer: string = \"obf-SingleFormContainer\";\r\n\tpublic static SingleFormQuestionMiddleText: string = \"obf-SingleFormQuestionMiddleText\";\r\n\tpublic static SingleFormCategoriesDropdown: string = \"obf-SingleFormCategoriesDropdown\";\r\n\tpublic static SingleFormComment: string = \"obf-SingleFormComment\";\r\n\tpublic static SingleFormEmailInput: string = \"obf-SingleFormEmailInput\";\r\n\tpublic static SingleFormRating: string = \"obf-SingleFormRating\";\r\n\tpublic static SingleFormScreenshotCheckbox: string = \"obf-SingleFormScreenshotCheckbox\";\r\n\tpublic static SingleFormScreenshotPreview: string = \"obf-SingleFormScreenshotPreview\";\r\n\tpublic static SingleFormSubmitButton: string = \"obf-SingleFormSubmitButton\";\r\n\tpublic static SingleFormCancelButton: string = \"obf-SingleFormCancelButton\";\r\n\tpublic static SingleFormSubmitButtonSpinner: string = \"obf-SingleFormSubmitButtonSpinner\";\r\n\r\n\t// Basic form ids\r\n\tpublic static BasicFormContainer: string = \"obf-BasicFormContainer\";\r\n\tpublic static BasicFormQuestionMiddleText: string = \"obf-BasicFormQuestionMiddleText\";\r\n\tpublic static BasicFormCategoriesDropdown: string = \"obf-BasicFormCategoriesDropdown\";\r\n\tpublic static BasicFormComment: string = \"obf-BasicFormComment\";\r\n\tpublic static BasicFormEmailInput: string = \"obf-BasicFormEmailInput\";\r\n\tpublic static BasicFormRating: string = \"obf-BasicFormRating\";\r\n\tpublic static BasicFormScreenshotCheckbox: string = \"obf-BasicFormScreenshotCheckbox\";\r\n\tpublic static BasicFormScreenshotPreview: string = \"obf-BasicFormScreenshotPreview\";\r\n\tpublic static BasicFormSubmitButton: string = \"obf-BasicFormSubmitButton\";\r\n\tpublic static BasicFormCancelButton: string = \"obf-BasicFormCancelButton\";\r\n\tpublic static BasicFormSubmitButtonSpinner: string = \"obf-BasicFormSubmitButtonSpinner\";\r\n\r\n\t// Thanks Panel ids\r\n\tpublic static ThanksPanelContainer: string = \"obf-ThanksPanelContainer\";\r\n\tpublic static ThanksPanelCloseButton: string = \"obf-ThanksPanelCloseButton\";\r\n\tpublic static ThanksPanelDiscussion: string = \"obf-ThanksPanelDiscussion\";\r\n\tpublic static ThanksPanelVerticalContainer: string = \"obf-ThanksPanelVerticalContainer\";\r\n\tpublic static ThanksPanelInnerContainer: string = \"obf-ThanksPanelInnerContainer\";\r\n\tpublic static ThanksPanelParagraph: string = \"obf-ThanksPanelParagraph\";\r\n\r\n\t// UserVoice form ids\r\n\tpublic static UserVoiceFormContainer: string = \"obf-UserVoiceFormContainer\";\r\n\tpublic static UserVoiceFormGoButton: string = \"obf-UserVoiceFormGoButton\";\r\n\r\n\t// Feedback Portal Idea Id\r\n\tpublic static FeedbackPortalIdeaContainer: string = \"obf-FeedbackPortalIdeaContainer\";\r\n\tpublic static OverallFeedbackPortalIdeaAnchor: string = \"obf-OverallFeedbackPortalIdeaAnchor\";\r\n\r\n\t// endregion\r\n\r\n\t// region Toast\r\n\tpublic static ToastContainer: string = \"obf-ToastContainer\";\r\n\tpublic static ToastCancel: string = \"obf-ToastCancel\";\r\n\r\n\t// Prompt ids\r\n\tpublic static TPromptContainer: string = \"obf-TPromptContainer\";\r\n\tpublic static TPromptTitle: string = \"obf-TPromptTitle\";\r\n\tpublic static TPromptText: string = \"obf-TPromptText\";\r\n\r\n\t// Survey ids\r\n\tpublic static TFormContainer: string = \"obf-TFormContainer\";\r\n\tpublic static TFormTitle: string = \"obf-TFormTitle\";\r\n\tpublic static TFormRating: string = \"obf-TFormRating\";\r\n\tpublic static TFormRatingQuestion: string = \"obf-TFormRatingQuestion\";\r\n\tpublic static TFormComment: string = \"obf-TFormComment\";\r\n\tpublic static TFormEmailTextBox: string = \"obf-TFormEmailTextBox\";\r\n\tpublic static TFormEmailCheckBox: string = \"obf-TFormEmailCheckBox\";\r\n\tpublic static TFormEmailLabel: string = \"obf-TFormEmailLabel\";\r\n\tpublic static TFormSubmitButton: string = \"obf-TFormSubmitButton\";\r\n\tpublic static TFormSubmitButtonSpinner: string = \"obf-TFormSubmitButtonSpinner\";\r\n\tpublic static TFormSubmitButtonContainer: string = \"obf-TFormSubmitButtonContainer\";\r\n\r\n\t// endregion\r\n}\r\n\r\n/**\r\n * Keys\r\n */\r\nexport class Keys {\r\n\tpublic static Esc: number = 27;\r\n\tpublic static Tab: number = 9;\r\n}\r\n\r\n/**\r\n * HTML tags\r\n */\r\nexport class Tags {\r\n\tpublic static Anchor: string = \"A\";\r\n\tpublic static Button: string = \"button\";\r\n\tpublic static Defs: string = \"defs\";\r\n\tpublic static Div: string = \"div\";\r\n\tpublic static FieldSet: string = \"fieldset\";\r\n\tpublic static Form: string = \"form\";\r\n\tpublic static Img: string = \"img\";\r\n\tpublic static Input: string = \"input\";\r\n\tpublic static Label: string = \"label\";\r\n\tpublic static Legend: string = \"legend\";\r\n\tpublic static Option: string = \"option\";\r\n\tpublic static Polygon: string = \"polygon\";\r\n\tpublic static Select: string = \"select\";\r\n\tpublic static Span: string = \"span\";\r\n\tpublic static Svg: string = \"svg\";\r\n\tpublic static TextArea: string = \"textarea\";\r\n\tpublic static Use: string = \"use\";\r\n}\r\n\r\n/**\r\n * HTML roles\r\n */\r\nexport class Roles {\r\n\tpublic static Button: string = \"Button\";\r\n}\r\n\r\n/**\r\n * URLs\r\n */\r\nexport class Urls {\r\n\t/**\r\n\t * Link to the feedback Privacy Statement\r\n\t */\r\n\tpublic static PrivacyStatementLink: string = \"https://go.microsoft.com/fwlink/?LinkId=521839\";\r\n}\r\n\r\n/**\r\n * prompt constants\r\n */\r\nexport class PromptConstants {\r\n\tpublic static No: string = \"1\";\r\n\tpublic static Yes: string = \"2\";\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","/**\r\n * Screenshot.ts\r\n *\r\n * A module for screenshot. It uses the html2canvas package.\r\n */\r\n\r\nconst html2canvas: any = require(\"../app/thirdparty/html2canvas/html2canvas\");\r\n\r\n/**\r\n * Get screenshot\r\n * @param domElement document element or document body \r\n * @param options background color\r\n */\r\nexport function createScreenshot(domElement?: object, options?: any): Promise<HTMLCanvasElement> {\r\n\treturn html2canvas(domElement || document.body, { background: \"#ffffff\", ...options });\r\n}\r\n","/**\r\n * CommonUI.ts\r\n *\r\n * Common logic for UI.\r\n */\r\n\r\nconst html2canvas: any = require(\"../app/thirdparty/html2canvas/html2canvas\");\r\n\r\nimport * as UIStrings from \"./UIStrings/UIStrings\";\r\nimport * as Configuration from \"./Configuration/Configuration\";\r\nimport * as Window from \"./Window/Window\";\r\nimport * as Theme from \"./Theme\";\r\nimport * as Screenshot from \"./Screenshot\";\r\nimport { loadStylesheet, loadScript } from \"./Window/DomUtils\";\r\nimport { IDs } from \"./UI/UiConstants\";\r\nimport { checkCssSelectorToBeSet } from \"./Utils\";\r\n\r\n/**\r\n * Has the SDK been initialized\r\n */\r\nlet initialized: boolean = false;\r\n\r\n/**\r\n * Set ui Strings.\r\n * @param data the ui strings\r\n */\r\nfunction setUIStrings(data: any): void {\r\n\tUIStrings.setUIStrings(data);\r\n};\r\n\r\n/**\r\n * Initialize\r\n */\r\nexport function initialize(): Promise<any> {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tif (!initialized) {\r\n\t\t\tconst initOptionsCommon = Configuration.get().getCommonInitOptions();\r\n\t\t\tif (!initOptionsCommon) {\r\n\t\t\t\treject(\"initOptionsCommon is null\");\r\n\t\t\t}\r\n\r\n\t\t\t// Check if custom CSS is being passed.\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\tif ((initOptionsCommon.customResourcesSetExternally & Configuration.CustomResources.Css) === Configuration.CustomResources.Css) {\r\n\t\t\t\tconst selector = \"#\" + IDs.TPromptTitle;\r\n\r\n\t\t\t\tif (!checkCssSelectorToBeSet(selector)) {\r\n\t\t\t\t\treject(\"Expected custom Css to be set by host but \" + selector + \" was not found to be set.\");\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tloadStylesheet(initOptionsCommon.stylesUrl);\r\n\t\t\t}\r\n\r\n\t\t\tTheme.initialize(initOptionsCommon.primaryColour, initOptionsCommon.secondaryColour);\r\n\r\n\t\t\t// Check if custom strings are being passed.\r\n\t\t\t// tslint:disable-next-line: no-bitwise\r\n\t\t\tif ((initOptionsCommon.customResourcesSetExternally & Configuration.CustomResources.Strings) === Configuration.CustomResources.Strings) {\r\n\r\n\t\t\t\tif (!UIStrings.getUIStrings()) {\r\n\t\t\t\t\treject(\"Expected custom strings to be set by host but UIStrings.getUIStrings() is null or undefined\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tinitialized = true;\r\n\t\t\t\tresolve();\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconst intlFileUrl =  initOptionsCommon.intlUrl + initOptionsCommon.locale.toLowerCase() + \"/\" +\r\n\t\t\t\t\tinitOptionsCommon.intlFilename;\r\n\r\n\t\t\t\tloadScript(intlFileUrl)\r\n\t\t\t\t.then(\r\n\t\t\t\t\t() => {\r\n\t\t\t\t\t\tif (!UIStrings.getUIStrings()) {\r\n\t\t\t\t\t\t\treject(\"UiStrings were not loaded from \" + intlFileUrl);\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tinitialized = true;\r\n\t\t\t\t\t\tresolve();\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t).catch(\r\n\t\t\t\t\t(err) => {\r\n\t\t\t\t\t\treject(\"Script load failed for \" + intlFileUrl + \". \" + err);\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tresolve();\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Reset the module. Used in unit tests.\r\n */\r\nexport function reset() {\r\n\tinitialized = false;\r\n}\r\n\r\n/* Make the setUIStrings method available globally */\r\nWindow.setSetUiStrings(setUIStrings);\r\nWindow.setCreateScreenshot(Screenshot.createScreenshot);\r\nWindow.get().OfficeBrowserFeedback.html2canvas = html2canvas;\r\n","/*\r\n * DomUtils.ts\r\n *\r\n * Module for page document utility functions\r\n */\r\n\r\n/**\r\n * Load the style sheet\r\n * @param url The url of the stylesheet\r\n */\r\nexport function loadStylesheet(url: string): void {\r\n\tconst link: HTMLLinkElement = document.createElement(\"link\");\r\n\tlink.rel = \"stylesheet\";\r\n\tlink.type = \"text/css\";\r\n\tlink.href = url;\r\n\r\n\tconst entry: HTMLScriptElement = document.getElementsByTagName(\"script\")[0];\r\n\tentry.parentNode.insertBefore(link, entry);\r\n}\r\n\r\n/**\r\n * Load the script and callback after it is loaded\r\n * @param url The url of the script\r\n * @param pageOrigin Optional - Origin of the page\r\n */\r\nexport function loadScript(url: string, pageOrigin: string = (window as any).origin): Promise<void> {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tconst script: any = document.createElement(\"script\");\r\n\t\tscript.async = true;\r\n\r\n\t\tif (script.readyState) { // IE\r\n\t\t\tscript.onreadystatechange = function() {\r\n\t\t\t\tif (script.readyState === \"loaded\" || script.readyState === \"complete\") {\r\n\t\t\t\t\tscript.onreadystatechange = null;\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t} else {  // Others\r\n\t\t\tscript.onload = function() {\r\n\t\t\t\tresolve();\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tscript.onerror = function() {\r\n\t\t\treject();\r\n\t\t};\r\n\r\n\t\tscript.src = url;\r\n\r\n\t\t// don't add if origin is not available or when containing \"null\". This is to mitigate possible\r\n\t\t// unexpected behavior with Chrome when a page hosting this SDK is being tested as a local file.\r\n\t\t// The behavior depends on Chrome.exe's --allow-file-access-from-files setting.\r\n\t\tif (pageOrigin && pageOrigin !== \"null\") {\r\n\t\t\tscript.crossOrigin = \"anonymous\";\r\n\t\t}\r\n\r\n\t\tconst entry: HTMLScriptElement = document.getElementsByTagName(\"script\")[0];\r\n\t\tentry.parentNode.insertBefore(script, entry);\r\n\t});\r\n}\r\n","/**\r\n * Theme.ts\r\n *\r\n * Module for the UI Theme\r\n */\r\n\r\nimport { Classes, IDs } from \"./UI/UiConstants\";\r\n\r\nlet defaultPrimaryColour = \"#0167B0\";\r\nlet defaultSecondaryColour = \"#194789\";\r\n\r\n/**\r\n * Init\r\n * @param {string} primaryColour Primary Colour\r\n * @param {string} secondaryColour Secondary Colour\r\n */\r\nexport function initialize(primaryColour: string = undefined, secondaryColour: string = undefined) {\r\n\tif (!primaryColour) {\r\n\t\tprimaryColour = defaultPrimaryColour;\r\n\t}\r\n\r\n\tif (!secondaryColour) {\r\n\t\tsecondaryColour = defaultSecondaryColour;\r\n\t}\r\n\r\n\tlet sheet = document.createElement(\"style\");\r\n\r\n\tsheet.textContent =\r\n\t\t`.${Classes.OverallAnchor}:focus { background-color: ${primaryColour} } ` +\r\n\t\t`.${Classes.OverallAnchor}:hover { background-color: ${secondaryColour} } ` +\r\n\t\t`.${Classes.OverallAnchorActive} { background-color: ${primaryColour} } ` +\r\n\t\t`.${Classes.SpinnerCircle} { background-color: ${primaryColour} } ` +\r\n\t\t// tslint:disable-next-line:max-line-length\r\n\t\t`.${Classes.ChoiceGroup} input[type=radio]:checked+label>.${Classes.ChoiceGroupIcon} { border-color: ${primaryColour} } ` +\r\n\t\t// tslint:disable-next-line:max-line-length\r\n\t\t`.${Classes.ChoiceGroup} input[type=radio]:hover+label>.${Classes.ChoiceGroupIcon} { border-color: ${secondaryColour} } ` +\r\n\t\t// tslint:disable-next-line:max-line-length\r\n\t\t`.${Classes.ChoiceGroup} input[type=radio]:checked+label>.${Classes.ChoiceGroupIcon}>span { background-color: ${primaryColour} } ` +\r\n\t\t`.${Classes.SubmitButton} { background-color: ${primaryColour} } ` +\r\n\t\t`.${Classes.SubmitButton}:hover { background-color: ${secondaryColour} } ` +\r\n\t\t`.${Classes.CancelButton} { background-color: ${primaryColour} } ` +\r\n\t\t`.${Classes.CancelButton}:hover { background-color: ${secondaryColour} } ` +\r\n\t\t`.${Classes.Link} { color: ${primaryColour} } ` +\r\n\t\t`.${Classes.Link}:hover { color: ${secondaryColour} } ` +\r\n\t\t`.${Classes.ThanksPanelTitle} { color: ${primaryColour} } ` +\r\n\t\t`#${IDs.TPromptTitle} { color: ${primaryColour} } ` +\r\n\t\t`#${IDs.TFormTitle} { color: ${primaryColour} } `;\r\n\r\n\tdocument.body.appendChild(sheet);\r\n}\r\n","import * as Configuration from \"../Configuration/Configuration\";\r\n\r\nconst HTTP_TIMEOUT: number = 8000; // timeout in milliseconds\r\n/**\r\n * Make an http request with retries\r\n * @param method the http method \"GET\", \"POST\" etc\r\n * @param url the url\r\n * @param requestBody the request body\r\n * @param maxRetries the maximum number of retries\r\n * @param onLoad the onload handler\r\n */\r\nfunction makeHttpRequest<T>(method: string, url: string, requestBody: any, maxRetries: number,\r\n\tonLoad: (xhr: XMLHttpRequest, resolve: (value?: T) => void, reject: (error?: any) => void) => void\r\n): Promise<T> {\r\n\tlet makeRequest: (retries: number, timeout: number) => Promise<T> =\r\n\t\t(retries: number, timeout: number) => {\r\n\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\tlet xhr: XMLHttpRequest = new XMLHttpRequest();\r\n\t\t\t\txhr.open(method, url, true);\r\n\t\t\t\txhr.timeout = timeout;\r\n\t\t\t\txhr.onload = () => { onLoad(xhr, resolve, reject); };\r\n\t\t\t\txhr.ontimeout = () => {\r\n\t\t\t\t\tif (retries > 0) {\r\n\t\t\t\t\t\t// double the timeout and retry it\r\n\t\t\t\t\t\tmakeRequest(retries - 1, timeout * 2).then(resolve, reject);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treject(new Error(`Request to '${url}' timed out. timeout: ${xhr.timeout}`));\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\txhr.onerror = () => {\r\n\t\t\t\t\tif (retries > 0) {\r\n\t\t\t\t\t\tmakeRequest(retries - 1, timeout).then(resolve, reject);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treject(new Error(`Request to '${url}' errored. ${xhr.status} - ${xhr.statusText} : ${xhr.responseText}`));\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\txhr.send(requestBody);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t// get the input timeout or using the default value if timeout is not defined\r\n\tconst httpTimeout = Configuration.get().getCommonInitOptions().petrolTimeout\r\n\t\t\t\t\t\t? Configuration.get().getCommonInitOptions().petrolTimeout\r\n\t\t\t\t\t\t: HTTP_TIMEOUT;\r\n\r\n\treturn makeRequest(maxRetries, httpTimeout);\r\n}\r\n\r\nconst uploadEndpointInt: string = \"https://petrol-int.office.microsoft.com/v1/feedback\";\r\nconst uploadEndpointProd: string = \"https://petrol.office.microsoft.com/v1/feedback\";\r\n\r\n/**\r\n * Send a payload to Petrol\r\n * @param isProduction is production?\r\n * @param manifest manifest content\r\n * @param screenshot screenshot content\r\n * @param diagnostics diagnostics content\r\n */\r\nexport function send(isProduction: boolean, manifest: Blob, screenshot?: Blob, diagnostics?: Blob): Promise<any> {\r\n\tif (manifest === undefined) {\r\n\t\treturn Promise.reject(new Error(\"Manifest cannot be undefined\"));\r\n\t}\r\n\r\n\tlet formData = new FormData();\r\n\tformData.append(\"Manifest\", manifest);\r\n\r\n\tif (screenshot) {\r\n\t\tformData.append(\"Screenshot\", screenshot);\r\n\t}\r\n\r\n\tif (diagnostics) {\r\n\t\tformData.append(\"Diagnostics\", diagnostics);\r\n\t}\r\n\r\n\treturn makeHttpRequest<any>(\"POST\", isProduction ? uploadEndpointProd : uploadEndpointInt, formData, 2,\r\n\t\tfunction (\r\n\t\t\txhr: XMLHttpRequest,\r\n\t\t\tresolve: (value?: any) => void,\r\n\t\t\treject: (error?: any) => void\r\n\t\t): void {\r\n\t\t\tif (xhr.status !== 200) {\r\n\t\t\t\treject(new Error(\"Non-200 response with status code: \" + xhr.status + \", response: \" + xhr.responseText));\r\n\t\t\t}\r\n\t\t\tresolve();\r\n\t\t});\r\n}\r\n","/**\r\n * Screenshot.ts\r\n * Module for managing the screenshot file\r\n */\r\n\r\n/* tslint:disable max-line-length */\r\nimport {IFile} from \"./IFile\";\r\nimport * as Logging from \"./../../Logging/Logging\";\r\n\r\nexport class Screenshot implements IFile {\r\n\tprivate screenshot: HTMLCanvasElement;\r\n\r\n\tconstructor (screenshot: HTMLCanvasElement) {\r\n\t\tthis.screenshot = screenshot;\r\n\t}\r\n\r\n\tpublic getContent(): Blob {\r\n\t\tlet imgString: string;\r\n\t\ttry {\r\n\t\t\timgString = this.screenshot.toDataURL(\"image/jpeg\").split(\",\")[1];\r\n\t\t} catch (e) {\r\n\t\t\tLogging.getLogger().logEvent(Logging.EventIds.Shared.Screenshot.GetContent.Failed.DefaultImage.Returned.VALUE,\r\n\t\t\t\tLogging.LogLevel.Error, { ErrorMessage: e.toString() });\r\n\r\n\t\t\t// return an image with \"Screenshot cannot be captured\" message\r\n\t\t\timgString = \"iVBORw0KGgoAAAANSUhEUgAAAN0AAAA+AQMAAACV2ox1AAAABGdBTUEAALGPC/xhBQAAAAZQTFRFAAAA////pdmf3QAAAAlwSFlzAAAOwgAADsIBFShKgAAAAjtJREFUSMfV1M1rE0EUAHDBa5r8A9vkL6giFiI0JH+Ih9KLx8TaukkJugShHgrJzYvkVPQkUqgwSePLEELaU+zBg8JKVvSQQNydlsadwCQzziRZ82ETxYMfc3gD8+MxjzcfV8T80f0vkQ8i68tAPSMSQ0PkI6QDpEPkZBHy1Wp1/zjni2lrZq2T2uikDG17A54Hr0vsvwXIl3WXt02zeIHQBSq3DxHk7VO55zIFgLLrcmaaQBGiqCwQArBVQTbNZODNBB5Ee2EEr5eGiDG4k5mcqcy+Ksh+N8K2+bRI1Z68fRMVoV+XmcFwpQJZGohpkds1WtjppGLaq51a2b8yp310UW9/H8VfRj68CIKRsWCFPCCEM419S4bSAOmPmdb3TBrQ4lmnt9n4/Hiv5fTunsOzXbJfLR2rU3Fd5ugOe9mw0lvNOCNxyDdIHkpHCv0S3a+MS0yT+4wkAKx1gBJeVxeMRhSeNZpXJfY+zqAVl+g0mCFRJMgs6oy9+MCMrWZaJJwiWFjuWcIShf+Wk2W9e59OHu21WPdsswZNLKs9wV77mJiaMVbBQ+/1jGZDofFLuOBU/jzG6OQKnkLOZ5EvwolMX2Q19TAX9MWyy/aNarewfZptechdLn8B3TatB/YXB2j4MKw3jTHKX4AO0CbqaSddMokHUbr0PpSXmFG4O4WIu86asCVihfoM6nUmse5gGkbJOyThVesX4UI0d00LBYMr55VuIZl8MkY1uOiTy9v3c+ShuXj5+NdQdL8B+5gmw8WZuREAAAAASUVORK5CYII=\";\r\n\t\t}\r\n\r\n\t\tlet blobBin = atob(imgString);\r\n\t\tlet array = [];\r\n\t\tfor (let i = 0; i < blobBin.length; i++) {\r\n\t\t\tarray.push(blobBin.charCodeAt(i));\r\n\t\t}\r\n\t\tlet file: Blob = new Blob([new Uint8Array(array)], {type: \"image/jpeg\"});\r\n\r\n\t\treturn file;\r\n\t}\r\n}\r\n","/**\r\n * Manifest.ts\r\n * Module for managing the manifest file\r\n */\r\n\r\nimport { IFile } from \"./IFile\";\r\nimport { FeedbackType, SDK_VERSION_PREFIX } from \"./../../Constants\";\r\nimport * as Utils from \"./../../Utils\";\r\nimport Version from \"./../../Version\";\r\nimport * as Window from \"./../../Window/Window\";\r\n\r\nexport class Manifest implements IFile {\r\n\tprivate manifestData: IManifestData;\r\n\r\n\tpublic constructor(manifestType: string, appId: number, submitTime: string, type: ManifestFeedbackType,\r\n\t\tclientFeedbackId: string, applicationGroup: IManifestDataApplication, telemetryGroup: IManifestDataTelemetry,\r\n\t\twebGroup: IManifestDataWeb) {\r\n\t\tthis.manifestData = {\r\n\t\t\tappId: appId,\r\n\t\t\tapplication: applicationGroup,\r\n\t\t\tclientFeedbackId: clientFeedbackId,\r\n\t\t\tmanifestType: manifestType,\r\n\t\t\tsource: \"Client\",\r\n\t\t\tsubmitTime: submitTime,\r\n\t\t\ttelemetry: telemetryGroup,\r\n\t\t\ttype: sanitizeType(type),\r\n\t\t\tweb: webGroup,\r\n\t\t\tsdkVersion: SDK_VERSION_PREFIX\r\n\t\t\t\t+ (Window.get().OfficeBrowserFeedback.sdkVersion !== undefined ?\r\n\t\t\t\t\tWindow.get().OfficeBrowserFeedback.sdkVersion : Version),\r\n\t\t};\r\n\t}\r\n\r\n\tpublic getExtendedManifestData(): string {\r\n\t\treturn this.manifestData.application.extendedManifestData;\r\n\t}\r\n\r\n\tpublic setComment(comment: string) {\r\n\t\tthis.manifestData.comment = comment;\r\n\t}\r\n\r\n\tpublic setEmail(email: string) {\r\n\t\tthis.manifestData.email = email;\r\n\t}\r\n\r\n\tpublic setCategory(category: string) {\r\n\t\tthis.manifestData.telemetry = this.manifestData.telemetry || {};\r\n\t\tthis.manifestData.telemetry.featureArea = category;\r\n\t}\r\n\r\n\tpublic setAppData(appData: string) {\r\n\t\tthis.manifestData.application = this.manifestData.application || {};\r\n\t\tthis.manifestData.application.appData = appData;\r\n\t}\r\n\r\n\tpublic setExtendedManifestData(extendedManifestData: string) {\r\n\t\tthis.manifestData.application = this.manifestData.application || {};\r\n\t\tthis.manifestData.application.extendedManifestData = extendedManifestData;\r\n\t}\r\n\r\n\tpublic setClientFeedbackId(clientFeedbackId: string) {\r\n\t\tthis.manifestData.clientFeedbackId = clientFeedbackId;\r\n\t}\r\n\r\n\tpublic getClientFeedbackId(): string {\r\n\t\treturn this.manifestData.clientFeedbackId;\r\n\t}\r\n\r\n\tpublic setComplianceInformation(authenticationType: string, ageGroup: string, sendFeedbackPolicyValue: string,\r\n\t\tsendSurveyPolicyValue: string, screenshotPolicyValue: string, emailPolicyValue: string) {\r\n\t\tthis.manifestData.complianceChecks = {\r\n\t\t\tauthenticationType: authenticationType,\r\n\t\t\tageGroup: ageGroup,\r\n\t\t\tpolicyAllowFeedback: sendFeedbackPolicyValue,\r\n\t\t\tpolicyAllowSurvey: sendSurveyPolicyValue,\r\n\t\t\tpolicyAllowScreenshot: screenshotPolicyValue,\r\n\t\t\tpolicyAllowContact: emailPolicyValue,\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Set freeform custom values in manifest. Throws if values are already set.\r\n\t * @param values the values as a JS object\r\n\t */\r\n\tpublic setValues(values: object) {\r\n\t\tif (values) {\r\n\t\t\tfor (let field in values) {\r\n\t\t\t\tif (values.hasOwnProperty(field)) {\r\n\t\t\t\t\tif (this.manifestData.hasOwnProperty(field)) {\r\n\t\t\t\t\t\t(<any> this.manifestData)[field] = Utils.overrideValues((<any> values)[field], (<any> this.manifestData)[field]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t(<any> this.manifestData)[field] = (<any> values)[field];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getContent(): Blob {\r\n\t\treturn new Blob([JSON.stringify(this.manifestData)], { type: \"application/json\" });\r\n\t}\r\n}\r\n\r\nfunction sanitizeType(type: ManifestFeedbackType): string {\r\n\tif (type === \"Survey\") {\r\n\t\treturn type;\r\n\t} else {\r\n\t\treturn FeedbackType[type];\r\n\t}\r\n}\r\n\r\nexport type ManifestFeedbackType = FeedbackType | \"Survey\";\r\n\r\n/**\r\n * Interface for the manifest data\r\n */\r\nexport interface IManifestData {\r\n\t// #region \"Required properties\"\r\n\tmanifestType: string;\r\n\tappId: number;\r\n\tsubmitTime: string;\r\n\tsource: string;\r\n\ttype: string;\r\n\tclientFeedbackId: string;\r\n\tsdkVersion: string;\r\n\t// #endregion \"Required properties\"\r\n\tcomment?: string;\r\n\temail?: string;\r\n\trating?: number;\r\n\tsurvey?: IManifestDataSurvey;\r\n\tweb?: IManifestDataWeb;\r\n\tapplication?: IManifestDataApplication;\r\n\ttelemetry?: IManifestDataTelemetry;\r\n\tcomplianceChecks?: IManifestComplianceChecks;\r\n}\r\n\r\n/**\r\n * Interface for survey related properties in manifest\r\n */\r\nexport interface IManifestDataSurvey {\r\n\tsurveyId: string;\r\n}\r\n\r\n/**\r\n * Interface for application related properties in manifest\r\n */\r\nexport interface IManifestDataApplication {\r\n\tappData?: string;\r\n\textendedManifestData?: string;\r\n\tfeedbackTenant?: string;\r\n}\r\n\r\n/**\r\n * Interface for telemetry related properties in manifest\r\n */\r\nexport interface IManifestDataTelemetry {\r\n\taudience?: string;\r\n\taudienceGroup?: string;\r\n\tchannel?: string;\r\n\tdeviceId?: string;\r\n\tdeviceType?: string;\r\n\terrorClassification?: string;\r\n\terrorCode?: string;\r\n\terrorName?: string;\r\n\tfeatureArea?: string;\r\n\tflights?: string;\r\n\tflightSource?: string;\r\n\tfundamentalArea?: string;\r\n\tinstallationType?: string;\r\n\tisLogIncluded?: boolean;\r\n\tisUserSubscriber?: boolean;\r\n\tloggableUserId?: string;\r\n\tofficeArchitecture?: string;\r\n\tofficeBuild?: string;\r\n\tofficeEditingLang?: number;\r\n\tofficeUILang?: number;\r\n\tosBitness?: number;\r\n\tosBuild?: string;\r\n\tosUserLang?: number;\r\n\tplatform?: string;\r\n\tprocessSessionId?: string;\r\n\tringId?: number;\r\n\tsku?: string;\r\n\tsourceContext?: string;\r\n\tsystemProductName?: string;\r\n\tsystemManufacturer?: string;\r\n\ttenantId?: string;\r\n}\r\n\r\n/**\r\n * Interface for web related properties in manifest\r\n */\r\nexport interface IManifestDataWeb {\r\n\tbrowser?: string;\r\n\tbrowserVersion?: string;\r\n\tdataCenter?: string;\r\n\tsourcePageName?: string;\r\n\tsourcePageURI?: string;\r\n}\r\n\r\n/**\r\n * Interface for compliance checks related properties in manifest\r\n */\r\nexport interface IManifestComplianceChecks {\r\n\tauthenticationType?: string;\r\n\tageGroup?: string;\r\n\tpolicyAllowFeedback?: string;\r\n\tpolicyAllowSurvey?: string;\r\n\tpolicyAllowScreenshot?: string;\r\n\tpolicyAllowContact?: string;\r\n}\r\n","/**\r\n * Feedback.ts\r\n *\r\n * Module for payload transport.\r\n */\r\n\r\nimport * as Constants from \"./../Constants\";\r\nimport * as Utils from \"./../Utils\";\r\nimport * as Logging from \"./../Logging/Logging\";\r\nimport * as Petrol from \"./Petrol\";\r\nimport { Screenshot } from \"./Files/Screenshot\";\r\nimport * as Configuration from \"../Configuration/Configuration\";\r\nimport { Manifest, ManifestFeedbackType, IManifestDataApplication, IManifestDataTelemetry, IManifestDataWeb }\r\n\tfrom \"./Files/Manifest\";\r\n\r\nimport { Api } from \"@ms-ofb/officefloodgatecore\";\r\nimport { AgeGroup, AuthenticationType } from \"../Configuration/Configuration\";\r\n\r\nexport { IManifestDataApplication, IManifestDataTelemetry, IManifestDataWeb } from \"./Files/Manifest\"\r\n\r\nexport class Transporter implements Api.ITransporter {\r\n\tprivate manifest: Manifest;\r\n\tprivate screenshot: Screenshot;\r\n\tprivate environment: Constants.Environment;\r\n\tprivate clientFeedbackId: string;\r\n\r\n\tpublic constructor(environment: Constants.Environment, manifestType: string, appId: number, type: ManifestFeedbackType,\r\n\t\tapplicationGroup: IManifestDataApplication, telemetryGroup: IManifestDataTelemetry, webGroup: IManifestDataWeb) {\r\n\r\n\t\tthis.clientFeedbackId = Utils.guid();\r\n\t\tthis.manifest = new Manifest(manifestType, appId, new Date().toISOString(), type,\r\n\t\t\tthis.clientFeedbackId, { ...applicationGroup }, { ...telemetryGroup }, { ...webGroup });\r\n\t\tthis.environment = environment;\r\n\r\n\t\tthis.manifest.setComplianceInformation(AuthenticationType[(Configuration.get().getCommonInitOptions()?.authenticationType) ??\r\n\t\t\tAuthenticationType.Unauthenticated],\r\n\t\t\tAgeGroup[(Configuration.get().getCommonInitOptions()?.ageGroup) ?? AgeGroup.Undefined],\r\n\t\t\tthis.ocpsEnumToString(Configuration.get().getInAppFeedbackInitOptions()?.sendFeedbackPolicyValue),\r\n\t\t\tthis.ocpsBooleanToString(Configuration.get().getFloodgateInitOptions()?.surveyEnabled),\r\n\t\t\tthis.ocpsEnumToString(Configuration.get().getCommonInitOptions()?.screenshotPolicyValue),\r\n\t\t\tthis.ocpsEnumToString(Configuration.get().getCommonInitOptions()?.emailPolicyValue));\r\n\t}\r\n\r\n\tpublic getClientFeedbackId(): string {\r\n\t\treturn this.clientFeedbackId;\r\n\t}\r\n\r\n\tpublic getExtendedManifestData(): string {\r\n\t\treturn this.manifest.getExtendedManifestData();\r\n\t}\r\n\r\n\tpublic setComment(comment: string) {\r\n\t\tthis.manifest.setComment(comment);\r\n\t}\r\n\r\n\tpublic setEmail(email: string) {\r\n\t\tthis.manifest.setEmail(email);\r\n\t}\r\n\r\n\tpublic setCategory(category: string) {\r\n\t\tthis.manifest.setCategory(category);\r\n\t}\r\n\r\n\tpublic setAppData(appData: string) {\r\n\t\tthis.manifest.setAppData(appData);\r\n\t}\r\n\r\n\tpublic setExtendedManifestData(extendedManifestData: string) {\r\n\t\tthis.manifest.setExtendedManifestData(extendedManifestData);\r\n\t}\r\n\r\n\tpublic setScreenshot(screenshot: HTMLCanvasElement) {\r\n\t\tthis.screenshot = new Screenshot(screenshot);\r\n\t}\r\n\r\n\tpublic setClientFeedbackId(clientFeedbackId: string) {\r\n\t\tthis.manifest.setClientFeedbackId(clientFeedbackId);\r\n\t}\r\n\r\n\tpublic getManifest(): Manifest {\r\n\t\treturn this.manifest;\r\n\t}\r\n\r\n\t/**\r\n\t * Set freeform custom values in manifest. Throws if values are already set.\r\n\t * @param values the values as a JS object\r\n\t */\r\n\tpublic setManifestValues(values: object) {\r\n\t\tthis.manifest.setValues(values);\r\n\t}\r\n\r\n\t/**\r\n\t * Submit the payload\r\n\t */\r\n\tpublic submit(): Promise<any> {\r\n\t\tif (!Configuration.get().isFeedbackSurveyEnabledByAADC()) {\r\n\t\t\tLogging.getLogger().logEvent(\r\n\t\t\t\tLogging.EventIds.Shared.Upload.Prevented.VALUE,\r\n\t\t\t\tLogging.LogLevel.Error,\r\n\t\t\t\t{\r\n\t\t\t\t\tData: JSON.stringify({\r\n\t\t\t\t\t\tageGroup: Configuration.get().getCommonInitOptions().ageGroup,\r\n\t\t\t\t\t\tauthenticationType: Configuration.get().getCommonInitOptions().authenticationType,\r\n\t\t\t\t\t}),\r\n\t\t\t\t});\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\r\n\t\tlet manifestContent: Blob = this.manifest.getContent();\r\n\t\tlet screenshotContent: Blob = undefined;\r\n\t\tconst clientFeedbackId: string = this.clientFeedbackId;\r\n\r\n\t\tif (this.screenshot) {\r\n\t\t\tscreenshotContent = this.screenshot.getContent();\r\n\t\t}\r\n\r\n\t\treturn Petrol.send(this.environment === Constants.Environment.Production, manifestContent, screenshotContent)\r\n\t\t\t.catch(\r\n\t\t\t\tfunction onRejected(err: Error) {\r\n\t\t\t\t\tConfiguration.get().setFeedbackSubmitted(false);\r\n\t\t\t\t\tConfiguration.get().getCommonInitOptions().onError(\"Payload submission failed: \" + err.message +\r\n\t\t\t\t\t\t\". ClientFeedbackId: \" + clientFeedbackId);\r\n\t\t\t\t\tLogging.getLogger().logEvent(Logging.EventIds.Shared.Upload.Failed.VALUE,\r\n\t\t\t\t\t\tLogging.LogLevel.Error, { ErrorMessage: err.message, ClientFeedbackId: clientFeedbackId });\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t}\r\n\r\n\tprivate ocpsBooleanToString(policyValue?: boolean) {\r\n\t\tif (policyValue === undefined) {\r\n\t\t\treturn \"Not Configured\";\r\n\t\t}\r\n\r\n\t\tif (policyValue) {\r\n\t\t\treturn \"Enabled\";\r\n\t\t}\r\n\r\n\t\treturn \"Disabled\";\r\n\t}\r\n\r\n\tprivate ocpsEnumToString(policyValue?: Constants.OCPSValues) {\r\n\t\tif (!policyValue) {\r\n\t\t\treturn \"Not Configured\";\r\n\t\t}\r\n\t\tswitch (policyValue) {\r\n\t\t\tcase Constants.OCPSValues.Disabled:\r\n\t\t\t\treturn \"Disabled\";\r\n\t\t\tcase Constants.OCPSValues.Enabled:\r\n\t\t\t\treturn \"Enabled\";\r\n\t\t\tdefault:\r\n\t\t\t\treturn \"Not Configured\";\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * Utils.ts\r\n *\r\n * Module for utility functions\r\n */\r\n\r\nimport { Classes } from \"./UiConstants\";\r\nimport * as Screenshot from \"./../Screenshot\";\r\nimport * as Logging from \"./../Logging/Logging\";\r\n\r\n/**\r\n * Set HTML element visibility\r\n * @param {string} id The Id of the HTML element\r\n * @param {any} vis The visibility to be set (true or false)\r\n * @return {void}\r\n */\r\nexport function setElementVisibility(id: string, vis: boolean): void {\r\n\tlet oldClassName: string = vis ? Classes.Hidden : Classes.Visible;\r\n\tlet newClassName: string = vis ? Classes.Visible : Classes.Hidden;\r\n\r\n\treplaceClassesById(id, oldClassName, newClassName);\r\n}\r\n\r\n/**\r\n * Delete HTML element by Id\r\n * @param {string} id The Id of the HTML element\r\n * @return {void}\r\n */\r\nexport function deleteElementById(id: string): void {\r\n\tlet element: HTMLElement = document.getElementById(id);\r\n\tif (element != null && element.parentNode != null) {\r\n\t\telement.parentNode.removeChild(element);\r\n\t}\r\n}\r\n\r\n/**\r\n * Add a CSS class to an HTML element by Id\r\n * @param {string} id The Id of the HTML element\r\n * @param {string} newClassName The name of CSS class to be added\r\n * @return {void}\r\n */\r\nexport function addClassById(id: string, newClass: string): void {\r\n\tlet element: HTMLElement = document.getElementById(id);\r\n\r\n\tif (!element) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// check is the class already exists, if not add it\r\n\tif (!element.className.match(new RegExp(\"\\\\b\" + newClass + \"\\\\b\"))) {\r\n\t\t// we use className instead of classList to support IE9\r\n\t\telement.className = element.className + \" \" + newClass;\r\n\t}\r\n}\r\n\r\n/**\r\n * Delete a CSS class of an HTML element by Id\r\n * @param {string} id The Id of the HTML element\r\n * @param {string} oldClassName The name of CSS class to be deleted\r\n * @return {void}\r\n */\r\nexport function deleteClassById(id: string, oldClass: string): void {\r\n\tlet element: HTMLElement = document.getElementById(id);\r\n\r\n\tif (!element) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// we use className instead of classList to support IE9\r\n\t// get rid of any occurrences of the class we don\"t want\r\n\telement.className = element.className.split(new RegExp(\"\\\\b\" + oldClass + \"\\\\b\", \"i\")).join(\" \");\r\n\r\n\t// get rid of extra whitespaces\r\n\telement.className = element.className.split(/\\s+/).join(\" \");\r\n}\r\n\r\n/**\r\n * Delete an CSS class and (or) add an CSS class to an HTML element by Id\r\n * @param {string} id The Id of the HTML element\r\n * @param {string} oldClassName The name of CSS class to be deleted\r\n * @param {string} newClassName The name of CSS class to be added\r\n * @return {void}\r\n */\r\nexport function replaceClassesById(id: string, oldClassName?: string, newClassName?: string): void {\r\n\tdeleteClassById(id, oldClassName);\r\n\taddClassById(id, newClassName);\r\n}\r\n\r\n/**\r\n * Set attribute on an HTML element\r\n * @param {string} id The Id of the HTML element\r\n * @param {string} attriName The attribute name\r\n * @param {string} attriValue The attribute value\r\n * @return {void}\r\n */\r\nexport function setAttributeOnHtmlElement(id: string, attriName: string, attriValue: string): void {\r\n\tlet htmlElement: HTMLElement = <HTMLElement> document.getElementById(id);\r\n\tif (htmlElement) {\r\n\t\thtmlElement.setAttribute(attriName, attriValue);\r\n\t}\r\n}\r\n\r\n/**\r\n * Add event listener helper function (wrapper) that deals with IE 8 compatability\r\n * @param object The object to add event listener to\r\n * @param type The event type\r\n * @param listener The listener function\r\n */\r\nexport function addEventListenerHelper(object: any, type: string, listener: (event: Event) => void): void {\r\n\tif (object.addEventListener) {\r\n\t\tobject.addEventListener(type, listener, false);\r\n\t} else if (object.attachEvent) {\r\n\t\tobject.attachEvent(\"on\" + type, listener);\r\n\t}\r\n}\r\n\r\n/**\r\n * Remove event listener helper function (wrapper) that deals with IE 8 compatability\r\n * @param object The object to remove event listener from\r\n * @param type The event type\r\n * @param listener The listener function\r\n */\r\nexport function removeEventListenerHelper(object: any, type: string, listener: (event: Event) => void): void {\r\n\tif (object.removeEventListener) {\r\n\t\tobject.removeEventListener(type, listener, false);\r\n\t} else if (object.detachEvent) {\r\n\t\tobject.detachEvent(\"on\" + type, listener);\r\n\t}\r\n}\r\n\r\n/**\r\n * Register event listener\r\n * @param id The Id of the HTML element\r\n * @param type The event type\r\n * @param listener The listener function\r\n */\r\nexport function registerListener(id: string, type: string, listener: (event: Event) => void): void {\r\n\tlet element: HTMLElement = document.getElementById(id);\r\n\tif (element) {\r\n\t\taddEventListenerHelper(element, type, listener);\r\n\t}\r\n}\r\n\r\n/**\r\n * Register event listener\r\n * @param element The HTML element\r\n * @param type The event type\r\n * @param listener The listener function\r\n */\r\nexport function registerListenerToElement(element: HTMLElement, type: string, listener: (event: Event) => void): void {\r\n\tif (element) {\r\n\t\taddEventListenerHelper(element, type, listener);\r\n\t}\r\n}\r\n\r\n/**\r\n * Un-register event listener\r\n * @param id The Id of the HTML element\r\n * @param type The event type\r\n * @param listener The listener function\r\n */\r\nexport function unregisterListener(id: string, type: string, listener: (event: Event) => void): void {\r\n\tlet element: HTMLElement = document.getElementById(id);\r\n\tif (element) {\r\n\t\tremoveEventListenerHelper(element, type, listener);\r\n\t}\r\n}\r\n\r\n/**\r\n * Returns the version of Internet Explorer or -1 for non-IE browser\r\n * @return {number} The IE version\r\n */\r\nexport function getInternetExplorerVersion(): number {\r\n\tlet rv: number = -1;\r\n\tlet ua: string = window.navigator.userAgent;\r\n\r\n\t// since IE 11, 'MSIE' is not a keyword in its user agent string anymore\r\n\t// determine whether the browser is IE or not, and the version of IE based on Trident keyword and its version\r\n\tif (ua.indexOf(\"Trident\") > -1) {\r\n\t\tlet re: RegExp = new RegExp(\"Trident/([0-9]{1,}[\\.0-9]{0,})\");\r\n\t\tif (re.exec(ua) != null) {\r\n\t\t\trv = parseFloat(RegExp.$1);\r\n\t\t\trv += 4; // trident version + 4 is the IE version\r\n\t\t}\r\n\t}\r\n\treturn rv;\r\n}\r\n\r\n/**\r\n * Check if the current text direction is right to left\r\n */\r\nexport function isRightToLeft(): boolean {\r\n\treturn getComputedStyle(document.documentElement).direction === \"rtl\";\r\n}\r\n\r\n/**\r\n * Screenshot preview is control by screenshot check box. Populate preview if checkbox is checked \r\n * @param screenshotCheckboxId The Id of screenshot checkbox \r\n * @param screenshotPreviewId The Id of preview \r\n */\r\nexport function ScreenshotPreviewByCheckbox(screenshotCheckboxId: string, screenshotPreviewId: string): void {\r\n\tlet screenshotCheckBox = <HTMLInputElement> document.getElementById(screenshotCheckboxId);\r\n\tlet screenshotCheckBoxSelected: boolean = screenshotCheckBox && screenshotCheckBox.checked;\r\n\tlet preview = <HTMLImageElement> document.getElementById(screenshotPreviewId);\r\n\r\n\tif (screenshotCheckBoxSelected) {\r\n\t\tsetElementVisibility(screenshotPreviewId, true);\r\n\t\tlet startTime: number = performance.now();\r\n\t\tScreenshot.createScreenshot(document.body).then(\r\n\t\t\t(canvas: HTMLCanvasElement) => {\r\n\t\t\t\tlet endTime: number = performance.now();\r\n\t\t\t\tLogging.getLogger().logEvent(Logging.EventIds.Shared.Screenshot.Render.Success.VALUE,\r\n\t\t\t\t\tLogging.LogLevel.Critical,\r\n\t\t\t\t\t{ TimeMilliseconds: endTime - startTime });\r\n\r\n\t\t\t\tpreview.src = canvas.toDataURL();\r\n\t\t\t}\r\n\t\t).catch((error: any) => {\r\n\t\t\tlet endTime: number = performance.now();\r\n\t\t\tLogging.getLogger().logEvent(Logging.EventIds.Shared.Screenshot.Render.Failed.VALUE,\r\n\t\t\t\tLogging.LogLevel.Error,\r\n\t\t\t\t{ ErrorMessage: error, TimeMilliseconds: endTime - startTime });\r\n\t\t});\r\n\t} else {\r\n\t\tsetElementVisibility(screenshotPreviewId, false);\r\n\t}\r\n}\r\n","/**\r\n * Spinner.ts\r\n *\r\n * A module for a spinner.\r\n */\r\n\r\nimport { Classes } from \"./UiConstants\";\r\nimport * as Utils from \"./Utils\";\r\n\r\ninterface ICircleObject {\r\n\telement: HTMLDivElement;\r\n\tj: number;\r\n}\r\n\r\nconst animationSpeed = 90;\r\nconst numCircles = 8;\r\nconst offsetSize = 0.2;\r\nconst parentSize = 34;\r\nconst fadeIncrement = 1 / numCircles;\r\n\r\nexport class Spinner {\r\n\tprivate circleObjects: ICircleObject[] = [];\r\n\tprivate interval: ReturnType<typeof setInterval>;\r\n\tprivate spinnerId: string;\r\n\tprivate spinner: HTMLElement;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t * @param id id of the element to attach the spinner to\r\n\t */\r\n\tconstructor(id: string) {\r\n\t\tthis.spinnerId = id;\r\n\t\tthis.spinner = document.getElementById(this.spinnerId);\r\n\t\tthis.createCirclesAndArrange();\r\n\t\tthis.initializeOpacities();\r\n\t\tthis.start();\r\n\t\tUtils.setElementVisibility(id, true);\r\n\t}\r\n\r\n\t/**\r\n\t * Destroys the spinner\r\n\t */\r\n\tpublic destroy() {\r\n\t\tUtils.setElementVisibility(this.spinnerId, false);\r\n\t\tthis.stop();\r\n\t}\r\n\r\n\t/**\r\n\t * Starts the animation\r\n\t */\r\n\tprivate start() {\r\n\t\tthis.stop();\r\n\t\tthis.interval = setInterval(() => {\r\n\t\t\tlet i = this.circleObjects.length;\r\n\t\t\twhile (i--) {\r\n\t\t\t\tfade(this.circleObjects[i]);\r\n\t\t\t}\r\n\t\t},\r\n\t\t\tanimationSpeed);\r\n\t}\r\n\r\n\t/**\r\n\t * Stops the animation\r\n\t */\r\n\tprivate stop() {\r\n\t\tclearInterval(this.interval);\r\n\t}\r\n\r\n\tprivate createCirclesAndArrange() {\r\n\t\tlet angle = 0;\r\n\t\tlet offset = parentSize * offsetSize;\r\n\t\tlet step = (2 * Math.PI) / numCircles;\r\n\t\tlet i = numCircles;\r\n\t\tlet circleObject: ICircleObject;\r\n\t\tlet radius = (parentSize - offset) * 0.5;\r\n\r\n\t\twhile (i--) {\r\n\t\t\tlet circle: HTMLDivElement = createCircle();\r\n\t\t\tlet x = Math.round(parentSize * 0.5 + radius * Math.cos(angle) - circle.clientWidth * 0.5) - offset * 0.5;\r\n\t\t\tlet y = Math.round(parentSize * 0.5 + radius * Math.sin(angle) - circle.clientHeight * 0.5) - offset * 0.5;\r\n\t\t\tthis.spinner.appendChild(circle);\r\n\t\t\tcircle.style.left = x + \"px\";\r\n\t\t\tcircle.style.top = y + \"px\";\r\n\t\t\tangle += step;\r\n\t\t\tcircleObject = { element: circle, j: i };\r\n\t\t\tthis.circleObjects.push(circleObject);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate initializeOpacities() {\r\n\t\tlet i = 0;\r\n\t\tlet j = 1;\r\n\t\tlet opacity: number;\r\n\r\n\t\tfor (i; i < numCircles; i++) {\r\n\t\t\tlet circleObject = this.circleObjects[i];\r\n\t\t\topacity = (fadeIncrement * j++);\r\n\t\t\tsetOpacity(circleObject.element, opacity);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction fade(circleObject: any) {\r\n\tlet opacity = getOpacity(circleObject.element) - fadeIncrement;\r\n\r\n\tif (opacity <= 0) {\r\n\t\topacity = 1;\r\n\t}\r\n\r\n\tsetOpacity(circleObject.element, opacity);\r\n}\r\n\r\nfunction getOpacity(element: HTMLDivElement) {\r\n\treturn parseFloat(window.getComputedStyle(element).getPropertyValue(\"opacity\"));\r\n}\r\n\r\nfunction setOpacity(element: HTMLDivElement, opacity: number) {\r\n\telement.style.opacity = opacity.toString();\r\n}\r\n\r\nfunction createCircle(): HTMLDivElement {\r\n\tlet circle: HTMLDivElement = document.createElement(\"div\");\r\n\tcircle.classList.add(Classes.SpinnerCircle);\r\n\tcircle.style.width = circle.style.height = parentSize * offsetSize + \"px\";\r\n\treturn circle;\r\n}\r\n","/**\r\n * TabFocus.ts\r\n *\r\n * Module to handle tab and shift tab focus\r\n */\r\n\r\nimport { Classes, IDs } from \"./../UiConstants\";\r\n\r\n/**\r\n * Keeps tabs and shift tabs focus on visible elements of the feedback dialog\r\n * This prevents tabs and shift tabs cycle focus to elements of the background main page.\r\n * @param focusedElement The in-focus element object\r\n */\r\nexport function cycleTabFocus(focusedElement: Element): void {\r\n\tlet elements = getTabbableElements();\r\n\r\n\t// when a tab lands on the last dummy tabbable element, set focus to the first\r\n\t// visible element which is the one after the first dummy tabbable element\r\n\tif (focusedElement.id === IDs.LastTabbable) {\r\n\t\tfor (let i = 0; i < elements.length; i++) {\r\n\t\t\tlet element = (<HTMLElement> elements[i]);\r\n\r\n\t\t\tif (element.id === IDs.FirstTabbable || !checkVisible(element)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\telement.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// when a shift tab lands on the first dummy tabbable element, set focus to the last\r\n\t\t// visible element which is the one before the last dummy tabbable element\r\n\t} else if (focusedElement.id === IDs.FirstTabbable) {\r\n\t\tfor (let i = elements.length - 1; i >= 0; i--) {\r\n\t\t\tlet element = (<HTMLElement> elements[i]);\r\n\r\n\t\t\tif (element.id === IDs.LastTabbable || !checkVisible(element)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\telement.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Returns a list of tabbable elements.\r\n * @returns {NodeListOf<Element>} list of tabbable elements\r\n */\r\nfunction getTabbableElements(): NodeListOf<Element> {\r\n\tconst tabbableSelector = \"a[href], area[href], input:not([disabled]):not([tabindex=\\'-1\\']), \" +\r\n\t\t\"button:not([disabled]):not([tabindex=\\'-1\\']), select:not([disabled]):not([tabindex=\\'-1\\']), \" +\r\n\t\t\"textarea:not([disabled]):not([tabindex =\\'-1\\']), \" +\r\n\t\t\"object, *[tabindex]:not([tabindex=\\'-1\\']), *[contenteditable=true]\";\r\n\r\n\treturn document.getElementById(IDs.MainContainer).querySelectorAll(tabbableSelector);\r\n}\r\n\r\n/**\r\n * Returns visibility of an element by inspecting the element's parent class name for visible/hidden value.\r\n * Walk up the parent chain if needed.\r\n * @param element The element object\r\n * @returns {Boolean} whether the element is visible\r\n */\r\nfunction checkVisible(element: HTMLElement): boolean {\r\n\tif (!element.parentElement) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// don't bother if parent element id is just whitespace or empty\r\n\tif (/\\S/.test(element.parentElement.id)) {\r\n\t\tif (element.parentElement.className.indexOf(Classes.Visible) >= 0) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (element.parentElement.className.indexOf(Classes.Hidden) >= 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\treturn checkVisible(element.parentElement);\r\n}\r\n","/**\r\n * Events.ts\r\n *\r\n * A module for all Event handling.\r\n */\r\n\r\nimport { Transporter } from \"./../../Transport/Transport\";\r\nimport * as Configuration from \"./../../Configuration/Configuration\";\r\nimport { IFormTemplate } from \"./FormTemplates/IFormTemplate\";\r\nimport { FeedbackType, PanelType } from \"./../../Constants\";\r\nimport { AttributeName, AttributeValue, Classes, IDs, Keys } from \"./../UiConstants\";\r\nimport * as Logging from \"./../../Logging/Logging\";\r\nimport { IOnDismissDelegate } from \"./../../IOnDismissDelegate\";\r\nimport * as Screenshot from \"./../../Screenshot\";\r\nimport { Spinner } from \"./../SpinnerControl\";\r\nimport * as UiUtils from \"./../Utils\";\r\nimport * as TabFocus from \"./TabFocus\";\r\nimport { IPanelTemplate } from \"./PanelTemplates/IPanelTemplate\";\r\n\r\n/**\r\n * Whether to use narrow layout\r\n */\r\nlet useNarrowLayout: boolean = false;\r\n\r\n/**\r\n * Whether transition enabled or not\r\n */\r\nlet transitionEnabled: boolean = true;\r\n\r\n/**\r\n * Callback for when the feedback dialog is dismissed\r\n */\r\nlet onDismiss: IOnDismissDelegate;\r\n\r\n/**\r\n * The Selected feedback type, undefined if none selected\r\n */\r\nlet selectedFeedbackType: FeedbackType = undefined;\r\n\r\n/**\r\n * The Selected panel type, undefined if none selected\r\n */\r\nlet selectedPanelType: PanelType = undefined;\r\n\r\n/**\r\n * feedbackType -> IFormTemplate mapping for multi BellyBand\r\n */\r\nlet formTemplates: { [key: number]: IFormTemplate };\r\n\r\n/**\r\n * panelType -> IPanelTemplate mapping for multi BellyBand\r\n */\r\nlet panelTemplates: { [key: number]: IPanelTemplate };\r\n\r\nconst anchors: string[] = [IDs.OverallSmileAnchor, IDs.OverallFrownAnchor, IDs.OverallIdeaAnchor, IDs.OverallBugAnchor];\r\n\r\nfunction setAriaSelectedAttributes(anchorID: string): void {\r\n\tlet i: number;\r\n\tfor (i = 0; i < anchors.length; i++) {\r\n\t\tif (anchors[i] === anchorID) {\r\n\t\t\tUiUtils.setAttributeOnHtmlElement(anchors[i], AttributeName.AriaSelected, AttributeValue.True);\r\n\t\t} else {\r\n\t\t\tUiUtils.setAttributeOnHtmlElement(anchors[i], AttributeName.AriaSelected, AttributeValue.False);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Dismiss all, including networking, UI, and events\r\n * @param submitted Was the control submitted (true), or cancelled (false)?\r\n */\r\nfunction dismissAll(): void {\r\n\tunregister();\r\n\tonDismiss(Configuration.get().getFeedbackSubmitted());\r\n\tConfiguration.get().setFeedbackSubmitted(false);\r\n}\r\n\r\n/**\r\n * List of listeners and the ids they are attached to. This ensures all events are correctly unregistered.\r\n */\r\nlet listenersList: { id: string, event: string, listener: (event: Event) => void }[] = [];\r\n\r\nfunction addListener(id: string, event: string, listener: (event: Event) => void): void {\r\n\tUiUtils.registerListener(id, event, listener);\r\n\tlistenersList.push({ event: event, id: id, listener: listener });\r\n}\r\n\r\nfunction removeListeners(): void {\r\n\tfor (let listener of listenersList) {\r\n\t\tUiUtils.unregisterListener(listener.id, listener.event, listener.listener);\r\n\t}\r\n\tlistenersList = [];\r\n}\r\n\r\n/**\r\n * Register events for single belly band\r\n */\r\nexport function registerSingle(feedbackType: FeedbackType,\r\n\tPANELTEMPLATES: { [key: number]: IPanelTemplate },\r\n\tON_DISMISS: IOnDismissDelegate = function (submitted: boolean) { return; }) {\r\n\tselectedFeedbackType = feedbackType;\r\n\tpanelTemplates = PANELTEMPLATES;\r\n\r\n\t// SingleFormTemplate events\r\n\taddListener(IDs.SingleFormSubmitButton, \"click\", submitButtonHandlerFactory(IDs.SingleFormSubmitButton,\r\n\t\tIDs.SingleFormSubmitButtonSpinner, IDs.SingleFormComment, IDs.SingleFormEmailInput,\r\n\t\tIDs.SingleFormScreenshotCheckbox, IDs.SingleFormScreenshotPreview, IDs.SingleFormCategoriesDropdown));\r\n\r\n\t// Screenshot checkbox click events\r\n\taddListener(IDs.SingleFormScreenshotCheckbox, \"click\", ScreenshotCheckboxClickHandler\r\n\t\t(IDs.SingleFormScreenshotCheckbox, IDs.SingleFormScreenshotPreview));\r\n\r\n\t// Close button click event.\r\n\taddListener(IDs.CloseButton, \"click\", () => { dismissAll(); });\r\n\r\n\t// ThanksPanel events\r\n\taddListener(IDs.ThanksPanelCloseButton, \"click\", (event: Event) => CloseButton(event));\r\n\r\n\t// cancel button events\r\n\taddListener(IDs.SingleFormCancelButton, \"click\", CancelButtonHandler);\r\n\tregisterCommon(ON_DISMISS);\r\n}\r\n\r\n/**\r\n * Register events for multi belly band\r\n */\r\nexport function registerMulti(FORMTEMPLATES: { [key: number]: IFormTemplate },\r\n\tPANELTEMPLATES: { [key: number]: IPanelTemplate },\r\n\tUSE_NARROW_LAYOUT: boolean,\r\n\tTRANSITIONENABLED: boolean,\r\n\tON_DISMISS: IOnDismissDelegate = function (submitted: boolean) { return; }) {\r\n\tuseNarrowLayout = USE_NARROW_LAYOUT;\r\n\tformTemplates = FORMTEMPLATES;\r\n\tpanelTemplates = PANELTEMPLATES;\r\n\ttransitionEnabled = TRANSITIONENABLED;\r\n\r\n\taddListener(IDs.OverallSmileAnchor, \"click\", overallSmileHandler);\r\n\taddListener(IDs.OverallFrownAnchor, \"click\", overallFrownHandler);\r\n\taddListener(IDs.OverallIdeaAnchor, \"click\", overallIdeaHandler);\r\n\taddListener(IDs.OverallBugAnchor, \"click\", overallBugHandler);\r\n\taddListener(IDs.CloseButton, \"click\", () => { dismissAll(); });\r\n\r\n\t// BasicFormTemplate events\r\n\taddListener(IDs.BasicFormSubmitButton, \"click\", submitButtonHandlerFactory(IDs.BasicFormSubmitButton,\r\n\t\tIDs.BasicFormSubmitButtonSpinner, IDs.BasicFormComment, IDs.BasicFormEmailInput,\r\n\t\tIDs.BasicFormScreenshotCheckbox, IDs.BasicFormScreenshotPreview, IDs.BasicFormCategoriesDropdown));\r\n\r\n\t// Screenshot checkbox click events\r\n\taddListener(IDs.BasicFormScreenshotCheckbox, \"click\", ScreenshotCheckboxClickHandler(IDs.BasicFormScreenshotCheckbox,\r\n\t\tIDs.BasicFormScreenshotPreview));\r\n\r\n\t// UserVoiceFormTemplate events\r\n\taddListener(IDs.UserVoiceFormGoButton, \"click\", UserVoiceFormGoButtonHandler);\r\n\r\n\taddListener(IDs.OverallFeedbackPortalIdeaAnchor, \"click\", overallFeedbackPortalIdeaHandler);\r\n\r\n\t// ThanksPanel events\r\n\taddListener(IDs.ThanksPanelCloseButton, \"click\", (event: Event) => CloseButton(event));\r\n\r\n\t// cancel button events\r\n\taddListener(IDs.BasicFormCancelButton, \"click\", CancelButtonHandler);\r\n\r\n\tregisterCommon(ON_DISMISS);\r\n\r\n\tif (!transitionEnabled) {\r\n\t\tUiUtils.addClassById(IDs.MainContentHolder, Classes.MarginLeft180px);\r\n\t\tUiUtils.addClassById(IDs.ColumnSeparatorDiv, Classes.ShowRightBorder);\r\n\t}\r\n}\r\n\r\nfunction registerCommon(ON_DISMISS: IOnDismissDelegate): void {\r\n\tonDismiss = ON_DISMISS;\r\n\r\n\tUiUtils.addEventListenerHelper(window, \"keyup\", keyEventHandler);\r\n\r\n\taddListener(IDs.OverlayBackground, \"click\", overlayBackgroundHandler);\r\n\taddListener(IDs.MainContainer, \"click\", mainContainerHandler);\r\n\taddListener(IDs.MainContainer, \"keyup\", tabKeyEventHandler);\r\n\taddListener(IDs.PrivacyStatementLink, \"click\", privacyStatementLinkHandler);\r\n\taddListener(IDs.EmailCheckBox, \"click\", emailCheckBoxHandler);\r\n\taddListener(IDs.BasicFormComment, \"keyup\", basicFormInputHandler);\r\n\taddListener(IDs.SingleFormComment, \"keyup\", singleFormInputHandler);\r\n\temailCheckBoxHandler(null); // call the checkbox handler to process the initial state\r\n}\r\n\r\n/**\r\n * Listener un-registration\r\n */\r\nfunction unregister(): void {\r\n\tUiUtils.removeEventListenerHelper(window, \"keyup\", keyEventHandler);\r\n\tremoveListeners();\r\n}\r\n\r\n/**\r\n * Tab key event handler\r\n * @param event The Event object\r\n */\r\nfunction tabKeyEventHandler(event: Event): void {\r\n\tlet keyCode = (<KeyboardEvent> event).keyCode || (<KeyboardEvent> event ).which;\r\n\r\n\tif (keyCode === Keys.Tab) {\r\n\t\tif ((document.activeElement.id === IDs.FirstTabbable && (<KeyboardEvent> event).shiftKey) ||\r\n\t\t\t(document.activeElement.id === IDs.LastTabbable && !(<KeyboardEvent> event).shiftKey)) {\r\n\t\t\tevent.stopPropagation();\r\n\t\t\tTabFocus.cycleTabFocus(document.activeElement);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Key event handler\r\n * @param event The Event object\r\n */\r\nfunction keyEventHandler(event: Event): void {\r\n\t// dismiss feedback upon pressing the escape key\r\n\tif ((<KeyboardEvent> event).keyCode === Keys.Esc) {\r\n\t\tevent.preventDefault();\r\n\t\tevent.stopPropagation();\r\n\r\n\t\tdismissAll();\r\n\t}\r\n}\r\n\r\n/**\r\n * Overlay background event handler. Dismiss feedback upon clicking on the background area\r\n * @param event The Event object\r\n */\r\nfunction overlayBackgroundHandler(event: Event): void {\r\n\tevent.preventDefault();\r\n\tevent.stopPropagation();\r\n\tdismissAll();\r\n}\r\n\r\n/**\r\n * Main container event handler. When clicking on main container area, do not propagate the event to lower level.\r\n * @param event The Event object\r\n */\r\nfunction mainContainerHandler(event: Event): void {\r\n\tevent.stopPropagation();\r\n}\r\n\r\n/**\r\n * Privacy statement link handler. When clicking on the privacy statement link,\r\n * do not propagate the event to lower level.\r\n * @param event The Event object\r\n */\r\nfunction privacyStatementLinkHandler(event: Event): void {\r\n\tevent.stopPropagation();\r\n}\r\n\r\n/**\r\n * Overall button click handler\r\n * @param event The Event object\r\n * @param achorId The id of the anchor html element which was selected\r\n */\r\nfunction overallHandler(event: Event, anchorId: string): void {\r\n\tevent.preventDefault();\r\n\tevent.stopPropagation();\r\n\r\n\tUiUtils.replaceClassesById(IDs.OverallSmileAnchor, Classes.OverallAnchorActive);\r\n\tUiUtils.replaceClassesById(IDs.OverallFrownAnchor, Classes.OverallAnchorActive);\r\n\tUiUtils.replaceClassesById(IDs.OverallIdeaAnchor, Classes.OverallAnchorActive);\r\n\tUiUtils.replaceClassesById(IDs.OverallBugAnchor, Classes.OverallAnchorActive);\r\n\r\n\tif (anchorId) {\r\n\t\tUiUtils.addClassById(anchorId, Classes.OverallAnchorActive);\r\n\t}\r\n\r\n\tLogging.getLogger().logEvent(\r\n\t\tLogging.EventIds.InApp.UI.Form.Shown.VALUE,\r\n\t\tLogging.LogLevel.Critical,\r\n\t\t{ FeedbackType: selectedFeedbackType, PanelType: selectedPanelType });\r\n\r\n\tif (typeof (selectedFeedbackType) !== \"undefined\") {\r\n\t\tUiUtils.setElementVisibility(IDs.LeftFormContainer, true);\r\n\t\tUiUtils.setElementVisibility(IDs.MiddleFormContainer, true);\r\n\t\tUiUtils.setElementVisibility(IDs.LeftPanelContainer, false);\r\n\t\tlet formTemplate: IFormTemplate = formTemplates[selectedFeedbackType];\r\n\t\tmainContentHolderSlideLeft(formTemplate.containerId);\r\n\r\n\t\tif (transitionEnabled) {\r\n\t\t\tmainContentHolderSlideLeft(formTemplate.containerId);\r\n\t\t}\r\n\t\tformTemplate.onSelect(selectedFeedbackType);\r\n\t}\r\n\r\n\tif (typeof (selectedPanelType) !== \"undefined\") {\r\n\t\tUiUtils.setElementVisibility(IDs.LeftFormContainer, false);\r\n\t\tUiUtils.setElementVisibility(IDs.MiddleFormContainer, false);\r\n\t\tUiUtils.setElementVisibility(IDs.LeftPanelContainer, true);\r\n\t\tfor (let panelType in panelTemplates) {\r\n\t\t\tif (panelTemplates.hasOwnProperty(panelType)) {\r\n\t\t\t\tUiUtils.setElementVisibility(panelTemplates[panelType].containerId, true);\r\n\t\t\t}\r\n\t\t}\r\n\t\tlet panelTemplate: IPanelTemplate = panelTemplates[selectedPanelType];\r\n\t\tpanelTemplate.onSelect(selectedPanelType);\r\n\t}\r\n}\r\n\r\n/**\r\n * Smile button event handler\r\n * @param event The Event object\r\n */\r\nfunction overallSmileHandler(event: Event): void {\r\n\tselectedFeedbackType = FeedbackType.Smile;\r\n\tselectedPanelType = undefined;\r\n\tsetAriaSelectedAttributes(IDs.OverallSmileAnchor);\r\n\tUiUtils.setAttributeOnHtmlElement(IDs.MiddleFormContainer, AttributeName.AriaExpanded, AttributeValue.True);\r\n\tUiUtils.setAttributeOnHtmlElement(IDs.MiddleFormContainer, AttributeName.AriaLabelledBy, IDs.OverallSmileAnchor);\r\n\toverallHandler(event, IDs.OverallSmileAnchor);\r\n}\r\n\r\n/**\r\n * Frown button event handler\r\n * @param event The Event object\r\n */\r\nfunction overallFrownHandler(event: Event): void {\r\n\tselectedFeedbackType = FeedbackType.Frown;\r\n\tselectedPanelType = undefined;\r\n\tsetAriaSelectedAttributes(IDs.OverallFrownAnchor);\r\n\tUiUtils.setAttributeOnHtmlElement(IDs.MiddleFormContainer, AttributeName.AriaExpanded, AttributeValue.True);\r\n\tUiUtils.setAttributeOnHtmlElement(IDs.MiddleFormContainer, AttributeName.AriaLabelledBy, IDs.OverallFrownAnchor);\r\n\toverallHandler(event, IDs.OverallFrownAnchor);\r\n}\r\n\r\n/**\r\n * Idea button event handler\r\n * @param event The Event object\r\n */\r\nfunction overallIdeaHandler(event: Event): void {\r\n\tselectedFeedbackType = FeedbackType.Idea;\r\n\tselectedPanelType = undefined;\r\n\tsetAriaSelectedAttributes(IDs.OverallIdeaAnchor);\r\n\tUiUtils.setAttributeOnHtmlElement(IDs.MiddleFormContainer, AttributeName.AriaExpanded, AttributeValue.True);\r\n\tUiUtils.setAttributeOnHtmlElement(IDs.MiddleFormContainer, AttributeName.AriaLabelledBy, IDs.OverallIdeaAnchor);\r\n\toverallHandler(event, IDs.OverallIdeaAnchor);\r\n}\r\n\r\n/**\r\n * Bug button event handler\r\n * @param event The Event object\r\n */\r\nfunction overallBugHandler(event: Event): void {\r\n\tselectedFeedbackType = FeedbackType.Bug;\r\n\tselectedPanelType = undefined;\r\n\tsetAriaSelectedAttributes(IDs.OverallBugAnchor);\r\n\tUiUtils.setAttributeOnHtmlElement(IDs.MiddleFormContainer, AttributeName.AriaExpanded, AttributeValue.True);\r\n\tUiUtils.setAttributeOnHtmlElement(IDs.MiddleFormContainer, AttributeName.AriaLabelledBy, IDs.OverallBugAnchor);\r\n\toverallHandler(event, IDs.OverallBugAnchor);\r\n}\r\n\r\n/**\r\n * Thanks pane event handler\r\n * @param event The Event object\r\n */\r\nfunction overallThanksHandler(event: Event): void {\r\n\tselectedFeedbackType = undefined;\r\n\tselectedPanelType = PanelType.Thanks;\r\n\r\n\tSetVisibilityExceptFor(IDs.ThanksPanelContainer, false);\r\n\r\n\toverallHandler(event, undefined);\r\n}\r\n\r\n/**\r\n * Sets visibility for all content panes except for specified.\r\n * @param except Pane not to set visibility for.\r\n * @param visible Visibility to be set\r\n */\r\nfunction SetVisibilityExceptFor(except: string, visible: boolean) {\r\n\tUiUtils.setElementVisibility(IDs.LeftFormContainer, visible);\r\n\tconst feedbackPanes = document.getElementById(IDs.MiddleFormContainer).children;\r\n\tfor (let currentFeedbackPane = 0; currentFeedbackPane < feedbackPanes.length; currentFeedbackPane++) {\r\n\t\tif (feedbackPanes[currentFeedbackPane].id !== except) {\r\n\t\t\tUiUtils.setElementVisibility(feedbackPanes[currentFeedbackPane].id, visible);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Main content holder slide left animation\r\n * @param {string} containerId The id of the container to be made visible\r\n * @return {void}\r\n */\r\nfunction mainContentHolderSlideLeft(containerId: string): void {\r\n\tfor (let feedbackType in formTemplates) {\r\n\t\tif (formTemplates.hasOwnProperty(feedbackType)) {\r\n\t\t\tUiUtils.setElementVisibility(formTemplates[feedbackType].containerId, false);\r\n\t\t}\r\n\t}\r\n\r\n\tif (useNarrowLayout) {\r\n\t\tUiUtils.setElementVisibility(IDs.LeftFormContainer, false);\r\n\t\tUiUtils.setElementVisibility(IDs.MiddleFormContainer, true);\r\n\t\tUiUtils.setElementVisibility(containerId, true);\r\n\t} else {\r\n\t\tUiUtils.addClassById(IDs.ColumnSeparatorDiv, Classes.ShowRightBorder);\r\n\t\tUiUtils.setElementVisibility(IDs.MiddleFormContainer, true);\r\n\t\tUiUtils.setElementVisibility(containerId, true);\r\n\t\tUiUtils.addClassById(IDs.LeftFormContainer, Classes.SlideLeft);\r\n\t\tUiUtils.addClassById(IDs.MiddleFormContainer, Classes.SlideLeft);\r\n\t}\r\n}\r\n\r\n/**\r\n * Submit button event handler factory\r\n * @param event The Event object\r\n */\r\nfunction submitButtonHandlerFactory(submitButtonId: string, spinnerId: string, commentInputId: string,\r\n\temailInputId: string, screenshotCheckboxId: string, screenshotPreviewId: string,\r\n\tcategoriesDropdownId: string): (event: Event) => void {\r\n\treturn function (event: Event) {\r\n\t\tevent.preventDefault();\r\n\t\tevent.stopPropagation();\r\n\r\n\t\tUiUtils.setElementVisibility(submitButtonId, false);\r\n\t\tlet spinner = new Spinner(spinnerId);\r\n\r\n\t\tlet transporter: Transporter = new Transporter(\r\n\t\t\tConfiguration.get().getCommonInitOptions().environment,\r\n\t\t\t\"Sas\",\r\n\t\t\tConfiguration.get().getCommonInitOptions().appId,\r\n\t\t\tselectedFeedbackType,\r\n\t\t\tConfiguration.get().getCommonInitOptions().applicationGroup,\r\n\t\t\tConfiguration.get().getCommonInitOptions().telemetryGroup,\r\n\t\t\tConfiguration.get().getCommonInitOptions().webGroup,\r\n\t\t);\r\n\r\n\t\tlet commentElement: HTMLTextAreaElement = <HTMLTextAreaElement> document.getElementById(commentInputId);\r\n\t\tlet commentEntered: boolean = (commentElement && !!commentElement.value);\r\n\t\tif (commentEntered) {\r\n\t\t\ttransporter.setComment(commentElement.value);\r\n\t\t}\r\n\r\n\t\tlet emailCheckBox: HTMLInputElement = <HTMLInputElement> document.getElementById(IDs.EmailCheckBox);\r\n\t\tlet emailElement: HTMLTextAreaElement = <HTMLTextAreaElement> document.getElementById(emailInputId);\r\n\t\tlet isEmailIncluded: boolean = (emailElement && !!emailElement.value);\r\n\t\tif (emailCheckBox && emailCheckBox.checked && isEmailIncluded) {\r\n\t\t\ttransporter.setEmail(emailElement.value);\r\n\t\t}\r\n\r\n\t\tlet screenshotCheckBox = <HTMLInputElement> document.getElementById(screenshotCheckboxId);\r\n\t\tlet screenshotCheckBoxSelected: boolean = screenshotCheckBox && screenshotCheckBox.checked;\r\n\r\n\t\tlet categoryElement: HTMLSelectElement = <HTMLSelectElement> document.getElementById(categoriesDropdownId);\r\n\t\tlet isCategorySelected: boolean = (categoryElement && categoryElement.selectedIndex > 0);\r\n\t\tif (isCategorySelected) {\r\n\t\t\ttransporter.setCategory(categoryElement.value);\r\n\t\t}\r\n\r\n\t\tLogging.getLogger().logEvent(Logging.EventIds.InApp.UI.Form.Submit.VALUE,\r\n\t\t\tLogging.LogLevel.Critical,\r\n\t\t\t{\r\n\t\t\t\tFeedbackType: selectedFeedbackType,\r\n\t\t\t\tIsEmailIncluded: isEmailIncluded,\r\n\t\t\t\tIsScreenshotIncluded: screenshotCheckBoxSelected,\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t\tif (screenshotCheckBoxSelected) {\r\n\t\t\tlet startTime: number = performance.now();\r\n\t\t\tScreenshot.createScreenshot(document.body).then(\r\n\t\t\t\t(canvas: HTMLCanvasElement) => {\r\n\t\t\t\t\tlet endTime: number = performance.now();\r\n\t\t\t\t\tLogging.getLogger().logEvent(Logging.EventIds.Shared.Screenshot.Render.Success.VALUE,\r\n\t\t\t\t\t\tLogging.LogLevel.Critical,\r\n\t\t\t\t\t\t{ TimeMilliseconds: endTime - startTime });\r\n\t\t\t\t\ttransporter.setScreenshot(canvas);\r\n\t\t\t\t\ttransporter.submit();\r\n\t\t\t\t}\r\n\t\t\t).catch((error: any) => {\r\n\t\t\t\tlet endTime: number = performance.now();\r\n\t\t\t\tLogging.getLogger().logEvent(Logging.EventIds.Shared.Screenshot.Render.Failed.VALUE,\r\n\t\t\t\t\tLogging.LogLevel.Error,\r\n\t\t\t\t\t{ ErrorMessage: error, TimeMilliseconds: endTime - startTime });\r\n\t\t\t\ttransporter.submit();\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\ttransporter.submit();\r\n\t\t}\r\n\r\n\t\tspinner.destroy();\r\n\t\tConfiguration.get().setFeedbackSubmitted(true);\r\n\t\tif (!Configuration.get().getInAppFeedbackInitOptions().isShowThanks) {\r\n\t\t\tdismissAll();\r\n\t\t} else {\r\n\t\t\toverallThanksHandler(event);\r\n\t\t}\r\n\t};\r\n}\r\n\r\n/**\r\n * Close button event\r\n */\r\nfunction CloseButton(event: Event) {\r\n\tSetVisibilityExceptFor(IDs.ThanksPanelContainer, true);\r\n\tdismissAll();\r\n}\r\n\r\n/**\r\n * UserVoiceForm Go button event handler\r\n * Opens UserVoice forum in a new window\r\n * @param event The Event object\r\n */\r\nfunction UserVoiceFormGoButtonHandler(event: Event): void {\r\n\tevent.preventDefault();\r\n\tevent.stopPropagation();\r\n\r\n\twindow.open(document.getElementById(IDs.UserVoiceFormGoButton).getAttribute(AttributeName.Source));\r\n\tdismissAll();\r\n}\r\n\r\nfunction overallFeedbackPortalIdeaHandler(event: Event): void {\r\n\tevent.preventDefault();\r\n\tevent.stopPropagation();\r\n\r\n\twindow.open(Configuration.get().getInAppFeedbackInitOptions().feedbackForumUrl);\r\n\tdismissAll();\r\n}\r\n\r\n/**\r\n * ScreenshotCheckbox Click event handler. Populate preview if checkbox is checked \r\n * @param screenshotCheckboxId The Id of screenshot checkbox\r\n * @param screenshotPreviewId The Id of preview\r\n * @param event The Event object\r\n */\r\nfunction ScreenshotCheckboxClickHandler(screenshotCheckboxId: string, screenshotPreviewId: string): (event: Event) => void {\r\n\treturn function (event: Event) {\r\n\t\tUiUtils.ScreenshotPreviewByCheckbox(screenshotCheckboxId, screenshotPreviewId);\r\n\t};\r\n}\r\n\r\n/**\r\n * Cancel button event handler factory\r\n */\r\nfunction CancelButtonHandler(): void {\r\n\tdismissAll();\r\n}\r\n\r\nfunction emailCheckBoxHandler(event: Event): void {\r\n\t// show email if checked and show default string if unchecked\r\n\tlet emailCheckBox: HTMLInputElement = <HTMLInputElement> document.getElementById(IDs.EmailCheckBox);\r\n\tif (emailCheckBox) {\r\n\t\t// multiFeedback form emailTextBox has id  IDs.BasicFormEmailInput\r\n\t\t// singleFeedback form emailTextBox has id IDs.SingleFormEmailInput\r\n\t\t// First we try to get with IDs.SingleFormEmailInput\r\n\t\t// if it does not exists, which means this is a multiFeedback form, then we get it with IDs.BasicFormEmailInput\r\n\t\tlet emailTextBox: HTMLInputElement = <HTMLInputElement> document.getElementById(IDs.SingleFormEmailInput);\r\n\t\tif (!emailTextBox) {\r\n\t\t\temailTextBox = <HTMLInputElement> document.getElementById(IDs.BasicFormEmailInput);\r\n\t\t}\r\n\t\temailTextBox.value = emailCheckBox.checked ? Configuration.get().getCommonInitOptions().userEmail : null;\r\n\t\temailTextBox.disabled = !emailCheckBox.checked;\r\n\t}\r\n}\r\n\r\nfunction basicFormInputHandler(event: Event): void {\r\n\tlet commentElement: HTMLTextAreaElement = <HTMLTextAreaElement> document.getElementById(IDs.BasicFormComment);\r\n\tlet commentEntered: boolean = (commentElement && !!commentElement.value);\r\n\t(document.getElementById(IDs.BasicFormSubmitButton) as HTMLButtonElement).disabled = !commentEntered;\r\n}\r\n\r\nfunction singleFormInputHandler(event: Event): void {\r\n\tlet commentElement: HTMLTextAreaElement = <HTMLTextAreaElement> document.getElementById(IDs.SingleFormComment);\r\n\tlet commentEntered: boolean = (commentElement && !!commentElement.value);\r\n\t(document.getElementById(IDs.SingleFormSubmitButton) as HTMLButtonElement).disabled = !commentEntered;\r\n}\r\n","/**\r\n * FormTemplateType.ts\r\n *\r\n * An enum for the types of forms available.\r\n */\r\n\r\nexport enum FormTemplateType {\r\n\tSingle = 0,\r\n\tBasic = 1,\r\n\tUserVoice = 2,\r\n\tFeedbackPortalIdea = 3,\r\n}\r\n","/**\r\n * CategoriesDropdown.ts\r\n *\r\n * A module to render the categories dropdown\r\n */\r\n\r\nimport * as UIStrings from \"./../UIStrings/UIStrings\";\r\nimport { Tags }  from \"./UiConstants\";\r\nimport { IUIAsJson } from \"./Renderer\";\r\n\r\n/**\r\n * Generate custom categories drop-down list. The list will contain just the\r\n * placeholder string if customCategories contains no value.\r\n * @param customCategories category values\r\n */\r\nexport function generate(customCategories: string[]): IUIAsJson[] {\r\n\tlet categories = customCategories ? customCategories : [];\r\n\r\n\tlet result: IUIAsJson[] = [{\r\n\t\tattributes: [{ name: \"selected\", value: \"true\" }],\r\n\t\tinnerText: UIStrings.getUIStrings().Form.CategoryPlaceholder,\r\n\t\ttag: Tags.Option,\r\n\t}];\r\n\r\n\tfor (let category of categories) {\r\n\t\tresult.push({\r\n\t\t\tinnerText: category,\r\n\t\t\ttag: Tags.Option,\r\n\t\t});\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\r\n * RatingControl.ts\r\n *\r\n * A module for a rating control.\r\n */\r\n\r\nimport { AttributeName, Classes, Tags } from \"./UiConstants\";\r\nimport * as Renderer from \"./Renderer\";\r\n\r\nlet starId: string = \"obf-star\";\r\n\r\nlet starDefinition: Renderer.IUIAsJson = {\r\n\tchildren: [\r\n\t\t{\r\n\t\t\tattributes: [\r\n\t\t\t\t{ name: AttributeName.Id, value: starId },\r\n\t\t\t\t{ name: AttributeName.X, value: \"0\" },\r\n\t\t\t\t{ name: AttributeName.Y, value: \"0\" },\r\n\t\t\t\t{ name: AttributeName.Width, value: \"105\" },\r\n\t\t\t\t{ name: AttributeName.Height, value: \"100\" },\r\n\t\t\t\t{\r\n\t\t\t\t\tname: AttributeName.Points,\r\n\t\t\t\t\tvalue: \"52.5, 80.3 84, 100 76.3, 63 105, 38 67.2, 35 52.5, 0 37.8, 35 0, 38 28.7, 63 20, 100 52.5, 80.3\",\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t\tid: starId,\r\n\t\t\ttag: Tags.Polygon,\r\n\t\t},\r\n\t],\r\n\ttag: Tags.Defs,\r\n};\r\n\r\nlet firstStar: Renderer.IUIAsJson = {\r\n\tattributes: [{ name: AttributeName.xlinkHref, value: `#${starId}` }],\r\n\ttag: Tags.Use,\r\n};\r\n\r\nlet secondStar: Renderer.IUIAsJson = {\r\n\tattributes: [\r\n\t\t{ name: AttributeName.xlinkHref, value: `#${starId}` },\r\n\t\t{ name: AttributeName.Transform, value: \"translate(105 0)\" },\r\n\t],\r\n\ttag: Tags.Use,\r\n};\r\n\r\nlet thirdStar: Renderer.IUIAsJson = {\r\n\tattributes: [\r\n\t\t{ name: AttributeName.xlinkHref, value: `#${starId}` },\r\n\t\t{ name: AttributeName.Transform, value: \"translate(210 0)\" },\r\n\t],\r\n\ttag: Tags.Use,\r\n};\r\n\r\nlet fourthStar: Renderer.IUIAsJson = {\r\n\tattributes: [\r\n\t\t{ name: AttributeName.xlinkHref, value: `#${starId}` },\r\n\t\t{ name: AttributeName.Transform, value: \"translate(315 0)\" },\r\n\t],\r\n\ttag: Tags.Use,\r\n};\r\n\r\nlet fifthStar: Renderer.IUIAsJson = {\r\n\tattributes: [\r\n\t\t{ name: AttributeName.xlinkHref, value: `#${starId}` },\r\n\t\t{ name: AttributeName.Transform, value: \"translate(420 0)\" },\r\n\t],\r\n\ttag: Tags.Use,\r\n};\r\n\r\nlet emptyStars: Renderer.IUIAsJson = {\r\n\tattributes: [{ name: AttributeName.ViewBox, value: \"0 0 525 100\" }],\r\n\tchildren: [starDefinition, firstStar, secondStar, thirdStar, fourthStar, fifthStar],\r\n\tclasses: [Classes.RatingGraphic],\r\n\ttag: Tags.Svg,\r\n};\r\n\r\nlet oneFilledStar: Renderer.IUIAsJson = {\r\n\tattributes: [{ name: AttributeName.ViewBox, value: \"0 0 105 100\" }],\r\n\tchildren: [starDefinition, firstStar],\r\n\tclasses: [Classes.RatingGraphic, Classes.RatingGraphicFilled],\r\n\ttag: Tags.Svg,\r\n};\r\n\r\nlet twoFilledStar: Renderer.IUIAsJson = {\r\n\tattributes: [{ name: AttributeName.ViewBox, value: \"0 0 210 100\" }],\r\n\tchildren: [starDefinition, firstStar, secondStar],\r\n\tclasses: [Classes.RatingGraphic, Classes.RatingGraphicFilled],\r\n\ttag: Tags.Svg,\r\n};\r\n\r\nlet threeFilledStar: Renderer.IUIAsJson = {\r\n\tattributes: [{ name: AttributeName.ViewBox, value: \"0 0 315 100\" }],\r\n\tchildren: [starDefinition, firstStar, secondStar, thirdStar],\r\n\tclasses: [Classes.RatingGraphic, Classes.RatingGraphicFilled],\r\n\ttag: Tags.Svg,\r\n};\r\n\r\nlet fourFilledStar: Renderer.IUIAsJson = {\r\n\tattributes: [{ name: AttributeName.ViewBox, value: \"0 0 420 100\" }],\r\n\tchildren: [starDefinition, firstStar, secondStar, thirdStar, fourthStar],\r\n\tclasses: [Classes.RatingGraphic, Classes.RatingGraphicFilled],\r\n\ttag: Tags.Svg,\r\n};\r\n\r\nlet fiveFilledStar: Renderer.IUIAsJson = {\r\n\tattributes: [{ name: AttributeName.ViewBox, value: \"0 0 525 100\" }],\r\n\tchildren: [starDefinition, firstStar, secondStar, thirdStar, fourthStar, fifthStar],\r\n\tclasses: [Classes.RatingGraphic, Classes.RatingGraphicFilled],\r\n\ttag: Tags.Svg,\r\n};\r\n\r\nexport function generate(id: string): Renderer.IUIAsJson {\r\n\treturn {\r\n\t\tchildren: [\r\n\t\t\temptyStars,\r\n\t\t\t{\r\n\t\t\t\tattributes: [\r\n\t\t\t\t\t{ name: AttributeName.Type, value: \"radio\" },\r\n\t\t\t\t\t{ name: AttributeName.Name, value: id },\r\n\t\t\t\t\t{ name: AttributeName.Value, value: \"1\" },\r\n\t\t\t\t],\r\n\t\t\t\ttag: Tags.Input,\r\n\t\t\t},\r\n\t\t\toneFilledStar,\r\n\t\t\t{\r\n\t\t\t\tattributes: [\r\n\t\t\t\t\t{ name: AttributeName.Type, value: \"radio\" },\r\n\t\t\t\t\t{ name: AttributeName.Name, value: id },\r\n\t\t\t\t\t{ name: AttributeName.Value, value: \"2\" },\r\n\t\t\t\t],\r\n\t\t\t\ttag: Tags.Input,\r\n\t\t\t},\r\n\t\t\ttwoFilledStar,\r\n\t\t\t{\r\n\t\t\t\tattributes: [\r\n\t\t\t\t\t{ name: AttributeName.Type, value: \"radio\" },\r\n\t\t\t\t\t{ name: AttributeName.Name, value: id },\r\n\t\t\t\t\t{ name: AttributeName.Value, value: \"3\" },\r\n\t\t\t\t],\r\n\t\t\t\ttag: Tags.Input,\r\n\t\t\t},\r\n\t\t\tthreeFilledStar,\r\n\t\t\t{\r\n\t\t\t\tattributes: [\r\n\t\t\t\t\t{ name: AttributeName.Type, value: \"radio\" },\r\n\t\t\t\t\t{ name: AttributeName.Name, value: id },\r\n\t\t\t\t\t{ name: AttributeName.Value, value: \"4\" },\r\n\t\t\t\t],\r\n\t\t\t\ttag: Tags.Input,\r\n\t\t\t},\r\n\t\t\tfourFilledStar,\r\n\t\t\t{\r\n\t\t\t\tattributes: [\r\n\t\t\t\t\t{ name: AttributeName.Type, value: \"radio\" },\r\n\t\t\t\t\t{ name: AttributeName.Name, value: id },\r\n\t\t\t\t\t{ name: AttributeName.Value, value: \"5\" },\r\n\t\t\t\t],\r\n\t\t\t\ttag: Tags.Input,\r\n\t\t\t},\r\n\t\t\tfiveFilledStar,\r\n\t\t],\r\n\t\tclasses: [Classes.Rating],\r\n\t\tid: id,\r\n\t\ttag: Tags.Span,\r\n\t};\r\n}\r\n","/**\r\n * BasicFormTemplate.ts\r\n *\r\n * A form template with contact info fields.\r\n */\r\n\r\nimport * as UIStrings from \"./../../../UIStrings/UIStrings\";\r\nimport { FormTemplateType } from \"./FormTemplateType\";\r\nimport { IUIAsJson } from \"./../../Renderer\";\r\nimport * as CategoriesDropdown from \"./../../CategoriesDropdown\";\r\nimport * as RatingControl from \"./../../RatingControl\";\r\nimport * as Configuration from \"./../../../Configuration/Configuration\";\r\nimport { FeedbackType, OCPSValues } from \"./../../../Constants\";\r\nimport { AttributeName, AttributeValue, Classes, IDs, Tags, Urls } from \"./../../UiConstants\";\r\n\r\n/**\r\n * Generate the markup\r\n * @returns the markup as json\r\n */\r\nexport function generate(): IUIAsJson {\r\n\tlet categories = Configuration.get().getInAppFeedbackLaunchOptions().categories;\r\n\tlet formSchema = {\r\n\t\tchildren: [\r\n\t\t\t{\r\n\t\t\t\tattributes: [{ name: AttributeName.For, value: IDs.BasicFormComment }],\r\n\t\t\t\tclasses: [Classes.FontSubtitle, Classes.TextAlignLeft, Classes.FormQuestionMiddleText],\r\n\t\t\t\tid: IDs.BasicFormQuestionMiddleText,\r\n\t\t\t\ttag: Tags.Label,\r\n\t\t\t\tinnerText: !Configuration.get().getInAppFeedbackInitOptions().transitionEnabled\r\n\t\t\t\t\t? UIStrings.getUIStrings().SingleForm.Title\r\n\t\t\t\t\t: \"\",\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tattributes: [{ name: AttributeName.Id, value: IDs.BasicFormCategoriesDropdown },\r\n\t\t\t\t{ name: AttributeName.AriaLabel, value: UIStrings.getUIStrings().Form.CategoryPlaceholder }],\r\n\t\t\t\tbrs: categories.show,\r\n\t\t\t\tchildren: CategoriesDropdown.generate(categories ? categories.customCategories : null),\r\n\t\t\t\tclasses: [Classes.FontSubText, Classes.FormCategoriesDropdown, Classes.TextInput],\r\n\t\t\t\ttag: Tags.Select,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tattributes: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: AttributeName.Placeholder,\r\n\t\t\t\t\t\tvalue: UIStrings.getUIStrings().Form.CommentPlaceholder,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: AttributeName.MaxLength,\r\n\t\t\t\t\t\tvalue: AttributeValue.TextAreaMaxLength,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FontSubText, Classes.FormComment, Classes.TextInput],\r\n\t\t\t\tid: IDs.BasicFormComment,\r\n\t\t\t\ttag: Tags.TextArea,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tbrs: false, // disable rating for now\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [{ name: AttributeName.For, value: IDs.BasicFormRating }],\r\n\t\t\t\t\t\tclasses: [Classes.FontText, Classes.TextAlignLeft, Classes.FormRatingLabel],\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.RatingLabel,\r\n\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t},\r\n\t\t\t\t\tRatingControl.generate(IDs.BasicFormRating),\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormRatingContainer],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tbrs: isEmailEnabled(),\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Type,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.Checkbox,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeValue.Unchecked,\r\n\t\t\t\t\t\t\t\tvalue: \"\",\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [Classes.FormEmailCheckBox, Classes.CheckBox],\r\n\t\t\t\t\t\tid: IDs.EmailCheckBox,\r\n\t\t\t\t\t\ttag: Tags.Input,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [{ name: AttributeName.For, value: IDs.EmailCheckBox }],\r\n\t\t\t\t\t\tclasses: [Classes.FontSubText, Classes.TextAlignLeft, Classes.FormEmailLabel],\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.EmailCheckBoxLabel,\r\n\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Type,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.Text,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Placeholder,\r\n\t\t\t\t\t\t\t\tvalue: UIStrings.getUIStrings().Form.EmailPlaceholder,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.AriaLabel,\r\n\t\t\t\t\t\t\t\tvalue: UIStrings.getUIStrings().Form.EmailPlaceholder,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Name,\r\n\t\t\t\t\t\t\t\tvalue: IDs.BasicFormEmailInput,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.MaxLength,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.TextAreaMaxLength,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Value,\r\n\t\t\t\t\t\t\t\tvalue:\r\n\t\t\t\t\t\t\t\t\tConfiguration.get().getInAppFeedbackInitOptions().userEmail\r\n\t\t\t\t\t\t\t\t\t\t? Configuration.get().getInAppFeedbackInitOptions().userEmail\r\n\t\t\t\t\t\t\t\t\t\t: \"\",\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [Classes.FontSubText, Classes.FormEmailInput, Classes.TextInput],\r\n\t\t\t\t\t\tid: IDs.BasicFormEmailInput,\r\n\t\t\t\t\t\ttag: Tags.Input,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormEmailContainer],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Type,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.Checkbox,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Value,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.Unchecked,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tbrs: isScreenshotEnabled(),\r\n\t\t\t\t\t\tclasses: [Classes.FormScreenshotCheckbox, Classes.CheckBox],\r\n\t\t\t\t\t\tid: IDs.BasicFormScreenshotCheckbox,\r\n\t\t\t\t\t\ttag: Tags.Input,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [{ name: AttributeName.For, value: IDs.BasicFormScreenshotCheckbox }],\r\n\t\t\t\t\t\tbrs: isScreenshotEnabled(),\r\n\t\t\t\t\t\tclasses: [Classes.FontSubText, Classes.TextAlignLeft, Classes.FormScreenshotLabel],\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.ScreenshotLabel,\r\n\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Preview,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.ScreenshotPreview,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Alt,\r\n\t\t\t\t\t\t\t\tvalue: UIStrings.getUIStrings().Form.ScreenshotImgAltText,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tbrs: Configuration.get().getInAppFeedbackInitOptions().screenshot,\r\n\t\t\t\t\t\tid: IDs.BasicFormScreenshotPreview,\r\n\t\t\t\t\t\tclasses: [Classes.FormScreenshotPreview],\r\n\t\t\t\t\t\ttag: Tags.Img,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormScreenshotContainer],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tchildren:\r\n\t\t\t\t\t[\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tclasses: [Classes.FontSubSubText, Classes.TextAlignLeft],\r\n\t\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.PrivacyLabel,\r\n\t\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tclasses: [Classes.FontSubSubText, Classes.TextAlignLeft],\r\n\t\t\t\t\t\t\tinnerText: Configuration.get().getCommonInitOptions().isCommercialHost\r\n\t\t\t\t\t\t\t\t? UIStrings.getUIStrings().Form.PrivacyConsent + \" \" : \"\",\r\n\t\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tname: AttributeName.HRef,\r\n\t\t\t\t\t\t\t\t\tvalue: Urls.PrivacyStatementLink,\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tname: AttributeName.Target,\r\n\t\t\t\t\t\t\t\t\tvalue: AttributeValue.BlankWindow,\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tname: AttributeName.Rel,\r\n\t\t\t\t\t\t\t\t\tvalue: AttributeValue.NoReferrer,\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\tclasses: [Classes.Link],\r\n\t\t\t\t\t\t\tid: IDs.PrivacyStatementLink,\r\n\t\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().PrivacyStatement,\r\n\t\t\t\t\t\t\ttag: Tags.Anchor,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FontSubSubText, Classes.TextAlignLeft, Classes.PrivacyStatementLinkDiv],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{ name: AttributeName.Type, value: AttributeValue.Button },\r\n\t\t\t\t\t\t\t{ name: AttributeName.AriaLabel, value: UIStrings.getUIStrings().Form.Cancel },\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [\r\n\t\t\t\t\t\t\tClasses.CancelButton,\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tid: IDs.BasicFormCancelButton,\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.Cancel,\r\n\t\t\t\t\t\ttag: Tags.Button,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Disabled,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.True,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [\r\n\t\t\t\t\t\t\tClasses.SubmitButton,\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tid: IDs.BasicFormSubmitButton,\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.Submit,\r\n\t\t\t\t\t\ttag: Tags.Button,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tclasses: [Classes.Spinner, Classes.Hidden],\r\n\t\t\t\t\t\tid: IDs.BasicFormSubmitButtonSpinner,\r\n\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormSubmitButtonContainer],\r\n\t\t\t},\r\n\t\t],\r\n\t\tclasses: [\r\n\t\t\tConfiguration.get().getInAppFeedbackInitOptions().transitionEnabled ? Classes.Hidden : Classes.Visible,\r\n\t\t\tClasses.MarginLeft60px,\r\n\t\t],\r\n\t\tid: containerId,\r\n\t};\r\n\treturn formSchema;\r\n}\r\n\r\n/**\r\n * The id for the container. This is the id of the top-most element and should\r\n * be unique to each form\r\n */\r\nexport let containerId: string = IDs.BasicFormContainer;\r\n\r\n/**\r\n * Forms may be used for different feedback types. This method executes form\r\n * specific logic when the feedback type is selected\r\n * @param feedbackType feedback type\r\n */\r\nexport function onSelect(feedbackType: FeedbackType): void {\r\n\tswitch (feedbackType) {\r\n\t\tcase FeedbackType.Smile: {\r\n\t\t\tdocument.getElementById(IDs.BasicFormQuestionMiddleText).textContent = UIStrings.getUIStrings().SmileForm.Title;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase FeedbackType.Frown: {\r\n\t\t\tdocument.getElementById(IDs.BasicFormQuestionMiddleText).textContent = UIStrings.getUIStrings().FrownForm.Title;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase FeedbackType.Idea: {\r\n\t\t\tdocument.getElementById(IDs.BasicFormQuestionMiddleText).textContent = UIStrings.getUIStrings().IdeaForm.Title;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase FeedbackType.Bug: {\r\n\t\t\tdocument.getElementById(IDs.BasicFormQuestionMiddleText).textContent = UIStrings.getUIStrings().BugForm.Title;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tdefault: {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tdocument.getElementById(IDs.BasicFormComment).focus();\r\n}\r\n\r\nexport function isEmailEnabled() {\r\n\tif (!Configuration.get().getInAppFeedbackInitOptions().showEmailAddress) {\r\n\t\treturn false;\r\n\t}\r\n\tif (Configuration.get().getCommonInitOptions().isCommercialHost) {\r\n\t\treturn Configuration.get().getCommonInitOptions().emailPolicyValue === OCPSValues.Enabled;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\nexport function isScreenshotEnabled() {\r\n\tif (!Configuration.get().getInAppFeedbackInitOptions().screenshot) {\r\n\t\treturn false;\r\n\t}\r\n\tif (Configuration.get().getCommonInitOptions().isCommercialHost) {\r\n\t\treturn Configuration.get().getCommonInitOptions().screenshotPolicyValue === OCPSValues.Enabled;\r\n\t}\r\n\treturn true;\r\n}\r\n/**\r\n * Form template type\r\n */\r\nexport let type: FormTemplateType = FormTemplateType.Basic;\r\n","/**\r\n * SingleFormTemplate.ts\r\n *\r\n * A form template with contact info fields.\r\n */\r\n\r\nimport * as UIStrings from \"./../../../UIStrings/UIStrings\";\r\nimport { FormTemplateType } from \"./FormTemplateType\";\r\nimport { IUIAsJson } from \"./../../Renderer\";\r\nimport * as CategoriesDropdown from \"./../../CategoriesDropdown\";\r\nimport * as RatingControl from \"./../../RatingControl\";\r\nimport * as Configuration from \"./../../../Configuration/Configuration\";\r\nimport { FeedbackType } from \"./../../../Constants\";\r\nimport { AttributeName, AttributeValue, Classes, IDs, Tags, Urls } from \"./../../UiConstants\";\r\nimport * as BasicForm from \"./BasicFormTemplate\";\r\n\r\n/**\r\n * Generate the markup\r\n * @returns the markup as json\r\n */\r\nexport function generate(): IUIAsJson {\r\n\tlet categories = Configuration.get().getInAppFeedbackLaunchOptions().categories;\r\n\r\n\tlet formSchema = {\r\n\t\tchildren: [\r\n\t\t\t{\r\n\t\t\t\tattributes: [{ name: AttributeName.For, value: IDs.SingleFormComment }],\r\n\t\t\t\tclasses: [\r\n\t\t\t\t\tClasses.FontSubtitle,\r\n\t\t\t\t\tClasses.TextAlignLeft,\r\n\t\t\t\t\tClasses.FormQuestionMiddleText,\r\n\t\t\t\t],\r\n\t\t\t\tid: IDs.SingleFormQuestionMiddleText,\r\n\t\t\t\tinnerText: UIStrings.getUIStrings().SingleForm.Title,\r\n\t\t\t\ttag: Tags.Label,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tattributes: [{ name: AttributeName.Id, value: IDs.SingleFormCategoriesDropdown }],\r\n\t\t\t\tbrs: categories.show,\r\n\t\t\t\tchildren: CategoriesDropdown.generate(categories ? categories.customCategories : null),\r\n\t\t\t\tclasses: [Classes.FontSubText, Classes.FormCategoriesDropdown, Classes.TextInput],\r\n\t\t\t\ttag: Tags.Select,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tattributes: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: AttributeName.Placeholder,\r\n\t\t\t\t\t\tvalue: UIStrings.getUIStrings().Form.CommentPlaceholder,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: AttributeName.MaxLength,\r\n\t\t\t\t\t\tvalue: AttributeValue.TextAreaMaxLength,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FontSubText, Classes.FormComment, Classes.TextInput],\r\n\t\t\t\tid: IDs.SingleFormComment,\r\n\t\t\t\ttag: Tags.TextArea,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tbrs: false, // ratings are disabled for now\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [{ name: AttributeName.For, value: IDs.SingleFormRating }],\r\n\t\t\t\t\t\tclasses: [\r\n\t\t\t\t\t\t\tClasses.FontSubText,\r\n\t\t\t\t\t\t\tClasses.TextAlignLeft,\r\n\t\t\t\t\t\t\tClasses.FormRatingLabel,\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.RatingLabel,\r\n\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t},\r\n\t\t\t\t\tRatingControl.generate(IDs.SingleFormRating),\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormRatingContainer],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tbrs: BasicForm.isEmailEnabled(),\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Type,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.Checkbox,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeValue.Unchecked,\r\n\t\t\t\t\t\t\t\tvalue: \"\",\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [Classes.FormEmailCheckBox, Classes.CheckBox],\r\n\t\t\t\t\t\tid: IDs.EmailCheckBox,\r\n\t\t\t\t\t\ttag: Tags.Input,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [{ name: AttributeName.For, value: IDs.EmailCheckBox }],\r\n\t\t\t\t\t\tclasses: [Classes.FontSubText, Classes.TextAlignLeft, Classes.FormEmailLabel],\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.EmailCheckBoxLabel,\r\n\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Type,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.Text,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Placeholder,\r\n\t\t\t\t\t\t\t\tvalue: UIStrings.getUIStrings().Form.EmailPlaceholder,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.AriaLabel,\r\n\t\t\t\t\t\t\t\tvalue: UIStrings.getUIStrings().Form.EmailPlaceholder,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Name,\r\n\t\t\t\t\t\t\t\tvalue: IDs.SingleFormEmailInput,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.MaxLength,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.TextAreaMaxLength,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Value,\r\n\t\t\t\t\t\t\t\tvalue:\r\n\t\t\t\t\t\t\t\t\tConfiguration.get().getInAppFeedbackInitOptions().userEmail\r\n\t\t\t\t\t\t\t\t\t? Configuration.get().getInAppFeedbackInitOptions().userEmail\r\n\t\t\t\t\t\t\t\t\t: \"\",\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [Classes.FontSubText, Classes.FormEmailInput, Classes.TextInput],\r\n\t\t\t\t\t\tid: IDs.SingleFormEmailInput,\r\n\t\t\t\t\t\ttag: Tags.Input,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormEmailContainer],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Type,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.Checkbox,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Value,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.Unchecked,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tbrs: BasicForm.isScreenshotEnabled(),\r\n\t\t\t\t\t\tclasses: [Classes.FormScreenshotCheckbox, Classes.CheckBox],\r\n\t\t\t\t\t\tid: IDs.SingleFormScreenshotCheckbox,\r\n\t\t\t\t\t\ttag: Tags.Input,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [{ name: AttributeName.For, value: IDs.SingleFormScreenshotCheckbox }],\r\n\t\t\t\t\t\tbrs: BasicForm.isScreenshotEnabled(),\r\n\t\t\t\t\t\tclasses: [Classes.FontText, Classes.TextAlignLeft, Classes.FormScreenshotLabel],\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.ScreenshotLabel,\r\n\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Preview,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.ScreenshotPreview,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tbrs: Configuration.get().getInAppFeedbackInitOptions().screenshot,\r\n\t\t\t\t\t\tid: IDs.SingleFormScreenshotPreview,\r\n\t\t\t\t\t\tclasses: [Classes.FormScreenshotPreview],\r\n\t\t\t\t\t\ttag: Tags.Img,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormScreenshotContainer],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tchildren:\r\n\t\t\t\t[\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tclasses: [Classes.FontSubSubText, Classes.TextAlignLeft],\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.PrivacyLabel,\r\n\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tclasses: [Classes.FontSubSubText, Classes.TextAlignLeft],\r\n\t\t\t\t\t\tinnerText: Configuration.get().getCommonInitOptions().isCommercialHost\r\n\t\t\t\t\t\t? UIStrings.getUIStrings().Form.PrivacyConsent + \" \" : \"\",\r\n\t\t\t\t\t\ttag: Tags.Label,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.HRef,\r\n\t\t\t\t\t\t\t\tvalue: Urls.PrivacyStatementLink,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Target,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.BlankWindow,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Rel,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.NoReferrer,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [Classes.Link],\r\n\t\t\t\t\t\tid: IDs.PrivacyStatementLink,\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().PrivacyStatement,\r\n\t\t\t\t\t\ttag: Tags.Anchor,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FontSubSubText, Classes.TextAlignLeft, Classes.PrivacyStatementLinkDiv],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{ name: AttributeName.Type, value: AttributeValue.Button},\r\n\t\t\t\t\t\t\t{ name: AttributeName.AriaLabel, value: UIStrings.getUIStrings().Form.Cancel },\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [\r\n\t\t\t\t\t\t\tClasses.CancelButton,\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tid: IDs.SingleFormCancelButton,\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.Cancel,\r\n\t\t\t\t\t\ttag: Tags.Button,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tname: AttributeName.Disabled,\r\n\t\t\t\t\t\t\t\tvalue: AttributeValue.True,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [Classes.SubmitButton],\r\n\t\t\t\t\t\tid: IDs.SingleFormSubmitButton,\r\n\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().Form.Submit,\r\n\t\t\t\t\t\ttag: Tags.Button,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tclasses: [Classes.Spinner, Classes.Hidden],\r\n\t\t\t\t\t\tid: IDs.SingleFormSubmitButtonSpinner,\r\n\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormSubmitButtonContainer],\r\n\t\t\t},\r\n\t\t],\r\n\t\tid: containerId,\r\n\t};\r\n\treturn formSchema;\r\n}\r\n\r\n/**\r\n * The id for the container. This is the id of the top-most element and should\r\n * be unique to each form\r\n */\r\nexport let containerId: string = IDs.SingleFormContainer;\r\n\r\n/**\r\n * Forms may be used for different feedback types. This method executes form\r\n * specific logic when the feedback type is selected\r\n * @param feedbackType feedback type\r\n */\r\nexport function onSelect(feedbackType: FeedbackType): void {\r\n\tdocument.getElementById(IDs.SingleFormComment).focus();\r\n}\r\n\r\n/**\r\n * Form template type\r\n */\r\nexport let type: FormTemplateType = FormTemplateType.Single;\r\n","/**\r\n * Layout.ts\r\n *\r\n * Module for the layout\r\n */\r\n\r\nimport { IFormTemplate } from \"./FormTemplates/IFormTemplate\";\r\nimport { FeedbackType } from \"./../../Constants\";\r\nimport { AttributeName, AttributeValue, Classes, IDs, Tags } from \"./../UiConstants\";\r\nimport * as Renderer from \"./../Renderer\";\r\nimport * as UIStrings from \"./../../UIStrings/UIStrings\";\r\nimport * as Utils from \"./../Utils\";\r\nimport * as SingleFormTemplate from \"./FormTemplates/SingleFormTemplate\";\r\nimport { IPanelTemplate } from \"./PanelTemplates/IPanelTemplate\";\r\nimport { IUIAsJson } from \"./../Renderer\";\r\nimport * as Configuration from \"./../../Configuration/Configuration\";\r\n\r\nexport {IFormTemplate} from \"./FormTemplates/IFormTemplate\";\r\n\r\n/**\r\n * Generates the multi layout as a Renderer.IUIAsJson object\r\n *\r\n * The TabFocus.ts has a dependency in the mainContainer. All tabbable elements\r\n * should be placed inside the mainContainer otherwise TabFocus.ts will not\r\n * function as expected.\r\n * @param {[key: number]: IFormTemplate} formTemplates FeedbackType -> FormTemplate mapping\r\n * @param {[key: number]: IPanelTemplate} panelTemplates PanelType -> PanelTemplate mapping\r\n * @returns {Renderer.IUIAsJson} Renderer.IUIAsJson object\r\n */\r\nexport function generateMulti(\r\n\tformTemplates: { [key: number]: IFormTemplate },\r\n\tpanelTemplates: { [key: number]: IPanelTemplate }\r\n): Renderer.IUIAsJson {\r\n\tlet schema: Renderer.IUIAsJson = {\r\n\t\tattributes: [{ name: AttributeName.DataHtml2CanvasIgnore, value: AttributeValue.True }],\r\n\t\tchildren:\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\tattributes:\r\n\t\t\t\t[\r\n\t\t\t\t\t{ name: AttributeName.Role, value: AttributeValue.Dialog },\r\n\t\t\t\t\t{ name: AttributeName.AriaModal, value: AttributeValue.True },\r\n\t\t\t\t],\r\n\t\t\t\tchildren:\r\n\t\t\t\t[\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes:\r\n\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t{ name: AttributeName.Role, value: AttributeValue.TabList },\r\n\t\t\t\t\t\t\t{ name: AttributeName.AriaDescribedBy, value: IDs.QuestionLeftText },\r\n\t\t\t\t\t\t\t{ name: AttributeName.AriaLabel, value: UIStrings.getUIStrings().FeedbackSubtitle },\r\n\t\t\t\t\t\t\t{ name: AttributeName.AriaOrientation, value: AttributeValue.AriaOrientationValueVertical},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tchildren:\r\n\t\t\t\t\t\t[\r\n\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t// This adds a \"first\" dummy tabbable div to the mainContainer. It's used as a marker\r\n\t\t\t\t\t\t\t\t// to handle tabs and shift tabs so focus will stay with elements on just the feedback\r\n\t\t\t\t\t\t\t\t// dialog. Do not relocate this without updating the TabFocus.ts code.\r\n\t\t\t\t\t\t\t\tattributes: [{ name: AttributeName.TabIndex, value: AttributeValue.Zero }],\r\n\t\t\t\t\t\t\t\tid: IDs.FirstTabbable,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t\t\t{ name: AttributeName.Type, value: AttributeValue.Button },\r\n\t\t\t\t\t\t\t\t\t{ name: AttributeName.AriaLabel, value: UIStrings.getUIStrings().CloseLabel },\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\tid: IDs.CloseButton,\r\n\t\t\t\t\t\t\t\tclasses: [Classes.CloseButton],\r\n\t\t\t\t\t\t\t\t// tslint:disable-next-line:max-line-length\r\n\t\t\t\t\t\t\t\tinnerHTML: '<svg viewBox=\"4 4 16 16\" width=\"16px\" height=\"16px\" focusable=\"false\"><path d=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/></svg>',\r\n\t\t\t\t\t\t\t\ttag: Tags.Button,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tchildren:\r\n\t\t\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tclasses: [Classes.FormWideContainer, Classes.Hidden],\r\n\t\t\t\t\t\t\t\t\t\tchildren: generateMultiPanels(panelTemplates),\r\n\t\t\t\t\t\t\t\t\t\tid: IDs.LeftPanelContainer,\r\n\t\t\t\t\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tchildren:\r\n\t\t\t\t\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\tclasses: [Classes.FontSubtitle, Classes.TextAlignLeft],\r\n\t\t\t\t\t\t\t\t\t\t\t\tid: IDs.QuestionLeftText,\r\n\t\t\t\t\t\t\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().FeedbackSubtitle,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\tchildren:\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchildren: generateOverallAnchors(formTemplates),\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: IDs.OverallAnchorsContainer,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\t\t\t\t\tid: IDs.ColumnSeparatorDiv,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\t\t\tclasses: [Classes.FormContainer],\r\n\t\t\t\t\t\t\t\t\t\tid: IDs.LeftFormContainer,\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tchildren: generateMultiForms(formTemplates),\r\n\t\t\t\t\t\t\t\t\t\tclasses:\r\n\t\t\t\t\t\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t\t\t\t\t\tClasses.FormContainer,\r\n\t\t\t\t\t\t\t\t\t\t\t\tConfiguration.get().getInAppFeedbackInitOptions().transitionEnabled ? Classes.Hidden : Classes.Visible,\r\n\t\t\t\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\t\t\tattributes:\r\n\t\t\t\t\t\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ name: AttributeName.Role, value: AttributeValue.TabPanel},\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ name: AttributeName.AriaExpanded, value: AttributeValue.False},\r\n\t\t\t\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\t\t\tid: IDs.MiddleFormContainer,\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\tclasses: [Classes.Hidden],\r\n\t\t\t\t\t\t\t\tid: IDs.MainContentHolder,\r\n\t\t\t\t\t\t\t\ttag: Tags.Form,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t// This adds a \"last\" dummy tabbable div to the mainContainer. It's used as a marker\r\n\t\t\t\t\t\t\t\t// to handle tabs and shift tabs so focus will stay with elements on just the feedback\r\n\t\t\t\t\t\t\t\t// dialog. Do not relocate this without updating the TabFocus.ts code.\r\n\t\t\t\t\t\t\t\tattributes: [{ name: AttributeName.TabIndex, value: AttributeValue.Zero }],\r\n\t\t\t\t\t\t\t\tid: IDs.LastTabbable,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tid: IDs.MainContainer,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Utils.isRightToLeft() ? Classes.Rtl : \"\" ],\r\n\t\t\t\tid: IDs.OverlayBackground,\r\n\t\t\t},\r\n\t\t],\r\n\t};\r\n\treturn schema;\r\n}\r\n\r\n/**\r\n * Generates the single layout as a Renderer.IUIAsJson object\r\n *\r\n * The TabFocus.ts has a dependency in the mainContainer. All tabbable elements\r\n * should be placed inside the mainContainer otherwise TabFocus.ts will not\r\n * function as expected.\r\n * @param {[key: number]: IPanelTemplate} panelTemplates PanelType -> PanelTemplate mapping\r\n * @returns {Renderer.IUIAsJson} Renderer.IUIAsJson object\r\n */\r\nexport function generateSingle(panelTemplates: { [key: number]: IPanelTemplate }): Renderer.IUIAsJson {\r\n\tlet schema: Renderer.IUIAsJson = {\r\n\t\tattributes: [{ name: AttributeName.DataHtml2CanvasIgnore, value: AttributeValue.True }],\r\n\t\tchildren:\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\tchildren:\r\n\t\t\t\t[\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// This adds a \"first\" dummy tabbable div to the mainContainer. It's used as a marker\r\n\t\t\t\t\t\t// to handle tabs and shift tabs so focus will stay with elements on just the feedback\r\n\t\t\t\t\t\t// dialog. Do not relocate this without updating the TabFocus.ts code.\r\n\t\t\t\t\t\tattributes: [{ name: AttributeName.TabIndex, value: AttributeValue.Zero }],\r\n\t\t\t\t\t\tid: IDs.FirstTabbable,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t{ name: AttributeName.Type, value: AttributeValue.Button },\r\n\t\t\t\t\t\t\t{ name: AttributeName.AriaLabel, value: UIStrings.getUIStrings().CloseLabel },\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tid: IDs.CloseButton,\r\n\t\t\t\t\t\tclasses: [Classes.CloseButton],\r\n\t\t\t\t\t\t// tslint:disable-next-line:max-line-length\r\n\t\t\t\t\t\tinnerHTML: '<svg viewBox=\"4 4 16 16\" width=\"16px\" height=\"16px\" focusable=\"false\"><path d=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/></svg>',\r\n\t\t\t\t\t\ttag: Tags.Button,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tchildren:\r\n\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tchildren: [SingleFormTemplate.generate()],\r\n\t\t\t\t\t\t\t\tclasses: [Classes.FormContainer],\r\n\t\t\t\t\t\t\t\tid: IDs.MiddleFormContainer,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t].concat((generateMultiPanels(panelTemplates) as\r\n\t\t\t\t\t\t\tConcatArray<{ children: IUIAsJson[], classes: string[], id: string }>)),\r\n\t\t\t\t\t\tclasses: [Classes.Hidden],\r\n\t\t\t\t\t\tid: IDs.MainContentHolder,\r\n\t\t\t\t\t\ttag: Tags.Form,\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// This adds a \"last\" dummy tabbable div to the mainContainer. It's used as a marker\r\n\t\t\t\t\t\t// to handle tabs and shift tabs so focus will stay with elements on just the feedback\r\n\t\t\t\t\t\t// dialog. Do not relocate this without updating the TabFocus.ts code.\r\n\t\t\t\t\t\tattributes: [{ name: AttributeName.TabIndex, value: AttributeValue.Zero }],\r\n\t\t\t\t\t\tid: IDs.LastTabbable,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tid: IDs.MainContainer,\r\n\t\t\t},\r\n\t\t],\r\n\t\tclasses: [Classes.SingleLayout, Utils.isRightToLeft() ? Classes.Rtl : \"\" ],\r\n\t\tid: IDs.OverlayBackground,\r\n\t};\r\n\treturn schema;\r\n}\r\n\r\n/**\r\n * Generate Renderer.IUIAsJson objects that holds the different forms that will be used on the bellyband.\r\n * This is used to generate just one form of each one of the templates that are actually going to be used.\r\n * @param {[key: number]: IFormTemplate} formTemplates FeedbackType -> FormTemplate mapping\r\n * @returns {Renderer.IUIAsJson} Renderer.IUIAsJson object\r\n */\r\nfunction generateMultiForms(formTemplates: { [key: number]: IFormTemplate }): Renderer.IUIAsJson[] {\r\n\tlet wrapper: Renderer.IUIAsJson = {\r\n\t\tchildren: [],\r\n\t};\r\n\r\n\tlet pushedContainers: { [key: string]: boolean } = {};\r\n\r\n\tfor (let feedbackType in formTemplates) {\r\n\t\tif (formTemplates.hasOwnProperty(feedbackType)) {\r\n\t\t\tlet notExists: boolean = !(formTemplates[feedbackType].containerId in pushedContainers);\r\n\t\t\tif (notExists) {\r\n\t\t\t\twrapper.children.push(formTemplates[feedbackType].generate());\r\n\t\t\t\tpushedContainers[formTemplates[feedbackType].containerId] = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn wrapper.children;\r\n}\r\n\r\n/**\r\n * Generate Renderer.IUIAsJson objects that holds the different forms that will be used on the bellyband.\r\n * This is used to generate just one form of each one of the templates that are actually going to be used.\r\n * @param {[key: number]: IFormTemplate} formTemplates FeedbackType -> FormTemplate mapping\r\n * @returns {Renderer.IUIAsJson} Renderer.IUIAsJson object\r\n */\r\nfunction generateMultiPanels(panelTemplates: { [key: number]: IPanelTemplate }): Renderer.IUIAsJson[] {\r\n\tlet wrapper: Renderer.IUIAsJson = {\r\n\t\tchildren: [],\r\n\t};\r\n\r\n\tlet pushedContainers: { [key: string]: boolean } = {};\r\n\r\n\tfor (let panelType in panelTemplates) {\r\n\t\tif (panelTemplates.hasOwnProperty(panelType)) {\r\n\t\t\tlet notExists: boolean = !(panelTemplates[panelType].containerId in pushedContainers);\r\n\t\t\tif (notExists) {\r\n\t\t\t\twrapper.children.push(panelTemplates[panelType].generate());\r\n\t\t\t\tpushedContainers[panelTemplates[panelType].containerId] = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn wrapper.children;\r\n}\r\n\r\n/**\r\n * Generates Renderer.IUIAsJson object that holds the different anchors that will be used on the bellyband.\r\n * @param {[key: number]: IFormTemplate} formTemplates FeedbackType -> FormTemplate mapping\r\n * @returns {Renderer.IUIAsJson} Renderer.IUIAsJson object\r\n */\r\nfunction generateOverallAnchors(formTemplates: { [key: number]: IFormTemplate }): Renderer.IUIAsJson[] {\r\n\tlet wrapper: Renderer.IUIAsJson = {\r\n\t\tchildren: [],\r\n\t};\r\n\r\n\tif (FeedbackType.Smile in formTemplates) {\r\n\t\twrapper.children.push(generateOverallAnchor(IDs.OverallSmileAnchor, IDs.OverallSmileImage,\r\n\t\t\t// The svg code for the image\r\n\t\t\t// tslint:disable-next-line:max-line-length\r\n\t\t\t'<svg viewBox=\"0 0 72 72\" width=\"24px\" height=\"24px\" focusable=\"false\"><path d=\"M36 1C16.7 1 1 16.7 1 36s15.7 35 35 35c19.3 0 35-15.7 35-35S55.3 1 36 1ZM49.3 18.3c2.3 0 4.2 2.7 4.2 6 0 3.3-1.9 6-4.2 6 -2.3 0-4.2-2.7-4.2-6C45.1 21 47 18.3 49.3 18.3ZM22.9 18.3c2.3 0 4.2 2.7 4.2 6 0 3.3-1.9 6-4.2 6 -2.3 0-4.2-2.7-4.2-6C18.7 21 20.6 18.3 22.9 18.3ZM36 58.6c-8.5 0-16-4.1-20.9-10.4l3.5-3.6c3.5 4.5 9.9 7.6 17.4 7.6 7.4 0 13.9-3.1 17.4-7.6l3.6 3.6C52.1 54.4 44.4 58.6 36 58.6Z\"/></svg>',\r\n\t\t\tIDs.OverallSmileText, UIStrings.getUIStrings().SmileForm.Anchor));\r\n\t}\r\n\r\n\tif (FeedbackType.Frown in formTemplates) {\r\n\t\twrapper.children.push(generateOverallAnchor(IDs.OverallFrownAnchor, IDs.OverallFrownImage,\r\n\t\t\t// The svg code for the image\r\n\t\t\t// tslint:disable-next-line:max-line-length\r\n\t\t\t'<svg viewBox=\"0 0 72 72\" width=\"24px\" height=\"24px\" focusable=\"false\"><path d=\"M36 1C16.7 1 1 16.7 1 36s15.7 35 35 35c19.3 0 35-15.7 35-35S55.3 1 36 1ZM49.3 18.3c2.3 0 4.2 2.7 4.2 6 0 3.3-1.9 6-4.2 6 -2.3 0-4.2-2.7-4.2-6C45.1 21 47 18.3 49.3 18.3ZM22.9 18.3c2.3 0 4.2 2.7 4.2 6 0 3.3-1.9 6-4.2 6 -2.3 0-4.2-2.7-4.2-6C18.7 21 20.6 18.3 22.9 18.3ZM52.8 57.9c-3.3-4.4-9.6-7.3-16.7-7.3 -7.2 0-13.4 3-16.7 7.3l-3.4-3.4c4.7-6.1 11.9-10 20.1-10 8.2 0 15.5 4 20.2 10L52.8 57.9Z\"/></svg>',\r\n\t\t\tIDs.OverallFrownText, UIStrings.getUIStrings().FrownForm.Anchor));\r\n\t}\r\n\r\n\tif (FeedbackType.IdeaRedirect in formTemplates) {\r\n\t\twrapper.children.push(generateOverallAnchor(IDs.OverallFeedbackPortalIdeaAnchor, IDs.OverallIdeaImage,\r\n\t\t\t// The svg code for the image\r\n\t\t\t// tslint:disable-next-line:max-line-length\r\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" focusable=\"false\" viewBox=\"0,0,2048,2048\"><path fill=\"#FAFAFA\" fill-opacity=\"1.000\" d=\"M 213 1920 v -546 l 275 -649 h 1072 l 275 649 v 546 z\" /><path fill=\"#3A3A38\" fill-opacity=\"1.000\" d=\"M 1877 1365 v 598 h -1706 v -598 l 289 -682 h 288 l -41 41 l 44 44 h -239 l -248 597 h 1520 l -221 -532 l 63 -62 m 166 680 h -1536 v 426 h 1536 z\" /><path fill=\"#FAFAFA\" fill-opacity=\"1.000\" d=\"M 1049 1067 l -342 -343 l 664 -664 l 482 483 l -523 524 z\" /><path fill=\"#797774\" fill-opacity=\"1.000\" d=\"M 1536 649 l -271 -272 l 60 -60 l 272 271 m -211 212 l -272 -272 l 60 -60 l 272 271 m -211 211 l -272 -271 l 61 -61 l 271 272 z\" /><path fill=\"#1E8BCD\" fill-opacity=\"1.000\" d=\"M 989 1067 l -343 -343 l 725 -724 l 543 543 l -524 524 h -121 l 524 -524 l -422 -422 l -604 603 l 343 343 z\" /><path fill=\"#3A3A38\" fill-opacity=\"1.000\" d=\"M 1451 1109 h -854 v -85 h 854 z\" /></svg>',\r\n\t\t\tIDs.OverallIdeaText, UIStrings.getUIStrings().IdeaForm.Anchor));\r\n\t}\r\n\r\n\tif (FeedbackType.Idea in formTemplates) {\r\n\t\twrapper.children.push(generateOverallAnchor(IDs.OverallIdeaAnchor, IDs.OverallIdeaImage,\r\n\t\t\t// The svg code for the image\r\n\t\t\t// tslint:disable-next-line:max-line-length\r\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" focusable=\"false\" viewBox=\"0,0,2048,2048\"><path fill=\"#FAFAFA\" fill-opacity=\"1.000\" d=\"M 213 1920 v -546 l 275 -649 h 1072 l 275 649 v 546 z\" /><path fill=\"#3A3A38\" fill-opacity=\"1.000\" d=\"M 1877 1365 v 598 h -1706 v -598 l 289 -682 h 288 l -41 41 l 44 44 h -239 l -248 597 h 1520 l -221 -532 l 63 -62 m 166 680 h -1536 v 426 h 1536 z\" /><path fill=\"#FAFAFA\" fill-opacity=\"1.000\" d=\"M 1049 1067 l -342 -343 l 664 -664 l 482 483 l -523 524 z\" /><path fill=\"#797774\" fill-opacity=\"1.000\" d=\"M 1536 649 l -271 -272 l 60 -60 l 272 271 m -211 212 l -272 -272 l 60 -60 l 272 271 m -211 211 l -272 -271 l 61 -61 l 271 272 z\" /><path fill=\"#1E8BCD\" fill-opacity=\"1.000\" d=\"M 989 1067 l -343 -343 l 725 -724 l 543 543 l -524 524 h -121 l 524 -524 l -422 -422 l -604 603 l 343 343 z\" /><path fill=\"#3A3A38\" fill-opacity=\"1.000\" d=\"M 1451 1109 h -854 v -85 h 854 z\" /></svg>',\r\n\t\t\tIDs.OverallIdeaText, UIStrings.getUIStrings().IdeaForm.Anchor));\r\n\t}\r\n\r\n\tif (FeedbackType.Bug in formTemplates) {\r\n\t\twrapper.children.push(generateOverallAnchor(IDs.OverallBugAnchor, IDs.OverallBugImage,\r\n\t\t\t// The svg code for the image\r\n\t\t\t// tslint:disable-next-line:max-line-length\r\n\t\t\t'<svg viewBox=\"150 100 1748 1748\" width=\"24px\" height=\"24px\" focusable=\"false\"><path d=\"M1824 1088q0 26-19 45t-45 19h-224q0 171-67 290l208 209q19 19 19 45t-19 45q-18 19-45 19t-45-19l-198-197q-5 5-15 13t-42 28.5-65 36.5-82 29-97 13v-896h-128v896q-51 0-101.5-13.5t-87-33-66-39-43.5-32.5l-15-14-183 207q-20 21-48 21-24 0-43-16-19-18-20.5-44.5t15.5-46.5l202-227q-58-114-58-274h-224q-26 0-45-19t-19-45 19-45 45-19h224v-294l-173-173q-19-19-19-45t19-45 45-19 45 19l173 173h844l173-173q19-19 45-19t45 19 19 45-19 45l-173 173v294h224q26 0 45 19t19 45zm-480-576h-640q0-133 93.5-226.5t226.5-93.5 226.5 93.5 93.5 226.5z\"/></svg>',\r\n\t\t\tIDs.OverallBugText, UIStrings.getUIStrings().BugForm.Anchor));\r\n\t}\r\n\r\n\treturn wrapper.children;\r\n}\r\n\r\n/**\r\n * Generates a Renderer.IUIAsJson object that holds an anchor that will be used on the bellyband.\r\n * @param overallAnchorID the overall anchor id\r\n * @param overallImageID the image id\r\n * @param imageClass the image class (icon)\r\n * @param overallTextID the id for text box\r\n * @param uiString the string to display\r\n */\r\nfunction generateOverallAnchor(\r\n\toverallAnchorID: string, overallImageID: string, svgImage: string,\r\n\toverallTextID: string, uiString: string): Renderer.IUIAsJson {\r\n\treturn {\r\n\t\tattributes:\r\n\t\t[\r\n\t\t\t{ name: AttributeName.Type, value: AttributeValue.Button },\r\n\t\t\t{ name: AttributeName.Role, value: AttributeValue.Tab },\r\n\t\t\t{ name: AttributeName.AriaLabel, value: uiString },\r\n\t\t\t{ name: AttributeName.AriaSelected, value: AttributeValue.False },\r\n\t\t],\r\n\t\tchildren:\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\tclasses: [Classes.OverallImage],\r\n\t\t\t\tid: overallImageID,\r\n\t\t\t\tinnerHTML: svgImage,\r\n\t\t\t\ttag: Tags.Div,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tclasses: [Classes.FontSubtitle, Classes.OverallText],\r\n\t\t\t\tid: overallTextID,\r\n\t\t\t\tinnerText: uiString,\r\n\t\t\t},\r\n\t\t],\r\n\t\tclasses: [Classes.OverallAnchor, Classes.TextAlignLeft],\r\n\t\tid: overallAnchorID,\r\n\t\ttag: Tags.Button,\r\n\t};\r\n}\r\n","/* eslint @microsoft/sdl/no-inner-html: \"off\" */\r\n\r\n/**\r\n * Renderer.ts\r\n *\r\n * Module for rendering the markup\r\n */\r\n\r\nimport { AttributeName, Tags } from \"./UiConstants\";\r\n\r\n/**\r\n * Interface for an attribute\r\n */\r\nexport interface IAttribute {\r\n\tname: string;\r\n\tvalue: string;\r\n}\r\n\r\n/**\r\n * Interface for UI(HTML markup) as json\r\n */\r\nexport interface IUIAsJson {\r\n\tid?: string;\r\n\ttag?: string; // div by default\r\n\tclasses?: string[]; // CSS class\r\n\tattributes?: IAttribute[];\r\n\tchildren?: IUIAsJson[];\r\n\tinnerText?: string;\r\n\tinnerHTML?: string;\r\n\tbrs?: any; // should the element and its children be created? true by default\r\n}\r\n\r\n/**\r\n * Create DOM elements from Json structure\r\n * @param {UiAsJson} schema The Json structure\r\n * @param {boolean} svg Create svg element instead of html?\r\n * @return {HTMLElement} HTML elements with tree structure\r\n */\r\nexport function elementFromJson(schema: IUIAsJson, svg?: boolean): Element {\r\n\tif (typeof schema.brs === \"undefined\") {\r\n\t\tschema.brs = true;\r\n\t}\r\n\r\n\tif (!schema.brs) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (!schema.tag) {\r\n\t\tschema.tag = Tags.Div;\r\n\t}\r\n\r\n\tlet element: Element;\r\n\r\n\tif (schema.tag === Tags.Svg) {\r\n\t\tsvg = true;\r\n\t}\r\n\r\n\tif (svg) {\r\n\t\telement = document.createElementNS(\"http://www.w3.org/2000/svg\", schema.tag);\r\n\t} else {\r\n\t\telement = document.createElement(schema.tag);\r\n\t}\r\n\r\n\tif (schema.attributes) {\r\n\t\tlet attribute: IAttribute;\r\n\t\tfor (let i = 0; i < schema.attributes.length; i++) {\r\n\t\t\tattribute = schema.attributes[i];\r\n\t\t\tif (attribute.name === AttributeName.xlinkHref) {\r\n\t\t\t\telement.setAttributeNS(\"http://www.w3.org/1999/xlink\", AttributeName.HRef, attribute.value);\r\n\t\t\t} else {\r\n\t\t\t\telement.setAttribute(attribute.name, attribute.value);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (schema.id) {\r\n\t\telement.id = schema.id;\r\n\t}\r\n\r\n\tif (schema.classes) {\r\n\t\tlet concatClasses: string = schema.classes.join(\" \");\r\n\t\tif (svg) {\r\n\t\t\telement.setAttribute(AttributeName.Class, concatClasses);\r\n\t\t} else {\r\n\t\t\telement.className = concatClasses;\r\n\t\t}\r\n\t}\r\n\r\n\tif (schema.innerText && !svg) {\r\n\t\telement.textContent = schema.innerText;\r\n\t}\r\n\r\n\tif (schema.innerHTML && !svg) {\r\n\t\telement.innerHTML = schema.innerHTML;\r\n\t}\r\n\r\n\tif (schema.children) {\r\n\t\tfor (let i = 0; i < schema.children.length; i++) {\r\n\t\t\t// Sometimes IE mis-reports length\r\n\t\t\tlet cur: IUIAsJson = schema.children[i];\r\n\r\n\t\t\tif (cur) {\r\n\t\t\t\tlet child: Element = elementFromJson(cur, svg);\r\n\r\n\t\t\t\tif (child) {\r\n\t\t\t\t\telement.appendChild(child);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn element;\r\n}\r\n","/**\r\n * ThanksPanelTemplate.ts\r\n *\r\n * A panel rendering a Thank you-message.\r\n */\r\n\r\nimport * as UIStrings from \"./../../../UIStrings/UIStrings\";\r\nimport { IUIAsJson } from \"./../../Renderer\";\r\nimport * as Configuration from \"./../../../Configuration/Configuration\";\r\nimport { PanelType } from \"./../../../Constants\";\r\nimport { IDs, Tags, Classes, Roles } from \"../../UiConstants\";\r\nimport { PanelTemplateType } from \"./PanelTemplateType\";\r\nimport * as IInitOptions from \"./../../../Configuration/IInitOptions\";\r\n\r\n/**\r\n * Function to create a Link Url\r\n * @param url to which the click will be redireced\r\n * @param text display text\r\n * @returns HTML Link with clickable Text based on URL  provided\r\n */\r\nfunction makeLinkText(url: string, text: string): string {\r\n\treturn `<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"${url}\">${text}</a>`;\r\n}\r\n\r\n/**\r\n * Function to create Thank you Page paragraph\r\n * Based on the init parameters, the paragraph is constructed in HTML view which is rendred in innerHTML tag of UIasJSON function.\r\n */\r\nfunction GetThankYouPageText(): string {\r\n\r\n\t// Add a page break to make the paragraph readable\r\n\tlet thankYouPageText: string = `${UIStrings.getUIStrings().ThanksPanel?.AppreciateText}<br><br>`;\r\n\r\n\t// if the age Group is not defined or adult , then only show the link\r\n\tconst ageGroupEnabledForFeedbackUrls: boolean = (Configuration.get().getCommonInitOptions().ageGroup === IInitOptions.AgeGroup.Undefined\r\n\t\t|| Configuration.get().getCommonInitOptions().ageGroup === IInitOptions.AgeGroup.Adult) ? true : false;\r\n\r\n\t// First check if the age group is enabled\r\n\tif (ageGroupEnabledForFeedbackUrls) {\r\n\r\n\t\t// if the My Feedback Portal is enable by the consumer product(office-wac/mso)\r\n\t\tif (!!Configuration.get().getInAppFeedbackInitOptions().myFeedbackForumUrl) {\r\n\t\t\tconst MyFeedbackString = `${UIStrings.getUIStrings().ThanksPanel?.MyFeedbackDescription}\r\n\t\t\t\t\t\t\t\t<br>\r\n\t\t\t\t\t\t\t\t${makeLinkText(Configuration.get().getInAppFeedbackInitOptions().myFeedbackForumUrl,\r\n\t\t\t\tUIStrings.getUIStrings().ThanksPanel?.MyFeedbackLinkText)}\r\n\t\t\t\t\t\t\t\t<br><br>`;\r\n\t\t\tthankYouPageText = `${thankYouPageText} ${MyFeedbackString}`;\r\n\t\t}\r\n\r\n\t\t// if the Feedback Forum Link is provided by the consumer product\r\n\t\tif (!!Configuration.get().getInAppFeedbackInitOptions().feedbackForumUrl) {\r\n\t\t\tconst FeedbackPortalText = `${UIStrings.getUIStrings().ThanksPanel?.FeedbackPortalDescription}\r\n\t\t\t\t\t\t\t\t<br>\r\n\t\t\t\t\t\t\t\t${makeLinkText(Configuration.get().getInAppFeedbackInitOptions().feedbackForumUrl,\r\n\t\t\t\tUIStrings.getUIStrings().ThanksPanel?.FeedbackPortalLinkText)}\r\n\t\t\t\t\t\t\t\t<br><br>`;\r\n\t\t\tthankYouPageText = `${thankYouPageText} ${FeedbackPortalText}`;\r\n\t\t}\r\n\t}\r\n\r\n\treturn thankYouPageText;\r\n}\r\n\r\n/**\r\n * Generate the markup\r\n * @returns the markup as json\r\n */\r\nexport function generate(): IUIAsJson {\r\n\tlet primaryColor = Configuration.get().getCommonInitOptions().primaryColour;\r\n\r\n\tlet formSchema = {\r\n\t\tchildren: [\r\n\t\t\t{\r\n\t\t\t\ttag: Tags.Div,\r\n\t\t\t\tid: IDs.ThanksPanelInnerContainer,\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\t// added to create margins before feedback image\r\n\t\t\t\t\t\tinnerHTML: \"<br>\",\r\n\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tid: IDs.ThanksPanelDiscussion,\r\n\t\t\t\t\t\tinnerHTML: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30.4 25.3\"\r\n\trole=\"presentation\" alt=\"\" tabindex=\"-1\" focusable=\"false\">\r\n\t<defs>\r\n\t\t<style>\r\n\t\t\t.cls-1,.cls-3{isolation:isolate;}\r\n\t\t\t.cls-2{fill:#e1dfdd;}\r\n\t\t\t.cls-3{fill:` + primaryColor + `;opacity:0.4;}\r\n\t\t\t.cls-4{fill:#c8c6c4;mix-blend-mode:multiply;}\r\n\t\t\t.cls-5{fill:#fff;}</style>\r\n\t</defs>\r\n\t<title>commentsOffice</title>\r\n\t<g class=\"cls-1\">\r\n\t\t<g id=\"Layer_1\" data-name=\"Layer 1\">\r\n\t\t\t<path class=\"cls-2\" d=\"M17.8,0H1.2A1.216,1.216,0,0,0,0,1.2V15.3a1.1554,1.1554,0,0,0,1.2,1.2H7l.1,\r\n\t\t\t\t4.1L10,16.5h7.9a1.1554,1.1554,0,0,0,1.2-1.2V1.2A1.305,1.305,0,0,0,17.8,0Z\"/>\r\n\t\t\t<path class=\"cls-3\" d=\"M28.5,10.8a6.0429,6.0429,0,0,0-3.2-2,7.1943,7.1943,0,0,0-6.4,1,7.4884,\r\n\t\t\t\t7.4884,0,0,0-3.1,5.7,6.016,6.016,0,0,0,.9,3.7,6.9394,6.9394,0,0,0,5,3.7l2.9,2.4L24.4,23a7.8372,\r\n\t\t\t\t7.8372,0,0,0,3-1.3,7.4574,7.4574,0,0,0,3-4.7A7.5076,7.5076,0,0,0,28.5,10.8Z\"/>\r\n\t\t\t<path id=\"Layer2_1_MEMBER_1_FILL\" data-name=\"Layer2 1 MEMBER 1 FILL\" class=\"cls-4\" d=\"M11.9885,\r\n\t\t\t\t8.0154a.8939.8939,0,1,0,.6371-.2589.8653.8653,0,0,0-.6371.2589M6.8115,9.24A.8977.8977,0,1,0,\r\n\t\t\t\t5.5532,7.9589.8977.8977,0,1,0,6.8115,9.24m3.2259-1.2412a.894.894,0,1,0,.2588.637A.8653.8653,\r\n\t\t\t\t0,0,0,10.0374,7.9983Z\"/>\r\n\t\t\t<path class=\"cls-5\" d=\"M20.9019,16.3243a.8008.8008,0,0,0,.2586-.5659.8371.8371,0,0,\r\n\t\t\t\t0-.21-.5919.7693.7693,0,0,0-1.1091-.05.8379.8379,0,0,0-.2627.5706.8012.8012,0,0,0,\r\n\t\t\t\t.2066.5869.77.77,0,0,0,1.1167.05m1.51-.51a.8014.8014,0,0,0,.2066.5874.7695.7695,0,0,0,\r\n\t\t\t\t1.1127.0541.8379.8379,0,0,0,.2627-.57.8009.8009,0,0,0-.2066-.5869.7694.7694,0,0,\r\n\t\t\t\t0-1.1167-.05.8011.8011,0,0,0-.2587.5663m2.8279.1272a.8371.8371,0,0,0,.21.5919.7693.7693,0,0,\r\n\t\t\t\t0,1.1091.05.8379.8379,0,0,0,.2627-.5706.8012.8012,0,0,0-.2066-.5869.77.77,0,0,\r\n\t\t\t\t0-1.1167-.05A.8008.8008,0,0,0,25.24,15.9416Z\"/>\r\n\t\t</g>\r\n\t</g>\r\n</svg>`,\r\n\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tid: IDs.ThanksPanelVerticalContainer,\r\n\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t\tchildren: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tclasses: [\r\n\t\t\t\t\t\t\t\t\tClasses.FontTitle,\r\n\t\t\t\t\t\t\t\t\tClasses.TextAlignLeft,\r\n\t\t\t\t\t\t\t\t\tClasses.FormQuestionMiddleText,\r\n\t\t\t\t\t\t\t\t\tClasses.ThanksPanelTitle,\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().ThanksPanel?.Title,\r\n\t\t\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tclasses: [\r\n\t\t\t\t\t\t\t\t\tClasses.FontSubText,\r\n\t\t\t\t\t\t\t\t\tClasses.TextAlignLeft,\r\n\t\t\t\t\t\t\t\t\tClasses.ThanksPanelMessage,\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\t// changed from innerText to innerHTML for rendering clickable Links\r\n\t\t\t\t\t\t\t\tinnerHTML: GetThankYouPageText(),\r\n\t\t\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t\t\t\tid: IDs.ThanksPanelParagraph,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tclasses: [\r\n\t\t\t\t\t\t\t\t\tClasses.SubmitButton,\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\tid: IDs.ThanksPanelCloseButton,\r\n\t\t\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().ThanksPanel?.Close,\r\n\t\t\t\t\t\t\t\tariaLabel: UIStrings.getUIStrings().ThanksPanel?.Close,\r\n\t\t\t\t\t\t\t\ttag: Tags.Button,\r\n\t\t\t\t\t\t\t\trole: Roles.Button,\r\n\t\t\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tname: \"aria-label\",\r\n\t\t\t\t\t\t\t\t\t\tvalue: UIStrings.getUIStrings().ThanksPanel?.Title + \" \" +\r\n\t\t\t\t\t\t\t\t\t\t\tUIStrings.getUIStrings().ThanksPanel?.AppreciateText + \" \" +\r\n\t\t\t\t\t\t\t\t\t\t\tUIStrings.getUIStrings().ThanksPanel?.Close,\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tname: \"type\",\r\n\t\t\t\t\t\t\t\t\t\tvalue: \"button\",\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\t// added to create margins after Close button\r\n\t\t\t\t\t\tinnerHTML: \"<br>\",\r\n\t\t\t\t\t\ttag: Tags.Div,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t],\r\n\t\tclasses: [Classes.Hidden],\r\n\t\tid: containerId,\r\n\t};\r\n\treturn formSchema;\r\n}\r\n\r\n/**\r\n * The id for the container. This is the id of the top-most element and should\r\n * be unique to each form\r\n */\r\nexport let containerId: string = IDs.ThanksPanelContainer;\r\n\r\n/**\r\n * This method executes form\r\n * specific logic when the pane is opened\r\n * @param panelType panel type\r\n */\r\nexport function onSelect(panelType: PanelType): void {\r\n\tif (panelType !== PanelType.Thanks) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tdocument.getElementById(IDs.ThanksPanelCloseButton).focus();\r\n}\r\n\r\n/**\r\n * Form template type\r\n */\r\nexport let type: PanelTemplateType = PanelTemplateType.Thanks;\r\n","/**\r\n * UserVoiceFormTemplate\r\n *\r\n * A form template for directing to user voice.\r\n */\r\n\r\nimport * as UIStrings from \"./../../../UIStrings/UIStrings\";\r\nimport { FormTemplateType } from \"./FormTemplateType\";\r\nimport { IUIAsJson } from \"./../../Renderer\";\r\nimport { FeedbackType } from \"./../../../Constants\";\r\nimport { AttributeName, Classes, IDs, Tags } from \"./../../UiConstants\";\r\nimport * as Configuration from \"./../../../Configuration/Configuration\";\r\n\r\nexport interface IUserVoiceInitOptions {\r\n\t// Url for user voice.\r\n\turl: string;\r\n}\r\n\r\n/**\r\n * Generate the markup\r\n * @returns the markup as json\r\n */\r\nexport function generate(): IUIAsJson {\r\n\tlet initOptions: IUserVoiceInitOptions = Configuration.get().getInAppFeedbackInitOptions().userVoice;\r\n\r\n\tlet formSchema = {\r\n\t\tchildren: [\r\n\t\t\t{\r\n\t\t\t\tclasses: [Classes.FontSubtitle, Classes.TextAlignLeft,\r\n\t\t\t\t\tClasses.FormQuestionMiddleText],\r\n\t\t\t\tinnerText: UIStrings.getUIStrings().UserVoiceForm.Title,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tclasses: [Classes.FontText, Classes.TextAlignLeft,\r\n\t\t\t\t\tClasses.FormMiddleText],\r\n\t\t\t\tinnerText: UIStrings.getUIStrings().UserVoiceForm.Text,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tchildren: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tattributes: [\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tname: AttributeName.Source,\r\n\t\t\t\t\t\t\t\t\t\tvalue: initOptions.url,\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\tclasses: [\r\n\t\t\t\t\t\t\t\t\tClasses.SubmitButton,\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\tid: IDs.UserVoiceFormGoButton,\r\n\t\t\t\t\t\t\t\tinnerText: UIStrings.getUIStrings().UserVoiceForm.Button,\r\n\t\t\t\t\t\t\t\ttag: Tags.Button,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tclasses: [Classes.FormSubmitButtonContainer],\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tclasses: [Classes.FormBottomContainer],\r\n\t\t\t},\r\n\t\t],\r\n\t\tclasses: [Classes.Hidden, Classes.MarginLeft60px],\r\n\t\tid: containerId,\r\n\t};\r\n\treturn formSchema;\r\n}\r\n\r\n/**\r\n * The id for the container. This is the id of the top-most element and should\r\n * be unique to each form\r\n */\r\nexport let containerId: string = IDs.UserVoiceFormContainer;\r\n\r\n/**\r\n * Forms may be used for different feedback types. This method executes form\r\n * specific logic when the feedback type is selected\r\n * @param feedbackType feedback type\r\n */\r\nexport function onSelect(feedbackType: FeedbackType): void {\r\n\tdocument.getElementById(IDs.UserVoiceFormGoButton).focus();\r\n}\r\n\r\n/**\r\n * Form template type\r\n */\r\nexport let type: FormTemplateType = FormTemplateType.UserVoice;\r\n","import { FeedbackType } from \"../../../Constants\";\r\nimport { IUIAsJson } from \"../../Renderer\";\r\nimport { IDs } from \"../../UiConstants\";\r\nimport { FormTemplateType } from \"./FormTemplateType\";\r\n\r\nexport function generate(): IUIAsJson {\r\n\treturn undefined;\r\n}\r\n\r\nexport let containerId: string = IDs.FeedbackPortalIdeaContainer;\r\n\r\nexport function onSelect(feedbackType: FeedbackType): void {\r\n\t    /* tslint:disable : no-empty */\r\n}\r\n\r\nexport let type: FormTemplateType = FormTemplateType.FeedbackPortalIdea;\r\n","/**\r\n * BellyBand.ts\r\n *\r\n * Module for the BellyBand UI\r\n */\r\n\r\nimport { FeedbackType, PanelType } from \"./../../Constants\";\r\nimport { Classes, IDs } from \"./../UiConstants\";\r\nimport * as Events from \"./Events\";\r\nimport * as Layout from \"./Layout\";\r\nimport * as Renderer from \"./../Renderer\";\r\nimport * as Utils from \"./../Utils\";\r\nimport * as WindowProperties from \"./../../WindowProperties\";\r\nimport { IFormTemplate } from \"./FormTemplates/IFormTemplate\";\r\nimport * as BasicFormTemplate from \"./FormTemplates/BasicFormTemplate\";\r\nimport * as ThanksPanelTemplate from \"./PanelTemplates/ThanksPanelTemplate\";\r\nimport * as UserVoiceFormTemplate from \"./FormTemplates/UserVoiceFormTemplate\";\r\nimport * as FeedbackPortalIdeaTemplate from \"./FormTemplates/FeedbackPortalIdeaTemplate\";\r\nimport * as Configuration from \"./../../Configuration/Configuration\";\r\nimport { IPanelTemplate } from \"./PanelTemplates/IPanelTemplate\";\r\n\r\nexport {IUserVoiceInitOptions} from \"./FormTemplates/UserVoiceFormTemplate\";\r\n\r\n/**\r\n * UI initialization for multi, including creating all feedback related HTML elements and setting\r\n * initial visibility of elements\r\n */\r\nexport function createMulti(onClose: () => void) {\r\n\t// Create the panelType -> IPanelTemplate mapping\r\n\tlet panelTemplates: { [key: number]: IPanelTemplate } = {};\r\n\tif (Configuration.get().getInAppFeedbackInitOptions().isShowThanks) {\r\n\t\tpanelTemplates[PanelType.Thanks] = ThanksPanelTemplate;\r\n\t}\r\n\r\n\t// Create the feedbackType -> IFormTemplate mapping\r\n\tlet formTemplates: {[key: number]: IFormTemplate} = {};\r\n\tlet transitionEnabled: boolean = Configuration.get().getInAppFeedbackInitOptions().transitionEnabled;\r\n\tformTemplates[FeedbackType.Smile] = BasicFormTemplate;\r\n\tformTemplates[FeedbackType.Frown] = BasicFormTemplate;\r\n\r\n\tif (Configuration.get().getInAppFeedbackInitOptions().feedbackForumUrl !== undefined) {\r\n\t\tformTemplates[FeedbackType.IdeaRedirect] = FeedbackPortalIdeaTemplate;\r\n\t} else if (Configuration.get().getInAppFeedbackInitOptions().userVoice &&\r\n\tConfiguration.get().getCommonInitOptions().locale === \"en\") {\r\n\t\tformTemplates[FeedbackType.Idea] = UserVoiceFormTemplate;\r\n\t} else {\r\n\t\tformTemplates[FeedbackType.Idea] = BasicFormTemplate;\r\n\t}\r\n\r\n\tif (Configuration.get().getInAppFeedbackInitOptions().bugForm) {\r\n\t\tformTemplates[FeedbackType.Bug] = BasicFormTemplate;\r\n\t}\r\n\r\n\tcreate(Renderer.elementFromJson(Layout.generateMulti(formTemplates, panelTemplates)));\r\n\r\n\tlet useNarrowScreenLayout = WindowProperties.isNarrow();\r\n\r\n\tEvents.registerMulti(\r\n\t\tformTemplates,\r\n\t\tpanelTemplates,\r\n\t\tuseNarrowScreenLayout,\r\n\t\ttransitionEnabled,\r\n\t\tfunction (submitted: boolean) {\r\n\t\t\tUtils.setElementVisibility(IDs.OverlayBackground, false);\r\n\t\t\tUtils.deleteElementById(IDs.OverlayBackground);\r\n\t\t\tConfiguration.get().getInAppFeedbackInitOptions().onDismiss(submitted);\r\n\t\t\tonClose();\r\n\t\t}\r\n\t);\r\n\r\n\t// If the screen size is narrow, add the Narrow class to the outermost div so that \r\n\t// the CSS used corresponds to the small screen UI\r\n\tif (useNarrowScreenLayout) {\r\n\t\tUtils.addClassById(IDs.OverlayBackground, Classes.NarrowLayout);\r\n\t}\r\n}\r\n\r\n/**\r\n * UI initialization for single, including creating all feedback related HTML elements and setting\r\n * initial visibility of elements\r\n * @return {void}\r\n */\r\nexport function createSingle(onClose: () => void, feedbackType: FeedbackType) {\r\n\t// Create the panelType -> IPanelTemplate mapping\r\n\tlet panelTemplates: { [key: number]: IPanelTemplate } = {};\r\n\tif (Configuration.get().getInAppFeedbackInitOptions().isShowThanks) {\r\n\t\tpanelTemplates[PanelType.Thanks] = ThanksPanelTemplate;\r\n\t}\r\n\r\n\tcreate(Renderer.elementFromJson(Layout.generateSingle(panelTemplates)));\r\n\r\n\tEvents.registerSingle(\r\n\t\tfeedbackType,\r\n\t\tpanelTemplates,\r\n\t\tfunction (submitted: boolean) {\r\n\t\t\tUtils.setElementVisibility(IDs.OverlayBackground, false);\r\n\t\t\tUtils.deleteElementById(IDs.OverlayBackground);\r\n\t\t\tConfiguration.get().getInAppFeedbackInitOptions().onDismiss(submitted);\r\n\t\t\tonClose();\r\n\t\t}\r\n\t);\r\n\r\n\tUtils.addClassById(IDs.OverlayBackground, Classes.SingleLayout);\r\n\tUtils.ScreenshotPreviewByCheckbox(IDs.SingleFormScreenshotCheckbox, IDs.SingleFormScreenshotPreview);\r\n}\r\n\r\n/**\r\n * Attach the UI element to the DOM.\r\n * @param userInterface the UI element\r\n */\r\nfunction create(userInterface: Element) {\r\n\tdocument.body.insertBefore(userInterface, document.body.firstChild);\r\n\r\n\tUtils.setElementVisibility(IDs.OverlayBackground, true);\r\n\r\n\tif (Utils.getInternetExplorerVersion() > 9 || Utils.getInternetExplorerVersion() === -1) {\r\n\t\t// Show the main feedback UI after a certain time to wait for the CSS keyframes animation to finish if \r\n\t\t// the browser is IE10 and above or non-IE\r\n\t\tsetTimeout(onMainContainerRender, 900);\r\n\t} else {\r\n\t\tonMainContainerRender();\r\n\t}\r\n}\r\n\r\n/**\r\n * Code to run when the main container animation has completed.\r\n */\r\nfunction onMainContainerRender(): void {\r\n\t// Show the MainContentHolder inside the MainContainer\r\n\tUtils.setElementVisibility(IDs.MainContentHolder, true);\r\n\tif (document.getElementById(IDs.OverallSmileAnchor)) {\r\n\t\t// Multi feedback\r\n\t\tdocument.getElementById(IDs.OverallSmileAnchor).focus();\r\n\r\n\t\t// If screenshot checkbox is selected, display the preview\r\n\t\tUtils.ScreenshotPreviewByCheckbox(IDs.BasicFormScreenshotCheckbox, IDs.BasicFormScreenshotPreview);\r\n\t} else if (document.getElementById(IDs.SingleFormComment)) {\r\n\t\t// Single feedback\r\n\t\tdocument.getElementById(IDs.SingleFormComment).focus();\r\n\r\n\t\t// If screenshot checkbox is selected, display the preview\r\n\t\tUtils.ScreenshotPreviewByCheckbox(IDs.SingleFormScreenshotCheckbox, IDs.SingleFormScreenshotPreview);\r\n\t}\r\n}\r\n\r\n/**\r\n * UI dismiss. Delete all feedback related HTML elements\r\n * @return {void}\r\n */\r\nexport function dismiss(): void {\r\n\treturn;\r\n}\r\n","/**\r\n * WindowProperties.ts\r\n *\r\n * Module to track window properties.\r\n */\r\n\r\n/**\r\n * Is the window narrow?\r\n * @returns True if it is, false otherwise\r\n */\r\nexport function isNarrow(): boolean {\r\n\tlet narrowScreenBoundary: number = 800;\r\n\r\n\tif (window.innerWidth) {\r\n\t\treturn window.innerWidth < narrowScreenBoundary;\r\n\t}\r\n\r\n\t// if we can't find the width; go with narrow.\r\n\treturn true;\r\n}\r\n","/**\r\n * App_inAppFeedback.ts\r\n *\r\n * The entry point for inAppFeedback.\r\n */\r\n\r\nimport * as CommonApp from \"./CommonApp\";\r\nimport * as CommonUI from \"./CommonUI\";\r\nimport * as Configuration from \"./Configuration/Configuration\";\r\nimport * as Logging from \"./Logging/Logging\";\r\nimport * as UI from \"./UI/BellyBand/BellyBand\";\r\nimport * as Window from \"./Window/Window\";\r\nimport { ILaunchOptionsInAppFeedback } from \"./Configuration/ILaunchOptions\";\r\nimport { OCPSValues, FeedbackStatus } from \"./Constants\";\r\n\r\n/**\r\n * Has inAppFeedback been initialized\r\n */\r\nlet initialized: boolean = false;\r\n\r\n/**\r\n * Initialize\r\n * @returns A promise which will be rejected if the call fails.\r\n */\r\nexport function initialize(): Promise<any> {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tif (!initialized) {\r\n\t\t\ttry {\r\n\t\t\t\tCommonApp.initialize();\r\n\t\t\t} catch (err) {\r\n\t\t\t\treject(\"CommonApp initialization failed: {\" + err + \"}\");\r\n\t\t\t}\r\n\r\n\t\t\tCommonUI.initialize()\r\n\t\t\t.then(\r\n\t\t\t\tfunction onInitializeFulfilled() {\r\n\t\t\t\t\tConfiguration.get().setInAppFeedbackInitOptions(Window.get().OfficeBrowserFeedback.initOptions);\r\n\t\t\t\t\tinitialized = true;\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}\r\n\t\t\t)\r\n\t\t\t.catch(\r\n\t\t\t\tfunction onInitializeRejected(err) { reject(\"Initialization failed: {\" + err + \"}\"); }\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tresolve();\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Has the control been opened. Prevents more than one dialog being generated.\r\n */\r\nlet opened: boolean = false;\r\n\r\n/**\r\n * Handler to launch the multi feedback dialog\r\n * @param launchOptions optional feedback properties\r\n * @returns A promise which will be rejected if the call fails.\r\n */\r\nexport function multiFeedback(launchOptions?: ILaunchOptionsInAppFeedback): Promise<any> {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tif (opened) {\r\n\t\t\treject(\"Control already open\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tinitialize()\r\n\t\t.then(\r\n\t\t\tfunction onInitializeFulfilled() {\r\n\t\t\t\tConfiguration.get().setInAppFeedbackLaunchOptions(launchOptions);\r\n\t\t\t\tUI.createMulti(function () { opened = false; });\r\n\t\t\t\tLogging.getLogger().logEvent(Logging.EventIds.InApp.UI.Picker.Shown.VALUE,\r\n\t\t\t\t\tLogging.LogLevel.Critical,\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tIsBugEnabled: Configuration.get().getInAppFeedbackInitOptions().bugForm,\r\n\t\t\t\t\t\tIsIdeaEnabled: Configuration.get().getInAppFeedbackInitOptions().userVoice !== undefined,\r\n\t\t\t\t\t});\r\n\t\t\t\topened = true;\r\n\t\t\t\tresolve();\r\n\t\t\t}\r\n\t\t)\r\n\t\t.catch(\r\n\t\t\tfunction onInitializeRejected(err) { reject(\"Initialization failed: {\" + err + \"}\"); }\r\n\t\t);\r\n\t});\r\n}\r\n\r\n/**\r\n * Handler to launch the single feedback dialog\r\n * @param feedbackType the feedback type\r\n * @param launchOptions optional feedback properties\r\n * @returns A promise which will be rejected if the call fails.\r\n */\r\nexport function singleFeedback(feedbackType: string, launchOptions?: ILaunchOptionsInAppFeedback): Promise<any> {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tif (opened) {\r\n\t\t\treject(\"Control already open\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet feedbackTypeEnum = Configuration.validateFeedbackType(feedbackType);\r\n\r\n\t\tinitialize()\r\n\t\t.then(\r\n\t\t\tfunction onInitializeFulfilled() {\r\n\t\t\t\tConfiguration.get().setInAppFeedbackLaunchOptions(launchOptions);\r\n\t\t\t\tUI.createSingle(function () { opened = false; }, feedbackTypeEnum);\r\n\t\t\t\tLogging.getLogger().logEvent(Logging.EventIds.InApp.UI.Form.Shown.VALUE,\r\n\t\t\t\t\tLogging.LogLevel.Critical,\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFeedbackType: feedbackTypeEnum,\r\n\t\t\t\t\t});\r\n\t\t\t\topened = true;\r\n\t\t\t\tresolve();\r\n\t\t\t}\r\n\t\t)\r\n\t\t.catch(\r\n\t\t\tfunction onInitializeRejected(err) { reject(\"Initialization failed: {\" + err + \"}\"); }\r\n\t\t);\r\n\t});\r\n}\r\n\r\nexport function getFeedbackStatus(): FeedbackStatus {\r\n\r\n\tif (Window.get().OfficeBrowserFeedback.initOptions.isCommercialHost &&\r\n\tWindow.get().OfficeBrowserFeedback.initOptions.sendFeedbackPolicyValue === OCPSValues.Disabled) {\r\n\t\treturn FeedbackStatus.DisabledByAdmin;\r\n\t}\r\n\r\n\tif (!Configuration.get().determineAADCPolicy(Window.get().OfficeBrowserFeedback.initOptions.authenticationType,\r\n\tWindow.get().OfficeBrowserFeedback.initOptions.ageGroup)) {\r\n\t\treturn FeedbackStatus.DisabledByAgeGroup;\r\n\t}\r\n\r\n\treturn FeedbackStatus.Enabled;\r\n}\r\n\r\n/**\r\n * Reset the inappfeedback module. Used in unit tests.\r\n */\r\nexport function reset() {\r\n\tCommonApp.reset();\r\n\tCommonUI.reset();\r\n\tinitialized = false;\r\n\topened = false;\r\n}\r\n\r\n/* Make the FeedbackDialog methods available globally */\r\nWindow.setMultiFeedback(multiFeedback);\r\nWindow.setSingleFeedback(singleFeedback);\r\nWindow.setFeedbackStatus(getFeedbackStatus);\r\n"],"sourceRoot":""}