@careevolution/mydatahelps-js 5.7.0 → 5.8.2-SecondaryViews.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/MyDataHelps.d.ts CHANGED
@@ -12,6 +12,7 @@ export declare class MyDataHelps {
12
12
  querySurveyAnswers(queryParameters: Model.SurveyAnswersQuery): Promise<Model.SurveyAnswersPage>;
13
13
  querySurveyResults(queryParameters: Model.SurveyResultsQuery): Promise<Model.SurveyResultsPage>;
14
14
  deleteSurveyResult(resultID: string): Promise<void>;
15
+ querySurveyResultsV2(queryParameters: Model.SurveyResultsV2Query): Promise<Model.SurveyResultsV2Page>;
15
16
  querySurveyTasks(queryParameters: Model.SurveyTaskQueryParameters): Promise<Model.SurveyTasksPage>;
16
17
  queryInboxItems(queryParameters: Model.InboxItemQueryParameters): Promise<Model.InboxItemsPage>;
17
18
  getInboxItem(id: Model.Guid): Promise<Model.InboxItem>;
@@ -55,6 +56,7 @@ export declare class MyDataHelps {
55
56
  queryNotifications(queryParameters: Model.NotificationQueryParameters): Promise<Model.NotificationsPage>;
56
57
  queryFitbitDailySummaries(queryParameters: Model.FitbitQuery): Promise<Model.FitbitDailySummariesPage>;
57
58
  queryFitbitSleepLogs(queryParameters: Model.FitbitQuery): Promise<Model.FitbitSleepLogsPage>;
59
+ getAppleHealthStatus(): Promise<Model.AppleHealthStatus>;
58
60
  queryAppleHealthActivitySummaries(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthActivitySummaryPage>;
59
61
  queryAppleHealthWorkouts(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthWorkoutPage>;
60
62
  uploadFile(file: File, category: string, fileName?: string): Promise<void>;
package/MyDataHelps.js CHANGED
@@ -119,6 +119,36 @@ class MyDataHelps {
119
119
  return;
120
120
  });
121
121
  }
122
+ querySurveyResultsV2(queryParameters) {
123
+ const parameters = { ...queryParameters };
124
+ if (parameters.surveyName) {
125
+ parameters.surveyName = MyDataHelps.reduceArrayAndEscape(parameters.surveyName);
126
+ }
127
+ if (parameters.event) {
128
+ parameters.event = MyDataHelps.reduceArrayAndEscape(parameters.event);
129
+ }
130
+ if (parameters.resultIdentifier) {
131
+ parameters.resultIdentifier = MyDataHelps.reduceArrayAndEscape(parameters.resultIdentifier);
132
+ }
133
+ if (parameters.insertedAfter) {
134
+ parameters.insertedAfter = MyDataHelps.convertDateToIsoString(parameters.insertedAfter);
135
+ }
136
+ if (parameters.insertedBefore) {
137
+ parameters.insertedBefore = MyDataHelps.convertDateToIsoString(parameters.insertedBefore);
138
+ }
139
+ if (parameters.modifiedAfter) {
140
+ parameters.modifiedAfter = MyDataHelps.convertDateToIsoString(parameters.modifiedAfter);
141
+ }
142
+ if (parameters.modifiedBefore) {
143
+ parameters.modifiedBefore = MyDataHelps.convertDateToIsoString(parameters.modifiedBefore);
144
+ }
145
+ const queryString = new URLSearchParams(parameters).toString();
146
+ const endpoint = 'surveyresults?' + queryString;
147
+ return this.connect()
148
+ .then(() => this.makeRequest(endpoint, 'GET', null, 'v2'))
149
+ .then(MyDataHelps.validateResponse)
150
+ .then(response => response.json());
151
+ }
122
152
  querySurveyTasks(queryParameters) {
123
153
  queryParameters = Object.assign({}, queryParameters);
124
154
  if (queryParameters.hasOwnProperty("status")) {
@@ -236,13 +266,18 @@ class MyDataHelps {
236
266
  window.webkit.messageHandlers.OpenExternalApplication.postMessage({
237
267
  messageID: messageID,
238
268
  url: url,
239
- modal: !!(options && options.modal)
269
+ modal: !!(options && options.modal),
270
+ secondaryViewKey: options && options.secondaryViewKey
240
271
  });
241
272
  }
242
273
  }
243
274
  openSecondaryView(projectId, viewKey, options) {
244
275
  this.lookupSecondaryView(projectId, viewKey).then(secondaryView => {
245
- return this.openApplication(secondaryView.url, options);
276
+ return this.openApplication(secondaryView.url, {
277
+ ...options,
278
+ modal: !!(options && options.modal),
279
+ secondaryViewKey: (options && options.secondaryViewKey) || viewKey
280
+ });
246
281
  });
247
282
  }
248
283
  ;
@@ -870,6 +905,24 @@ class MyDataHelps {
870
905
  });
871
906
  }
872
907
  // AppleHealth
908
+ getAppleHealthStatus() {
909
+ let mdh = this;
910
+ return new Promise(function (resolve, reject) {
911
+ if (mdh.isStandaloneMode()) {
912
+ resolve(null);
913
+ }
914
+ else if (window.webkit.messageHandlers.GetAppleHealthStatus) {
915
+ let messageID = mdh.nextMessageID();
916
+ mdh.messageHandlers[messageID] = function (statusResponse) {
917
+ resolve(statusResponse.data);
918
+ };
919
+ window.webkit.messageHandlers.GetAppleHealthStatus.postMessage({ messageID: messageID });
920
+ }
921
+ else {
922
+ reject();
923
+ }
924
+ });
925
+ }
873
926
  queryAppleHealthActivitySummaries(queryParameters) {
874
927
  queryParameters = Object.assign({}, queryParameters);
875
928
  if (queryParameters.hasOwnProperty("startDate")) {
@@ -1350,7 +1403,7 @@ class MyDataHelps {
1350
1403
  ];
1351
1404
  this.accessTokenRenewalBufferSeconds = 120;
1352
1405
  this.unsupportedActions = ["SetHeight", "ResearchKit"];
1353
- this.supportedEvents = ["surveyDidFinish", "applicationDidBecomeVisible", "externalAccountSyncComplete", "tokenWillExpire", "healthConnectSyncComplete", "healthConnectPhrSyncComplete"];
1406
+ this.supportedEvents = ["surveyDidFinish", "applicationDidBecomeVisible", "externalAccountSyncComplete", "tokenWillExpire", "healthConnectSyncComplete", "healthConnectPhrSyncComplete", "appleHealthSyncResume", "appleHealthSyncComplete"];
1354
1407
  this.supportedLanguages = [];
1355
1408
  this.currentMessageID = 1;
1356
1409
  this.messageHandlers = [];
@@ -1513,7 +1566,8 @@ class MyDataHelps {
1513
1566
  name: 'OpenApplication',
1514
1567
  messageID: data.messageID,
1515
1568
  url: data.url,
1516
- modal: data.modal
1569
+ modal: data.modal,
1570
+ secondaryViewKey: data.secondaryViewKey
1517
1571
  }, applicationHost);
1518
1572
  },
1519
1573
  "Dismiss": function () {
@@ -1,2 +1,2 @@
1
- class e{startSurvey(e,t){if(this.isStandaloneMode()){const n=new URLSearchParams;n.set("surveyName",e),t?.editResultID&&n.set("editResultID",t.editResultID),t?.event&&n.set("event",t.event),this.startDelegatedSurvey(`${this.baseUrl}/survey?${n.toString()}`)}else if(window.webkit.messageHandlers.StartParticipantSurvey){let n=this.nextMessageID();window.webkit.messageHandlers.StartParticipantSurvey.postMessage({messageID:n,surveyName:e,options:t})}}completeStep(e){if(null==e&&(e=""),"string"!=typeof e&&(e=JSON.stringify(e)),window.webkit.messageHandlers.ResearchKit)window.webkit.messageHandlers.ResearchKit.postMessage(e);else if(window.webkit.messageHandlers.CompleteStep){let t=this.nextMessageID();window.webkit.messageHandlers.CompleteStep.postMessage({messageID:t,answer:e})}}querySurveyAnswers(t){(t=Object.assign({},t)).hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("stepIdentifier")&&(t.stepIdentifier=e.reduceArrayAndEscape(t.stepIdentifier)),t.hasOwnProperty("resultIdentifier")&&(t.resultIdentifier=e.reduceArrayAndEscape(t.resultIdentifier)),t.hasOwnProperty("answer")&&(t.answer=e.reduceArrayAndEscape(t.answer)),t.hasOwnProperty("before")&&(t.before=e.convertDateToIsoString(t.before)),t.hasOwnProperty("after")&&(t.after=e.convertDateToIsoString(t.after)),t.hasOwnProperty("event")&&(t.event=e.reduceArrayAndEscape(t.event));const n="surveyanswers?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}querySurveyResults(t){(t={...t}).hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("event")&&(t.event=e.reduceArrayAndEscape(t.event)),t.hasOwnProperty("before")&&(t.before=e.convertDateToIsoString(t.before)),t.hasOwnProperty("after")&&(t.after=e.convertDateToIsoString(t.after)),t.hasOwnProperty("insertedBefore")&&(t.insertedBefore=e.convertDateToIsoString(t.insertedBefore)),t.hasOwnProperty("insertedAfter")&&(t.insertedAfter=e.convertDateToIsoString(t.insertedAfter));const n="surveyresults?"+new URLSearchParams(t).toString();return this.connect().then((()=>this.makeRequest(n,"GET",null))).then(e.validateResponse).then((e=>e.json()))}deleteSurveyResult(t){const n="surveyresults/"+encodeURIComponent(t),s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}querySurveyTasks(t){(t=Object.assign({},t)).hasOwnProperty("status")&&(t.status=e.reduceArrayAndEscape(t.status)),t.hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("event")&&(t.event=e.reduceArrayAndEscape(t.event));const n="surveytasks?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryInboxItems(t){(t=((e,t)=>{for(const n of Object.keys(t)){const s=t[n];void 0!==s&&(e[n]=s)}return e})({},t)).hasOwnProperty("type")&&(t.type=e.reduceArrayAndEscape(t.type)),t.hasOwnProperty("status")&&(t.status=e.reduceArrayAndEscape(t.status));const n="inbox?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getInboxItem(t){const n=`inbox/${t}`,s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}updateInboxItem(t,n){const s=`inbox/${t}/${n}`,a=this;return this.connect().then((function(){return a.makeRequest(s,"PUT",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}startEmbeddedSurvey(e,t,n){n||(n=this.getCurrentLanguage());let s=this.baseUrl+"mydatahelps/"+e+"/surveylink/"+t+"?lang="+n;return this.startEmbeddedSurveyInternal(s)}openExternalUrl(e){window.webkit.messageHandlers.OpenExternalLink&&window.webkit.messageHandlers.OpenExternalLink.postMessage(e)}openEmbeddedUrl(e){window.webkit.messageHandlers.OpenEmbeddedLink&&window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(e)}showTab(e){window.webkit.messageHandlers.ShowTab&&window.webkit.messageHandlers.ShowTab.postMessage(e)}openApplication(e,t){if(window.webkit.messageHandlers.OpenExternalApplication){let n=this.nextMessageID();window.webkit.messageHandlers.OpenExternalApplication.postMessage({messageID:n,url:e,modal:!(!t||!t.modal)})}}openSecondaryView(e,t,n){this.lookupSecondaryView(e,t).then((e=>this.openApplication(e.url,n)))}lookupSecondaryView(e,t){let n=this.baseUrl;n.endsWith("/")||(n+="/");return fetch(`${n}api/v1/public/projects/${e}/views/${t}`,{method:"GET",headers:{Accept:"application/json"}}).then((e=>e.ok?e.json():e.text().then((t=>{throw new Error(`Failed to fetch secondary view: ${e.status} ${e.statusText}${t?" - "+t:""}`)}))))}dismiss(){window.webkit.messageHandlers.Dismiss&&window.webkit.messageHandlers.Dismiss.postMessage({})}back(){window.webkit.messageHandlers.PopNavigation&&window.webkit.messageHandlers.PopNavigation.postMessage({})}showDashboard(e,t){window.webkit.messageHandlers.ShowParticipantDashboard&&window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({dashboardKey:e,modal:!(!t||!t.modal),title:t&&t.title?t.title:void 0})}showWebVisualization(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualization&&window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({visualizationKey:e,parameters:t,modal:!(!n||!n.modal),title:n&&n.title?n.title:void 0})}showWebVisualizationPdf(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF&&window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({visualizationKey:e,parameters:t,landscape:!(!n||!n.landscape),htmlViewerZoom:n&&n.htmlViewerZoom})}showProject(e){window.webkit.messageHandlers.ShowProject&&window.webkit.messageHandlers.ShowProject.postMessage({code:e})}joinProject(e){window.webkit.messageHandlers.JoinProject&&window.webkit.messageHandlers.JoinProject.postMessage({code:e})}on(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");this.registeredEventHandlers[e]||(this.registeredEventHandlers[e]=[]),this.registeredEventHandlers[e].push(t)}off(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");if(!this.registeredEventHandlers[e])return;let n=this.registeredEventHandlers[e].indexOf(t);-1!==n&&this.registeredEventHandlers[e].splice(n,1)}triggerEvent(e){let t=e.type;this.supportedEvents.includes(t)&&this.registeredEventHandlers[t]&&this.registeredEventHandlers[t].forEach((function(t){t(e)}))}setActionResult(e){Object.prototype.hasOwnProperty.call(this.messageHandlers,e.messageID)&&"function"==typeof this.messageHandlers[e.messageID]?this.messageHandlers[e.messageID](e):console.error(`Invalid messageID: ${e.messageID}`)}getParticipantInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("participant","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}persistParticipantInfo(e,t){const n=this;return this.connect().then((function(){return n.makeRequest("participant","PUT",{demographics:e,customFields:t})})).then((async function(e){if(!e.ok)throw(await e.json()).message;return e.json()})).catch((function(e){console.log("Unable to persist participant: "+e)}))}getProjectInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("project","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getDeviceDataPoint(t){const n="devicedata/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}deleteDeviceDataPoint(t){const n="devicedata/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}queryDeviceData(t){(t=Object.assign({},t)).hasOwnProperty("type")&&(t.type=e.reduceArrayAndEscape(t.type)),t.hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter));const n="devicedata?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}persistDeviceData(t){const n=this;return this.connect().then((function(){return n.makeRequest("devicedata","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getDeviceDataAllDataTypes(t,n){const s={};void 0!==t&&(s.enabled=t.toString()),n&&(s.namespace=n);const a=`devicedata/allDataTypes?${new URLSearchParams(s).toString()}`;return this.connect().then((()=>this.makeRequest(a,"GET",null))).then(e.validateResponse).then((e=>e.json()))}queryDeviceDataV2(t){(t=Object.assign({},t)).hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter)),t.hasOwnProperty("insertedBefore")&&(t.insertedBefore=e.convertDateToIsoString(t.insertedBefore)),t.hasOwnProperty("insertedAfter")&&(t.insertedAfter=e.convertDateToIsoString(t.insertedAfter)),t.hasOwnProperty("modifiedBefore")&&(t.modifiedBefore=e.convertDateToIsoString(t.modifiedBefore)),t.hasOwnProperty("modifiedAfter")&&(t.modifiedAfter=e.convertDateToIsoString(t.modifiedAfter)),e.flattenPropertyShallow(t,"dataSource"),e.flattenPropertyShallow(t,"properties");const n="devicedata?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null,"v2")})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryDeviceDataV2Aggregate(t){(t=Object.assign({},t)).hasOwnProperty("aggregateFunctions")&&(t.aggregateFunctions=e.reduceArrayAndEscape(t.aggregateFunctions)),t.hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter)),t.hasOwnProperty("insertedBefore")&&(t.insertedBefore=e.convertDateToIsoString(t.insertedBefore)),t.hasOwnProperty("insertedAfter")&&(t.insertedAfter=e.convertDateToIsoString(t.insertedAfter)),t.hasOwnProperty("modifiedBefore")&&(t.modifiedBefore=e.convertDateToIsoString(t.modifiedBefore)),t.hasOwnProperty("modifiedAfter")&&(t.modifiedAfter=e.convertDateToIsoString(t.modifiedAfter)),e.flattenPropertyShallow(t,"dataSource"),e.flattenPropertyShallow(t,"properties");const n="devicedata/aggregate?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null,"v2")})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryDeviceDataV2DailySleep(t){(t=Object.assign({},t)).hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter)),t.hasOwnProperty("insertedBefore")&&(t.insertedBefore=e.convertDateToIsoString(t.insertedBefore)),t.hasOwnProperty("insertedAfter")&&(t.insertedAfter=e.convertDateToIsoString(t.insertedAfter)),t.hasOwnProperty("modifiedBefore")&&(t.modifiedBefore=e.convertDateToIsoString(t.modifiedBefore)),t.hasOwnProperty("modifiedAfter")&&(t.modifiedAfter=e.convertDateToIsoString(t.modifiedAfter)),e.flattenPropertyShallow(t,"dataSource"),e.flattenPropertyShallow(t,"properties");const n="devicedata/aggregate/dailysleep?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null,"v2")})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getDeviceDataV2AllDataTypes(t,n){const s={};void 0!==t&&(s.enabled=t.toString()),n&&(s.namespace=n);const a=`devicedata/allDataTypes?${new URLSearchParams(s).toString()}`,r=this;return this.connect().then((function(){return r.makeRequest(a,"GET",null,"v2")})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getExternalAccountProviders(t,n,s,a){let r={};t&&(r.search=t),n&&(r.category=n),s&&(r.pageSize=s),a&&(r.pageNumber=a);const o="externalaccountproviders?"+new URLSearchParams(r).toString(),i=this;return this.connect().then((function(){return i.makeRequest(o,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}connectExternalAccount(n,s){return new Promise(((a,r)=>{const o=t.nextMessageID();if(t.messageHandlers[o]=function(e){e&&e.success?a():r(e.errorMessage)},this.standaloneMode){const t=this;let a,i=s?.standaloneModeFinalRedirectPath||t.standaloneModeFinalRedirectPath||window.location.href;if(s?.openNewWindow){i=`${i.split("?")[0]}?connectExternalAccount=true&messageID=${o}&success=%SUCCESSVALUE%`;let e=null;if(s?.width&&s?.height){const t=s?.width,n=s?.height;e="width="+t+",height="+n+",top="+(window.outerHeight/2+window.screenY-n/2)+",left="+(window.outerWidth/2+window.screenX-t/2)}a=window.open("","providerauth",e),a.document.open(),a.document.write(`<!DOCTYPE html><html><head><title>Loading</title><link href="${this.baseUrl}Content/Loading.css" rel="stylesheet"/></head><body><div id="fragment-redirect-content"></div></body></html>`),a.document.close()}const c=e.generateVerifier();e.hashVerifier(c).then((s=>{const o=new URLSearchParams({finalRedirectPath:i,verifierHash:s}).toString(),d="externalaccountproviders/"+n+"/connect?"+o;this.connect().then((function(){return t.makeRequest(d,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.text()})).then((function(e){const t=new URL(e.replace(/['"]+/g,"")),n=new URLSearchParams;n.set("verifier",c),e=`${t}#${n}`,a?a.location=e:window.top.location=e})).catch((function(e){r(e)}))}))}else window.webkit.messageHandlers.ConnectExternalAccount&&window.webkit.messageHandlers.ConnectExternalAccount.postMessage({externalAccountProviderID:n,messageID:o,...s})}))}getExternalAccounts(){const t=this;return this.connect().then((function(){return t.makeRequest("externalaccounts","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}refreshExternalAccount(t){const n="externalaccounts/refresh/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}deleteExternalAccount(t){const n="externalaccounts/delete/"+encodeURIComponent(t),s=this;return this.isStandaloneMode()?this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})):new Promise((function(e,n){if(window.webkit.messageHandlers.DeleteProviderAccount){const a=s.nextMessageID();s.messageHandlers[a]=function(t){t.success?e(t):n(t)},window.webkit.messageHandlers.DeleteProviderAccount.postMessage({messageID:a,accountID:t})}else n()}))}getFeaturedProviders(t){const n={};t&&(n.featuredProvidersContext=t);const s=`featuredexternalaccountproviders?${new URLSearchParams(n).toString()}`;return this.connect().then((()=>this.makeRequest(s,"GET",null))).then(e.validateResponse).then((e=>e.json()))}queryNotifications(t){(t=Object.assign({},t)).hasOwnProperty("sentBefore")&&(t.sentBefore=e.convertDateToIsoString(t.sentBefore)),t.hasOwnProperty("sentAfter")&&(t.sentAfter=e.convertDateToIsoString(t.sentAfter));const n="notifications?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitDailySummaries(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/dailySummaries?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitSleepLogs(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/sleepLogs?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryAppleHealthActivitySummaries(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="appleHealth/activitySummaries?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryAppleHealthWorkouts(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="appleHealth/workouts?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}uploadFile(t,n,s){if(t.size>209715200)throw new Error("File size exceeds the maximum allowed size of 200MB.");const a=this,r="files?category="+n+"&fileName="+encodeURIComponent(s??t.name);return this.connect().then((function(){return a.makeRequest(r,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()})).then((function(e){return fetch(e.preSignedUrl,{method:"PUT",body:t,headers:{"Content-Type":t.type,"x-amz-server-side-encryption":"AES256"}})})).then((function(t){return e.validateResponse(t)})).then((function(){}))}queryFiles(t){const n="files?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getFileDownloadUrl(t){if(!t)throw new Error("Please specify the key of the file to download.");const n="files/download?key="+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}deleteFile(t){if(!t)throw new Error("Please specify the key of the file to delete.");const n="files?key="+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}connect(){const e=this;let t=function(){e.token=null,e.refreshTokenPromise=new Promise((function(n,s){let a=e.nextMessageID();e.messageHandlers[a]=function(r){r.success?(e.tokenExpires=Date.now()+1e3*r.data.expires_in,e.token=r.data,e.baseUrl=r.baseUrl,setTimeout(t,1e3*(r.data.expires_in-e.accessTokenRenewalBufferSeconds)),n(null)):(e.token=null,s(r.message)),e.messageHandlers[a]=null,e.refreshTokenPromise=null},window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({messageID:a})}))};if(this.token&&Date.now()<this.tokenExpires)return Promise.resolve();if(this.isStandaloneMode()&&!this.isEmbeddedMode()){let e=this.token?"access token is expired or invalid":"access token must be explicitly provided using the setParticipantAccess method";return console.log(e),Promise.reject(e)}return this.refreshTokenPromise||t(),this.refreshTokenPromise}setParticipantAccessToken(e,t){this.enableStandaloneMode(),this.token=e,t&&(this.baseUrl=t),this.tokenExpires=Date.now()+1e3*this.token.expires_in;const n=this;setTimeout((function(){n.triggerEvent({type:"tokenWillExpire"})}),1e3*(this.token.expires_in-this.accessTokenRenewalBufferSeconds))}isStandaloneMode(){return this.standaloneMode}isEmbeddedMode(){return this.embeddedMode}enableStandaloneMode(e=!1,t){this.standaloneMode=!0,this.embeddedMode=e,t&&(this.baseUrl=t),window.webkit&&(window.webkit.messageHandlers=e?{GetDelegatedAccessToken:window.webkit.messageHandlers.GetDelegatedAccessToken,OpenExternalLink:window.webkit.messageHandlers.OpenExternalLink,OpenEmbeddedLink:window.webkit.messageHandlers.OpenEmbeddedLink,OpenExternalApplication:window.webkit.messageHandlers.OpenExternalApplication,PopNavigation:window.webkit.messageHandlers.PopNavigation,Dismiss:window.webkit.messageHandlers.Dismiss}:{})}get standaloneModeFinalRedirectPath(){return this._standaloneModeFinalRedirectPath}set standaloneModeFinalRedirectPath(e){this._standaloneModeFinalRedirectPath=e}setStatusBarStyle(e){window.webkit.messageHandlers.SetStatusBarStyle&&window.webkit.messageHandlers.SetStatusBarStyle.postMessage({style:e})}getDeviceInfo(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.GetDeviceInfo){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetDeviceInfo.postMessage({messageID:n})}else n()}))}setSupportedLanguages(e){this.supportedLanguages.length=0;for(let t=0;t<e.length;t++)this.supportedLanguages.push(e[t].replace("_","-"))}getStepConfiguration(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.GetStepConfiguration){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetStepConfiguration.postMessage({messageID:n})}else n()}))}getSurveyContext(){let e=this;return new Promise((function(t,n){e.isStandaloneMode()&&t(null),e.getDeviceInfo().then((function(s){if("Web"!==s.platform)t({surveyMode:"Survey"});else if(window.webkit.messageHandlers.GetSurveyContext){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetSurveyContext.postMessage({messageID:n})}else n()})).catch((function(e){n()}))}))}getCurrentSurveyAnswers(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.GetCurrentSurveyAnswers){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetCurrentSurveyAnswers.postMessage({messageID:n})}else n()}))}setCurrentLanguage(e){if(e){let t=this.getSupportedLanguage(e);t?this.language=t:console.warn(`language ${e} not supported`)}else this.language=e}getCurrentLanguage(){let e,t=new URLSearchParams(window.location.search);if(t.has("lang")){if(e=this.getSupportedLanguage(t.get("lang")),e)return e;console.warn(`language ${t.get("lang")} not supported`)}return this.language||navigator.language}showGoogleFitSettings(){window.webkit.messageHandlers.ShowGoogleFitSettings&&window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({})}showHealthConnectMatchmakingPrompt(){window.webkit.messageHandlers.HealthConnectMatchmaking&&window.webkit.messageHandlers.HealthConnectMatchmaking.postMessage({})}showHealthConnectSettings(){window.webkit.messageHandlers.HealthConnectSettings&&window.webkit.messageHandlers.HealthConnectSettings.postMessage({})}showHealthConnectPrompt(){window.webkit.messageHandlers.HealthConnectPrompt&&window.webkit.messageHandlers.HealthConnectPrompt.postMessage({})}getHealthConnectStatus(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.HealthConnectStatus){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.HealthConnectStatus.postMessage({messageID:n})}else n()}))}showHealthConnectPhrPrompt(){window.webkit.messageHandlers.HealthConnectPhrPrompt&&window.webkit.messageHandlers.HealthConnectPhrPrompt.postMessage({})}getHealthConnectPhrStatus(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.HealthConnectPhrStatus){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.HealthConnectPhrStatus.postMessage({messageID:n})}else n()}))}requestReview(e){window.webkit.messageHandlers.RequestReview&&window.webkit.messageHandlers.RequestReview.postMessage({cooldownDays:e})}trackCustomEvent(t){const n=this;return this.connect().then((function(){return n.makeRequest("customevents","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getDataCollectionSettings(){const t=this;return this.connect().then((function(){return t.makeRequest("datacollectionsettings","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getDataAvailability(){const t=this;return this.connect().then((function(){return t.makeRequest("dataavailability","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}invokeCustomApi(t,n,s,a){if(t.includes("?"))throw new Error('Cannot include query parameters directly in the "customApi" string. Provide as an argument for "queryParameters" instead.');let r="custom/"+t;if(n=n.toUpperCase(),null!=s&&("GET"===n||"DELETE"===n)){let e=new URLSearchParams(s).toString();r+="?"+e,s=null}const o=this;return this.connect().then((function(){return o.makeRequest(r,n,s)})).then((function(t){return e.validateResponse(t)})).then((function(e){return a?e.json():void 0}))}constructor(){if(this.baseUrl="https://mydatahelps.org/",this.acceptableParentDomains=["localhost","careevolution.com","internal","b3-deploys.com","mydatahelps.org","platform.joinallofus.org","careevolution.dev","ce.dev","mydatahelps.dev"],this.accessTokenRenewalBufferSeconds=120,this.unsupportedActions=["SetHeight","ResearchKit"],this.supportedEvents=["surveyDidFinish","applicationDidBecomeVisible","externalAccountSyncComplete","tokenWillExpire","healthConnectSyncComplete","healthConnectPhrSyncComplete"],this.supportedLanguages=[],this.currentMessageID=1,this.messageHandlers=[],this.registeredEventHandlers={},this.refreshTokenPromise=null,this.standaloneMode=!1,this.embeddedMode=!1,this.handleConnectExternalAccountResponse())return;let e,t=this,n=function(){let e=document.location.ancestorOrigins;if(e&&e[0])return e[0];return"*"}();function s(e){if("*"===e)return!0;let n=new URL(e);for(let e=0;e<t.acceptableParentDomains.length;e++)if(n.hostname===t.acceptableParentDomains[e]||n.hostname.endsWith("."+t.acceptableParentDomains[e]))return!0;return!1}s(n)||console.log("Detected unsupported parent origin domain."),e=window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.ResearchKit?{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},OpenExternalLink:function(e){window.parent.postMessage({name:"OpenExternalUrl",url:e},n)},OpenEmbeddedLink:function(e){window.parent.postMessage({name:"OpenEmbeddedUrl",url:e},n)},GetCurrentSurveyAnswers:function(e){window.parent.postMessage({name:"GetCurrentSurveyAnswers",messageID:e.messageID},n)},GetStepConfiguration:function(e){window.parent.postMessage({name:"GetStepConfiguration",messageID:e.messageID},n)},GetSurveyContext:function(e){window.parent.postMessage({name:"GetSurveyContext",messageID:e.messageID},n)},CompleteStep:function(e){window.parent.postMessage({name:"CompleteStep",messageID:e.messageID,answer:e.answer},n)}}:{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)},StartParticipantSurvey:function(e){window.parent.postMessage({name:"StartParticipantSurvey",messageID:e.messageID,surveyName:e.surveyName,options:e.options},n)},OpenExternalLink:function(e){window.parent.postMessage({name:"OpenExternalUrl",url:e},n)},OpenEmbeddedLink:function(e){window.parent.postMessage({name:"OpenEmbeddedUrl",url:e},n)},OpenExternalApplication:function(e){window.parent.postMessage({name:"OpenApplication",messageID:e.messageID,url:e.url,modal:e.modal},n)},Dismiss:function(){window.parent.postMessage({name:"Dismiss"},n)},PopNavigation:function(){window.parent.postMessage({name:"Back"},n)},ShowTab:function(e){window.parent.postMessage({name:"ShowTab",tabKey:e},n)},ShowParticipantDashboard:function(e){window.parent.postMessage({name:"ShowParticipantDashboard",dashboardKey:e.dashboardKey,modal:e.modal},n)},ShowParticipantWebVisualization:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualization",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal},n)},ShowParticipantWebVisualizationPDF:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualizationPDF",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal,landscape:e.landscape,htmlViewerZoom:e.htmlViewerZoom},n)},DeleteProviderAccount:function(e){window.parent.postMessage({name:"DeleteProviderAccount",messageID:e.messageID,accountID:e.accountID},n)},ConnectExternalAccount:function(e){window.parent.postMessage({name:"ConnectExternalAccount",externalAccountProviderID:e.externalAccountProviderID,messageID:e.messageID,openNewWindow:e.openNewWindow,width:e.width,height:e.height},n)},ShowProject:function(e){window.parent.postMessage({name:"ShowProject",code:e.code},n)},JoinProject:function(e){window.parent.postMessage({name:"JoinProject",code:e.code},n)},GetCurrentSurveyAnswers:function(e){window.parent.postMessage({name:"GetCurrentSurveyAnswers",messageID:e.messageID},n)},GetStepConfiguration:function(e){window.parent.postMessage({name:"GetStepConfiguration",messageID:e.messageID},n)},CompleteStep:function(e){window.parent.postMessage({name:"CompleteStep",messageID:e.messageID,answer:e.answer},n)},HealthConnectStatus:function(e){window.parent.postMessage({name:"HealthConnectStatus",messageID:e.messageID},n)},HealthConnectPrompt:function(){window.parent.postMessage({name:"HealthConnectPrompt"},n)},HealthConnectPhrStatus:function(e){window.parent.postMessage({name:"HealthConnectPhrStatus",messageID:e.messageID},n)},HealthConnectPhrPrompt:function(){window.parent.postMessage({name:"HealthConnectPhrPrompt"},n)},HealthConnectSettings:function(){window.parent.postMessage({name:"HealthConnectSettings"},n)},HealthConnectMatchmaking:function(){window.parent.postMessage({name:"HealthConnectMatchmaking"},n)}},window.webkit&&window.webkit.messageHandlers&&function(){for(let t in e)if(window.webkit.messageHandlers[t])return!0;for(let e in t.unsupportedActions)if(window.webkit.messageHandlers[t.unsupportedActions[e]])return!0;return!1}()||(window.webkit={messageHandlers:{}}),function(e){for(let t in e)if(!window.webkit.messageHandlers[t])try{window.webkit.messageHandlers[t]={postMessage:e[t]}}catch(e){return void console.log("Unable to add missing actions on this platform: "+e)}}(e),window.addEventListener("message",(function(e){if(!function(e){return!(!t.isStandaloneMode()||e.origin!==window.location.origin)||("*"===n?s(e.origin):e.origin===n)}(e))throw console.error("message.origin '"+e.origin+"' is not allowed."),"message.origin '"+e.origin+"' is not allowed.";e.data.messageID?t.setActionResult(e.data):t.triggerEvent(e.data)}),!1),this.hasEmbeddedModeUrlParameter()&&t.enableStandaloneMode(!0)}nextMessageID(){return this.currentMessageID++}makeUrl(e,t){if(!this.baseUrl)throw console.error("Cannot use makeUrl without MyDataHelps.baseUrl."),"Cannot use makeUrl without MyDataHelps.baseUrl.";return this.baseUrl+"api/"+t+"/delegated/"+e}makeRequest(e,t,n,s="v1"){if(!this.token||!this.token.access_token)throw"No access_token available for request authorization.";let a=this.makeUrl(e,s),r=new Headers;r.append("Authorization","Bearer "+this.token.access_token),r.append("Accept","application/json, text/javascript, */*; q=0.01"),r.append("Accept-Language",this.getCurrentLanguage()),n&&r.append("Content-Type","application/json");let o={method:t,headers:r};return n&&(o.body=JSON.stringify(n)),fetch(a,o)}getSupportedLanguage(e){return e=e.replace("_","-"),0===this.supportedLanguages.length||this.supportedLanguages.find((t=>t===e))||e.indexOf("-")>0&&(e=e.substring(0,e.indexOf("-")),this.supportedLanguages.find((t=>t===e)))?e:void 0}static validateResponse(e){if(!e.ok)throw e.statusText;return e}static escapeParam(e){return String(e).replaceAll("\\","\\\\").replaceAll(",","\\,")}static reduceArrayAndEscape(t){if(Array.isArray(t)){return t.map((function(t){return e.escapeParam(t)})).join(",")}return this.escapeParam(t)}static convertDateToIsoString(e){let t=new Date(e);if(isNaN(t.getTime()))throw"Cannot interpret parameter as Date";return t.toISOString()}static flattenPropertyShallow(t,n){if(void 0!==t[n]&&null!==t[n]){for(var s in t[n])t[n].hasOwnProperty(s)&&(t[`${n}.${s}`]=e.escapeParam(t[n][s]));delete t[n]}}startEmbeddedSurveyInternal(e){let t="mydatahelps-survey-modal",n=this;return new Promise((function(s,a){if(document.getElementById(t))return void a("Survey already in progress");window.addEventListener("message",(function e(a){if(a.origin!==new URL(n.baseUrl).origin)return;let r=document.getElementById("mydatahelps-survey-frame").contentWindow;a.source===r&&("SurveyWindowInitialized"===a.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===a.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s(a.data)))}),!0);let r=document.createElement("div");r.className="mydatahelps-survey-modal",r.id=t,r.innerHTML="<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='"+e+"'></iframe></div>",document.body.append(r),document.body.className+=" no-scroll"}))}startDelegatedSurvey(e){let t="mydatahelps-survey-modal",n=this;if(document.getElementById(t))return;window.addEventListener("message",(function e(s){if(s.origin!==new URL(n.baseUrl).origin)return;let a=document.getElementById("mydatahelps-survey-frame").contentWindow;s.source===a&&("GetDelegatedAccessToken"===s.data.name?n.getParticipantInfo().then((e=>{a.postMessage({name:"DelegatedAccessTokenResponse",accessToken:n.token,baseUrl:n.baseUrl,participantID:e.participantID},"*")})):"SurveyWindowInitialized"===s.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===s.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s.data.type="surveyDidFinish",n.triggerEvent(s.data)))}),!0);let s=document.createElement("div");s.className="mydatahelps-survey-modal",s.id=t,s.innerHTML=`<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='${e}&lang=${n.getCurrentLanguage()}'></iframe></div>`,document.body.append(s),document.body.className+=" no-scroll"}handleConnectExternalAccountResponse(){const e=new URLSearchParams(window.location.search);if(e.get("connectExternalAccount")&&e.get("messageID")&&e.get("success")){const t={name:"ConnectExternalAccountResponse",messageID:parseInt(e.get("messageID")),success:"true"===e.get("success")};if(window.opener)window.opener.postMessage(t,window.location.origin);else{const e=new BroadcastChannel("ConnectExternalAccount");e.postMessage(t),e.close()}return window.close(),!0}}hasEmbeddedModeUrlParameter(){const e=new URLSearchParams(window.location.search),t=e.get("_e");if(e.has("_e")&&"false"!==t)return URL.canParse(t)&&(this.standaloneModeFinalRedirectPath=t),!0}static generateVerifier(){const e=Math.ceil(16),t=new Uint8Array(e);return window.crypto.getRandomValues(t),Array.from(t).map((e=>e.toString(16).padStart(2,"0"))).join("").slice(0,32)}static async hashVerifier(e){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t),s=Array.from(new Uint8Array(n));return btoa(String.fromCharCode(...s)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}const t=new e;window.MyDataHelps=t,window.RKStudioClient={},window.RKStudioClient.setActionResult=function(e){window.MyDataHelps.setActionResult(e)};export{e as MyDataHelps,t as default};
1
+ class e{startSurvey(e,t){if(this.isStandaloneMode()){const n=new URLSearchParams;n.set("surveyName",e),t?.editResultID&&n.set("editResultID",t.editResultID),t?.event&&n.set("event",t.event),this.startDelegatedSurvey(`${this.baseUrl}/survey?${n.toString()}`)}else if(window.webkit.messageHandlers.StartParticipantSurvey){let n=this.nextMessageID();window.webkit.messageHandlers.StartParticipantSurvey.postMessage({messageID:n,surveyName:e,options:t})}}completeStep(e){if(null==e&&(e=""),"string"!=typeof e&&(e=JSON.stringify(e)),window.webkit.messageHandlers.ResearchKit)window.webkit.messageHandlers.ResearchKit.postMessage(e);else if(window.webkit.messageHandlers.CompleteStep){let t=this.nextMessageID();window.webkit.messageHandlers.CompleteStep.postMessage({messageID:t,answer:e})}}querySurveyAnswers(t){(t=Object.assign({},t)).hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("stepIdentifier")&&(t.stepIdentifier=e.reduceArrayAndEscape(t.stepIdentifier)),t.hasOwnProperty("resultIdentifier")&&(t.resultIdentifier=e.reduceArrayAndEscape(t.resultIdentifier)),t.hasOwnProperty("answer")&&(t.answer=e.reduceArrayAndEscape(t.answer)),t.hasOwnProperty("before")&&(t.before=e.convertDateToIsoString(t.before)),t.hasOwnProperty("after")&&(t.after=e.convertDateToIsoString(t.after)),t.hasOwnProperty("event")&&(t.event=e.reduceArrayAndEscape(t.event));const n="surveyanswers?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}querySurveyResults(t){(t={...t}).hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("event")&&(t.event=e.reduceArrayAndEscape(t.event)),t.hasOwnProperty("before")&&(t.before=e.convertDateToIsoString(t.before)),t.hasOwnProperty("after")&&(t.after=e.convertDateToIsoString(t.after)),t.hasOwnProperty("insertedBefore")&&(t.insertedBefore=e.convertDateToIsoString(t.insertedBefore)),t.hasOwnProperty("insertedAfter")&&(t.insertedAfter=e.convertDateToIsoString(t.insertedAfter));const n="surveyresults?"+new URLSearchParams(t).toString();return this.connect().then((()=>this.makeRequest(n,"GET",null))).then(e.validateResponse).then((e=>e.json()))}deleteSurveyResult(t){const n="surveyresults/"+encodeURIComponent(t),s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}querySurveyResultsV2(t){const n={...t};n.surveyName&&(n.surveyName=e.reduceArrayAndEscape(n.surveyName)),n.event&&(n.event=e.reduceArrayAndEscape(n.event)),n.resultIdentifier&&(n.resultIdentifier=e.reduceArrayAndEscape(n.resultIdentifier)),n.insertedAfter&&(n.insertedAfter=e.convertDateToIsoString(n.insertedAfter)),n.insertedBefore&&(n.insertedBefore=e.convertDateToIsoString(n.insertedBefore)),n.modifiedAfter&&(n.modifiedAfter=e.convertDateToIsoString(n.modifiedAfter)),n.modifiedBefore&&(n.modifiedBefore=e.convertDateToIsoString(n.modifiedBefore));const s="surveyresults?"+new URLSearchParams(n).toString();return this.connect().then((()=>this.makeRequest(s,"GET",null,"v2"))).then(e.validateResponse).then((e=>e.json()))}querySurveyTasks(t){(t=Object.assign({},t)).hasOwnProperty("status")&&(t.status=e.reduceArrayAndEscape(t.status)),t.hasOwnProperty("surveyName")&&(t.surveyName=e.reduceArrayAndEscape(t.surveyName)),t.hasOwnProperty("event")&&(t.event=e.reduceArrayAndEscape(t.event));const n="surveytasks?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryInboxItems(t){(t=((e,t)=>{for(const n of Object.keys(t)){const s=t[n];void 0!==s&&(e[n]=s)}return e})({},t)).hasOwnProperty("type")&&(t.type=e.reduceArrayAndEscape(t.type)),t.hasOwnProperty("status")&&(t.status=e.reduceArrayAndEscape(t.status));const n="inbox?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getInboxItem(t){const n=`inbox/${t}`,s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}updateInboxItem(t,n){const s=`inbox/${t}/${n}`,a=this;return this.connect().then((function(){return a.makeRequest(s,"PUT",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}startEmbeddedSurvey(e,t,n){n||(n=this.getCurrentLanguage());let s=this.baseUrl+"mydatahelps/"+e+"/surveylink/"+t+"?lang="+n;return this.startEmbeddedSurveyInternal(s)}openExternalUrl(e){window.webkit.messageHandlers.OpenExternalLink&&window.webkit.messageHandlers.OpenExternalLink.postMessage(e)}openEmbeddedUrl(e){window.webkit.messageHandlers.OpenEmbeddedLink&&window.webkit.messageHandlers.OpenEmbeddedLink.postMessage(e)}showTab(e){window.webkit.messageHandlers.ShowTab&&window.webkit.messageHandlers.ShowTab.postMessage(e)}openApplication(e,t){if(window.webkit.messageHandlers.OpenExternalApplication){let n=this.nextMessageID();window.webkit.messageHandlers.OpenExternalApplication.postMessage({messageID:n,url:e,modal:!(!t||!t.modal),secondaryViewKey:t&&t.secondaryViewKey})}}openSecondaryView(e,t,n){this.lookupSecondaryView(e,t).then((e=>this.openApplication(e.url,{...n,modal:!(!n||!n.modal),secondaryViewKey:n&&n.secondaryViewKey||t})))}lookupSecondaryView(e,t){let n=this.baseUrl;n.endsWith("/")||(n+="/");return fetch(`${n}api/v1/public/projects/${e}/views/${t}`,{method:"GET",headers:{Accept:"application/json"}}).then((e=>e.ok?e.json():e.text().then((t=>{throw new Error(`Failed to fetch secondary view: ${e.status} ${e.statusText}${t?" - "+t:""}`)}))))}dismiss(){window.webkit.messageHandlers.Dismiss&&window.webkit.messageHandlers.Dismiss.postMessage({})}back(){window.webkit.messageHandlers.PopNavigation&&window.webkit.messageHandlers.PopNavigation.postMessage({})}showDashboard(e,t){window.webkit.messageHandlers.ShowParticipantDashboard&&window.webkit.messageHandlers.ShowParticipantDashboard.postMessage({dashboardKey:e,modal:!(!t||!t.modal),title:t&&t.title?t.title:void 0})}showWebVisualization(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualization&&window.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({visualizationKey:e,parameters:t,modal:!(!n||!n.modal),title:n&&n.title?n.title:void 0})}showWebVisualizationPdf(e,t,n){window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF&&window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({visualizationKey:e,parameters:t,landscape:!(!n||!n.landscape),htmlViewerZoom:n&&n.htmlViewerZoom})}showProject(e){window.webkit.messageHandlers.ShowProject&&window.webkit.messageHandlers.ShowProject.postMessage({code:e})}joinProject(e){window.webkit.messageHandlers.JoinProject&&window.webkit.messageHandlers.JoinProject.postMessage({code:e})}on(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");this.registeredEventHandlers[e]||(this.registeredEventHandlers[e]=[]),this.registeredEventHandlers[e].push(t)}off(e,t){if(!this.supportedEvents.includes(e))throw new Error(e+" is not a supported event type.");if(!this.registeredEventHandlers[e])return;let n=this.registeredEventHandlers[e].indexOf(t);-1!==n&&this.registeredEventHandlers[e].splice(n,1)}triggerEvent(e){let t=e.type;this.supportedEvents.includes(t)&&this.registeredEventHandlers[t]&&this.registeredEventHandlers[t].forEach((function(t){t(e)}))}setActionResult(e){Object.prototype.hasOwnProperty.call(this.messageHandlers,e.messageID)&&"function"==typeof this.messageHandlers[e.messageID]?this.messageHandlers[e.messageID](e):console.error(`Invalid messageID: ${e.messageID}`)}getParticipantInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("participant","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}persistParticipantInfo(e,t){const n=this;return this.connect().then((function(){return n.makeRequest("participant","PUT",{demographics:e,customFields:t})})).then((async function(e){if(!e.ok)throw(await e.json()).message;return e.json()})).catch((function(e){console.log("Unable to persist participant: "+e)}))}getProjectInfo(){const t=this;return this.connect().then((function(){return t.makeRequest("project","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getDeviceDataPoint(t){const n="devicedata/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}deleteDeviceDataPoint(t){const n="devicedata/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}queryDeviceData(t){(t=Object.assign({},t)).hasOwnProperty("type")&&(t.type=e.reduceArrayAndEscape(t.type)),t.hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter));const n="devicedata?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}persistDeviceData(t){const n=this;return this.connect().then((function(){return n.makeRequest("devicedata","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getDeviceDataAllDataTypes(t,n){const s={};void 0!==t&&(s.enabled=t.toString()),n&&(s.namespace=n);const a=`devicedata/allDataTypes?${new URLSearchParams(s).toString()}`;return this.connect().then((()=>this.makeRequest(a,"GET",null))).then(e.validateResponse).then((e=>e.json()))}queryDeviceDataV2(t){(t=Object.assign({},t)).hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter)),t.hasOwnProperty("insertedBefore")&&(t.insertedBefore=e.convertDateToIsoString(t.insertedBefore)),t.hasOwnProperty("insertedAfter")&&(t.insertedAfter=e.convertDateToIsoString(t.insertedAfter)),t.hasOwnProperty("modifiedBefore")&&(t.modifiedBefore=e.convertDateToIsoString(t.modifiedBefore)),t.hasOwnProperty("modifiedAfter")&&(t.modifiedAfter=e.convertDateToIsoString(t.modifiedAfter)),e.flattenPropertyShallow(t,"dataSource"),e.flattenPropertyShallow(t,"properties");const n="devicedata?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null,"v2")})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryDeviceDataV2Aggregate(t){(t=Object.assign({},t)).hasOwnProperty("aggregateFunctions")&&(t.aggregateFunctions=e.reduceArrayAndEscape(t.aggregateFunctions)),t.hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter)),t.hasOwnProperty("insertedBefore")&&(t.insertedBefore=e.convertDateToIsoString(t.insertedBefore)),t.hasOwnProperty("insertedAfter")&&(t.insertedAfter=e.convertDateToIsoString(t.insertedAfter)),t.hasOwnProperty("modifiedBefore")&&(t.modifiedBefore=e.convertDateToIsoString(t.modifiedBefore)),t.hasOwnProperty("modifiedAfter")&&(t.modifiedAfter=e.convertDateToIsoString(t.modifiedAfter)),e.flattenPropertyShallow(t,"dataSource"),e.flattenPropertyShallow(t,"properties");const n="devicedata/aggregate?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null,"v2")})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryDeviceDataV2DailySleep(t){(t=Object.assign({},t)).hasOwnProperty("observedBefore")&&(t.observedBefore=e.convertDateToIsoString(t.observedBefore)),t.hasOwnProperty("observedAfter")&&(t.observedAfter=e.convertDateToIsoString(t.observedAfter)),t.hasOwnProperty("insertedBefore")&&(t.insertedBefore=e.convertDateToIsoString(t.insertedBefore)),t.hasOwnProperty("insertedAfter")&&(t.insertedAfter=e.convertDateToIsoString(t.insertedAfter)),t.hasOwnProperty("modifiedBefore")&&(t.modifiedBefore=e.convertDateToIsoString(t.modifiedBefore)),t.hasOwnProperty("modifiedAfter")&&(t.modifiedAfter=e.convertDateToIsoString(t.modifiedAfter)),e.flattenPropertyShallow(t,"dataSource"),e.flattenPropertyShallow(t,"properties");const n="devicedata/aggregate/dailysleep?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null,"v2")})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getDeviceDataV2AllDataTypes(t,n){const s={};void 0!==t&&(s.enabled=t.toString()),n&&(s.namespace=n);const a=`devicedata/allDataTypes?${new URLSearchParams(s).toString()}`,r=this;return this.connect().then((function(){return r.makeRequest(a,"GET",null,"v2")})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getExternalAccountProviders(t,n,s,a){let r={};t&&(r.search=t),n&&(r.category=n),s&&(r.pageSize=s),a&&(r.pageNumber=a);const o="externalaccountproviders?"+new URLSearchParams(r).toString(),i=this;return this.connect().then((function(){return i.makeRequest(o,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}connectExternalAccount(n,s){return new Promise(((a,r)=>{const o=t.nextMessageID();if(t.messageHandlers[o]=function(e){e&&e.success?a():r(e.errorMessage)},this.standaloneMode){const t=this;let a,i=s?.standaloneModeFinalRedirectPath||t.standaloneModeFinalRedirectPath||window.location.href;if(s?.openNewWindow){i=`${i.split("?")[0]}?connectExternalAccount=true&messageID=${o}&success=%SUCCESSVALUE%`;let e=null;if(s?.width&&s?.height){const t=s?.width,n=s?.height;e="width="+t+",height="+n+",top="+(window.outerHeight/2+window.screenY-n/2)+",left="+(window.outerWidth/2+window.screenX-t/2)}a=window.open("","providerauth",e),a.document.open(),a.document.write(`<!DOCTYPE html><html><head><title>Loading</title><link href="${this.baseUrl}Content/Loading.css" rel="stylesheet"/></head><body><div id="fragment-redirect-content"></div></body></html>`),a.document.close()}const d=e.generateVerifier();e.hashVerifier(d).then((s=>{const o=new URLSearchParams({finalRedirectPath:i,verifierHash:s}).toString(),c="externalaccountproviders/"+n+"/connect?"+o;this.connect().then((function(){return t.makeRequest(c,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.text()})).then((function(e){const t=new URL(e.replace(/['"]+/g,"")),n=new URLSearchParams;n.set("verifier",d),e=`${t}#${n}`,a?a.location=e:window.top.location=e})).catch((function(e){r(e)}))}))}else window.webkit.messageHandlers.ConnectExternalAccount&&window.webkit.messageHandlers.ConnectExternalAccount.postMessage({externalAccountProviderID:n,messageID:o,...s})}))}getExternalAccounts(){const t=this;return this.connect().then((function(){return t.makeRequest("externalaccounts","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}refreshExternalAccount(t){const n="externalaccounts/refresh/"+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}deleteExternalAccount(t){const n="externalaccounts/delete/"+encodeURIComponent(t),s=this;return this.isStandaloneMode()?this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})):new Promise((function(e,n){if(window.webkit.messageHandlers.DeleteProviderAccount){const a=s.nextMessageID();s.messageHandlers[a]=function(t){t.success?e(t):n(t)},window.webkit.messageHandlers.DeleteProviderAccount.postMessage({messageID:a,accountID:t})}else n()}))}getFeaturedProviders(t){const n={};t&&(n.featuredProvidersContext=t);const s=`featuredexternalaccountproviders?${new URLSearchParams(n).toString()}`;return this.connect().then((()=>this.makeRequest(s,"GET",null))).then(e.validateResponse).then((e=>e.json()))}queryNotifications(t){(t=Object.assign({},t)).hasOwnProperty("sentBefore")&&(t.sentBefore=e.convertDateToIsoString(t.sentBefore)),t.hasOwnProperty("sentAfter")&&(t.sentAfter=e.convertDateToIsoString(t.sentAfter));const n="notifications?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitDailySummaries(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/dailySummaries?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryFitbitSleepLogs(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="fitbit/sleepLogs?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getAppleHealthStatus(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.GetAppleHealthStatus){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetAppleHealthStatus.postMessage({messageID:n})}else n()}))}queryAppleHealthActivitySummaries(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="appleHealth/activitySummaries?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}queryAppleHealthWorkouts(t){(t=Object.assign({},t)).hasOwnProperty("startDate")&&(t.startDate=e.convertDateToIsoString(t.startDate)),t.hasOwnProperty("endDate")&&(t.endDate=e.convertDateToIsoString(t.endDate));const n="appleHealth/workouts?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}uploadFile(t,n,s){if(t.size>209715200)throw new Error("File size exceeds the maximum allowed size of 200MB.");const a=this,r="files?category="+n+"&fileName="+encodeURIComponent(s??t.name);return this.connect().then((function(){return a.makeRequest(r,"POST",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()})).then((function(e){return fetch(e.preSignedUrl,{method:"PUT",body:t,headers:{"Content-Type":t.type,"x-amz-server-side-encryption":"AES256"}})})).then((function(t){return e.validateResponse(t)})).then((function(){}))}queryFiles(t){const n="files?"+new URLSearchParams(t).toString(),s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getFileDownloadUrl(t){if(!t)throw new Error("Please specify the key of the file to download.");const n="files/download?key="+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}deleteFile(t){if(!t)throw new Error("Please specify the key of the file to delete.");const n="files?key="+t,s=this;return this.connect().then((function(){return s.makeRequest(n,"DELETE",null)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}connect(){const e=this;let t=function(){e.token=null,e.refreshTokenPromise=new Promise((function(n,s){let a=e.nextMessageID();e.messageHandlers[a]=function(r){r.success?(e.tokenExpires=Date.now()+1e3*r.data.expires_in,e.token=r.data,e.baseUrl=r.baseUrl,setTimeout(t,1e3*(r.data.expires_in-e.accessTokenRenewalBufferSeconds)),n(null)):(e.token=null,s(r.message)),e.messageHandlers[a]=null,e.refreshTokenPromise=null},window.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({messageID:a})}))};if(this.token&&Date.now()<this.tokenExpires)return Promise.resolve();if(this.isStandaloneMode()&&!this.isEmbeddedMode()){let e=this.token?"access token is expired or invalid":"access token must be explicitly provided using the setParticipantAccess method";return console.log(e),Promise.reject(e)}return this.refreshTokenPromise||t(),this.refreshTokenPromise}setParticipantAccessToken(e,t){this.enableStandaloneMode(),this.token=e,t&&(this.baseUrl=t),this.tokenExpires=Date.now()+1e3*this.token.expires_in;const n=this;setTimeout((function(){n.triggerEvent({type:"tokenWillExpire"})}),1e3*(this.token.expires_in-this.accessTokenRenewalBufferSeconds))}isStandaloneMode(){return this.standaloneMode}isEmbeddedMode(){return this.embeddedMode}enableStandaloneMode(e=!1,t){this.standaloneMode=!0,this.embeddedMode=e,t&&(this.baseUrl=t),window.webkit&&(window.webkit.messageHandlers=e?{GetDelegatedAccessToken:window.webkit.messageHandlers.GetDelegatedAccessToken,OpenExternalLink:window.webkit.messageHandlers.OpenExternalLink,OpenEmbeddedLink:window.webkit.messageHandlers.OpenEmbeddedLink,OpenExternalApplication:window.webkit.messageHandlers.OpenExternalApplication,PopNavigation:window.webkit.messageHandlers.PopNavigation,Dismiss:window.webkit.messageHandlers.Dismiss}:{})}get standaloneModeFinalRedirectPath(){return this._standaloneModeFinalRedirectPath}set standaloneModeFinalRedirectPath(e){this._standaloneModeFinalRedirectPath=e}setStatusBarStyle(e){window.webkit.messageHandlers.SetStatusBarStyle&&window.webkit.messageHandlers.SetStatusBarStyle.postMessage({style:e})}getDeviceInfo(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.GetDeviceInfo){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetDeviceInfo.postMessage({messageID:n})}else n()}))}setSupportedLanguages(e){this.supportedLanguages.length=0;for(let t=0;t<e.length;t++)this.supportedLanguages.push(e[t].replace("_","-"))}getStepConfiguration(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.GetStepConfiguration){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetStepConfiguration.postMessage({messageID:n})}else n()}))}getSurveyContext(){let e=this;return new Promise((function(t,n){e.isStandaloneMode()&&t(null),e.getDeviceInfo().then((function(s){if("Web"!==s.platform)t({surveyMode:"Survey"});else if(window.webkit.messageHandlers.GetSurveyContext){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetSurveyContext.postMessage({messageID:n})}else n()})).catch((function(e){n()}))}))}getCurrentSurveyAnswers(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.GetCurrentSurveyAnswers){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.GetCurrentSurveyAnswers.postMessage({messageID:n})}else n()}))}setCurrentLanguage(e){if(e){let t=this.getSupportedLanguage(e);t?this.language=t:console.warn(`language ${e} not supported`)}else this.language=e}getCurrentLanguage(){let e,t=new URLSearchParams(window.location.search);if(t.has("lang")){if(e=this.getSupportedLanguage(t.get("lang")),e)return e;console.warn(`language ${t.get("lang")} not supported`)}return this.language||navigator.language}showGoogleFitSettings(){window.webkit.messageHandlers.ShowGoogleFitSettings&&window.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({})}showHealthConnectMatchmakingPrompt(){window.webkit.messageHandlers.HealthConnectMatchmaking&&window.webkit.messageHandlers.HealthConnectMatchmaking.postMessage({})}showHealthConnectSettings(){window.webkit.messageHandlers.HealthConnectSettings&&window.webkit.messageHandlers.HealthConnectSettings.postMessage({})}showHealthConnectPrompt(){window.webkit.messageHandlers.HealthConnectPrompt&&window.webkit.messageHandlers.HealthConnectPrompt.postMessage({})}getHealthConnectStatus(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.HealthConnectStatus){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.HealthConnectStatus.postMessage({messageID:n})}else n()}))}showHealthConnectPhrPrompt(){window.webkit.messageHandlers.HealthConnectPhrPrompt&&window.webkit.messageHandlers.HealthConnectPhrPrompt.postMessage({})}getHealthConnectPhrStatus(){let e=this;return new Promise((function(t,n){if(e.isStandaloneMode())t(null);else if(window.webkit.messageHandlers.HealthConnectPhrStatus){let n=e.nextMessageID();e.messageHandlers[n]=function(e){t(e.data)},window.webkit.messageHandlers.HealthConnectPhrStatus.postMessage({messageID:n})}else n()}))}requestReview(e){window.webkit.messageHandlers.RequestReview&&window.webkit.messageHandlers.RequestReview.postMessage({cooldownDays:e})}trackCustomEvent(t){const n=this;return this.connect().then((function(){return n.makeRequest("customevents","POST",t)})).then((function(t){return e.validateResponse(t)})).then((function(){}))}getDataCollectionSettings(){const t=this;return this.connect().then((function(){return t.makeRequest("datacollectionsettings","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}getDataAvailability(){const t=this;return this.connect().then((function(){return t.makeRequest("dataavailability","GET",null)})).then((function(t){return e.validateResponse(t)})).then((function(e){return e.json()}))}invokeCustomApi(t,n,s,a){if(t.includes("?"))throw new Error('Cannot include query parameters directly in the "customApi" string. Provide as an argument for "queryParameters" instead.');let r="custom/"+t;if(n=n.toUpperCase(),null!=s&&("GET"===n||"DELETE"===n)){let e=new URLSearchParams(s).toString();r+="?"+e,s=null}const o=this;return this.connect().then((function(){return o.makeRequest(r,n,s)})).then((function(t){return e.validateResponse(t)})).then((function(e){return a?e.json():void 0}))}constructor(){if(this.baseUrl="https://mydatahelps.org/",this.acceptableParentDomains=["localhost","careevolution.com","internal","b3-deploys.com","mydatahelps.org","platform.joinallofus.org","careevolution.dev","ce.dev","mydatahelps.dev"],this.accessTokenRenewalBufferSeconds=120,this.unsupportedActions=["SetHeight","ResearchKit"],this.supportedEvents=["surveyDidFinish","applicationDidBecomeVisible","externalAccountSyncComplete","tokenWillExpire","healthConnectSyncComplete","healthConnectPhrSyncComplete","appleHealthSyncResume","appleHealthSyncComplete"],this.supportedLanguages=[],this.currentMessageID=1,this.messageHandlers=[],this.registeredEventHandlers={},this.refreshTokenPromise=null,this.standaloneMode=!1,this.embeddedMode=!1,this.handleConnectExternalAccountResponse())return;let e,t=this,n=function(){let e=document.location.ancestorOrigins;if(e&&e[0])return e[0];return"*"}();function s(e){if("*"===e)return!0;let n=new URL(e);for(let e=0;e<t.acceptableParentDomains.length;e++)if(n.hostname===t.acceptableParentDomains[e]||n.hostname.endsWith("."+t.acceptableParentDomains[e]))return!0;return!1}s(n)||console.log("Detected unsupported parent origin domain."),e=window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.ResearchKit?{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},OpenExternalLink:function(e){window.parent.postMessage({name:"OpenExternalUrl",url:e},n)},OpenEmbeddedLink:function(e){window.parent.postMessage({name:"OpenEmbeddedUrl",url:e},n)},GetCurrentSurveyAnswers:function(e){window.parent.postMessage({name:"GetCurrentSurveyAnswers",messageID:e.messageID},n)},GetStepConfiguration:function(e){window.parent.postMessage({name:"GetStepConfiguration",messageID:e.messageID},n)},GetSurveyContext:function(e){window.parent.postMessage({name:"GetSurveyContext",messageID:e.messageID},n)},CompleteStep:function(e){window.parent.postMessage({name:"CompleteStep",messageID:e.messageID,answer:e.answer},n)}}:{GetDelegatedAccessToken:function(e){window.parent.postMessage({name:"GetDelegatedAccessToken",messageID:e.messageID},n)},GetDeviceInfo:function(e){window.parent.postMessage({name:"GetDeviceInfo",messageID:e.messageID},n)},StartParticipantSurvey:function(e){window.parent.postMessage({name:"StartParticipantSurvey",messageID:e.messageID,surveyName:e.surveyName,options:e.options},n)},OpenExternalLink:function(e){window.parent.postMessage({name:"OpenExternalUrl",url:e},n)},OpenEmbeddedLink:function(e){window.parent.postMessage({name:"OpenEmbeddedUrl",url:e},n)},OpenExternalApplication:function(e){window.parent.postMessage({name:"OpenApplication",messageID:e.messageID,url:e.url,modal:e.modal,secondaryViewKey:e.secondaryViewKey},n)},Dismiss:function(){window.parent.postMessage({name:"Dismiss"},n)},PopNavigation:function(){window.parent.postMessage({name:"Back"},n)},ShowTab:function(e){window.parent.postMessage({name:"ShowTab",tabKey:e},n)},ShowParticipantDashboard:function(e){window.parent.postMessage({name:"ShowParticipantDashboard",dashboardKey:e.dashboardKey,modal:e.modal},n)},ShowParticipantWebVisualization:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualization",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal},n)},ShowParticipantWebVisualizationPDF:function(e){window.parent.postMessage({name:"ShowParticipantWebVisualizationPDF",visualizationKey:e.visualizationKey,parameters:e.parameters,modal:e.modal,landscape:e.landscape,htmlViewerZoom:e.htmlViewerZoom},n)},DeleteProviderAccount:function(e){window.parent.postMessage({name:"DeleteProviderAccount",messageID:e.messageID,accountID:e.accountID},n)},ConnectExternalAccount:function(e){window.parent.postMessage({name:"ConnectExternalAccount",externalAccountProviderID:e.externalAccountProviderID,messageID:e.messageID,openNewWindow:e.openNewWindow,width:e.width,height:e.height},n)},ShowProject:function(e){window.parent.postMessage({name:"ShowProject",code:e.code},n)},JoinProject:function(e){window.parent.postMessage({name:"JoinProject",code:e.code},n)},GetCurrentSurveyAnswers:function(e){window.parent.postMessage({name:"GetCurrentSurveyAnswers",messageID:e.messageID},n)},GetStepConfiguration:function(e){window.parent.postMessage({name:"GetStepConfiguration",messageID:e.messageID},n)},CompleteStep:function(e){window.parent.postMessage({name:"CompleteStep",messageID:e.messageID,answer:e.answer},n)},HealthConnectStatus:function(e){window.parent.postMessage({name:"HealthConnectStatus",messageID:e.messageID},n)},HealthConnectPrompt:function(){window.parent.postMessage({name:"HealthConnectPrompt"},n)},HealthConnectPhrStatus:function(e){window.parent.postMessage({name:"HealthConnectPhrStatus",messageID:e.messageID},n)},HealthConnectPhrPrompt:function(){window.parent.postMessage({name:"HealthConnectPhrPrompt"},n)},HealthConnectSettings:function(){window.parent.postMessage({name:"HealthConnectSettings"},n)},HealthConnectMatchmaking:function(){window.parent.postMessage({name:"HealthConnectMatchmaking"},n)}},window.webkit&&window.webkit.messageHandlers&&function(){for(let t in e)if(window.webkit.messageHandlers[t])return!0;for(let e in t.unsupportedActions)if(window.webkit.messageHandlers[t.unsupportedActions[e]])return!0;return!1}()||(window.webkit={messageHandlers:{}}),function(e){for(let t in e)if(!window.webkit.messageHandlers[t])try{window.webkit.messageHandlers[t]={postMessage:e[t]}}catch(e){return void console.log("Unable to add missing actions on this platform: "+e)}}(e),window.addEventListener("message",(function(e){if(!function(e){return!(!t.isStandaloneMode()||e.origin!==window.location.origin)||("*"===n?s(e.origin):e.origin===n)}(e))throw console.error("message.origin '"+e.origin+"' is not allowed."),"message.origin '"+e.origin+"' is not allowed.";e.data.messageID?t.setActionResult(e.data):t.triggerEvent(e.data)}),!1),this.hasEmbeddedModeUrlParameter()&&t.enableStandaloneMode(!0)}nextMessageID(){return this.currentMessageID++}makeUrl(e,t){if(!this.baseUrl)throw console.error("Cannot use makeUrl without MyDataHelps.baseUrl."),"Cannot use makeUrl without MyDataHelps.baseUrl.";return this.baseUrl+"api/"+t+"/delegated/"+e}makeRequest(e,t,n,s="v1"){if(!this.token||!this.token.access_token)throw"No access_token available for request authorization.";let a=this.makeUrl(e,s),r=new Headers;r.append("Authorization","Bearer "+this.token.access_token),r.append("Accept","application/json, text/javascript, */*; q=0.01"),r.append("Accept-Language",this.getCurrentLanguage()),n&&r.append("Content-Type","application/json");let o={method:t,headers:r};return n&&(o.body=JSON.stringify(n)),fetch(a,o)}getSupportedLanguage(e){return e=e.replace("_","-"),0===this.supportedLanguages.length||this.supportedLanguages.find((t=>t===e))||e.indexOf("-")>0&&(e=e.substring(0,e.indexOf("-")),this.supportedLanguages.find((t=>t===e)))?e:void 0}static validateResponse(e){if(!e.ok)throw e.statusText;return e}static escapeParam(e){return String(e).replaceAll("\\","\\\\").replaceAll(",","\\,")}static reduceArrayAndEscape(t){if(Array.isArray(t)){return t.map((function(t){return e.escapeParam(t)})).join(",")}return this.escapeParam(t)}static convertDateToIsoString(e){let t=new Date(e);if(isNaN(t.getTime()))throw"Cannot interpret parameter as Date";return t.toISOString()}static flattenPropertyShallow(t,n){if(void 0!==t[n]&&null!==t[n]){for(var s in t[n])t[n].hasOwnProperty(s)&&(t[`${n}.${s}`]=e.escapeParam(t[n][s]));delete t[n]}}startEmbeddedSurveyInternal(e){let t="mydatahelps-survey-modal",n=this;return new Promise((function(s,a){if(document.getElementById(t))return void a("Survey already in progress");window.addEventListener("message",(function e(a){if(a.origin!==new URL(n.baseUrl).origin)return;let r=document.getElementById("mydatahelps-survey-frame").contentWindow;a.source===r&&("SurveyWindowInitialized"===a.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===a.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s(a.data)))}),!0);let r=document.createElement("div");r.className="mydatahelps-survey-modal",r.id=t,r.innerHTML="<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='"+e+"'></iframe></div>",document.body.append(r),document.body.className+=" no-scroll"}))}startDelegatedSurvey(e){let t="mydatahelps-survey-modal",n=this;if(document.getElementById(t))return;window.addEventListener("message",(function e(s){if(s.origin!==new URL(n.baseUrl).origin)return;let a=document.getElementById("mydatahelps-survey-frame").contentWindow;s.source===a&&("GetDelegatedAccessToken"===s.data.name?n.getParticipantInfo().then((e=>{a.postMessage({name:"DelegatedAccessTokenResponse",accessToken:n.token,baseUrl:n.baseUrl,participantID:e.participantID},"*")})):"SurveyWindowInitialized"===s.data.name?document.getElementById(t).className+=" loaded":"SurveyFinished"===s.data.name&&(document.getElementById(t).remove(),document.body.className=document.body.className.replace("no-scroll",""),window.removeEventListener("message",e,!0),s.data.type="surveyDidFinish",n.triggerEvent(s.data)))}),!0);let s=document.createElement("div");s.className="mydatahelps-survey-modal",s.id=t,s.innerHTML=`<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='${e}&lang=${n.getCurrentLanguage()}'></iframe></div>`,document.body.append(s),document.body.className+=" no-scroll"}handleConnectExternalAccountResponse(){const e=new URLSearchParams(window.location.search);if(e.get("connectExternalAccount")&&e.get("messageID")&&e.get("success")){const t={name:"ConnectExternalAccountResponse",messageID:parseInt(e.get("messageID")),success:"true"===e.get("success")};if(window.opener)window.opener.postMessage(t,window.location.origin);else{const e=new BroadcastChannel("ConnectExternalAccount");e.postMessage(t),e.close()}return window.close(),!0}}hasEmbeddedModeUrlParameter(){const e=new URLSearchParams(window.location.search),t=e.get("_e");if(e.has("_e")&&"false"!==t)return URL.canParse(t)&&(this.standaloneModeFinalRedirectPath=t),!0}static generateVerifier(){const e=Math.ceil(16),t=new Uint8Array(e);return window.crypto.getRandomValues(t),Array.from(t).map((e=>e.toString(16).padStart(2,"0"))).join("").slice(0,32)}static async hashVerifier(e){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t),s=Array.from(new Uint8Array(n));return btoa(String.fromCharCode(...s)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}const t=new e;window.MyDataHelps=t,window.RKStudioClient={},window.RKStudioClient.setActionResult=function(e){window.MyDataHelps.setActionResult(e)};export{e as MyDataHelps,t as default};
2
2
  //# sourceMappingURL=MyDataHelps.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MyDataHelps.min.js","sources":["../../src/MyDataHelps.ts"],"sourcesContent":["// @ts-ignore : let rollup handle CSS injection\nimport \"../MyDataHelps.css\";\n\nimport * as Model from \"./types\";\nimport { StringMap } from \"./types\";\n\nexport class MyDataHelps {\n\n\tbaseUrl: string = 'https://mydatahelps.org/';\n\tlanguage: string;\n\ttoken: Model.Token;\n\ttokenExpires: number;\n\n\tprivate _standaloneModeFinalRedirectPath: string;\n\n\t// Surveys\n\n\tstartSurvey(surveyName: string, options?: Model.StartSurveyOptions): void {\n\t\tif (this.isStandaloneMode()) {\n\t\t\tconst params = new URLSearchParams();\n\t\t\tparams.set('surveyName', surveyName);\n\t\t\tif (options?.editResultID) {\n\t\t\t\tparams.set('editResultID', options.editResultID);\n\t\t\t}\n\t\t\tif (options?.event) {\n\t\t\t\tparams.set('event', options.event);\n\t\t\t}\n\t\t\tthis.startDelegatedSurvey(`${this.baseUrl}/survey?${params.toString()}`);\n\t\t}\n\t\telse if (window.webkit.messageHandlers.StartParticipantSurvey) {\n\t\t\tlet messageID = this.nextMessageID();\n\t\t\twindow.webkit.messageHandlers.StartParticipantSurvey.postMessage({\n\t\t\t\tmessageID: messageID,\n\t\t\t\tsurveyName: surveyName,\n\t\t\t\toptions: options\n\t\t\t});\n\t\t}\n\t}\n\n\tcompleteStep(answer: any): void {\n\t\tif (answer === undefined || answer === null) answer = '';\n\t\tif (typeof answer !== 'string') {\n\t\t\tanswer = JSON.stringify(answer);\n\t\t}\n\t\tif (window.webkit.messageHandlers.ResearchKit) {\n\t\t\twindow.webkit.messageHandlers.ResearchKit.postMessage(answer);\n\t\t}\n\t\telse if (window.webkit.messageHandlers.CompleteStep) {\n\t\t\tlet messageID = this.nextMessageID();\n\t\t\twindow.webkit.messageHandlers.CompleteStep.postMessage({\n\t\t\t\tmessageID: messageID,\n\t\t\t\tanswer: answer\n\t\t\t});\n\t\t}\n\t}\n\n\tquerySurveyAnswers(queryParameters: Model.SurveyAnswersQuery): Promise<Model.SurveyAnswersPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"surveyName\")) {\n\t\t\tqueryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"stepIdentifier\")) {\n\t\t\tqueryParameters.stepIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.stepIdentifier);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"resultIdentifier\")) {\n\t\t\tqueryParameters.resultIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.resultIdentifier);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"answer\")) {\n\t\t\tqueryParameters.answer = MyDataHelps.reduceArrayAndEscape(queryParameters.answer);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"before\")) {\n\t\t\tqueryParameters.before = MyDataHelps.convertDateToIsoString(queryParameters.before);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"after\")) {\n\t\t\tqueryParameters.after = MyDataHelps.convertDateToIsoString(queryParameters.after);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"event\")) {\n\t\t\tqueryParameters.event = MyDataHelps.reduceArrayAndEscape(queryParameters.event);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'surveyanswers?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tquerySurveyResults(queryParameters: Model.SurveyResultsQuery): Promise<Model.SurveyResultsPage> {\n\t\tqueryParameters = { ...queryParameters }\n\n\t\tif (queryParameters.hasOwnProperty(\"surveyName\")) {\n\t\t\tqueryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"event\")) {\n\t\t\tqueryParameters.event = MyDataHelps.reduceArrayAndEscape(queryParameters.event);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"before\")) {\n\t\t\tqueryParameters.before = MyDataHelps.convertDateToIsoString(queryParameters.before);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"after\")) {\n\t\t\tqueryParameters.after = MyDataHelps.convertDateToIsoString(queryParameters.after);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedBefore\")) {\n\t\t\tqueryParameters.insertedBefore = MyDataHelps.convertDateToIsoString(queryParameters.insertedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedAfter\")) {\n\t\t\tqueryParameters.insertedAfter = MyDataHelps.convertDateToIsoString(queryParameters.insertedAfter);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'surveyresults?' + queryString;\n\n\t\treturn this.connect()\n\t\t\t.then(() => this.makeRequest(endpoint, 'GET', null))\n\t\t\t.then(MyDataHelps.validateResponse)\n\t\t\t.then(response => response.json());\n\t}\n\n\tdeleteSurveyResult(resultID: string): Promise<void> {\n\t\tconst endpoint = 'surveyresults/' + encodeURIComponent(resultID);\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'DELETE', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tquerySurveyTasks(queryParameters: Model.SurveyTaskQueryParameters): Promise<Model.SurveyTasksPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"status\")) {\n\t\t\tqueryParameters.status = MyDataHelps.reduceArrayAndEscape(queryParameters.status) as Model.SurveyTaskStatus;\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"surveyName\")) {\n\t\t\tqueryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"event\")) {\n\t\t\tqueryParameters.event = MyDataHelps.reduceArrayAndEscape(queryParameters.event);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'surveytasks?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryInboxItems(queryParameters: Model.InboxItemQueryParameters): Promise<Model.InboxItemsPage> {\n\t\tconst assignDefined = (target: any, source: any): any => {\n\t\t\tfor (const key of Object.keys(source)) {\n\t\t\t\tconst value = source[key];\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\ttarget[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn target;\n\t\t};\n\n\t\tqueryParameters = assignDefined({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"type\")) {\n\t\t\tqueryParameters.type = MyDataHelps.reduceArrayAndEscape(queryParameters.type) as Model.InboxItemType;\n\t\t}\n\n\t\tif (queryParameters.hasOwnProperty(\"status\")) {\n\t\t\tqueryParameters.status = MyDataHelps.reduceArrayAndEscape(queryParameters.status) as Model.InboxItemStatus;\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'inbox?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tgetInboxItem(id: Model.Guid): Promise<Model.InboxItem> {\n\t\tconst endpoint = `inbox/${id}`;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tupdateInboxItem(id: Model.Guid, update: Model.InboxItemUpdate): Promise<Model.InboxItemUpdateResult> {\n\t\tconst endpoint = `inbox/${id}/${update}`;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'PUT', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tstartEmbeddedSurvey(linkIdentifier: string, surveyName: string, language: string): Promise<any> {\n\t\tif (!language) {\n\t\t\tlanguage = this.getCurrentLanguage();\n\t\t}\n\t\tlet surveyUrl = this.baseUrl + \"mydatahelps/\" + linkIdentifier + '/surveylink/' + surveyName + \"?lang=\" + language;\n\t\treturn this.startEmbeddedSurveyInternal(surveyUrl);\n\t}\n\n\t// Navigation\n\n\topenExternalUrl(url: string): void {\n\t\tif (window.webkit.messageHandlers.OpenExternalLink) {\n\t\t\twindow.webkit.messageHandlers.OpenExternalLink.postMessage(url);\n\t\t}\n\t}\n\n\topenEmbeddedUrl(url: string): void {\n\t\tif (window.webkit.messageHandlers.OpenEmbeddedLink) {\n\t\t\twindow.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);\n\t\t}\n\t}\n\n\tshowTab(tabKey: string): void {\n\t\tif (window.webkit.messageHandlers.ShowTab) {\n\t\t\twindow.webkit.messageHandlers.ShowTab.postMessage(tabKey);\n\t\t}\n\t}\n\n\topenApplication(url: string, options?: Model.OpenApplicationOptions): void {\n\t\tif (window.webkit.messageHandlers.OpenExternalApplication) {\n\t\t\tlet messageID = this.nextMessageID();\n\t\t\twindow.webkit.messageHandlers.OpenExternalApplication.postMessage({\n\t\t\t\tmessageID: messageID,\n\t\t\t\turl: url,\n\t\t\t\tmodal: !!(options && options.modal)\n\t\t\t});\n\t\t}\n\t}\n\n\topenSecondaryView(projectId: string, viewKey: string, options?: Model.OpenApplicationOptions): void {\n\t\tthis.lookupSecondaryView(projectId, viewKey).then(secondaryView => {\n\t\t\treturn this.openApplication(secondaryView.url, options);\n\t\t});\n\t};\n\n\tlookupSecondaryView(projectId: string, viewKey: string): Promise<Model.SecondaryView> {\n\t\tlet baseUrl = this.baseUrl;\n\t\tif (!baseUrl.endsWith(\"/\")) {\n\t\t\tbaseUrl += \"/\";\n\t\t}\n\t\tconst viewLookupUrl = `${baseUrl}api/v1/public/projects/${projectId}/views/${viewKey}`;\n\t\treturn fetch(viewLookupUrl, { method: 'GET', headers: { 'Accept': 'application/json' } })\n\t\t\t.then(response => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\treturn response.text().then(text => {\n\t\t\t\t\t\tthrow new Error(`Failed to fetch secondary view: ${response.status} ${response.statusText}${text ? ' - ' + text : ''}`);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tdismiss(): void {\n\t\tif (window.webkit.messageHandlers.Dismiss) {\n\t\t\twindow.webkit.messageHandlers.Dismiss.postMessage({});\n\t\t}\n\t}\n\n\tback(): void {\n\t\tif (window.webkit.messageHandlers.PopNavigation) {\n\t\t\twindow.webkit.messageHandlers.PopNavigation.postMessage({});\n\t\t}\n\t}\n\n\tshowDashboard(dashboardKey: string, options?: Model.ShowDashboardOptions): void {\n\t\tif (window.webkit.messageHandlers.ShowParticipantDashboard) {\n\t\t\twindow.webkit.messageHandlers.ShowParticipantDashboard.postMessage({\n\t\t\t\tdashboardKey: dashboardKey,\n\t\t\t\tmodal: !!(options && options.modal),\n\t\t\t\ttitle: options && options.title ? options.title : undefined\n\t\t\t});\n\t\t}\n\t}\n\n\tshowWebVisualization(visualizationKey: string, parameters: object, options: Model.ShowWebVisualizationOptions): void {\n\t\tif (window.webkit.messageHandlers.ShowParticipantWebVisualization) {\n\t\t\twindow.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({\n\t\t\t\tvisualizationKey: visualizationKey,\n\t\t\t\tparameters: parameters,\n\t\t\t\tmodal: !!(options && options.modal),\n\t\t\t\ttitle: options && options.title ? options.title : undefined\n\t\t\t});\n\t\t}\n\t}\n\n\tshowWebVisualizationPdf(visualizationKey: string, parameters: object, options: Model.ShowWebVisualizationPdfOptions): void {\n\t\tif (window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF) {\n\t\t\twindow.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({\n\t\t\t\tvisualizationKey: visualizationKey,\n\t\t\t\tparameters: parameters,\n\t\t\t\tlandscape: !!(options && options.landscape),\n\t\t\t\thtmlViewerZoom: options && options.htmlViewerZoom\n\t\t\t});\n\t\t}\n\t}\n\n\tshowProject(projectCode: string): void {\n\t\tif (window.webkit.messageHandlers.ShowProject) {\n\t\t\twindow.webkit.messageHandlers.ShowProject.postMessage({ code: projectCode });\n\t\t}\n\t}\n\n\tjoinProject(projectCode: string): void {\n\t\tif (window.webkit.messageHandlers.JoinProject) {\n\t\t\twindow.webkit.messageHandlers.JoinProject.postMessage({ code: projectCode });\n\t\t}\n\t}\n\n\t//Events\n\n\ton(eventName: Model.EventName, callback: (EventData) => void): void {\n\n\t\tif (!this.supportedEvents.includes(eventName)) {\n\t\t\tthrow new Error(eventName + \" is not a supported event type.\");\n\t\t}\n\n\t\tif (!this.registeredEventHandlers[eventName]) {\n\t\t\tthis.registeredEventHandlers[eventName] = [];\n\t\t}\n\n\t\tthis.registeredEventHandlers[eventName].push(callback);\n\t}\n\n\toff(eventName: Model.EventName, callback: (EventData) => void): void {\n\n\t\tif (!this.supportedEvents.includes(eventName)) {\n\t\t\tthrow new Error(eventName + \" is not a supported event type.\");\n\t\t}\n\n\t\tif (!this.registeredEventHandlers[eventName]) return;\n\n\t\tlet eventHandlerIndex = this.registeredEventHandlers[eventName].indexOf(callback);\n\n\t\tif (eventHandlerIndex !== -1) {\n\t\t\tthis.registeredEventHandlers[eventName].splice(eventHandlerIndex, 1);\n\t\t}\n\t}\n\n\ttriggerEvent(event: Model.EventData): void {\n\t\tlet eventName = event.type;\n\t\tif (this.supportedEvents.includes(eventName) && this.registeredEventHandlers[eventName]) {\n\t\t\tthis.registeredEventHandlers[eventName].forEach(function (handler) {\n\t\t\t\thandler(event);\n\t\t\t});\n\t\t}\n\t}\n\n\tsetActionResult(data: Model.EventData): void {\n\t\tif (Object.prototype.hasOwnProperty.call(this.messageHandlers, data.messageID) &&\n\t\t\ttypeof this.messageHandlers[data.messageID] === 'function') {\n\t\t\tthis.messageHandlers[data.messageID](data);\n\t\t} else {\n\t\t\tconsole.error(`Invalid messageID: ${data.messageID}`);\n\t\t}\n\t}\n\n\t// Participant Info\n\n\tgetParticipantInfo(): Promise<Model.ParticipantInfo> {\n\t\tconst mdh = this;\n\t\tconst endpoint = 'participant';\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tpersistParticipantInfo(demographics: Partial<Model.ParticipantDemographics> | undefined, customFields: StringMap): Promise<Model.ParticipantInfo> {\n\t\tconst endpoint = 'participant';\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'PUT', { demographics, customFields });\n\t\t\t})\n\t\t\t.then(async function (response) {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tvar errorJson = await response.json();\n\t\t\t\t\tthrow errorJson.message;\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch(function (error) {\n\t\t\t\tconsole.log(\"Unable to persist participant: \" + error);\n\t\t\t});\n\t}\n\n\tgetProjectInfo(): Promise<Model.ProjectInfo> {\n\t\tconst mdh = this;\n\t\tconst endpoint = 'project';\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// Device Data\n\n\tgetDeviceDataPoint(id: Model.Guid): Promise<Model.DeviceDataPoint> {\n\t\tconst endpoint = 'devicedata/' + id;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tdeleteDeviceDataPoint(id: Model.Guid): Promise<void> {\n\t\tconst endpoint = 'devicedata/' + id;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'DELETE', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tqueryDeviceData(queryParameters: Model.DeviceDataPointQuery): Promise<Model.DeviceDataPointsPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"type\")) {\n\t\t\tqueryParameters.type = MyDataHelps.reduceArrayAndEscape(queryParameters.type);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedBefore\")) {\n\t\t\tqueryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedAfter\")) {\n\t\t\tqueryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'devicedata?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tpersistDeviceData(deviceDataPoints: Model.PersistableDeviceDataPoint[]): Promise<void> {\n\t\tconst endpoint = 'devicedata';\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', deviceDataPoints);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tgetDeviceDataAllDataTypes(enabled?: boolean, namespace?: string): Promise<Model.SupportedDeviceDataType[]> {\n\t\tconst queryParameters: Record<string, string> = {};\n\n\t\tif (enabled !== undefined) {\n\t\t\tqueryParameters['enabled'] = enabled.toString();\n\t\t}\n\n\t\tif (namespace) {\n\t\t\tqueryParameters['namespace'] = namespace;\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters).toString();\n\t\tconst endpoint = `devicedata/allDataTypes?${queryString}`;\n\n\t\treturn this.connect()\n\t\t\t.then(() => this.makeRequest(endpoint, 'GET', null))\n\t\t\t.then(MyDataHelps.validateResponse)\n\t\t\t.then(response => response.json());\n\t}\n\n\t// Device Data V2\n\n\tqueryDeviceDataV2(queryParameters: Model.DeviceDataV2Query): Promise<Model.DeviceDataV2Page> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"observedBefore\")) {\n\t\t\tqueryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedAfter\")) {\n\t\t\tqueryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedBefore\")) {\n\t\t\tqueryParameters.insertedBefore = MyDataHelps.convertDateToIsoString(queryParameters.insertedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedAfter\")) {\n\t\t\tqueryParameters.insertedAfter = MyDataHelps.convertDateToIsoString(queryParameters.insertedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedBefore\")) {\n\t\t\tqueryParameters.modifiedBefore = MyDataHelps.convertDateToIsoString(queryParameters.modifiedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedAfter\")) {\n\t\t\tqueryParameters.modifiedAfter = MyDataHelps.convertDateToIsoString(queryParameters.modifiedAfter);\n\t\t}\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"dataSource\");\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"properties\");\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'devicedata?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null, 'v2');\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryDeviceDataV2Aggregate(queryParameters: Model.DeviceDataV2AggregateQuery): Promise<Model.DeviceDataV2AggregatePage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"aggregateFunctions\")) {\n\t\t\tqueryParameters.aggregateFunctions = MyDataHelps.reduceArrayAndEscape(queryParameters.aggregateFunctions);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedBefore\")) {\n\t\t\tqueryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedAfter\")) {\n\t\t\tqueryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedBefore\")) {\n\t\t\tqueryParameters.insertedBefore = MyDataHelps.convertDateToIsoString(queryParameters.insertedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedAfter\")) {\n\t\t\tqueryParameters.insertedAfter = MyDataHelps.convertDateToIsoString(queryParameters.insertedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedBefore\")) {\n\t\t\tqueryParameters.modifiedBefore = MyDataHelps.convertDateToIsoString(queryParameters.modifiedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedAfter\")) {\n\t\t\tqueryParameters.modifiedAfter = MyDataHelps.convertDateToIsoString(queryParameters.modifiedAfter);\n\t\t}\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"dataSource\");\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"properties\");\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'devicedata/aggregate?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null, 'v2');\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryDeviceDataV2DailySleep(queryParameters: Model.DeviceDataV2AggregateQuery): Promise<Model.DeviceDataV2DailySleepPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"observedBefore\")) {\n\t\t\tqueryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedAfter\")) {\n\t\t\tqueryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedBefore\")) {\n\t\t\tqueryParameters.insertedBefore = MyDataHelps.convertDateToIsoString(queryParameters.insertedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedAfter\")) {\n\t\t\tqueryParameters.insertedAfter = MyDataHelps.convertDateToIsoString(queryParameters.insertedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedBefore\")) {\n\t\t\tqueryParameters.modifiedBefore = MyDataHelps.convertDateToIsoString(queryParameters.modifiedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedAfter\")) {\n\t\t\tqueryParameters.modifiedAfter = MyDataHelps.convertDateToIsoString(queryParameters.modifiedAfter);\n\t\t}\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"dataSource\");\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"properties\");\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'devicedata/aggregate/dailysleep?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null, 'v2');\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tgetDeviceDataV2AllDataTypes(enabled?: boolean, namespace?: string): Promise<Model.SupportedDeviceDataV2DataType[]> {\n\t\tconst queryParameters: Record<string, string> = {};\n\n\t\tif (enabled !== undefined) {\n\t\t\tqueryParameters['enabled'] = enabled.toString();\n\t\t}\n\n\t\tif (namespace) {\n\t\t\tqueryParameters['namespace'] = namespace;\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters).toString();\n\t\tconst endpoint = `devicedata/allDataTypes?${queryString}`;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null, 'v2');\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// External Accounts\n\n\tgetExternalAccountProviders(search: string | null, category: string | null, pageSize: number, pageNumber: number): Promise<Model.ExternalAccountProvidersPage> {\n\t\tlet searchParameters: any = {};\n\t\tif (!!search) searchParameters.search = search;\n\t\tif (!!category) searchParameters.category = category;\n\t\tif (!!pageSize) searchParameters.pageSize = pageSize;\n\t\tif (!!pageNumber) searchParameters.pageNumber = pageNumber;\n\n\t\tconst queryString = new URLSearchParams(searchParameters).toString();\n\t\tconst endpoint = 'externalaccountproviders?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tconnectExternalAccount(externalAccountProviderID: number, options?: Model.ConnectExternalAccountOptions): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\n\t\t\tconst messageID = mdh.nextMessageID();\n\t\t\tmdh.messageHandlers[messageID] = function (connectProviderAccountResponse) {\n\t\t\t\tif (connectProviderAccountResponse && connectProviderAccountResponse.success) {\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\treject(connectProviderAccountResponse.errorMessage)\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (this.standaloneMode) {\n\t\t\t\tconst mdh = this;\n\t\t\t\tlet standaloneModeFinalRedirectPath = options?.standaloneModeFinalRedirectPath || mdh.standaloneModeFinalRedirectPath || window.location.href;\n\n\t\t\t\t// DEV: Safari blocks popups in AJAX responses. Work-around is to open a blank window before the request and set the URL later\n\t\t\t\tlet providerAuthWindow;\n\t\t\t\tif (options?.openNewWindow) {\n\t\t\t\t\tstandaloneModeFinalRedirectPath = `${standaloneModeFinalRedirectPath.split('?')[0]}?connectExternalAccount=true&messageID=${messageID}&success=%SUCCESSVALUE%`;\n\t\t\t\t\tlet windowFeatures = null;\n\t\t\t\t\tif (options?.width && options?.height) {\n\t\t\t\t\t\tconst w = options?.width;\n\t\t\t\t\t\tconst h = options?.height;\n\t\t\t\t\t\tconst y = window.outerHeight / 2 + window.screenY - (h / 2);\n\t\t\t\t\t\tconst x = window.outerWidth / 2 + window.screenX - (w / 2);\n\t\t\t\t\t\twindowFeatures = \"width=\" + w + \",height=\" + h + \",top=\" + y + \",left=\" + x;\n\t\t\t\t\t}\n\n\t\t\t\t\tproviderAuthWindow = window.open(\"\", 'providerauth', windowFeatures);\n\t\t\t\t\tproviderAuthWindow.document.open();\n\t\t\t\t\tproviderAuthWindow.document.write(`<!DOCTYPE html><html><head><title>Loading</title><link href=\"${this.baseUrl}Content/Loading.css\" rel=\"stylesheet\"/></head><body><div id=\"fragment-redirect-content\"></div></body></html>`);\n\t\t\t\t\tproviderAuthWindow.document.close();\n\t\t\t\t}\n\n\t\t\t\tconst verifier = MyDataHelps.generateVerifier();\n\t\t\t\tMyDataHelps.hashVerifier(verifier).then(verifierHash => {\n\t\t\t\t\tconst searchParameters = { finalRedirectPath: standaloneModeFinalRedirectPath, verifierHash: verifierHash };\n\t\t\t\t\tconst queryString = new URLSearchParams(searchParameters).toString();\n\t\t\t\t\tconst endpoint = \"externalaccountproviders/\" + externalAccountProviderID + \"/connect?\" + queryString;\n\n\t\t\t\t\tthis.connect()\n\t\t\t\t\t\t.then(function () {\n\t\t\t\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', null);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(function (response) {\n\t\t\t\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(function (response) {\n\t\t\t\t\t\t\treturn response.text();\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(function (redirectUrl) {\n\t\t\t\t\t\t\tconst url = new URL(redirectUrl.replace(/['\"]+/g, ''));\n\t\t\t\t\t\t\tconst searchParams = new URLSearchParams();\n\t\t\t\t\t\t\tsearchParams.set('verifier', verifier);\n\t\t\t\t\t\t\tredirectUrl = `${url}#${searchParams}`;\n\t\t\t\t\t\t\tif (providerAuthWindow) {\n\t\t\t\t\t\t\t\tproviderAuthWindow.location = redirectUrl;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twindow.top.location = redirectUrl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(function (error) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t} else if (window.webkit.messageHandlers.ConnectExternalAccount) {\n\t\t\t\twindow.webkit.messageHandlers.ConnectExternalAccount.postMessage({\n\t\t\t\t\texternalAccountProviderID: externalAccountProviderID,\n\t\t\t\t\tmessageID: messageID,\n\t\t\t\t\t...options\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tgetExternalAccounts(): Promise<Model.ExternalAccount[]> {\n\t\tconst endpoint = 'externalaccounts';\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\trefreshExternalAccount(accountID: number): Promise<void> {\n\t\tconst endpoint = 'externalaccounts/refresh/' + accountID;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tdeleteExternalAccount(accountID: number): Promise<any> {\n\t\tconst endpoint = 'externalaccounts/delete/' + encodeURIComponent(accountID);\n\t\tconst mdh = this;\n\n\t\tif (this.isStandaloneMode()) {\n\t\t\treturn this\n\t\t\t\t.connect()\n\t\t\t\t.then(function () {\n\t\t\t\t\treturn mdh.makeRequest(endpoint, 'DELETE', null);\n\t\t\t\t})\n\t\t\t\t.then(function (response) {\n\t\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t\t});\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tif (window.webkit.messageHandlers.DeleteProviderAccount) {\n\t\t\t\tconst messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {\n\t\t\t\t\tif (!deleteProviderAccountResponse.success) {\n\t\t\t\t\t\treject(deleteProviderAccountResponse)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(deleteProviderAccountResponse);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.DeleteProviderAccount.postMessage({\n\t\t\t\t\tmessageID: messageID,\n\t\t\t\t\taccountID: accountID\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tgetFeaturedProviders(context?: string): Promise<Model.ExternalAccountProvider[]> {\n\t\tconst queryParameters: Record<string, string> = {};\n\n\t\tif (context) {\n\t\t\tqueryParameters['featuredProvidersContext'] = context;\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters).toString();\n\t\tconst endpoint = `featuredexternalaccountproviders?${queryString}`;\n\n\t\treturn this.connect()\n\t\t\t.then(() => this.makeRequest(endpoint, 'GET', null))\n\t\t\t.then(MyDataHelps.validateResponse)\n\t\t\t.then(response => response.json());\n\t}\n\n\t// Notifications\n\n\tqueryNotifications(queryParameters: Model.NotificationQueryParameters): Promise<Model.NotificationsPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"sentBefore\")) {\n\t\t\tqueryParameters.sentBefore = MyDataHelps.convertDateToIsoString(queryParameters.sentBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"sentAfter\")) {\n\t\t\tqueryParameters.sentAfter = MyDataHelps.convertDateToIsoString(queryParameters.sentAfter);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'notifications?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// Fitbit\n\n\tqueryFitbitDailySummaries(queryParameters: Model.FitbitQuery): Promise<Model.FitbitDailySummariesPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"startDate\")) {\n\t\t\tqueryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"endDate\")) {\n\t\t\tqueryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'fitbit/dailySummaries?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryFitbitSleepLogs(queryParameters: Model.FitbitQuery): Promise<Model.FitbitSleepLogsPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"startDate\")) {\n\t\t\tqueryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"endDate\")) {\n\t\t\tqueryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'fitbit/sleepLogs?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// AppleHealth\n\n\tqueryAppleHealthActivitySummaries(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthActivitySummaryPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"startDate\")) {\n\t\t\tqueryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"endDate\")) {\n\t\t\tqueryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'appleHealth/activitySummaries?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryAppleHealthWorkouts(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthWorkoutPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"startDate\")) {\n\t\t\tqueryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"endDate\")) {\n\t\t\tqueryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'appleHealth/workouts?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// Files\n\n\tuploadFile(file: File, category: string, fileName?: string): Promise<void> {\n\n\t\tif (file.size > 200 * 1024 * 1024) {\n\t\t\tthrow new Error(\"File size exceeds the maximum allowed size of 200MB.\");\n\t\t}\n\n\t\tconst mdh = this;\n\t\tconst endpoint = 'files?category=' + category + '&fileName=' + encodeURIComponent(fileName ?? file.name);\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.then(function (json) {\n\t\t\t\treturn fetch(json.preSignedUrl, {\n\t\t\t\t\tmethod: 'PUT',\n\t\t\t\t\tbody: file,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': file.type,\n\t\t\t\t\t\t'x-amz-server-side-encryption': 'AES256'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tqueryFiles(queryParameters: Model.UploadedFileQuery): Promise<Model.UploadedFilesPage> {\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'files?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tgetFileDownloadUrl(key: string): Promise<Model.DownloadedFile> {\n\n\t\tif (!key) throw new Error(\"Please specify the key of the file to download.\");\n\n\t\tconst endpoint = 'files/download?key=' + key;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tdeleteFile(key: string): Promise<void> {\n\n\t\tif (!key) throw new Error(\"Please specify the key of the file to delete.\");\n\n\t\tconst endpoint = 'files?key=' + key;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'DELETE', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\t// Authorization\n\n\tconnect(): Promise<void> {\n\t\tconst mdh = this;\n\t\tlet refreshDelegatedAccessToken = function () {\n\t\t\tmdh.token = null;\n\n\t\t\tmdh.refreshTokenPromise = new Promise(function (resolve, reject) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (tokenResponse) {\n\t\t\t\t\tif (tokenResponse.success) {\n\t\t\t\t\t\tmdh.tokenExpires = Date.now() + (tokenResponse.data.expires_in * 1000);\n\t\t\t\t\t\tmdh.token = tokenResponse.data;\n\t\t\t\t\t\tmdh.baseUrl = tokenResponse.baseUrl;\n\t\t\t\t\t\tsetTimeout(refreshDelegatedAccessToken, ((tokenResponse.data.expires_in - mdh.accessTokenRenewalBufferSeconds) * 1000));\n\t\t\t\t\t\tresolve(null);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmdh.token = null;\n\t\t\t\t\t\treject(tokenResponse.message);\n\t\t\t\t\t}\n\t\t\t\t\tmdh.messageHandlers[messageID] = null;\n\t\t\t\t\tmdh.refreshTokenPromise = null;\n\t\t\t\t};\n\n\t\t\t\twindow.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({ messageID: messageID });\n\t\t\t});\n\t\t};\n\n\t\tif (this.token && Date.now() < this.tokenExpires) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tif (this.isStandaloneMode() && !this.isEmbeddedMode()) {\n\t\t\tlet error = this.token ? \"access token is expired or invalid\" : \"access token must be explicitly provided using the setParticipantAccess method\";\n\t\t\tconsole.log(error);\n\t\t\treturn Promise.reject(error);\n\t\t}\n\n\t\tif (!this.refreshTokenPromise) {\n\t\t\trefreshDelegatedAccessToken();\n\t\t}\n\n\t\t// Re-use promise if refresh already in progress\n\t\treturn this.refreshTokenPromise;\n\t}\n\n\tsetParticipantAccessToken(token: Model.Token, baseUrl?: string): void {\n\t\tthis.enableStandaloneMode();\n\t\tthis.token = token;\n\t\tif (baseUrl) {\n\t\t\tthis.baseUrl = baseUrl;\n\t\t}\n\t\tthis.tokenExpires = Date.now() + (this.token.expires_in * 1000);\n\t\tconst mdh = this;\n\t\tsetTimeout(function () {\n\t\t\tmdh.triggerEvent({ type: \"tokenWillExpire\" });\n\t\t}, ((this.token.expires_in - this.accessTokenRenewalBufferSeconds) * 1000));\n\t}\n\n\t// Miscellaneous\n\n\tisStandaloneMode() {\n\t\treturn this.standaloneMode;\n\t}\n\n\tisEmbeddedMode() {\n\t\treturn this.embeddedMode;\n\t}\n\n\tenableStandaloneMode(embeddedMode: boolean = false, baseUrl?: string) {\n\t\tthis.standaloneMode = true;\n\t\tthis.embeddedMode = embeddedMode;\n\t\tif (baseUrl) {\n\t\t\tthis.baseUrl = baseUrl;\n\t\t}\n\t\tif (window.webkit) {\n\t\t\twindow.webkit.messageHandlers = embeddedMode ? {\n\t\t\t\tGetDelegatedAccessToken: window.webkit.messageHandlers.GetDelegatedAccessToken,\n\t\t\t\tOpenExternalLink: window.webkit.messageHandlers.OpenExternalLink,\n\t\t\t\tOpenEmbeddedLink: window.webkit.messageHandlers.OpenEmbeddedLink,\n\t\t\t\tOpenExternalApplication: window.webkit.messageHandlers.OpenExternalApplication,\n\t\t\t\tPopNavigation: window.webkit.messageHandlers.PopNavigation,\n\t\t\t\tDismiss: window.webkit.messageHandlers.Dismiss,\n\t\t\t} : {};\n\t\t}\n\t}\n\n\tget standaloneModeFinalRedirectPath(): string {\n\t\treturn this._standaloneModeFinalRedirectPath;\n\t}\n\n\tset standaloneModeFinalRedirectPath(path: string) {\n\t\tthis._standaloneModeFinalRedirectPath = path;\n\t}\n\n\tsetStatusBarStyle(style: Model.StatusBarStyle): void {\n\t\tif (window.webkit.messageHandlers.SetStatusBarStyle) {\n\t\t\twindow.webkit.messageHandlers.SetStatusBarStyle.postMessage({ style: style });\n\t\t}\n\t}\n\n\tgetDeviceInfo(): Promise<Model.DeviceInfo> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.DeviceInfo>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.GetDeviceInfo) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (deviceInfoResponse) {\n\t\t\t\t\tresolve(deviceInfoResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.GetDeviceInfo.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tsetSupportedLanguages(languages: string[]) {\n\t\tthis.supportedLanguages.length = 0;\n\t\tfor (let i = 0; i < languages.length; i++) {\n\t\t\tthis.supportedLanguages.push(languages[i].replace(\"_\", \"-\"));\n\t\t}\n\t}\n\n\tgetStepConfiguration(): Promise<Model.StepConfiguration> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.StepConfiguration>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.GetStepConfiguration) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (stepConfigurationResponse) {\n\t\t\t\t\tresolve(stepConfigurationResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.GetStepConfiguration.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tgetSurveyContext(): Promise<Model.SurveyContext> {\n\t\tlet mdh = this;\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t}\n\t\t\tmdh.getDeviceInfo().then(function (deviceInfo) {\n\t\t\t\tif (deviceInfo.platform !== \"Web\") {\n\t\t\t\t\tresolve({ surveyMode: \"Survey\" });\n\t\t\t\t}\n\t\t\t\telse if (window.webkit.messageHandlers.GetSurveyContext) {\n\t\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\t\tmdh.messageHandlers[messageID] = function (surveyContextResponse) {\n\t\t\t\t\t\tresolve(surveyContextResponse.data);\n\t\t\t\t\t};\n\t\t\t\t\twindow.webkit.messageHandlers.GetSurveyContext.postMessage({ messageID: messageID });\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject();\n\t\t\t\t}\n\t\t\t}).catch(function (error) {\n\t\t\t\treject();\n\t\t\t});\n\t\t});\n\t}\n\n\tgetCurrentSurveyAnswers(): Promise<Model.CurrentSurveyAnswer[]> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.CurrentSurveyAnswer[]>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.GetCurrentSurveyAnswers) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (currentSurveyAnswersResponse) {\n\t\t\t\t\tresolve(currentSurveyAnswersResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.GetCurrentSurveyAnswers.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tsetCurrentLanguage(language: string) {\n\t\tif (language) {\n\t\t\tlet supportedLanguage = this.getSupportedLanguage(language);\n\t\t\tif (supportedLanguage) {\n\t\t\t\tthis.language = supportedLanguage;\n\t\t\t} else {\n\t\t\t\tconsole.warn(`language ${language} not supported`);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.language = language;\n\t\t}\n\t}\n\n\tgetCurrentLanguage(): string {\n\t\tlet searchParams = new URLSearchParams(window.location.search);\n\t\tlet lang;\n\t\tif (searchParams.has(\"lang\")) {\n\t\t\tlang = this.getSupportedLanguage(searchParams.get(\"lang\"));\n\t\t\tif (lang) {\n\t\t\t\treturn lang;\n\t\t\t} else {\n\t\t\t\tconsole.warn(`language ${searchParams.get(\"lang\")} not supported`);\n\t\t\t}\n\t\t}\n\t\treturn this.language || navigator.language;\n\t}\n\n\tshowGoogleFitSettings(): void {\n\t\tif (window.webkit.messageHandlers.ShowGoogleFitSettings) {\n\t\t\twindow.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({});\n\t\t}\n\t}\n\n\tshowHealthConnectMatchmakingPrompt(): void {\n\t\tif (window.webkit.messageHandlers.HealthConnectMatchmaking) {\n\t\t\twindow.webkit.messageHandlers.HealthConnectMatchmaking.postMessage({});\n\t\t}\n\t}\n\n\tshowHealthConnectSettings(): void {\n\t\tif (window.webkit.messageHandlers.HealthConnectSettings) {\n\t\t\twindow.webkit.messageHandlers.HealthConnectSettings.postMessage({});\n\t\t}\n\t}\n\n\tshowHealthConnectPrompt(): void {\n\t\tif (window.webkit.messageHandlers.HealthConnectPrompt) {\n\t\t\twindow.webkit.messageHandlers.HealthConnectPrompt.postMessage({});\n\t\t}\n\t}\n\n\tgetHealthConnectStatus(): Promise<Model.HealthConnectStatus> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.HealthConnectStatus>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.HealthConnectStatus) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (statusResponse) {\n\t\t\t\t\tresolve(statusResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.HealthConnectStatus.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tshowHealthConnectPhrPrompt(): void {\n\t\tif (window.webkit.messageHandlers.HealthConnectPhrPrompt) {\n\t\t\twindow.webkit.messageHandlers.HealthConnectPhrPrompt.postMessage({});\n\t\t}\n\t}\n\n\tgetHealthConnectPhrStatus(): Promise<Model.HealthConnectPhrStatus> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.HealthConnectPhrStatus>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.HealthConnectPhrStatus) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (statusResponse) {\n\t\t\t\t\tresolve(statusResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.HealthConnectPhrStatus.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\trequestReview(cooldownDays?: number): void {\n\t\tif (window.webkit.messageHandlers.RequestReview) {\n\t\t\twindow.webkit.messageHandlers.RequestReview.postMessage({ cooldownDays: cooldownDays });\n\t\t}\n\t}\n\n\ttrackCustomEvent(event: Model.CustomEventInfo): Promise<void> {\n\t\tconst endpoint = 'customevents';\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', event);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tgetDataCollectionSettings(): Promise<Model.DataCollectionSettings> {\n\t\tconst mdh = this;\n\t\tconst endpoint = 'datacollectionsettings';\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tgetDataAvailability(): Promise<Model.DataAvailability> {\n\t\tconst mdh = this;\n\t\tconst endpoint = 'dataavailability';\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tinvokeCustomApi(customApi: string, method: string, queryParameters: string | string[][] | Record<string, string> | URLSearchParams | null | undefined, jsonResponse: boolean): Promise<any> {\n\t\tif (customApi.includes('?')) {\n\t\t\tthrow new Error(\"Cannot include query parameters directly in the \\\"customApi\\\" string. Provide as an argument for \\\"queryParameters\\\" instead.\");\n\t\t}\n\n\t\tlet endpoint = 'custom/' + customApi;\n\t\tmethod = method.toUpperCase();\n\t\tif (queryParameters !== null && queryParameters !== undefined && (method === 'GET' || method === 'DELETE')) {\n\t\t\tlet parameterString = new URLSearchParams(queryParameters).toString();\n\t\t\tendpoint += \"?\" + parameterString;\n\t\t\tqueryParameters = null;\n\t\t}\n\n\t\tconst mdh = this;\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, method, queryParameters);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn jsonResponse ? response.json() : undefined;\n\t\t\t});\n\t}\n\n\tconstructor() {\n\t\tif (this.handleConnectExternalAccountResponse()) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet mdh = this;\n\t\tlet applicationHost = getParentOrigin();\n\t\tlet supportedActions;\n\n\t\tfunction getParentOrigin(): string {\n\t\t\tlet ancestorOrigins = document.location.ancestorOrigins;\n\t\t\tif (ancestorOrigins && ancestorOrigins[0]) {\n\t\t\t\treturn ancestorOrigins[0];\n\t\t\t}\n\n\t\t\treturn '*';\n\t\t}\n\n\t\tfunction acceptableOrigin(origin) {\n\t\t\tif (origin === '*') return true;\n\n\t\t\tlet sourceURL = new URL(origin);\n\t\t\tfor (let k = 0; k < mdh.acceptableParentDomains.length; k++) {\n\t\t\t\tif (sourceURL.hostname === mdh.acceptableParentDomains[k] || sourceURL.hostname.endsWith(\".\" + mdh.acceptableParentDomains[k])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction validateWindowMessageOrigin(message) {\n\t\t\tif (mdh.isStandaloneMode() && message.origin === window.location.origin) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (applicationHost === \"*\") {\n\t\t\t\treturn acceptableOrigin(message.origin);\n\t\t\t}\n\n\t\t\treturn message.origin === applicationHost;\n\t\t}\n\n\t\tfunction addActions(actions) {\n\t\t\tfor (let action in actions) {\n\t\t\t\tif (!window.webkit.messageHandlers[action]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twindow.webkit.messageHandlers[action] = { postMessage: actions[action] };\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.log(\"Unable to add missing actions on this platform: \" + error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction receiveWindowMessage(message) {\n\t\t\tif (!validateWindowMessageOrigin(message)) {\n\t\t\t\t// todo: this can generate tons of console errors when hosting some apps within webappstep (youtube content, for example )\n\t\t\t\tconsole.error(\"message.origin '\" + message.origin + \"' is not allowed.\");\n\t\t\t\tthrow \"message.origin '\" + message.origin + \"' is not allowed.\";\n\t\t\t}\n\n\t\t\tif (message.data.messageID) {\n\t\t\t\tmdh.setActionResult(message.data);\n\t\t\t} else {\n\t\t\t\tmdh.triggerEvent(message.data);\n\t\t\t}\n\t\t}\n\n\t\tfunction windowHasAnyActions() {\n\t\t\tfor (let action in supportedActions) {\n\t\t\t\tif (window.webkit.messageHandlers[action]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let action in mdh.unsupportedActions) {\n\t\t\t\tif (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!acceptableOrigin(applicationHost)) {\n\t\t\tconsole.log(\"Detected unsupported parent origin domain.\");\n\t\t}\n\n\t\tif (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.ResearchKit) {\n\t\t\t// Presence of ResearchKit handler indicates the SDK is being used from within a WebViewStep. For pre-SDK backwards compatiblity,\n\t\t\t// WebViewStep setup registers the following handlers: GetDeviceInfo, DeleteProviderAccount, ConnectExternalAccount\n\t\t\t// ShowParticipantWebVisualizationPDF, ResearchKit\n\t\t\tsupportedActions = {\n\t\t\t\t\"GetDelegatedAccessToken\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetDelegatedAccessToken',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenExternalLink\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'OpenExternalUrl',\n\t\t\t\t\t\turl: data\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenEmbeddedLink\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'OpenEmbeddedUrl',\n\t\t\t\t\t\turl: data\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetCurrentSurveyAnswers\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetCurrentSurveyAnswers',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetStepConfiguration\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetStepConfiguration',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetSurveyContext\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetSurveyContext',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost);\n\t\t\t\t},\n\t\t\t\t\"CompleteStep\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'CompleteStep',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\tanswer: data.answer\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\tsupportedActions = {\n\t\t\t\t\"GetDelegatedAccessToken\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetDelegatedAccessToken',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetDeviceInfo\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"StartParticipantSurvey\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'StartParticipantSurvey',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\tsurveyName: data.surveyName,\n\t\t\t\t\t\toptions: data.options\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenExternalLink\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'OpenExternalUrl', url: data }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenEmbeddedLink\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'OpenEmbeddedUrl', url: data }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenExternalApplication\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'OpenApplication',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\turl: data.url,\n\t\t\t\t\t\tmodal: data.modal\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"Dismiss\": function () {\n\t\t\t\t\twindow.parent.postMessage({ name: 'Dismiss' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"PopNavigation\": function () {\n\t\t\t\t\twindow.parent.postMessage({ name: 'Back' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowTab\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'ShowTab', tabKey: data }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowParticipantDashboard\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'ShowParticipantDashboard',\n\t\t\t\t\t\tdashboardKey: data.dashboardKey,\n\t\t\t\t\t\tmodal: data.modal\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowParticipantWebVisualization\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'ShowParticipantWebVisualization',\n\t\t\t\t\t\tvisualizationKey: data.visualizationKey,\n\t\t\t\t\t\tparameters: data.parameters,\n\t\t\t\t\t\tmodal: data.modal\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowParticipantWebVisualizationPDF\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'ShowParticipantWebVisualizationPDF',\n\t\t\t\t\t\tvisualizationKey: data.visualizationKey,\n\t\t\t\t\t\tparameters: data.parameters,\n\t\t\t\t\t\tmodal: data.modal,\n\t\t\t\t\t\tlandscape: data.landscape,\n\t\t\t\t\t\thtmlViewerZoom: data.htmlViewerZoom\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"DeleteProviderAccount\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'DeleteProviderAccount',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\taccountID: data.accountID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ConnectExternalAccount\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'ConnectExternalAccount',\n\t\t\t\t\t\texternalAccountProviderID: data.externalAccountProviderID,\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\topenNewWindow: data.openNewWindow,\n\t\t\t\t\t\twidth: data.width,\n\t\t\t\t\t\theight: data.height\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowProject\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'ShowProject', code: data.code }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"JoinProject\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'JoinProject', code: data.code }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetCurrentSurveyAnswers\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetCurrentSurveyAnswers',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetStepConfiguration\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetStepConfiguration',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"CompleteStep\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'CompleteStep',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\tanswer: data.answer\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectStatus\": function(data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'HealthConnectStatus',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectPrompt\": function() {\n\t\t\t\t\twindow.parent.postMessage({ name: 'HealthConnectPrompt' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectPhrStatus\": function(data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'HealthConnectPhrStatus',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectPhrPrompt\": function() {\n\t\t\t\t\twindow.parent.postMessage({ name: 'HealthConnectPhrPrompt' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectSettings\": function() {\n\t\t\t\t\twindow.parent.postMessage({ name: 'HealthConnectSettings' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectMatchmaking\": function() {\n\t\t\t\t\twindow.parent.postMessage({ name: 'HealthConnectMatchmaking' }, applicationHost)\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tif (!window.webkit || !window.webkit.messageHandlers || !windowHasAnyActions()) {\n\t\t\twindow.webkit = {\n\t\t\t\tmessageHandlers: {}\n\t\t\t};\n\t\t}\n\n\t\taddActions(supportedActions);\n\n\t\twindow.addEventListener(\"message\", receiveWindowMessage, false);\n\n\t\tif (this.hasEmbeddedModeUrlParameter()) {\n\t\t\tmdh.enableStandaloneMode(true);\n\t\t}\n\t}\n\n\tprivate readonly acceptableParentDomains = [\n\t\t'localhost',\n\t\t'careevolution.com',\n\t\t'internal',\n\t\t'b3-deploys.com',\n\t\t'mydatahelps.org',\n\t\t'platform.joinallofus.org',\n\t\t'careevolution.dev',\n\t\t'ce.dev',\n\t\t'mydatahelps.dev'\n\t];\n\n\tprivate readonly accessTokenRenewalBufferSeconds = 120;\n\tprivate readonly unsupportedActions = [\"SetHeight\", \"ResearchKit\"];\n\tprivate readonly supportedEvents = [\"surveyDidFinish\", \"applicationDidBecomeVisible\", \"externalAccountSyncComplete\", \"tokenWillExpire\", \"healthConnectSyncComplete\", \"healthConnectPhrSyncComplete\"];\n\tprivate readonly supportedLanguages = [];\n\n\tprivate currentMessageID = 1;\n\tprivate messageHandlers = [];\n\tprivate registeredEventHandlers = {};\n\tprivate refreshTokenPromise = null;\n\tprivate standaloneMode = false;\n\tprivate embeddedMode = false;\n\n\tprivate nextMessageID() {\n\t\treturn this.currentMessageID++;\n\t}\n\n\tprivate makeUrl(endpoint, apiVersion) {\n\t\tif (!this.baseUrl) {\n\t\t\tconsole.error(\"Cannot use makeUrl without MyDataHelps.baseUrl.\");\n\t\t\tthrow \"Cannot use makeUrl without MyDataHelps.baseUrl.\";\n\t\t}\n\n\t\treturn this.baseUrl + 'api/' + apiVersion + '/delegated/' + endpoint;\n\t}\n\n\tprivate makeRequest(endpoint, method, body, apiVersion = \"v1\") {\n\t\tif (!this.token || !this.token.access_token) {\n\t\t\tthrow \"No access_token available for request authorization.\";\n\t\t}\n\n\t\tlet url = this.makeUrl(endpoint, apiVersion);\n\n\t\tlet headers = new Headers();\n\t\theaders.append('Authorization', 'Bearer ' + this.token.access_token);\n\t\theaders.append('Accept', 'application/json, text/javascript, */*; q=0.01');\n\t\theaders.append('Accept-Language', this.getCurrentLanguage());\n\t\tif (!!body) {\n\t\t\theaders.append('Content-Type', 'application/json');\n\t\t}\n\n\t\tlet init: any = {\n\t\t\tmethod: method,\n\t\t\theaders: headers\n\t\t};\n\t\tif (!!body) {\n\t\t\tinit.body = JSON.stringify(body);\n\t\t}\n\n\t\treturn fetch(url, init);\n\t}\n\n\tprivate getSupportedLanguage(language: string): string {\n\t\tlanguage = language.replace(\"_\", \"-\");\n\t\tif (this.supportedLanguages.length === 0) {\n\t\t\treturn language;\n\t\t} else {\n\t\t\tif (this.supportedLanguages.find((l) => l === language)) {\n\t\t\t\treturn language;\n\t\t\t} else if (language.indexOf(\"-\") > 0) {\n\t\t\t\tlanguage = language.substring(0, language.indexOf(\"-\"));\n\t\t\t\tif (this.supportedLanguages.find((l) => l === language)) {\n\t\t\t\t\treturn language;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static validateResponse(response) {\n\t\tif (!response.ok) {\n\t\t\tthrow response.statusText;\n\t\t}\n\n\t\treturn response;\n\t}\n\n\tprivate static escapeParam(param) {\n\t\treturn String(param)\n\t\t\t.replaceAll(\"\\\\\", \"\\\\\\\\\")\n\t\t\t.replaceAll(\",\", \"\\\\,\");\n\t}\n\n\tprivate static reduceArrayAndEscape(param) {\n\t\tif (Array.isArray(param)) {\n\t\t\tlet escapedParams = param.map(function (elem) {\n\t\t\t\treturn MyDataHelps.escapeParam(elem);\n\t\t\t});\n\t\t\treturn escapedParams.join(\",\");\n\t\t}\n\n\t\treturn this.escapeParam(param);\n\t}\n\n\tprivate static convertDateToIsoString(date) {\n\t\tlet paramAsDate = new Date(date);\n\t\tif (isNaN(paramAsDate.getTime())) {\n\t\t\tthrow \"Cannot interpret parameter as Date\";\n\t\t}\n\n\t\treturn paramAsDate.toISOString();\n\t}\n\n\tprivate static flattenPropertyShallow(params, property) {\n\t\tif (params[property] === undefined || params[property] === null) return;\n\n\t\tfor (var key in params[property]) {\n\t\t\tif (params[property].hasOwnProperty(key)) {\n\t\t\t\tparams[`${property}.${key}`] = MyDataHelps.escapeParam(params[property][key]);\n\t\t\t}\n\t\t}\n\n\t\tdelete params[property];\n\t}\n\n\tprivate startEmbeddedSurveyInternal(surveyUrl) {\n\t\tlet mdhSurveyModalId = 'mydatahelps-survey-modal';\n\t\tlet mdh = this;\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tif (document.getElementById(mdhSurveyModalId)) {\n\t\t\t\treject(\"Survey already in progress\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow.addEventListener(\"message\", function listener(message) {\n\t\t\t\tif (message.origin !== new URL(mdh.baseUrl).origin) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet frame = (document.getElementById('mydatahelps-survey-frame') as HTMLFrameElement).contentWindow;\n\t\t\t\tif (message.source !== frame) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (message.data.name === 'SurveyWindowInitialized') {\n\t\t\t\t\tdocument.getElementById(mdhSurveyModalId).className += \" loaded\";\n\t\t\t\t} else if (message.data.name === 'SurveyFinished') {\n\t\t\t\t\tdocument.getElementById(mdhSurveyModalId).remove();\n\t\t\t\t\tdocument.body.className = document.body.className.replace(\"no-scroll\", \"\");\n\t\t\t\t\twindow.removeEventListener(\"message\", listener, true);\n\t\t\t\t\tresolve(message.data);\n\t\t\t\t}\n\t\t\t}, true);\n\n\t\t\tlet surveyModal = document.createElement('div');\n\t\t\tsurveyModal.className = 'mydatahelps-survey-modal';\n\t\t\tsurveyModal.id = mdhSurveyModalId;\n\t\t\tsurveyModal.innerHTML = \"<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='\" + surveyUrl + \"'></iframe></div>\";\n\t\t\tdocument.body.append(surveyModal);\n\t\t\tdocument.body.className += ' no-scroll';\n\t\t});\n\t}\n\n\tprivate startDelegatedSurvey(surveyUrl) {\n\t\tlet mdhSurveyModalId = 'mydatahelps-survey-modal';\n\t\tlet mdh = this;\n\n\t\tif (document.getElementById(mdhSurveyModalId)) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.addEventListener(\"message\", function listener(message) {\n\t\t\tif (message.origin !== new URL(mdh.baseUrl).origin) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet frame = (document.getElementById('mydatahelps-survey-frame') as HTMLFrameElement).contentWindow;\n\t\t\tif (message.source !== frame) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (message.data.name === 'GetDelegatedAccessToken') {\n\t\t\t\tmdh.getParticipantInfo().then((participant) => {\n\t\t\t\t\tframe.postMessage({ name: \"DelegatedAccessTokenResponse\", accessToken: mdh.token, baseUrl: mdh.baseUrl, participantID: participant.participantID }, '*');\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (message.data.name === 'SurveyWindowInitialized') {\n\t\t\t\tdocument.getElementById(mdhSurveyModalId).className += \" loaded\";\n\t\t\t}\n\t\t\telse if (message.data.name === 'SurveyFinished') {\n\t\t\t\tdocument.getElementById(mdhSurveyModalId).remove();\n\t\t\t\tdocument.body.className = document.body.className.replace(\"no-scroll\", \"\");\n\t\t\t\twindow.removeEventListener(\"message\", listener, true);\n\t\t\t\tmessage.data.type = 'surveyDidFinish';\n\t\t\t\tmdh.triggerEvent(message.data);\n\t\t\t}\n\t\t}, true);\n\n\t\tlet surveyModal = document.createElement('div');\n\t\tsurveyModal.className = 'mydatahelps-survey-modal';\n\t\tsurveyModal.id = mdhSurveyModalId;\n\t\tsurveyModal.innerHTML = `<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='${surveyUrl}&lang=${mdh.getCurrentLanguage()}'></iframe></div>`;\n\t\tdocument.body.append(surveyModal);\n\t\tdocument.body.className += ' no-scroll';\n\t}\n\n\tprivate handleConnectExternalAccountResponse() {\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tif (params.get('connectExternalAccount') && params.get('messageID') && params.get('success')) {\n\t\t\tconst message = {\n\t\t\t\tname: 'ConnectExternalAccountResponse',\n\t\t\t\tmessageID: parseInt(params.get('messageID')),\n\t\t\t\tsuccess: params.get('success') === 'true'\n\t\t\t};\n\t\t\tif (window.opener) {\n\t\t\t\twindow.opener.postMessage(message, window.location.origin);\n\t\t\t} else {\n\t\t\t\tconst bc = new BroadcastChannel(\"ConnectExternalAccount\");\n\t\t\t\tbc.postMessage(message);\n\t\t\t\tbc.close();\n\t\t\t}\n\t\t\twindow.close();\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate hasEmbeddedModeUrlParameter() {\n\t\tconst embeddedModeKey = '_e';\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tconst embeddedModeValue = params.get(embeddedModeKey);\n\t\tif (params.has(embeddedModeKey) && embeddedModeValue !== 'false') {\n\t\t\tif (URL.canParse(embeddedModeValue)) {\n\t\t\t\tthis.standaloneModeFinalRedirectPath = embeddedModeValue;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate static generateVerifier() {\n\t\tconst len = 32;\n\t\tconst size = Math.ceil(len / 2);\n\t\tconst buffer = new Uint8Array(size);\n\t\twindow.crypto.getRandomValues(buffer);\n\n\t\treturn Array.from(buffer)\n\t\t\t.map(b => b.toString(16).padStart(2, '0'))\n\t\t\t.join('')\n\t\t\t.slice(0, len);\n\t}\n\n\tprivate static async hashVerifier(message: string) {\n\t\t// 1. Encode the message into bytes\n\t\tconst encoder = new TextEncoder();\n\t\tconst data = encoder.encode(message);\n\n\t\t// 2. Calculate the SHA-256 hash\n\t\tconst hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\n\t\t// 3. Convert ArrayBuffer to Base64\n\t\tconst hashArray = Array.from(new Uint8Array(hashBuffer));\n\t\tconst base64 = btoa(String.fromCharCode(...hashArray));\n\n\t\t// 4. Make it URL-safe\n\t\treturn base64\n\t\t\t.replace(/\\+/g, '-')\n\t\t\t.replace(/\\//g, '_')\n\t\t\t.replace(/=+$/, '');\n\t}\n}\n\n//iOS/Android directly invoke window.MyDataHelps and window.RKStudioClient\n//so it's necessary to explicitly ensure they are present on the window\nconst mdh = new MyDataHelps();\n\nwindow.MyDataHelps = mdh;\n\n// For backwards compatibility\nwindow.RKStudioClient = {};\nwindow.RKStudioClient.setActionResult = function (data) {\n\twindow.MyDataHelps.setActionResult(data);\n};\n\nexport default mdh;\nexport * from './types';\n"],"names":["MyDataHelps","startSurvey","surveyName","options","this","isStandaloneMode","params","URLSearchParams","set","editResultID","event","startDelegatedSurvey","baseUrl","toString","window","webkit","messageHandlers","StartParticipantSurvey","messageID","nextMessageID","postMessage","completeStep","answer","JSON","stringify","ResearchKit","CompleteStep","querySurveyAnswers","queryParameters","Object","assign","hasOwnProperty","reduceArrayAndEscape","stepIdentifier","resultIdentifier","before","convertDateToIsoString","after","endpoint","mdh","connect","then","makeRequest","response","validateResponse","json","querySurveyResults","insertedBefore","insertedAfter","deleteSurveyResult","resultID","encodeURIComponent","querySurveyTasks","status","queryInboxItems","target","source","key","keys","value","undefined","assignDefined","type","getInboxItem","id","updateInboxItem","update","startEmbeddedSurvey","linkIdentifier","language","getCurrentLanguage","surveyUrl","startEmbeddedSurveyInternal","openExternalUrl","url","OpenExternalLink","openEmbeddedUrl","OpenEmbeddedLink","showTab","tabKey","ShowTab","openApplication","OpenExternalApplication","modal","openSecondaryView","projectId","viewKey","lookupSecondaryView","secondaryView","endsWith","fetch","method","headers","Accept","ok","text","Error","statusText","dismiss","Dismiss","back","PopNavigation","showDashboard","dashboardKey","ShowParticipantDashboard","title","showWebVisualization","visualizationKey","parameters","ShowParticipantWebVisualization","showWebVisualizationPdf","ShowParticipantWebVisualizationPDF","landscape","htmlViewerZoom","showProject","projectCode","ShowProject","code","joinProject","JoinProject","on","eventName","callback","supportedEvents","includes","registeredEventHandlers","push","off","eventHandlerIndex","indexOf","splice","triggerEvent","forEach","handler","setActionResult","data","prototype","call","console","error","getParticipantInfo","persistParticipantInfo","demographics","customFields","async","message","catch","log","getProjectInfo","getDeviceDataPoint","deleteDeviceDataPoint","queryDeviceData","observedBefore","observedAfter","persistDeviceData","deviceDataPoints","getDeviceDataAllDataTypes","enabled","namespace","queryDeviceDataV2","modifiedBefore","modifiedAfter","flattenPropertyShallow","queryDeviceDataV2Aggregate","aggregateFunctions","queryDeviceDataV2DailySleep","getDeviceDataV2AllDataTypes","getExternalAccountProviders","search","category","pageSize","pageNumber","searchParameters","connectExternalAccount","externalAccountProviderID","Promise","resolve","reject","connectProviderAccountResponse","success","errorMessage","standaloneMode","providerAuthWindow","standaloneModeFinalRedirectPath","location","href","openNewWindow","split","windowFeatures","width","height","w","h","outerHeight","screenY","outerWidth","screenX","open","document","write","close","verifier","generateVerifier","hashVerifier","verifierHash","queryString","finalRedirectPath","redirectUrl","URL","replace","searchParams","top","ConnectExternalAccount","getExternalAccounts","refreshExternalAccount","accountID","deleteExternalAccount","DeleteProviderAccount","deleteProviderAccountResponse","getFeaturedProviders","context","queryNotifications","sentBefore","sentAfter","queryFitbitDailySummaries","startDate","endDate","queryFitbitSleepLogs","queryAppleHealthActivitySummaries","queryAppleHealthWorkouts","uploadFile","file","fileName","size","name","preSignedUrl","body","queryFiles","getFileDownloadUrl","deleteFile","refreshDelegatedAccessToken","token","refreshTokenPromise","tokenResponse","tokenExpires","Date","now","expires_in","setTimeout","accessTokenRenewalBufferSeconds","GetDelegatedAccessToken","isEmbeddedMode","setParticipantAccessToken","enableStandaloneMode","embeddedMode","_standaloneModeFinalRedirectPath","path","setStatusBarStyle","style","SetStatusBarStyle","getDeviceInfo","GetDeviceInfo","deviceInfoResponse","setSupportedLanguages","languages","supportedLanguages","length","i","getStepConfiguration","GetStepConfiguration","stepConfigurationResponse","getSurveyContext","deviceInfo","platform","surveyMode","GetSurveyContext","surveyContextResponse","getCurrentSurveyAnswers","GetCurrentSurveyAnswers","currentSurveyAnswersResponse","setCurrentLanguage","supportedLanguage","getSupportedLanguage","warn","lang","has","get","navigator","showGoogleFitSettings","ShowGoogleFitSettings","showHealthConnectMatchmakingPrompt","HealthConnectMatchmaking","showHealthConnectSettings","HealthConnectSettings","showHealthConnectPrompt","HealthConnectPrompt","getHealthConnectStatus","HealthConnectStatus","statusResponse","showHealthConnectPhrPrompt","HealthConnectPhrPrompt","getHealthConnectPhrStatus","HealthConnectPhrStatus","requestReview","cooldownDays","RequestReview","trackCustomEvent","getDataCollectionSettings","getDataAvailability","invokeCustomApi","customApi","jsonResponse","toUpperCase","parameterString","constructor","acceptableParentDomains","unsupportedActions","currentMessageID","handleConnectExternalAccountResponse","supportedActions","applicationHost","ancestorOrigins","getParentOrigin","acceptableOrigin","origin","sourceURL","k","hostname","parent","action","windowHasAnyActions","actions","addActions","addEventListener","validateWindowMessageOrigin","hasEmbeddedModeUrlParameter","makeUrl","apiVersion","access_token","Headers","append","init","find","l","substring","escapeParam","param","String","replaceAll","Array","isArray","map","elem","join","date","paramAsDate","isNaN","getTime","toISOString","property","mdhSurveyModalId","getElementById","listener","frame","contentWindow","className","remove","removeEventListener","surveyModal","createElement","innerHTML","participant","accessToken","participantID","parseInt","opener","bc","BroadcastChannel","embeddedModeValue","canParse","Math","ceil","len","buffer","Uint8Array","crypto","getRandomValues","from","b","padStart","slice","TextEncoder","encode","hashBuffer","subtle","digest","hashArray","btoa","fromCharCode","RKStudioClient"],"mappings":"MAMaA,EAWZ,WAAAC,CAAYC,EAAoBC,GAC/B,GAAIC,KAAKC,mBAAoB,CAC5B,MAAMC,EAAS,IAAIC,gBACnBD,EAAOE,IAAI,aAAcN,GACrBC,GAASM,cACZH,EAAOE,IAAI,eAAgBL,EAAQM,cAEhCN,GAASO,OACZJ,EAAOE,IAAI,QAASL,EAAQO,OAE7BN,KAAKO,qBAAqB,GAAGP,KAAKQ,kBAAkBN,EAAOO,aAC5D,MACK,GAAIC,OAAOC,OAAOC,gBAAgBC,uBAAwB,CAC9D,IAAIC,EAAYd,KAAKe,gBACrBL,OAAOC,OAAOC,gBAAgBC,uBAAuBG,YAAY,CAChEF,UAAWA,EACXhB,WAAYA,EACZC,QAASA,GAEX,CACD,CAEA,YAAAkB,CAAaC,GAKZ,GAJIA,UAAyCA,EAAS,IAChC,iBAAXA,IACVA,EAASC,KAAKC,UAAUF,IAErBR,OAAOC,OAAOC,gBAAgBS,YACjCX,OAAOC,OAAOC,gBAAgBS,YAAYL,YAAYE,QAElD,GAAIR,OAAOC,OAAOC,gBAAgBU,aAAc,CACpD,IAAIR,EAAYd,KAAKe,gBACrBL,OAAOC,OAAOC,gBAAgBU,aAAaN,YAAY,CACtDF,UAAWA,EACXI,OAAQA,GAEV,CACD,CAEA,kBAAAK,CAAmBC,IAClBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,gBAClCH,EAAgB1B,WAAaF,EAAYgC,qBAAqBJ,EAAgB1B,aAE3E0B,EAAgBG,eAAe,oBAClCH,EAAgBK,eAAiBjC,EAAYgC,qBAAqBJ,EAAgBK,iBAE/EL,EAAgBG,eAAe,sBAClCH,EAAgBM,iBAAmBlC,EAAYgC,qBAAqBJ,EAAgBM,mBAEjFN,EAAgBG,eAAe,YAClCH,EAAgBN,OAAStB,EAAYgC,qBAAqBJ,EAAgBN,SAEvEM,EAAgBG,eAAe,YAClCH,EAAgBO,OAASnC,EAAYoC,uBAAuBR,EAAgBO,SAEzEP,EAAgBG,eAAe,WAClCH,EAAgBS,MAAQrC,EAAYoC,uBAAuBR,EAAgBS,QAExET,EAAgBG,eAAe,WAClCH,EAAgBlB,MAAQV,EAAYgC,qBAAqBJ,EAAgBlB,QAG1E,MACM4B,EAAW,iBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,kBAAAC,CAAmBlB,IAClBA,EAAkB,IAAKA,IAEHG,eAAe,gBAClCH,EAAgB1B,WAAaF,EAAYgC,qBAAqBJ,EAAgB1B,aAE3E0B,EAAgBG,eAAe,WAClCH,EAAgBlB,MAAQV,EAAYgC,qBAAqBJ,EAAgBlB,QAEtEkB,EAAgBG,eAAe,YAClCH,EAAgBO,OAASnC,EAAYoC,uBAAuBR,EAAgBO,SAEzEP,EAAgBG,eAAe,WAClCH,EAAgBS,MAAQrC,EAAYoC,uBAAuBR,EAAgBS,QAExET,EAAgBG,eAAe,oBAClCH,EAAgBmB,eAAiB/C,EAAYoC,uBAAuBR,EAAgBmB,iBAEjFnB,EAAgBG,eAAe,mBAClCH,EAAgBoB,cAAgBhD,EAAYoC,uBAAuBR,EAAgBoB,gBAGpF,MACMV,EAAW,iBADG,IAAI/B,gBAAgBqB,GAAwCf,WAGhF,OAAOT,KAAKoC,UACVC,MAAK,IAAMrC,KAAKsC,YAAYJ,EAAU,MAAO,QAC7CG,KAAKzC,EAAY4C,kBACjBH,MAAKE,GAAYA,EAASE,QAC7B,CAEA,kBAAAI,CAAmBC,GAClB,MAAMZ,EAAW,iBAAmBa,mBAAmBD,GACjDX,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,SAAU,KAC5C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,gBAAAW,CAAiBxB,IAChBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,YAClCH,EAAgByB,OAASrD,EAAYgC,qBAAqBJ,EAAgByB,SAEvEzB,EAAgBG,eAAe,gBAClCH,EAAgB1B,WAAaF,EAAYgC,qBAAqBJ,EAAgB1B,aAE3E0B,EAAgBG,eAAe,WAClCH,EAAgBlB,MAAQV,EAAYgC,qBAAqBJ,EAAgBlB,QAG1E,MACM4B,EAAW,eADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,eAAAS,CAAgB1B,IAWfA,EAVsB,EAAC2B,EAAaC,KACnC,IAAK,MAAMC,KAAO5B,OAAO6B,KAAKF,GAAS,CACtC,MAAMG,EAAQH,EAAOC,QACPG,IAAVD,IACHJ,EAAOE,GAAOE,EAEhB,CACA,OAAOJ,CAAM,EAGIM,CAAc,CAAA,EAAIjC,IAEhBG,eAAe,UAClCH,EAAgBkC,KAAO9D,EAAYgC,qBAAqBJ,EAAgBkC,OAGrElC,EAAgBG,eAAe,YAClCH,EAAgByB,OAASrD,EAAYgC,qBAAqBJ,EAAgByB,SAG3E,MACMf,EAAW,SADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,YAAAkB,CAAaC,GACZ,MAAM1B,EAAW,SAAS0B,IACpBzB,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,eAAAoB,CAAgBD,EAAgBE,GAC/B,MAAM5B,EAAW,SAAS0B,KAAME,IAC1B3B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,mBAAAsB,CAAoBC,EAAwBlE,EAAoBmE,GAC1DA,IACJA,EAAWjE,KAAKkE,sBAEjB,IAAIC,EAAYnE,KAAKQ,QAAU,eAAiBwD,EAAiB,eAAiBlE,EAAa,SAAWmE,EAC1G,OAAOjE,KAAKoE,4BAA4BD,EACzC,CAIA,eAAAE,CAAgBC,GACX5D,OAAOC,OAAOC,gBAAgB2D,kBACjC7D,OAAOC,OAAOC,gBAAgB2D,iBAAiBvD,YAAYsD,EAE7D,CAEA,eAAAE,CAAgBF,GACX5D,OAAOC,OAAOC,gBAAgB6D,kBACjC/D,OAAOC,OAAOC,gBAAgB6D,iBAAiBzD,YAAYsD,EAE7D,CAEA,OAAAI,CAAQC,GACHjE,OAAOC,OAAOC,gBAAgBgE,SACjClE,OAAOC,OAAOC,gBAAgBgE,QAAQ5D,YAAY2D,EAEpD,CAEA,eAAAE,CAAgBP,EAAavE,GAC5B,GAAIW,OAAOC,OAAOC,gBAAgBkE,wBAAyB,CAC1D,IAAIhE,EAAYd,KAAKe,gBACrBL,OAAOC,OAAOC,gBAAgBkE,wBAAwB9D,YAAY,CACjEF,UAAWA,EACXwD,IAAKA,EACLS,SAAUhF,IAAWA,EAAQgF,QAE/B,CACD,CAEA,iBAAAC,CAAkBC,EAAmBC,EAAiBnF,GACrDC,KAAKmF,oBAAoBF,EAAWC,GAAS7C,MAAK+C,GAC1CpF,KAAK6E,gBAAgBO,EAAcd,IAAKvE,IAEjD,CAEA,mBAAAoF,CAAoBF,EAAmBC,GACtC,IAAI1E,EAAUR,KAAKQ,QACdA,EAAQ6E,SAAS,OACrB7E,GAAW,KAGZ,OAAO8E,MADe,GAAG9E,2BAAiCyE,WAAmBC,IACjD,CAAEK,OAAQ,MAAOC,QAAS,CAAEC,OAAU,sBAChEpD,MAAKE,GACAA,EAASmD,GAKPnD,EAASE,OAJRF,EAASoD,OAAOtD,MAAKsD,IAC3B,MAAM,IAAIC,MAAM,mCAAmCrD,EAASU,UAAUV,EAASsD,aAAaF,EAAO,MAAQA,EAAO,KAAK,KAK5H,CAEA,OAAAG,GACKpF,OAAOC,OAAOC,gBAAgBmF,SACjCrF,OAAOC,OAAOC,gBAAgBmF,QAAQ/E,YAAY,CAAA,EAEpD,CAEA,IAAAgF,GACKtF,OAAOC,OAAOC,gBAAgBqF,eACjCvF,OAAOC,OAAOC,gBAAgBqF,cAAcjF,YAAY,CAAA,EAE1D,CAEA,aAAAkF,CAAcC,EAAsBpG,GAC/BW,OAAOC,OAAOC,gBAAgBwF,0BACjC1F,OAAOC,OAAOC,gBAAgBwF,yBAAyBpF,YAAY,CAClEmF,aAAcA,EACdpB,SAAUhF,IAAWA,EAAQgF,OAC7BsB,MAAOtG,GAAWA,EAAQsG,MAAQtG,EAAQsG,WAAQ7C,GAGrD,CAEA,oBAAA8C,CAAqBC,EAA0BC,EAAoBzG,GAC9DW,OAAOC,OAAOC,gBAAgB6F,iCACjC/F,OAAOC,OAAOC,gBAAgB6F,gCAAgCzF,YAAY,CACzEuF,iBAAkBA,EAClBC,WAAYA,EACZzB,SAAUhF,IAAWA,EAAQgF,OAC7BsB,MAAOtG,GAAWA,EAAQsG,MAAQtG,EAAQsG,WAAQ7C,GAGrD,CAEA,uBAAAkD,CAAwBH,EAA0BC,EAAoBzG,GACjEW,OAAOC,OAAOC,gBAAgB+F,oCACjCjG,OAAOC,OAAOC,gBAAgB+F,mCAAmC3F,YAAY,CAC5EuF,iBAAkBA,EAClBC,WAAYA,EACZI,aAAc7G,IAAWA,EAAQ6G,WACjCC,eAAgB9G,GAAWA,EAAQ8G,gBAGtC,CAEA,WAAAC,CAAYC,GACPrG,OAAOC,OAAOC,gBAAgBoG,aACjCtG,OAAOC,OAAOC,gBAAgBoG,YAAYhG,YAAY,CAAEiG,KAAMF,GAEhE,CAEA,WAAAG,CAAYH,GACPrG,OAAOC,OAAOC,gBAAgBuG,aACjCzG,OAAOC,OAAOC,gBAAgBuG,YAAYnG,YAAY,CAAEiG,KAAMF,GAEhE,CAIA,EAAAK,CAAGC,EAA4BC,GAE9B,IAAKtH,KAAKuH,gBAAgBC,SAASH,GAClC,MAAM,IAAIzB,MAAMyB,EAAY,mCAGxBrH,KAAKyH,wBAAwBJ,KACjCrH,KAAKyH,wBAAwBJ,GAAa,IAG3CrH,KAAKyH,wBAAwBJ,GAAWK,KAAKJ,EAC9C,CAEA,GAAAK,CAAIN,EAA4BC,GAE/B,IAAKtH,KAAKuH,gBAAgBC,SAASH,GAClC,MAAM,IAAIzB,MAAMyB,EAAY,mCAG7B,IAAKrH,KAAKyH,wBAAwBJ,GAAY,OAE9C,IAAIO,EAAoB5H,KAAKyH,wBAAwBJ,GAAWQ,QAAQP,IAE9C,IAAtBM,GACH5H,KAAKyH,wBAAwBJ,GAAWS,OAAOF,EAAmB,EAEpE,CAEA,YAAAG,CAAazH,GACZ,IAAI+G,EAAY/G,EAAMoD,KAClB1D,KAAKuH,gBAAgBC,SAASH,IAAcrH,KAAKyH,wBAAwBJ,IAC5ErH,KAAKyH,wBAAwBJ,GAAWW,SAAQ,SAAUC,GACzDA,EAAQ3H,EACT,GAEF,CAEA,eAAA4H,CAAgBC,GACX1G,OAAO2G,UAAUzG,eAAe0G,KAAKrI,KAAKY,gBAAiBuH,EAAKrH,YACnB,mBAAzCd,KAAKY,gBAAgBuH,EAAKrH,WACjCd,KAAKY,gBAAgBuH,EAAKrH,WAAWqH,GAErCG,QAAQC,MAAM,sBAAsBJ,EAAKrH,YAE3C,CAIA,kBAAA0H,GACC,MAAMrG,EAAMnC,KAGZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YALI,cAKkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,sBAAAgG,CAAuBC,EAAkEC,GACxF,MACMxG,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YANI,cAMkB,MAAO,CAAEoG,eAAcC,gBACzD,IACCtG,MAAKuG,eAAgBrG,GACrB,IAAKA,EAASmD,GAEb,YADsBnD,EAASE,QACfoG,QAEjB,OAAOtG,EAASE,MACjB,IACCqG,OAAM,SAAUP,GAChBD,QAAQS,IAAI,kCAAoCR,EACjD,GACF,CAEA,cAAAS,GACC,MAAM7G,EAAMnC,KAGZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YALI,UAKkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,kBAAAwG,CAAmBrF,GAClB,MAAM1B,EAAW,cAAgB0B,EAC3BzB,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,qBAAAyG,CAAsBtF,GACrB,MAAM1B,EAAW,cAAgB0B,EAC3BzB,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,SAAU,KAC5C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,eAAA8G,CAAgB3H,IACfA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,UAClCH,EAAgBkC,KAAO9D,EAAYgC,qBAAqBJ,EAAgBkC,OAErElC,EAAgBG,eAAe,oBAClCH,EAAgB4H,eAAiBxJ,EAAYoC,uBAAuBR,EAAgB4H,iBAEjF5H,EAAgBG,eAAe,mBAClCH,EAAgB6H,cAAgBzJ,EAAYoC,uBAAuBR,EAAgB6H,gBAGpF,MACMnH,EAAW,cADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,iBAAA6G,CAAkBC,GACjB,MACMpH,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YANI,aAMkB,OAAQiH,EAC1C,IACClH,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,yBAAAmH,CAA0BC,EAAmBC,GAC5C,MAAMlI,EAA0C,CAAA,OAEhCgC,IAAZiG,IACHjI,EAAyB,QAAIiI,EAAQhJ,YAGlCiJ,IACHlI,EAA2B,UAAIkI,GAGhC,MACMxH,EAAW,2BADG,IAAI/B,gBAAgBqB,GAAiBf,aAGzD,OAAOT,KAAKoC,UACVC,MAAK,IAAMrC,KAAKsC,YAAYJ,EAAU,MAAO,QAC7CG,KAAKzC,EAAY4C,kBACjBH,MAAKE,GAAYA,EAASE,QAC7B,CAIA,iBAAAkH,CAAkBnI,IACjBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,oBAClCH,EAAgB4H,eAAiBxJ,EAAYoC,uBAAuBR,EAAgB4H,iBAEjF5H,EAAgBG,eAAe,mBAClCH,EAAgB6H,cAAgBzJ,EAAYoC,uBAAuBR,EAAgB6H,gBAEhF7H,EAAgBG,eAAe,oBAClCH,EAAgBmB,eAAiB/C,EAAYoC,uBAAuBR,EAAgBmB,iBAEjFnB,EAAgBG,eAAe,mBAClCH,EAAgBoB,cAAgBhD,EAAYoC,uBAAuBR,EAAgBoB,gBAEhFpB,EAAgBG,eAAe,oBAClCH,EAAgBoI,eAAiBhK,EAAYoC,uBAAuBR,EAAgBoI,iBAEjFpI,EAAgBG,eAAe,mBAClCH,EAAgBqI,cAAgBjK,EAAYoC,uBAAuBR,EAAgBqI,gBAEpFjK,EAAYkK,uBAAuBtI,EAAiB,cACpD5B,EAAYkK,uBAAuBtI,EAAiB,cAEpD,MACMU,EAAW,cADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KAAM,KAC/C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,0BAAAsH,CAA2BvI,IAC1BA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,wBAClCH,EAAgBwI,mBAAqBpK,EAAYgC,qBAAqBJ,EAAgBwI,qBAEnFxI,EAAgBG,eAAe,oBAClCH,EAAgB4H,eAAiBxJ,EAAYoC,uBAAuBR,EAAgB4H,iBAEjF5H,EAAgBG,eAAe,mBAClCH,EAAgB6H,cAAgBzJ,EAAYoC,uBAAuBR,EAAgB6H,gBAEhF7H,EAAgBG,eAAe,oBAClCH,EAAgBmB,eAAiB/C,EAAYoC,uBAAuBR,EAAgBmB,iBAEjFnB,EAAgBG,eAAe,mBAClCH,EAAgBoB,cAAgBhD,EAAYoC,uBAAuBR,EAAgBoB,gBAEhFpB,EAAgBG,eAAe,oBAClCH,EAAgBoI,eAAiBhK,EAAYoC,uBAAuBR,EAAgBoI,iBAEjFpI,EAAgBG,eAAe,mBAClCH,EAAgBqI,cAAgBjK,EAAYoC,uBAAuBR,EAAgBqI,gBAEpFjK,EAAYkK,uBAAuBtI,EAAiB,cACpD5B,EAAYkK,uBAAuBtI,EAAiB,cAEpD,MACMU,EAAW,wBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KAAM,KAC/C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,2BAAAwH,CAA4BzI,IAC3BA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,oBAClCH,EAAgB4H,eAAiBxJ,EAAYoC,uBAAuBR,EAAgB4H,iBAEjF5H,EAAgBG,eAAe,mBAClCH,EAAgB6H,cAAgBzJ,EAAYoC,uBAAuBR,EAAgB6H,gBAEhF7H,EAAgBG,eAAe,oBAClCH,EAAgBmB,eAAiB/C,EAAYoC,uBAAuBR,EAAgBmB,iBAEjFnB,EAAgBG,eAAe,mBAClCH,EAAgBoB,cAAgBhD,EAAYoC,uBAAuBR,EAAgBoB,gBAEhFpB,EAAgBG,eAAe,oBAClCH,EAAgBoI,eAAiBhK,EAAYoC,uBAAuBR,EAAgBoI,iBAEjFpI,EAAgBG,eAAe,mBAClCH,EAAgBqI,cAAgBjK,EAAYoC,uBAAuBR,EAAgBqI,gBAEpFjK,EAAYkK,uBAAuBtI,EAAiB,cACpD5B,EAAYkK,uBAAuBtI,EAAiB,cAEpD,MACMU,EAAW,mCADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KAAM,KAC/C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,2BAAAyH,CAA4BT,EAAmBC,GAC9C,MAAMlI,EAA0C,CAAA,OAEhCgC,IAAZiG,IACHjI,EAAyB,QAAIiI,EAAQhJ,YAGlCiJ,IACHlI,EAA2B,UAAIkI,GAGhC,MACMxH,EAAW,2BADG,IAAI/B,gBAAgBqB,GAAiBf,aAEnD0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KAAM,KAC/C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,2BAAA0H,CAA4BC,EAAuBC,EAAyBC,EAAkBC,GAC7F,IAAIC,EAAwB,CAAA,EACtBJ,IAAQI,EAAiBJ,OAASA,GAClCC,IAAUG,EAAiBH,SAAWA,GACtCC,IAAUE,EAAiBF,SAAWA,GACtCC,IAAYC,EAAiBD,WAAaA,GAEhD,MACMrI,EAAW,4BADG,IAAI/B,gBAAgBqK,GAAkB/J,WAEpD0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,sBAAAgI,CAAuBC,EAAmC3K,GACzD,OAAO,IAAI4K,SAAc,CAACC,EAASC,KAElC,MAAM/J,EAAYqB,EAAIpB,gBAStB,GARAoB,EAAIvB,gBAAgBE,GAAa,SAAUgK,GACtCA,GAAkCA,EAA+BC,QACpEH,IAEAC,EAAOC,EAA+BE,aAExC,EAEIhL,KAAKiL,eAAgB,CACxB,MAAM9I,EAAMnC,KACZ,IAGIkL,EAHAC,EAAkCpL,GAASoL,iCAAmChJ,EAAIgJ,iCAAmCzK,OAAO0K,SAASC,KAIzI,GAAItL,GAASuL,cAAe,CAC3BH,EAAkC,GAAGA,EAAgCI,MAAM,KAAK,4CAA4CzK,2BAC5H,IAAI0K,EAAiB,KACrB,GAAIzL,GAAS0L,OAAS1L,GAAS2L,OAAQ,CACtC,MAAMC,EAAI5L,GAAS0L,MACbG,EAAI7L,GAAS2L,OAGnBF,EAAiB,SAAWG,EAAI,WAAaC,EAAI,SAFvClL,OAAOmL,YAAc,EAAInL,OAAOoL,QAAWF,EAAI,GAEM,UADrDlL,OAAOqL,WAAa,EAAIrL,OAAOsL,QAAWL,EAAI,EAEzD,CAEAT,EAAqBxK,OAAOuL,KAAK,GAAI,eAAgBT,GACrDN,EAAmBgB,SAASD,OAC5Bf,EAAmBgB,SAASC,MAAM,gEAAgEnM,KAAKQ,uHACvG0K,EAAmBgB,SAASE,OAC7B,CAEA,MAAMC,EAAWzM,EAAY0M,mBAC7B1M,EAAY2M,aAAaF,GAAUhK,MAAKmK,IACvC,MACMC,EAAc,IAAItM,gBADC,CAAEuM,kBAAmBvB,EAAiCqB,aAAcA,IACnC/L,WACpDyB,EAAW,4BAA8BwI,EAA4B,YAAc+B,EAEzFzM,KAAKoC,UACHC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,OAAQ,KAC1C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASoD,MACjB,IACCtD,MAAK,SAAUsK,GACf,MAAMrI,EAAM,IAAIsI,IAAID,EAAYE,QAAQ,SAAU,KAC5CC,EAAe,IAAI3M,gBACzB2M,EAAa1M,IAAI,WAAYiM,GAC7BM,EAAc,GAAGrI,KAAOwI,IACpB5B,EACHA,EAAmBE,SAAWuB,EAE9BjM,OAAOqM,IAAI3B,SAAWuB,CAExB,IACC7D,OAAM,SAAUP,GAChBsC,EAAOtC,EACR,GAAE,GAEL,MAAW7H,OAAOC,OAAOC,gBAAgBoM,wBACxCtM,OAAOC,OAAOC,gBAAgBoM,uBAAuBhM,YAAY,CAChE0J,0BAA2BA,EAC3B5J,UAAWA,KACRf,GAEL,GAEF,CAEA,mBAAAkN,GACC,MACM9K,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YANI,mBAMkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,sBAAAyK,CAAuBC,GACtB,MAAMjL,EAAW,4BAA8BiL,EACzChL,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,OAAQ,KAC1C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,qBAAA+K,CAAsBD,GACrB,MAAMjL,EAAW,2BAA6Ba,mBAAmBoK,GAC3DhL,EAAMnC,KAEZ,OAAIA,KAAKC,mBACDD,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,SAAU,KAC5C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IAGK,IAAIoI,SAAQ,SAAUC,EAASC,GACrC,GAAInK,OAAOC,OAAOC,gBAAgByM,sBAAuB,CACxD,MAAMvM,EAAYqB,EAAIpB,gBACtBoB,EAAIvB,gBAAgBE,GAAa,SAAUwM,GACrCA,EAA8BvC,QAGlCH,EAAQ0C,GAFRzC,EAAOyC,EAIT,EACA5M,OAAOC,OAAOC,gBAAgByM,sBAAsBrM,YAAY,CAC/DF,UAAWA,EACXqM,UAAWA,GAEb,MACCtC,GAEF,GACD,CAEA,oBAAA0C,CAAqBC,GACpB,MAAMhM,EAA0C,CAAA,EAE5CgM,IACHhM,EAA0C,yBAAIgM,GAG/C,MACMtL,EAAW,oCADG,IAAI/B,gBAAgBqB,GAAiBf,aAGzD,OAAOT,KAAKoC,UACVC,MAAK,IAAMrC,KAAKsC,YAAYJ,EAAU,MAAO,QAC7CG,KAAKzC,EAAY4C,kBACjBH,MAAKE,GAAYA,EAASE,QAC7B,CAIA,kBAAAgL,CAAmBjM,IAClBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,gBAClCH,EAAgBkM,WAAa9N,EAAYoC,uBAAuBR,EAAgBkM,aAE7ElM,EAAgBG,eAAe,eAClCH,EAAgBmM,UAAY/N,EAAYoC,uBAAuBR,EAAgBmM,YAGhF,MACMzL,EAAW,iBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,yBAAAmL,CAA0BpM,IACzBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,eAClCH,EAAgBqM,UAAYjO,EAAYoC,uBAAuBR,EAAgBqM,YAE5ErM,EAAgBG,eAAe,aAClCH,EAAgBsM,QAAUlO,EAAYoC,uBAAuBR,EAAgBsM,UAG9E,MACM5L,EAAW,yBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,oBAAAsL,CAAqBvM,IACpBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,eAClCH,EAAgBqM,UAAYjO,EAAYoC,uBAAuBR,EAAgBqM,YAE5ErM,EAAgBG,eAAe,aAClCH,EAAgBsM,QAAUlO,EAAYoC,uBAAuBR,EAAgBsM,UAG9E,MACM5L,EAAW,oBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,iCAAAuL,CAAkCxM,IACjCA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,eAClCH,EAAgBqM,UAAYjO,EAAYoC,uBAAuBR,EAAgBqM,YAE5ErM,EAAgBG,eAAe,aAClCH,EAAgBsM,QAAUlO,EAAYoC,uBAAuBR,EAAgBsM,UAG9E,MACM5L,EAAW,iCADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,wBAAAwL,CAAyBzM,IACxBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,eAClCH,EAAgBqM,UAAYjO,EAAYoC,uBAAuBR,EAAgBqM,YAE5ErM,EAAgBG,eAAe,aAClCH,EAAgBsM,QAAUlO,EAAYoC,uBAAuBR,EAAgBsM,UAG9E,MACM5L,EAAW,wBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,UAAAyL,CAAWC,EAAY9D,EAAkB+D,GAExC,GAAID,EAAKE,KAAO,UACf,MAAM,IAAIzI,MAAM,wDAGjB,MAAMzD,EAAMnC,KACNkC,EAAW,kBAAoBmI,EAAW,aAAetH,mBAAmBqL,GAAYD,EAAKG,MAEnG,OAAOtO,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,OAAQ,KAC1C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,IACCJ,MAAK,SAAUI,GACf,OAAO6C,MAAM7C,EAAK8L,aAAc,CAC/BhJ,OAAQ,MACRiJ,KAAML,EACN3I,QAAS,CACR,eAAgB2I,EAAKzK,KACrB,+BAAgC,WAGnC,IACCrB,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,UAAAoM,CAAWjN,GACV,MACMU,EAAW,SADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,kBAAAiM,CAAmBrL,GAElB,IAAKA,EAAK,MAAM,IAAIuC,MAAM,mDAE1B,MAAM1D,EAAW,sBAAwBmB,EACnClB,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,UAAAkM,CAAWtL,GAEV,IAAKA,EAAK,MAAM,IAAIuC,MAAM,iDAE1B,MAAM1D,EAAW,aAAemB,EAC1BlB,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,SAAU,KAC5C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAIA,OAAAD,GACC,MAAMD,EAAMnC,KACZ,IAAI4O,EAA8B,WACjCzM,EAAI0M,MAAQ,KAEZ1M,EAAI2M,oBAAsB,IAAInE,SAAQ,SAAUC,EAASC,GACxD,IAAI/J,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUiO,GACtCA,EAAchE,SACjB5I,EAAI6M,aAAeC,KAAKC,MAAyC,IAAhCH,EAAc5G,KAAKgH,WACpDhN,EAAI0M,MAAQE,EAAc5G,KAC1BhG,EAAI3B,QAAUuO,EAAcvO,QAC5B4O,WAAWR,EAAsG,KAAvEG,EAAc5G,KAAKgH,WAAahN,EAAIkN,kCAC9EzE,EAAQ,QAERzI,EAAI0M,MAAQ,KACZhE,EAAOkE,EAAclG,UAEtB1G,EAAIvB,gBAAgBE,GAAa,KACjCqB,EAAI2M,oBAAsB,IAC3B,EAEApO,OAAOC,OAAOC,gBAAgB0O,wBAAwBtO,YAAY,CAAEF,UAAWA,GAChF,GACD,EAEA,GAAId,KAAK6O,OAASI,KAAKC,MAAQlP,KAAKgP,aACnC,OAAOrE,QAAQC,UAGhB,GAAI5K,KAAKC,qBAAuBD,KAAKuP,iBAAkB,CACtD,IAAIhH,EAAQvI,KAAK6O,MAAQ,qCAAuC,iFAEhE,OADAvG,QAAQS,IAAIR,GACLoC,QAAQE,OAAOtC,EACvB,CAOA,OALKvI,KAAK8O,qBACTF,IAIM5O,KAAK8O,mBACb,CAEA,yBAAAU,CAA0BX,EAAoBrO,GAC7CR,KAAKyP,uBACLzP,KAAK6O,MAAQA,EACTrO,IACHR,KAAKQ,QAAUA,GAEhBR,KAAKgP,aAAeC,KAAKC,MAAiC,IAAxBlP,KAAK6O,MAAMM,WAC7C,MAAMhN,EAAMnC,KACZoP,YAAW,WACVjN,EAAI4F,aAAa,CAAErE,KAAM,mBAC1B,GAAqE,KAAhE1D,KAAK6O,MAAMM,WAAanP,KAAKqP,iCACnC,CAIA,gBAAApP,GACC,OAAOD,KAAKiL,cACb,CAEA,cAAAsE,GACC,OAAOvP,KAAK0P,YACb,CAEA,oBAAAD,CAAqBC,GAAwB,EAAOlP,GACnDR,KAAKiL,gBAAiB,EACtBjL,KAAK0P,aAAeA,EAChBlP,IACHR,KAAKQ,QAAUA,GAEZE,OAAOC,SACVD,OAAOC,OAAOC,gBAAkB8O,EAAe,CAC9CJ,wBAAyB5O,OAAOC,OAAOC,gBAAgB0O,wBACvD/K,iBAAkB7D,OAAOC,OAAOC,gBAAgB2D,iBAChDE,iBAAkB/D,OAAOC,OAAOC,gBAAgB6D,iBAChDK,wBAAyBpE,OAAOC,OAAOC,gBAAgBkE,wBACvDmB,cAAevF,OAAOC,OAAOC,gBAAgBqF,cAC7CF,QAASrF,OAAOC,OAAOC,gBAAgBmF,SACpC,CAAA,EAEN,CAEA,mCAAIoF,GACH,OAAOnL,KAAK2P,gCACb,CAEA,mCAAIxE,CAAgCyE,GACnC5P,KAAK2P,iCAAmCC,CACzC,CAEA,iBAAAC,CAAkBC,GACbpP,OAAOC,OAAOC,gBAAgBmP,mBACjCrP,OAAOC,OAAOC,gBAAgBmP,kBAAkB/O,YAAY,CAAE8O,MAAOA,GAEvE,CAEA,aAAAE,GACC,IAAI7N,EAAMnC,KACV,OAAO,IAAI2K,SAA0B,SAAUC,EAASC,GACvD,GAAI1I,EAAIlC,mBACP2K,EAAQ,WACF,GAAIlK,OAAOC,OAAOC,gBAAgBqP,cAAe,CACvD,IAAInP,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUoP,GAC1CtF,EAAQsF,EAAmB/H,KAC5B,EACAzH,OAAOC,OAAOC,gBAAgBqP,cAAcjP,YAAY,CAAEF,UAAWA,GACtE,MACC+J,GAEF,GACD,CAEA,qBAAAsF,CAAsBC,GACrBpQ,KAAKqQ,mBAAmBC,OAAS,EACjC,IAAK,IAAIC,EAAI,EAAGA,EAAIH,EAAUE,OAAQC,IACrCvQ,KAAKqQ,mBAAmB3I,KAAK0I,EAAUG,GAAG1D,QAAQ,IAAK,KAEzD,CAEA,oBAAA2D,GACC,IAAIrO,EAAMnC,KACV,OAAO,IAAI2K,SAAiC,SAAUC,EAASC,GAC9D,GAAI1I,EAAIlC,mBACP2K,EAAQ,WACF,GAAIlK,OAAOC,OAAOC,gBAAgB6P,qBAAsB,CAC9D,IAAI3P,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAU4P,GAC1C9F,EAAQ8F,EAA0BvI,KACnC,EACAzH,OAAOC,OAAOC,gBAAgB6P,qBAAqBzP,YAAY,CAAEF,UAAWA,GAC7E,MACC+J,GAEF,GACD,CAEA,gBAAA8F,GACC,IAAIxO,EAAMnC,KACV,OAAO,IAAI2K,SAAQ,SAAUC,EAASC,GACjC1I,EAAIlC,oBACP2K,EAAQ,MAETzI,EAAI6N,gBAAgB3N,MAAK,SAAUuO,GAClC,GAA4B,QAAxBA,EAAWC,SACdjG,EAAQ,CAAEkG,WAAY,gBAElB,GAAIpQ,OAAOC,OAAOC,gBAAgBmQ,iBAAkB,CACxD,IAAIjQ,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUkQ,GAC1CpG,EAAQoG,EAAsB7I,KAC/B,EACAzH,OAAOC,OAAOC,gBAAgBmQ,iBAAiB/P,YAAY,CAAEF,UAAWA,GACzE,MAEC+J,GAEF,IAAG/B,OAAM,SAAUP,GAClBsC,GACD,GACD,GACD,CAEA,uBAAAoG,GACC,IAAI9O,EAAMnC,KACV,OAAO,IAAI2K,SAAqC,SAAUC,EAASC,GAClE,GAAI1I,EAAIlC,mBACP2K,EAAQ,WACF,GAAIlK,OAAOC,OAAOC,gBAAgBsQ,wBAAyB,CACjE,IAAIpQ,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUqQ,GAC1CvG,EAAQuG,EAA6BhJ,KACtC,EACAzH,OAAOC,OAAOC,gBAAgBsQ,wBAAwBlQ,YAAY,CAAEF,UAAWA,GAChF,MACC+J,GAEF,GACD,CAEA,kBAAAuG,CAAmBnN,GAClB,GAAIA,EAAU,CACb,IAAIoN,EAAoBrR,KAAKsR,qBAAqBrN,GAC9CoN,EACHrR,KAAKiE,SAAWoN,EAEhB/I,QAAQiJ,KAAK,YAAYtN,kBAE3B,MACCjE,KAAKiE,SAAWA,CAElB,CAEA,kBAAAC,GACC,IACIsN,EADA1E,EAAe,IAAI3M,gBAAgBO,OAAO0K,SAAShB,QAEvD,GAAI0C,EAAa2E,IAAI,QAAS,CAE7B,GADAD,EAAOxR,KAAKsR,qBAAqBxE,EAAa4E,IAAI,SAC9CF,EACH,OAAOA,EAEPlJ,QAAQiJ,KAAK,YAAYzE,EAAa4E,IAAI,wBAE5C,CACA,OAAO1R,KAAKiE,UAAY0N,UAAU1N,QACnC,CAEA,qBAAA2N,GACKlR,OAAOC,OAAOC,gBAAgBiR,uBACjCnR,OAAOC,OAAOC,gBAAgBiR,sBAAsB7Q,YAAY,CAAA,EAElE,CAEA,kCAAA8Q,GACKpR,OAAOC,OAAOC,gBAAgBmR,0BACjCrR,OAAOC,OAAOC,gBAAgBmR,yBAAyB/Q,YAAY,CAAA,EAErE,CAEA,yBAAAgR,GACKtR,OAAOC,OAAOC,gBAAgBqR,uBACjCvR,OAAOC,OAAOC,gBAAgBqR,sBAAsBjR,YAAY,CAAA,EAElE,CAEA,uBAAAkR,GACKxR,OAAOC,OAAOC,gBAAgBuR,qBACjCzR,OAAOC,OAAOC,gBAAgBuR,oBAAoBnR,YAAY,CAAA,EAEhE,CAEA,sBAAAoR,GACC,IAAIjQ,EAAMnC,KACV,OAAO,IAAI2K,SAAmC,SAAUC,EAASC,GAChE,GAAI1I,EAAIlC,mBACP2K,EAAQ,WACF,GAAIlK,OAAOC,OAAOC,gBAAgByR,oBAAqB,CAC7D,IAAIvR,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUwR,GAC1C1H,EAAQ0H,EAAenK,KACxB,EACAzH,OAAOC,OAAOC,gBAAgByR,oBAAoBrR,YAAY,CAAEF,UAAWA,GAC5E,MACC+J,GAEF,GACD,CAEA,0BAAA0H,GACK7R,OAAOC,OAAOC,gBAAgB4R,wBACjC9R,OAAOC,OAAOC,gBAAgB4R,uBAAuBxR,YAAY,CAAA,EAEnE,CAEA,yBAAAyR,GACC,IAAItQ,EAAMnC,KACV,OAAO,IAAI2K,SAAsC,SAAUC,EAASC,GACnE,GAAI1I,EAAIlC,mBACP2K,EAAQ,WACF,GAAIlK,OAAOC,OAAOC,gBAAgB8R,uBAAwB,CAChE,IAAI5R,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUwR,GAC1C1H,EAAQ0H,EAAenK,KACxB,EACAzH,OAAOC,OAAOC,gBAAgB8R,uBAAuB1R,YAAY,CAAEF,UAAWA,GAC/E,MACC+J,GAEF,GACD,CAEA,aAAA8H,CAAcC,GACTlS,OAAOC,OAAOC,gBAAgBiS,eACjCnS,OAAOC,OAAOC,gBAAgBiS,cAAc7R,YAAY,CAAE4R,aAAcA,GAE1E,CAEA,gBAAAE,CAAiBxS,GAChB,MACM6B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YANI,eAMkB,OAAQhC,EAC1C,IACC+B,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,yBAAA0Q,GACC,MAAM5Q,EAAMnC,KAGZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YALI,yBAKkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,mBAAAuQ,GACC,MAAM7Q,EAAMnC,KAGZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YALI,mBAKkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,eAAAwQ,CAAgBC,EAAmB3N,EAAgB/D,EAAoG2R,GACtJ,GAAID,EAAU1L,SAAS,KACtB,MAAM,IAAI5B,MAAM,6HAGjB,IAAI1D,EAAW,UAAYgR,EAE3B,GADA3N,EAASA,EAAO6N,cACZ5R,UAAyE,QAAX+D,GAA+B,WAAXA,GAAsB,CAC3G,IAAI8N,EAAkB,IAAIlT,gBAAgBqB,GAAiBf,WAC3DyB,GAAY,IAAMmR,EAClB7R,EAAkB,IACnB,CAEA,MAAMW,EAAMnC,KACZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAUqD,EAAQ/D,EAC1C,IACCa,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAO4Q,EAAe5Q,EAASE,YAASe,CACzC,GACF,CAEA,WAAA8P,GACC,GAr+CDtT,KAAAQ,QAAkB,2BAmwDDR,KAAAuT,wBAA0B,CAC1C,YACA,oBACA,WACA,iBACA,kBACA,2BACA,oBACA,SACA,mBAGgBvT,KAAAqP,gCAAkC,IAClCrP,KAAAwT,mBAAqB,CAAC,YAAa,eACnCxT,KAAAuH,gBAAkB,CAAC,kBAAmB,8BAA+B,8BAA+B,kBAAmB,4BAA6B,gCACpJvH,KAAAqQ,mBAAqB,GAE9BrQ,KAAAyT,iBAAmB,EACnBzT,KAAAY,gBAAkB,GAClBZ,KAAAyH,wBAA0B,CAAA,EAC1BzH,KAAA8O,oBAAsB,KACtB9O,KAAAiL,gBAAiB,EACjBjL,KAAA0P,cAAe,EApTlB1P,KAAK0T,uCACR,OAGD,IAEIC,EAFAxR,EAAMnC,KACN4T,EAGJ,WACC,IAAIC,EAAkB3H,SAASd,SAASyI,gBACxC,GAAIA,GAAmBA,EAAgB,GACtC,OAAOA,EAAgB,GAGxB,MAAO,GACR,CAVsBC,GAYtB,SAASC,EAAiBC,GACzB,GAAe,MAAXA,EAAgB,OAAO,EAE3B,IAAIC,EAAY,IAAIrH,IAAIoH,GACxB,IAAK,IAAIE,EAAI,EAAGA,EAAI/R,EAAIoR,wBAAwBjD,OAAQ4D,IACvD,GAAID,EAAUE,WAAahS,EAAIoR,wBAAwBW,IAAMD,EAAUE,SAAS9O,SAAS,IAAMlD,EAAIoR,wBAAwBW,IAC1H,OAAO,EAGT,OAAO,CACR,CAuDKH,EAAiBH,IACrBtL,QAAQS,IAAI,8CAOZ4K,EAJGjT,OAAOC,QAAUD,OAAOC,OAAOC,iBAAmBF,OAAOC,OAAOC,gBAAgBS,YAIhE,CAClBiO,wBAA2B,SAAUnH,GACpCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,0BACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACArP,iBAAoB,SAAU4D,GAC7BzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,kBACNhK,IAAK6D,GACHyL,EACJ,EACAnP,iBAAoB,SAAU0D,GAC7BzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,kBACNhK,IAAK6D,GACHyL,EACJ,EACA1C,wBAA2B,SAAU/I,GACpCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,0BACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACAnD,qBAAwB,SAAUtI,GACjCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,uBACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACA7C,iBAAoB,SAAU5I,GAC7BzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,mBACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACAtS,aAAgB,SAAU6G,GACzBzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,eACNxN,UAAWqH,EAAKrH,UAChBI,OAAQiH,EAAKjH,QACX0S,EACJ,GAGkB,CAClBtE,wBAA2B,SAAUnH,GACpCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,0BACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACA3D,cAAiB,SAAU9H,GAC1BzH,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,gBAAiBxN,UAAWqH,EAAKrH,WAAa8S,EACjF,EACA/S,uBAA0B,SAAUsH,GACnCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,yBACNxN,UAAWqH,EAAKrH,UAChBhB,WAAYqI,EAAKrI,WACjBC,QAASoI,EAAKpI,SACZ6T,EACJ,EACArP,iBAAoB,SAAU4D,GAC7BzH,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,kBAAmBhK,IAAK6D,GAAQyL,EACnE,EACAnP,iBAAoB,SAAU0D,GAC7BzH,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,kBAAmBhK,IAAK6D,GAAQyL,EACnE,EACA9O,wBAA2B,SAAUqD,GACpCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,kBACNxN,UAAWqH,EAAKrH,UAChBwD,IAAK6D,EAAK7D,IACVS,MAAOoD,EAAKpD,OACV6O,EACJ,EACA7N,QAAW,WACVrF,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,WAAasF,EAChD,EACA3N,cAAiB,WAChBvF,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,QAAUsF,EAC7C,EACAhP,QAAW,SAAUuD,GACpBzH,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,UAAW3J,OAAQwD,GAAQyL,EAC9D,EACAxN,yBAA4B,SAAU+B,GACrCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,2BACNnI,aAAcgC,EAAKhC,aACnBpB,MAAOoD,EAAKpD,OACV6O,EACJ,EACAnN,gCAAmC,SAAU0B,GAC5CzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,kCACN/H,iBAAkB4B,EAAK5B,iBACvBC,WAAY2B,EAAK3B,WACjBzB,MAAOoD,EAAKpD,OACV6O,EACJ,EACAjN,mCAAsC,SAAUwB,GAC/CzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,qCACN/H,iBAAkB4B,EAAK5B,iBACvBC,WAAY2B,EAAK3B,WACjBzB,MAAOoD,EAAKpD,MACZ6B,UAAWuB,EAAKvB,UAChBC,eAAgBsB,EAAKtB,gBACnB+M,EACJ,EACAvG,sBAAyB,SAAUlF,GAClCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,wBACNxN,UAAWqH,EAAKrH,UAChBqM,UAAWhF,EAAKgF,WACdyG,EACJ,EACA5G,uBAA0B,SAAU7E,GACnCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,yBACN5D,0BAA2BvC,EAAKuC,0BAChC5J,UAAWqH,EAAKrH,UAChBwK,cAAenD,EAAKmD,cACpBG,MAAOtD,EAAKsD,MACZC,OAAQvD,EAAKuD,QACXkI,EACJ,EACA5M,YAAe,SAAUmB,GACxBzH,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,cAAerH,KAAMkB,EAAKlB,MAAQ2M,EACrE,EACAzM,YAAe,SAAUgB,GACxBzH,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,cAAerH,KAAMkB,EAAKlB,MAAQ2M,EACrE,EACA1C,wBAA2B,SAAU/I,GACpCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,0BACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACAnD,qBAAwB,SAAUtI,GACjCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,uBACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACAtS,aAAgB,SAAU6G,GACzBzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,eACNxN,UAAWqH,EAAKrH,UAChBI,OAAQiH,EAAKjH,QACX0S,EACJ,EACAvB,oBAAuB,SAASlK,GAC/BzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,sBACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACAzB,oBAAuB,WACtBzR,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,uBAAyBsF,EAC5D,EACAlB,uBAA0B,SAASvK,GAClCzH,OAAO0T,OAAOpT,YAAY,CACzBsN,KAAM,yBACNxN,UAAWqH,EAAKrH,WACd8S,EACJ,EACApB,uBAA0B,WACzB9R,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,0BAA4BsF,EAC/D,EACA3B,sBAAyB,WACxBvR,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,yBAA2BsF,EAC9D,EACA7B,yBAA4B,WAC3BrR,OAAO0T,OAAOpT,YAAY,CAAEsN,KAAM,4BAA8BsF,EACjE,GAIGlT,OAAOC,QAAWD,OAAOC,OAAOC,iBA3MrC,WACC,IAAK,IAAIyT,KAAUV,EAClB,GAAIjT,OAAOC,OAAOC,gBAAgByT,GACjC,OAAO,EAGT,IAAK,IAAIA,KAAUlS,EAAIqR,mBACtB,GAAI9S,OAAOC,OAAOC,gBAAgBuB,EAAIqR,mBAAmBa,IACxD,OAAO,EAGT,OAAO,CACR,CA+LyDC,KACxD5T,OAAOC,OAAS,CACfC,gBAAiB,CAAA,IAxOnB,SAAoB2T,GACnB,IAAK,IAAIF,KAAUE,EAClB,IAAK7T,OAAOC,OAAOC,gBAAgByT,GAClC,IACC3T,OAAOC,OAAOC,gBAAgByT,GAAU,CAAErT,YAAauT,EAAQF,GAChE,CAAE,MAAO9L,GAER,YADAD,QAAQS,IAAI,mDAAqDR,EAElE,CAGH,CAiOAiM,CAAWb,GAEXjT,OAAO+T,iBAAiB,WAjOxB,SAA8B5L,GAC7B,IA1BD,SAAqCA,GACpC,SAAI1G,EAAIlC,oBAAsB4I,EAAQmL,SAAWtT,OAAO0K,SAAS4I,UAIzC,MAApBJ,EACIG,EAAiBlL,EAAQmL,QAG1BnL,EAAQmL,SAAWJ,EAC3B,CAgBMc,CAA4B7L,GAGhC,MADAP,QAAQC,MAAM,mBAAqBM,EAAQmL,OAAS,qBAC9C,mBAAqBnL,EAAQmL,OAAS,oBAGzCnL,EAAQV,KAAKrH,UAChBqB,EAAI+F,gBAAgBW,EAAQV,MAE5BhG,EAAI4F,aAAac,EAAQV,KAE3B,IAqNyD,GAErDnI,KAAK2U,+BACRxS,EAAIsN,sBAAqB,EAE3B,CA0BQ,aAAA1O,GACP,OAAOf,KAAKyT,kBACb,CAEQ,OAAAmB,CAAQ1S,EAAU2S,GACzB,IAAK7U,KAAKQ,QAET,MADA8H,QAAQC,MAAM,mDACR,kDAGP,OAAOvI,KAAKQ,QAAU,OAASqU,EAAa,cAAgB3S,CAC7D,CAEQ,WAAAI,CAAYJ,EAAUqD,EAAQiJ,EAAMqG,EAAa,MACxD,IAAK7U,KAAK6O,QAAU7O,KAAK6O,MAAMiG,aAC9B,KAAM,uDAGP,IAAIxQ,EAAMtE,KAAK4U,QAAQ1S,EAAU2S,GAE7BrP,EAAU,IAAIuP,QAClBvP,EAAQwP,OAAO,gBAAiB,UAAYhV,KAAK6O,MAAMiG,cACvDtP,EAAQwP,OAAO,SAAU,kDACzBxP,EAAQwP,OAAO,kBAAmBhV,KAAKkE,sBACjCsK,GACLhJ,EAAQwP,OAAO,eAAgB,oBAGhC,IAAIC,EAAY,CACf1P,OAAQA,EACRC,QAASA,GAMV,OAJMgJ,IACLyG,EAAKzG,KAAOrN,KAAKC,UAAUoN,IAGrBlJ,MAAMhB,EAAK2Q,EACnB,CAEQ,oBAAA3D,CAAqBrN,GAE5B,OADAA,EAAWA,EAAS4I,QAAQ,IAAK,KACM,IAAnC7M,KAAKqQ,mBAAmBC,QAGvBtQ,KAAKqQ,mBAAmB6E,MAAMC,GAAMA,IAAMlR,KAEnCA,EAAS4D,QAAQ,KAAO,IAClC5D,EAAWA,EAASmR,UAAU,EAAGnR,EAAS4D,QAAQ,MAC9C7H,KAAKqQ,mBAAmB6E,MAAMC,GAAMA,IAAMlR,KANxCA,OAIA,CAOT,CAEQ,uBAAOzB,CAAiBD,GAC/B,IAAKA,EAASmD,GACb,MAAMnD,EAASsD,WAGhB,OAAOtD,CACR,CAEQ,kBAAO8S,CAAYC,GAC1B,OAAOC,OAAOD,GACZE,WAAW,KAAM,QACjBA,WAAW,IAAK,MACnB,CAEQ,2BAAO5T,CAAqB0T,GACnC,GAAIG,MAAMC,QAAQJ,GAAQ,CAIzB,OAHoBA,EAAMK,KAAI,SAAUC,GACvC,OAAOhW,EAAYyV,YAAYO,EAChC,IACqBC,KAAK,IAC3B,CAEA,OAAO7V,KAAKqV,YAAYC,EACzB,CAEQ,6BAAOtT,CAAuB8T,GACrC,IAAIC,EAAc,IAAI9G,KAAK6G,GAC3B,GAAIE,MAAMD,EAAYE,WACrB,KAAM,qCAGP,OAAOF,EAAYG,aACpB,CAEQ,6BAAOpM,CAAuB5J,EAAQiW,GAC7C,QAAyB3S,IAArBtD,EAAOiW,IAAgD,OAArBjW,EAAOiW,GAA7C,CAEA,IAAK,IAAI9S,KAAOnD,EAAOiW,GAClBjW,EAAOiW,GAAUxU,eAAe0B,KACnCnD,EAAO,GAAGiW,KAAY9S,KAASzD,EAAYyV,YAAYnV,EAAOiW,GAAU9S,YAInEnD,EAAOiW,EARmD,CASlE,CAEQ,2BAAA/R,CAA4BD,GACnC,IAAIiS,EAAmB,2BACnBjU,EAAMnC,KAEV,OAAO,IAAI2K,SAAQ,SAAUC,EAASC,GACrC,GAAIqB,SAASmK,eAAeD,GAE3B,YADAvL,EAAO,8BAIRnK,OAAO+T,iBAAiB,WAAW,SAAS6B,EAASzN,GACpD,GAAIA,EAAQmL,SAAW,IAAIpH,IAAIzK,EAAI3B,SAASwT,OAC3C,OAED,IAAIuC,EAASrK,SAASmK,eAAe,4BAAiDG,cAClF3N,EAAQzF,SAAWmT,IAGG,4BAAtB1N,EAAQV,KAAKmG,KAChBpC,SAASmK,eAAeD,GAAkBK,WAAa,UACvB,mBAAtB5N,EAAQV,KAAKmG,OACvBpC,SAASmK,eAAeD,GAAkBM,SAC1CxK,SAASsC,KAAKiI,UAAYvK,SAASsC,KAAKiI,UAAU5J,QAAQ,YAAa,IACvEnM,OAAOiW,oBAAoB,UAAWL,GAAU,GAChD1L,EAAQ/B,EAAQV,OAElB,IAAG,GAEH,IAAIyO,EAAc1K,SAAS2K,cAAc,OACzCD,EAAYH,UAAY,2BACxBG,EAAYhT,GAAKwS,EACjBQ,EAAYE,UAAY,mQAAqQ3S,EAAY,oBACzS+H,SAASsC,KAAKwG,OAAO4B,GACrB1K,SAASsC,KAAKiI,WAAa,YAC5B,GACD,CAEQ,oBAAAlW,CAAqB4D,GAC5B,IAAIiS,EAAmB,2BACnBjU,EAAMnC,KAEV,GAAIkM,SAASmK,eAAeD,GAC3B,OAGD1V,OAAO+T,iBAAiB,WAAW,SAAS6B,EAASzN,GACpD,GAAIA,EAAQmL,SAAW,IAAIpH,IAAIzK,EAAI3B,SAASwT,OAC3C,OAED,IAAIuC,EAASrK,SAASmK,eAAe,4BAAiDG,cAClF3N,EAAQzF,SAAWmT,IAGG,4BAAtB1N,EAAQV,KAAKmG,KAChBnM,EAAIqG,qBAAqBnG,MAAM0U,IAC9BR,EAAMvV,YAAY,CAAEsN,KAAM,+BAAgC0I,YAAa7U,EAAI0M,MAAOrO,QAAS2B,EAAI3B,QAASyW,cAAeF,EAAYE,eAAiB,IAAI,IAG3H,4BAAtBpO,EAAQV,KAAKmG,KACrBpC,SAASmK,eAAeD,GAAkBK,WAAa,UAEzB,mBAAtB5N,EAAQV,KAAKmG,OACrBpC,SAASmK,eAAeD,GAAkBM,SAC1CxK,SAASsC,KAAKiI,UAAYvK,SAASsC,KAAKiI,UAAU5J,QAAQ,YAAa,IACvEnM,OAAOiW,oBAAoB,UAAWL,GAAU,GAChDzN,EAAQV,KAAKzE,KAAO,kBACpBvB,EAAI4F,aAAac,EAAQV,OAE3B,IAAG,GAEH,IAAIyO,EAAc1K,SAAS2K,cAAc,OACzCD,EAAYH,UAAY,2BACxBG,EAAYhT,GAAKwS,EACjBQ,EAAYE,UAAY,mQAAmQ3S,UAAkBhC,EAAI+B,wCACjTgI,SAASsC,KAAKwG,OAAO4B,GACrB1K,SAASsC,KAAKiI,WAAa,YAC5B,CAEQ,oCAAA/C,GACP,MAAMxT,EAAS,IAAIC,gBAAgBO,OAAO0K,SAAShB,QACnD,GAAIlK,EAAOwR,IAAI,2BAA6BxR,EAAOwR,IAAI,cAAgBxR,EAAOwR,IAAI,WAAY,CAC7F,MAAM7I,EAAU,CACfyF,KAAM,iCACNxN,UAAWoW,SAAShX,EAAOwR,IAAI,cAC/B3G,QAAmC,SAA1B7K,EAAOwR,IAAI,YAErB,GAAIhR,OAAOyW,OACVzW,OAAOyW,OAAOnW,YAAY6H,EAASnI,OAAO0K,SAAS4I,YAC7C,CACN,MAAMoD,EAAK,IAAIC,iBAAiB,0BAChCD,EAAGpW,YAAY6H,GACfuO,EAAGhL,OACJ,CAEA,OADA1L,OAAO0L,SACA,CACR,CACD,CAEQ,2BAAAuI,GACP,MACMzU,EAAS,IAAIC,gBAAgBO,OAAO0K,SAAShB,QAC7CkN,EAAoBpX,EAAOwR,IAFT,MAGxB,GAAIxR,EAAOuR,IAHa,OAGiC,UAAtB6F,EAIlC,OAHI1K,IAAI2K,SAASD,KAChBtX,KAAKmL,gCAAkCmM,IAEjC,CAET,CAEQ,uBAAOhL,GACd,MACM+B,EAAOmJ,KAAKC,KAAKC,IACjBC,EAAS,IAAIC,WAAWvJ,GAG9B,OAFA3N,OAAOmX,OAAOC,gBAAgBH,GAEvBlC,MAAMsC,KAAKJ,GAChBhC,KAAIqC,GAAKA,EAAEvX,SAAS,IAAIwX,SAAS,EAAG,OACpCpC,KAAK,IACLqC,MAAM,EARI,GASb,CAEQ,yBAAa3L,CAAa1D,GAEjC,MACMV,GADU,IAAIgQ,aACCC,OAAOvP,GAGtBwP,QAAmBR,OAAOS,OAAOC,OAAO,UAAWpQ,GAGnDqQ,EAAY/C,MAAMsC,KAAK,IAAIH,WAAWS,IAI5C,OAHeI,KAAKlD,OAAOmD,gBAAgBF,IAIzC3L,QAAQ,MAAO,KACfA,QAAQ,MAAO,KACfA,QAAQ,MAAO,GAClB,EAKD,MAAM1K,EAAM,IAAIvC,EAEhBc,OAAOd,YAAcuC,EAGrBzB,OAAOiY,eAAiB,CAAA,EACxBjY,OAAOiY,eAAezQ,gBAAkB,SAAUC,GACjDzH,OAAOd,YAAYsI,gBAAgBC,EACpC"}
1
+ {"version":3,"file":"MyDataHelps.min.js","sources":["../../src/MyDataHelps.ts"],"sourcesContent":["// @ts-ignore : let rollup handle CSS injection\nimport \"../MyDataHelps.css\";\n\nimport * as Model from \"./types\";\nimport { StringMap } from \"./types\";\n\nexport class MyDataHelps {\n\n\tbaseUrl: string = 'https://mydatahelps.org/';\n\tlanguage: string;\n\ttoken: Model.Token;\n\ttokenExpires: number;\n\n\tprivate _standaloneModeFinalRedirectPath: string;\n\n\t// Surveys\n\n\tstartSurvey(surveyName: string, options?: Model.StartSurveyOptions): void {\n\t\tif (this.isStandaloneMode()) {\n\t\t\tconst params = new URLSearchParams();\n\t\t\tparams.set('surveyName', surveyName);\n\t\t\tif (options?.editResultID) {\n\t\t\t\tparams.set('editResultID', options.editResultID);\n\t\t\t}\n\t\t\tif (options?.event) {\n\t\t\t\tparams.set('event', options.event);\n\t\t\t}\n\t\t\tthis.startDelegatedSurvey(`${this.baseUrl}/survey?${params.toString()}`);\n\t\t}\n\t\telse if (window.webkit.messageHandlers.StartParticipantSurvey) {\n\t\t\tlet messageID = this.nextMessageID();\n\t\t\twindow.webkit.messageHandlers.StartParticipantSurvey.postMessage({\n\t\t\t\tmessageID: messageID,\n\t\t\t\tsurveyName: surveyName,\n\t\t\t\toptions: options\n\t\t\t});\n\t\t}\n\t}\n\n\tcompleteStep(answer: any): void {\n\t\tif (answer === undefined || answer === null) answer = '';\n\t\tif (typeof answer !== 'string') {\n\t\t\tanswer = JSON.stringify(answer);\n\t\t}\n\t\tif (window.webkit.messageHandlers.ResearchKit) {\n\t\t\twindow.webkit.messageHandlers.ResearchKit.postMessage(answer);\n\t\t}\n\t\telse if (window.webkit.messageHandlers.CompleteStep) {\n\t\t\tlet messageID = this.nextMessageID();\n\t\t\twindow.webkit.messageHandlers.CompleteStep.postMessage({\n\t\t\t\tmessageID: messageID,\n\t\t\t\tanswer: answer\n\t\t\t});\n\t\t}\n\t}\n\n\tquerySurveyAnswers(queryParameters: Model.SurveyAnswersQuery): Promise<Model.SurveyAnswersPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"surveyName\")) {\n\t\t\tqueryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"stepIdentifier\")) {\n\t\t\tqueryParameters.stepIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.stepIdentifier);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"resultIdentifier\")) {\n\t\t\tqueryParameters.resultIdentifier = MyDataHelps.reduceArrayAndEscape(queryParameters.resultIdentifier);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"answer\")) {\n\t\t\tqueryParameters.answer = MyDataHelps.reduceArrayAndEscape(queryParameters.answer);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"before\")) {\n\t\t\tqueryParameters.before = MyDataHelps.convertDateToIsoString(queryParameters.before);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"after\")) {\n\t\t\tqueryParameters.after = MyDataHelps.convertDateToIsoString(queryParameters.after);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"event\")) {\n\t\t\tqueryParameters.event = MyDataHelps.reduceArrayAndEscape(queryParameters.event);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'surveyanswers?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tquerySurveyResults(queryParameters: Model.SurveyResultsQuery): Promise<Model.SurveyResultsPage> {\n\t\tqueryParameters = { ...queryParameters }\n\n\t\tif (queryParameters.hasOwnProperty(\"surveyName\")) {\n\t\t\tqueryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"event\")) {\n\t\t\tqueryParameters.event = MyDataHelps.reduceArrayAndEscape(queryParameters.event);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"before\")) {\n\t\t\tqueryParameters.before = MyDataHelps.convertDateToIsoString(queryParameters.before);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"after\")) {\n\t\t\tqueryParameters.after = MyDataHelps.convertDateToIsoString(queryParameters.after);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedBefore\")) {\n\t\t\tqueryParameters.insertedBefore = MyDataHelps.convertDateToIsoString(queryParameters.insertedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedAfter\")) {\n\t\t\tqueryParameters.insertedAfter = MyDataHelps.convertDateToIsoString(queryParameters.insertedAfter);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'surveyresults?' + queryString;\n\n\t\treturn this.connect()\n\t\t\t.then(() => this.makeRequest(endpoint, 'GET', null))\n\t\t\t.then(MyDataHelps.validateResponse)\n\t\t\t.then(response => response.json());\n\t}\n\n\tdeleteSurveyResult(resultID: string): Promise<void> {\n\t\tconst endpoint = 'surveyresults/' + encodeURIComponent(resultID);\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'DELETE', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tquerySurveyResultsV2(queryParameters: Model.SurveyResultsV2Query): Promise<Model.SurveyResultsV2Page> {\n\t\tconst parameters = { ...queryParameters };\n\n\t\tif (parameters.surveyName) {\n\t\t\tparameters.surveyName = MyDataHelps.reduceArrayAndEscape(parameters.surveyName);\n\t\t}\n\t\tif (parameters.event) {\n\t\t\tparameters.event = MyDataHelps.reduceArrayAndEscape(parameters.event);\n\t\t}\n\t\tif (parameters.resultIdentifier) {\n\t\t\tparameters.resultIdentifier = MyDataHelps.reduceArrayAndEscape(parameters.resultIdentifier);\n\t\t}\n\t\tif (parameters.insertedAfter) {\n\t\t\tparameters.insertedAfter = MyDataHelps.convertDateToIsoString(parameters.insertedAfter);\n\t\t}\n\t\tif (parameters.insertedBefore) {\n\t\t\tparameters.insertedBefore = MyDataHelps.convertDateToIsoString(parameters.insertedBefore);\n\t\t}\n\t\tif (parameters.modifiedAfter) {\n\t\t\tparameters.modifiedAfter = MyDataHelps.convertDateToIsoString(parameters.modifiedAfter);\n\t\t}\n\t\tif (parameters.modifiedBefore) {\n\t\t\tparameters.modifiedBefore = MyDataHelps.convertDateToIsoString(parameters.modifiedBefore);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(parameters as Record<string, string>).toString();\n\t\tconst endpoint = 'surveyresults?' + queryString;\n\n\t\treturn this.connect()\n\t\t\t.then(() => this.makeRequest(endpoint, 'GET', null, 'v2'))\n\t\t\t.then(MyDataHelps.validateResponse)\n\t\t\t.then(response => response.json());\n\t}\n\n\tquerySurveyTasks(queryParameters: Model.SurveyTaskQueryParameters): Promise<Model.SurveyTasksPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"status\")) {\n\t\t\tqueryParameters.status = MyDataHelps.reduceArrayAndEscape(queryParameters.status) as Model.SurveyTaskStatus;\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"surveyName\")) {\n\t\t\tqueryParameters.surveyName = MyDataHelps.reduceArrayAndEscape(queryParameters.surveyName);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"event\")) {\n\t\t\tqueryParameters.event = MyDataHelps.reduceArrayAndEscape(queryParameters.event);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'surveytasks?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryInboxItems(queryParameters: Model.InboxItemQueryParameters): Promise<Model.InboxItemsPage> {\n\t\tconst assignDefined = (target: any, source: any): any => {\n\t\t\tfor (const key of Object.keys(source)) {\n\t\t\t\tconst value = source[key];\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\ttarget[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn target;\n\t\t};\n\n\t\tqueryParameters = assignDefined({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"type\")) {\n\t\t\tqueryParameters.type = MyDataHelps.reduceArrayAndEscape(queryParameters.type) as Model.InboxItemType;\n\t\t}\n\n\t\tif (queryParameters.hasOwnProperty(\"status\")) {\n\t\t\tqueryParameters.status = MyDataHelps.reduceArrayAndEscape(queryParameters.status) as Model.InboxItemStatus;\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'inbox?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tgetInboxItem(id: Model.Guid): Promise<Model.InboxItem> {\n\t\tconst endpoint = `inbox/${id}`;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tupdateInboxItem(id: Model.Guid, update: Model.InboxItemUpdate): Promise<Model.InboxItemUpdateResult> {\n\t\tconst endpoint = `inbox/${id}/${update}`;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'PUT', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tstartEmbeddedSurvey(linkIdentifier: string, surveyName: string, language: string): Promise<any> {\n\t\tif (!language) {\n\t\t\tlanguage = this.getCurrentLanguage();\n\t\t}\n\t\tlet surveyUrl = this.baseUrl + \"mydatahelps/\" + linkIdentifier + '/surveylink/' + surveyName + \"?lang=\" + language;\n\t\treturn this.startEmbeddedSurveyInternal(surveyUrl);\n\t}\n\n\t// Navigation\n\n\topenExternalUrl(url: string): void {\n\t\tif (window.webkit.messageHandlers.OpenExternalLink) {\n\t\t\twindow.webkit.messageHandlers.OpenExternalLink.postMessage(url);\n\t\t}\n\t}\n\n\topenEmbeddedUrl(url: string): void {\n\t\tif (window.webkit.messageHandlers.OpenEmbeddedLink) {\n\t\t\twindow.webkit.messageHandlers.OpenEmbeddedLink.postMessage(url);\n\t\t}\n\t}\n\n\tshowTab(tabKey: string): void {\n\t\tif (window.webkit.messageHandlers.ShowTab) {\n\t\t\twindow.webkit.messageHandlers.ShowTab.postMessage(tabKey);\n\t\t}\n\t}\n\n\topenApplication(url: string, options?: Model.OpenApplicationOptions): void {\n\t\tif (window.webkit.messageHandlers.OpenExternalApplication) {\n\t\t\tlet messageID = this.nextMessageID();\n\t\t\twindow.webkit.messageHandlers.OpenExternalApplication.postMessage({\n\t\t\t\tmessageID: messageID,\n\t\t\t\turl: url,\n\t\t\t\tmodal: !!(options && options.modal),\n\t\t\t\tsecondaryViewKey: options && options.secondaryViewKey\n\t\t\t});\n\t\t}\n\t}\n\n\topenSecondaryView(projectId: string, viewKey: string, options?: Model.OpenApplicationOptions): void {\n\t\tthis.lookupSecondaryView(projectId, viewKey).then(secondaryView => {\n\t\t\treturn this.openApplication(secondaryView.url, {\n\t\t\t\t...options,\n\t\t\t\tmodal: !!(options && options.modal),\n\t\t\t\tsecondaryViewKey: (options && options.secondaryViewKey) || viewKey\n\t\t\t});\n\t\t});\n\t};\n\n\tlookupSecondaryView(projectId: string, viewKey: string): Promise<Model.SecondaryView> {\n\t\tlet baseUrl = this.baseUrl;\n\t\tif (!baseUrl.endsWith(\"/\")) {\n\t\t\tbaseUrl += \"/\";\n\t\t}\n\t\tconst viewLookupUrl = `${baseUrl}api/v1/public/projects/${projectId}/views/${viewKey}`;\n\t\treturn fetch(viewLookupUrl, { method: 'GET', headers: { 'Accept': 'application/json' } })\n\t\t\t.then(response => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\treturn response.text().then(text => {\n\t\t\t\t\t\tthrow new Error(`Failed to fetch secondary view: ${response.status} ${response.statusText}${text ? ' - ' + text : ''}`);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tdismiss(): void {\n\t\tif (window.webkit.messageHandlers.Dismiss) {\n\t\t\twindow.webkit.messageHandlers.Dismiss.postMessage({});\n\t\t}\n\t}\n\n\tback(): void {\n\t\tif (window.webkit.messageHandlers.PopNavigation) {\n\t\t\twindow.webkit.messageHandlers.PopNavigation.postMessage({});\n\t\t}\n\t}\n\n\tshowDashboard(dashboardKey: string, options?: Model.ShowDashboardOptions): void {\n\t\tif (window.webkit.messageHandlers.ShowParticipantDashboard) {\n\t\t\twindow.webkit.messageHandlers.ShowParticipantDashboard.postMessage({\n\t\t\t\tdashboardKey: dashboardKey,\n\t\t\t\tmodal: !!(options && options.modal),\n\t\t\t\ttitle: options && options.title ? options.title : undefined\n\t\t\t});\n\t\t}\n\t}\n\n\tshowWebVisualization(visualizationKey: string, parameters: object, options: Model.ShowWebVisualizationOptions): void {\n\t\tif (window.webkit.messageHandlers.ShowParticipantWebVisualization) {\n\t\t\twindow.webkit.messageHandlers.ShowParticipantWebVisualization.postMessage({\n\t\t\t\tvisualizationKey: visualizationKey,\n\t\t\t\tparameters: parameters,\n\t\t\t\tmodal: !!(options && options.modal),\n\t\t\t\ttitle: options && options.title ? options.title : undefined\n\t\t\t});\n\t\t}\n\t}\n\n\tshowWebVisualizationPdf(visualizationKey: string, parameters: object, options: Model.ShowWebVisualizationPdfOptions): void {\n\t\tif (window.webkit.messageHandlers.ShowParticipantWebVisualizationPDF) {\n\t\t\twindow.webkit.messageHandlers.ShowParticipantWebVisualizationPDF.postMessage({\n\t\t\t\tvisualizationKey: visualizationKey,\n\t\t\t\tparameters: parameters,\n\t\t\t\tlandscape: !!(options && options.landscape),\n\t\t\t\thtmlViewerZoom: options && options.htmlViewerZoom\n\t\t\t});\n\t\t}\n\t}\n\n\tshowProject(projectCode: string): void {\n\t\tif (window.webkit.messageHandlers.ShowProject) {\n\t\t\twindow.webkit.messageHandlers.ShowProject.postMessage({ code: projectCode });\n\t\t}\n\t}\n\n\tjoinProject(projectCode: string): void {\n\t\tif (window.webkit.messageHandlers.JoinProject) {\n\t\t\twindow.webkit.messageHandlers.JoinProject.postMessage({ code: projectCode });\n\t\t}\n\t}\n\n\t//Events\n\n\ton(eventName: Model.EventName, callback: (EventData) => void): void {\n\n\t\tif (!this.supportedEvents.includes(eventName)) {\n\t\t\tthrow new Error(eventName + \" is not a supported event type.\");\n\t\t}\n\n\t\tif (!this.registeredEventHandlers[eventName]) {\n\t\t\tthis.registeredEventHandlers[eventName] = [];\n\t\t}\n\n\t\tthis.registeredEventHandlers[eventName].push(callback);\n\t}\n\n\toff(eventName: Model.EventName, callback: (EventData) => void): void {\n\n\t\tif (!this.supportedEvents.includes(eventName)) {\n\t\t\tthrow new Error(eventName + \" is not a supported event type.\");\n\t\t}\n\n\t\tif (!this.registeredEventHandlers[eventName]) return;\n\n\t\tlet eventHandlerIndex = this.registeredEventHandlers[eventName].indexOf(callback);\n\n\t\tif (eventHandlerIndex !== -1) {\n\t\t\tthis.registeredEventHandlers[eventName].splice(eventHandlerIndex, 1);\n\t\t}\n\t}\n\n\ttriggerEvent(event: Model.EventData): void {\n\t\tlet eventName = event.type;\n\t\tif (this.supportedEvents.includes(eventName) && this.registeredEventHandlers[eventName]) {\n\t\t\tthis.registeredEventHandlers[eventName].forEach(function (handler) {\n\t\t\t\thandler(event);\n\t\t\t});\n\t\t}\n\t}\n\n\tsetActionResult(data: Model.EventData): void {\n\t\tif (Object.prototype.hasOwnProperty.call(this.messageHandlers, data.messageID) &&\n\t\t\ttypeof this.messageHandlers[data.messageID] === 'function') {\n\t\t\tthis.messageHandlers[data.messageID](data);\n\t\t} else {\n\t\t\tconsole.error(`Invalid messageID: ${data.messageID}`);\n\t\t}\n\t}\n\n\t// Participant Info\n\n\tgetParticipantInfo(): Promise<Model.ParticipantInfo> {\n\t\tconst mdh = this;\n\t\tconst endpoint = 'participant';\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tpersistParticipantInfo(demographics: Partial<Model.ParticipantDemographics> | undefined, customFields: StringMap): Promise<Model.ParticipantInfo> {\n\t\tconst endpoint = 'participant';\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'PUT', { demographics, customFields });\n\t\t\t})\n\t\t\t.then(async function (response) {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tvar errorJson = await response.json();\n\t\t\t\t\tthrow errorJson.message;\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.catch(function (error) {\n\t\t\t\tconsole.log(\"Unable to persist participant: \" + error);\n\t\t\t});\n\t}\n\n\tgetProjectInfo(): Promise<Model.ProjectInfo> {\n\t\tconst mdh = this;\n\t\tconst endpoint = 'project';\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// Device Data\n\n\tgetDeviceDataPoint(id: Model.Guid): Promise<Model.DeviceDataPoint> {\n\t\tconst endpoint = 'devicedata/' + id;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tdeleteDeviceDataPoint(id: Model.Guid): Promise<void> {\n\t\tconst endpoint = 'devicedata/' + id;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'DELETE', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tqueryDeviceData(queryParameters: Model.DeviceDataPointQuery): Promise<Model.DeviceDataPointsPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"type\")) {\n\t\t\tqueryParameters.type = MyDataHelps.reduceArrayAndEscape(queryParameters.type);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedBefore\")) {\n\t\t\tqueryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedAfter\")) {\n\t\t\tqueryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'devicedata?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tpersistDeviceData(deviceDataPoints: Model.PersistableDeviceDataPoint[]): Promise<void> {\n\t\tconst endpoint = 'devicedata';\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', deviceDataPoints);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tgetDeviceDataAllDataTypes(enabled?: boolean, namespace?: string): Promise<Model.SupportedDeviceDataType[]> {\n\t\tconst queryParameters: Record<string, string> = {};\n\n\t\tif (enabled !== undefined) {\n\t\t\tqueryParameters['enabled'] = enabled.toString();\n\t\t}\n\n\t\tif (namespace) {\n\t\t\tqueryParameters['namespace'] = namespace;\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters).toString();\n\t\tconst endpoint = `devicedata/allDataTypes?${queryString}`;\n\n\t\treturn this.connect()\n\t\t\t.then(() => this.makeRequest(endpoint, 'GET', null))\n\t\t\t.then(MyDataHelps.validateResponse)\n\t\t\t.then(response => response.json());\n\t}\n\n\t// Device Data V2\n\n\tqueryDeviceDataV2(queryParameters: Model.DeviceDataV2Query): Promise<Model.DeviceDataV2Page> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"observedBefore\")) {\n\t\t\tqueryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedAfter\")) {\n\t\t\tqueryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedBefore\")) {\n\t\t\tqueryParameters.insertedBefore = MyDataHelps.convertDateToIsoString(queryParameters.insertedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedAfter\")) {\n\t\t\tqueryParameters.insertedAfter = MyDataHelps.convertDateToIsoString(queryParameters.insertedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedBefore\")) {\n\t\t\tqueryParameters.modifiedBefore = MyDataHelps.convertDateToIsoString(queryParameters.modifiedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedAfter\")) {\n\t\t\tqueryParameters.modifiedAfter = MyDataHelps.convertDateToIsoString(queryParameters.modifiedAfter);\n\t\t}\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"dataSource\");\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"properties\");\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'devicedata?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null, 'v2');\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryDeviceDataV2Aggregate(queryParameters: Model.DeviceDataV2AggregateQuery): Promise<Model.DeviceDataV2AggregatePage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"aggregateFunctions\")) {\n\t\t\tqueryParameters.aggregateFunctions = MyDataHelps.reduceArrayAndEscape(queryParameters.aggregateFunctions);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedBefore\")) {\n\t\t\tqueryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedAfter\")) {\n\t\t\tqueryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedBefore\")) {\n\t\t\tqueryParameters.insertedBefore = MyDataHelps.convertDateToIsoString(queryParameters.insertedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedAfter\")) {\n\t\t\tqueryParameters.insertedAfter = MyDataHelps.convertDateToIsoString(queryParameters.insertedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedBefore\")) {\n\t\t\tqueryParameters.modifiedBefore = MyDataHelps.convertDateToIsoString(queryParameters.modifiedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedAfter\")) {\n\t\t\tqueryParameters.modifiedAfter = MyDataHelps.convertDateToIsoString(queryParameters.modifiedAfter);\n\t\t}\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"dataSource\");\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"properties\");\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'devicedata/aggregate?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null, 'v2');\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryDeviceDataV2DailySleep(queryParameters: Model.DeviceDataV2AggregateQuery): Promise<Model.DeviceDataV2DailySleepPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"observedBefore\")) {\n\t\t\tqueryParameters.observedBefore = MyDataHelps.convertDateToIsoString(queryParameters.observedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"observedAfter\")) {\n\t\t\tqueryParameters.observedAfter = MyDataHelps.convertDateToIsoString(queryParameters.observedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedBefore\")) {\n\t\t\tqueryParameters.insertedBefore = MyDataHelps.convertDateToIsoString(queryParameters.insertedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"insertedAfter\")) {\n\t\t\tqueryParameters.insertedAfter = MyDataHelps.convertDateToIsoString(queryParameters.insertedAfter);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedBefore\")) {\n\t\t\tqueryParameters.modifiedBefore = MyDataHelps.convertDateToIsoString(queryParameters.modifiedBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"modifiedAfter\")) {\n\t\t\tqueryParameters.modifiedAfter = MyDataHelps.convertDateToIsoString(queryParameters.modifiedAfter);\n\t\t}\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"dataSource\");\n\t\tMyDataHelps.flattenPropertyShallow(queryParameters, \"properties\");\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'devicedata/aggregate/dailysleep?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null, 'v2');\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tgetDeviceDataV2AllDataTypes(enabled?: boolean, namespace?: string): Promise<Model.SupportedDeviceDataV2DataType[]> {\n\t\tconst queryParameters: Record<string, string> = {};\n\n\t\tif (enabled !== undefined) {\n\t\t\tqueryParameters['enabled'] = enabled.toString();\n\t\t}\n\n\t\tif (namespace) {\n\t\t\tqueryParameters['namespace'] = namespace;\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters).toString();\n\t\tconst endpoint = `devicedata/allDataTypes?${queryString}`;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null, 'v2');\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// External Accounts\n\n\tgetExternalAccountProviders(search: string | null, category: string | null, pageSize: number, pageNumber: number): Promise<Model.ExternalAccountProvidersPage> {\n\t\tlet searchParameters: any = {};\n\t\tif (!!search) searchParameters.search = search;\n\t\tif (!!category) searchParameters.category = category;\n\t\tif (!!pageSize) searchParameters.pageSize = pageSize;\n\t\tif (!!pageNumber) searchParameters.pageNumber = pageNumber;\n\n\t\tconst queryString = new URLSearchParams(searchParameters).toString();\n\t\tconst endpoint = 'externalaccountproviders?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tconnectExternalAccount(externalAccountProviderID: number, options?: Model.ConnectExternalAccountOptions): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\n\t\t\tconst messageID = mdh.nextMessageID();\n\t\t\tmdh.messageHandlers[messageID] = function (connectProviderAccountResponse) {\n\t\t\t\tif (connectProviderAccountResponse && connectProviderAccountResponse.success) {\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\treject(connectProviderAccountResponse.errorMessage)\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (this.standaloneMode) {\n\t\t\t\tconst mdh = this;\n\t\t\t\tlet standaloneModeFinalRedirectPath = options?.standaloneModeFinalRedirectPath || mdh.standaloneModeFinalRedirectPath || window.location.href;\n\n\t\t\t\t// DEV: Safari blocks popups in AJAX responses. Work-around is to open a blank window before the request and set the URL later\n\t\t\t\tlet providerAuthWindow;\n\t\t\t\tif (options?.openNewWindow) {\n\t\t\t\t\tstandaloneModeFinalRedirectPath = `${standaloneModeFinalRedirectPath.split('?')[0]}?connectExternalAccount=true&messageID=${messageID}&success=%SUCCESSVALUE%`;\n\t\t\t\t\tlet windowFeatures = null;\n\t\t\t\t\tif (options?.width && options?.height) {\n\t\t\t\t\t\tconst w = options?.width;\n\t\t\t\t\t\tconst h = options?.height;\n\t\t\t\t\t\tconst y = window.outerHeight / 2 + window.screenY - (h / 2);\n\t\t\t\t\t\tconst x = window.outerWidth / 2 + window.screenX - (w / 2);\n\t\t\t\t\t\twindowFeatures = \"width=\" + w + \",height=\" + h + \",top=\" + y + \",left=\" + x;\n\t\t\t\t\t}\n\n\t\t\t\t\tproviderAuthWindow = window.open(\"\", 'providerauth', windowFeatures);\n\t\t\t\t\tproviderAuthWindow.document.open();\n\t\t\t\t\tproviderAuthWindow.document.write(`<!DOCTYPE html><html><head><title>Loading</title><link href=\"${this.baseUrl}Content/Loading.css\" rel=\"stylesheet\"/></head><body><div id=\"fragment-redirect-content\"></div></body></html>`);\n\t\t\t\t\tproviderAuthWindow.document.close();\n\t\t\t\t}\n\n\t\t\t\tconst verifier = MyDataHelps.generateVerifier();\n\t\t\t\tMyDataHelps.hashVerifier(verifier).then(verifierHash => {\n\t\t\t\t\tconst searchParameters = { finalRedirectPath: standaloneModeFinalRedirectPath, verifierHash: verifierHash };\n\t\t\t\t\tconst queryString = new URLSearchParams(searchParameters).toString();\n\t\t\t\t\tconst endpoint = \"externalaccountproviders/\" + externalAccountProviderID + \"/connect?\" + queryString;\n\n\t\t\t\t\tthis.connect()\n\t\t\t\t\t\t.then(function () {\n\t\t\t\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', null);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(function (response) {\n\t\t\t\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(function (response) {\n\t\t\t\t\t\t\treturn response.text();\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(function (redirectUrl) {\n\t\t\t\t\t\t\tconst url = new URL(redirectUrl.replace(/['\"]+/g, ''));\n\t\t\t\t\t\t\tconst searchParams = new URLSearchParams();\n\t\t\t\t\t\t\tsearchParams.set('verifier', verifier);\n\t\t\t\t\t\t\tredirectUrl = `${url}#${searchParams}`;\n\t\t\t\t\t\t\tif (providerAuthWindow) {\n\t\t\t\t\t\t\t\tproviderAuthWindow.location = redirectUrl;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twindow.top.location = redirectUrl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(function (error) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t} else if (window.webkit.messageHandlers.ConnectExternalAccount) {\n\t\t\t\twindow.webkit.messageHandlers.ConnectExternalAccount.postMessage({\n\t\t\t\t\texternalAccountProviderID: externalAccountProviderID,\n\t\t\t\t\tmessageID: messageID,\n\t\t\t\t\t...options\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tgetExternalAccounts(): Promise<Model.ExternalAccount[]> {\n\t\tconst endpoint = 'externalaccounts';\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\trefreshExternalAccount(accountID: number): Promise<void> {\n\t\tconst endpoint = 'externalaccounts/refresh/' + accountID;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tdeleteExternalAccount(accountID: number): Promise<any> {\n\t\tconst endpoint = 'externalaccounts/delete/' + encodeURIComponent(accountID);\n\t\tconst mdh = this;\n\n\t\tif (this.isStandaloneMode()) {\n\t\t\treturn this\n\t\t\t\t.connect()\n\t\t\t\t.then(function () {\n\t\t\t\t\treturn mdh.makeRequest(endpoint, 'DELETE', null);\n\t\t\t\t})\n\t\t\t\t.then(function (response) {\n\t\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t\t});\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tif (window.webkit.messageHandlers.DeleteProviderAccount) {\n\t\t\t\tconst messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (deleteProviderAccountResponse) {\n\t\t\t\t\tif (!deleteProviderAccountResponse.success) {\n\t\t\t\t\t\treject(deleteProviderAccountResponse)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(deleteProviderAccountResponse);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.DeleteProviderAccount.postMessage({\n\t\t\t\t\tmessageID: messageID,\n\t\t\t\t\taccountID: accountID\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tgetFeaturedProviders(context?: string): Promise<Model.ExternalAccountProvider[]> {\n\t\tconst queryParameters: Record<string, string> = {};\n\n\t\tif (context) {\n\t\t\tqueryParameters['featuredProvidersContext'] = context;\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters).toString();\n\t\tconst endpoint = `featuredexternalaccountproviders?${queryString}`;\n\n\t\treturn this.connect()\n\t\t\t.then(() => this.makeRequest(endpoint, 'GET', null))\n\t\t\t.then(MyDataHelps.validateResponse)\n\t\t\t.then(response => response.json());\n\t}\n\n\t// Notifications\n\n\tqueryNotifications(queryParameters: Model.NotificationQueryParameters): Promise<Model.NotificationsPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"sentBefore\")) {\n\t\t\tqueryParameters.sentBefore = MyDataHelps.convertDateToIsoString(queryParameters.sentBefore);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"sentAfter\")) {\n\t\t\tqueryParameters.sentAfter = MyDataHelps.convertDateToIsoString(queryParameters.sentAfter);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'notifications?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// Fitbit\n\n\tqueryFitbitDailySummaries(queryParameters: Model.FitbitQuery): Promise<Model.FitbitDailySummariesPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"startDate\")) {\n\t\t\tqueryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"endDate\")) {\n\t\t\tqueryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'fitbit/dailySummaries?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryFitbitSleepLogs(queryParameters: Model.FitbitQuery): Promise<Model.FitbitSleepLogsPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"startDate\")) {\n\t\t\tqueryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"endDate\")) {\n\t\t\tqueryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'fitbit/sleepLogs?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// AppleHealth\n\n\tgetAppleHealthStatus(): Promise<Model.AppleHealthStatus> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.AppleHealthStatus>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.GetAppleHealthStatus) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (statusResponse) {\n\t\t\t\t\tresolve(statusResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.GetAppleHealthStatus.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tqueryAppleHealthActivitySummaries(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthActivitySummaryPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"startDate\")) {\n\t\t\tqueryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"endDate\")) {\n\t\t\tqueryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'appleHealth/activitySummaries?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tqueryAppleHealthWorkouts(queryParameters: Model.AppleHealthQuery): Promise<Model.AppleHealthWorkoutPage> {\n\t\tqueryParameters = Object.assign({}, queryParameters);\n\n\t\tif (queryParameters.hasOwnProperty(\"startDate\")) {\n\t\t\tqueryParameters.startDate = MyDataHelps.convertDateToIsoString(queryParameters.startDate);\n\t\t}\n\t\tif (queryParameters.hasOwnProperty(\"endDate\")) {\n\t\t\tqueryParameters.endDate = MyDataHelps.convertDateToIsoString(queryParameters.endDate);\n\t\t}\n\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'appleHealth/workouts?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\t// Files\n\n\tuploadFile(file: File, category: string, fileName?: string): Promise<void> {\n\n\t\tif (file.size > 200 * 1024 * 1024) {\n\t\t\tthrow new Error(\"File size exceeds the maximum allowed size of 200MB.\");\n\t\t}\n\n\t\tconst mdh = this;\n\t\tconst endpoint = 'files?category=' + category + '&fileName=' + encodeURIComponent(fileName ?? file.name);\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.then(function (json) {\n\t\t\t\treturn fetch(json.preSignedUrl, {\n\t\t\t\t\tmethod: 'PUT',\n\t\t\t\t\tbody: file,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': file.type,\n\t\t\t\t\t\t'x-amz-server-side-encryption': 'AES256'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tqueryFiles(queryParameters: Model.UploadedFileQuery): Promise<Model.UploadedFilesPage> {\n\t\tconst queryString = new URLSearchParams(queryParameters as Record<string, any>).toString();\n\t\tconst endpoint = 'files?' + queryString;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tgetFileDownloadUrl(key: string): Promise<Model.DownloadedFile> {\n\n\t\tif (!key) throw new Error(\"Please specify the key of the file to download.\");\n\n\t\tconst endpoint = 'files/download?key=' + key;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tdeleteFile(key: string): Promise<void> {\n\n\t\tif (!key) throw new Error(\"Please specify the key of the file to delete.\");\n\n\t\tconst endpoint = 'files?key=' + key;\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'DELETE', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\t// Authorization\n\n\tconnect(): Promise<void> {\n\t\tconst mdh = this;\n\t\tlet refreshDelegatedAccessToken = function () {\n\t\t\tmdh.token = null;\n\n\t\t\tmdh.refreshTokenPromise = new Promise(function (resolve, reject) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (tokenResponse) {\n\t\t\t\t\tif (tokenResponse.success) {\n\t\t\t\t\t\tmdh.tokenExpires = Date.now() + (tokenResponse.data.expires_in * 1000);\n\t\t\t\t\t\tmdh.token = tokenResponse.data;\n\t\t\t\t\t\tmdh.baseUrl = tokenResponse.baseUrl;\n\t\t\t\t\t\tsetTimeout(refreshDelegatedAccessToken, ((tokenResponse.data.expires_in - mdh.accessTokenRenewalBufferSeconds) * 1000));\n\t\t\t\t\t\tresolve(null);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmdh.token = null;\n\t\t\t\t\t\treject(tokenResponse.message);\n\t\t\t\t\t}\n\t\t\t\t\tmdh.messageHandlers[messageID] = null;\n\t\t\t\t\tmdh.refreshTokenPromise = null;\n\t\t\t\t};\n\n\t\t\t\twindow.webkit.messageHandlers.GetDelegatedAccessToken.postMessage({ messageID: messageID });\n\t\t\t});\n\t\t};\n\n\t\tif (this.token && Date.now() < this.tokenExpires) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tif (this.isStandaloneMode() && !this.isEmbeddedMode()) {\n\t\t\tlet error = this.token ? \"access token is expired or invalid\" : \"access token must be explicitly provided using the setParticipantAccess method\";\n\t\t\tconsole.log(error);\n\t\t\treturn Promise.reject(error);\n\t\t}\n\n\t\tif (!this.refreshTokenPromise) {\n\t\t\trefreshDelegatedAccessToken();\n\t\t}\n\n\t\t// Re-use promise if refresh already in progress\n\t\treturn this.refreshTokenPromise;\n\t}\n\n\tsetParticipantAccessToken(token: Model.Token, baseUrl?: string): void {\n\t\tthis.enableStandaloneMode();\n\t\tthis.token = token;\n\t\tif (baseUrl) {\n\t\t\tthis.baseUrl = baseUrl;\n\t\t}\n\t\tthis.tokenExpires = Date.now() + (this.token.expires_in * 1000);\n\t\tconst mdh = this;\n\t\tsetTimeout(function () {\n\t\t\tmdh.triggerEvent({ type: \"tokenWillExpire\" });\n\t\t}, ((this.token.expires_in - this.accessTokenRenewalBufferSeconds) * 1000));\n\t}\n\n\t// Miscellaneous\n\n\tisStandaloneMode() {\n\t\treturn this.standaloneMode;\n\t}\n\n\tisEmbeddedMode() {\n\t\treturn this.embeddedMode;\n\t}\n\n\tenableStandaloneMode(embeddedMode: boolean = false, baseUrl?: string) {\n\t\tthis.standaloneMode = true;\n\t\tthis.embeddedMode = embeddedMode;\n\t\tif (baseUrl) {\n\t\t\tthis.baseUrl = baseUrl;\n\t\t}\n\t\tif (window.webkit) {\n\t\t\twindow.webkit.messageHandlers = embeddedMode ? {\n\t\t\t\tGetDelegatedAccessToken: window.webkit.messageHandlers.GetDelegatedAccessToken,\n\t\t\t\tOpenExternalLink: window.webkit.messageHandlers.OpenExternalLink,\n\t\t\t\tOpenEmbeddedLink: window.webkit.messageHandlers.OpenEmbeddedLink,\n\t\t\t\tOpenExternalApplication: window.webkit.messageHandlers.OpenExternalApplication,\n\t\t\t\tPopNavigation: window.webkit.messageHandlers.PopNavigation,\n\t\t\t\tDismiss: window.webkit.messageHandlers.Dismiss,\n\t\t\t} : {};\n\t\t}\n\t}\n\n\tget standaloneModeFinalRedirectPath(): string {\n\t\treturn this._standaloneModeFinalRedirectPath;\n\t}\n\n\tset standaloneModeFinalRedirectPath(path: string) {\n\t\tthis._standaloneModeFinalRedirectPath = path;\n\t}\n\n\tsetStatusBarStyle(style: Model.StatusBarStyle): void {\n\t\tif (window.webkit.messageHandlers.SetStatusBarStyle) {\n\t\t\twindow.webkit.messageHandlers.SetStatusBarStyle.postMessage({ style: style });\n\t\t}\n\t}\n\n\tgetDeviceInfo(): Promise<Model.DeviceInfo> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.DeviceInfo>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.GetDeviceInfo) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (deviceInfoResponse) {\n\t\t\t\t\tresolve(deviceInfoResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.GetDeviceInfo.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tsetSupportedLanguages(languages: string[]) {\n\t\tthis.supportedLanguages.length = 0;\n\t\tfor (let i = 0; i < languages.length; i++) {\n\t\t\tthis.supportedLanguages.push(languages[i].replace(\"_\", \"-\"));\n\t\t}\n\t}\n\n\tgetStepConfiguration(): Promise<Model.StepConfiguration> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.StepConfiguration>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.GetStepConfiguration) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (stepConfigurationResponse) {\n\t\t\t\t\tresolve(stepConfigurationResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.GetStepConfiguration.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tgetSurveyContext(): Promise<Model.SurveyContext> {\n\t\tlet mdh = this;\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t}\n\t\t\tmdh.getDeviceInfo().then(function (deviceInfo) {\n\t\t\t\tif (deviceInfo.platform !== \"Web\") {\n\t\t\t\t\tresolve({ surveyMode: \"Survey\" });\n\t\t\t\t}\n\t\t\t\telse if (window.webkit.messageHandlers.GetSurveyContext) {\n\t\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\t\tmdh.messageHandlers[messageID] = function (surveyContextResponse) {\n\t\t\t\t\t\tresolve(surveyContextResponse.data);\n\t\t\t\t\t};\n\t\t\t\t\twindow.webkit.messageHandlers.GetSurveyContext.postMessage({ messageID: messageID });\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject();\n\t\t\t\t}\n\t\t\t}).catch(function (error) {\n\t\t\t\treject();\n\t\t\t});\n\t\t});\n\t}\n\n\tgetCurrentSurveyAnswers(): Promise<Model.CurrentSurveyAnswer[]> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.CurrentSurveyAnswer[]>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.GetCurrentSurveyAnswers) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (currentSurveyAnswersResponse) {\n\t\t\t\t\tresolve(currentSurveyAnswersResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.GetCurrentSurveyAnswers.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tsetCurrentLanguage(language: string) {\n\t\tif (language) {\n\t\t\tlet supportedLanguage = this.getSupportedLanguage(language);\n\t\t\tif (supportedLanguage) {\n\t\t\t\tthis.language = supportedLanguage;\n\t\t\t} else {\n\t\t\t\tconsole.warn(`language ${language} not supported`);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.language = language;\n\t\t}\n\t}\n\n\tgetCurrentLanguage(): string {\n\t\tlet searchParams = new URLSearchParams(window.location.search);\n\t\tlet lang;\n\t\tif (searchParams.has(\"lang\")) {\n\t\t\tlang = this.getSupportedLanguage(searchParams.get(\"lang\"));\n\t\t\tif (lang) {\n\t\t\t\treturn lang;\n\t\t\t} else {\n\t\t\t\tconsole.warn(`language ${searchParams.get(\"lang\")} not supported`);\n\t\t\t}\n\t\t}\n\t\treturn this.language || navigator.language;\n\t}\n\n\tshowGoogleFitSettings(): void {\n\t\tif (window.webkit.messageHandlers.ShowGoogleFitSettings) {\n\t\t\twindow.webkit.messageHandlers.ShowGoogleFitSettings.postMessage({});\n\t\t}\n\t}\n\n\tshowHealthConnectMatchmakingPrompt(): void {\n\t\tif (window.webkit.messageHandlers.HealthConnectMatchmaking) {\n\t\t\twindow.webkit.messageHandlers.HealthConnectMatchmaking.postMessage({});\n\t\t}\n\t}\n\n\tshowHealthConnectSettings(): void {\n\t\tif (window.webkit.messageHandlers.HealthConnectSettings) {\n\t\t\twindow.webkit.messageHandlers.HealthConnectSettings.postMessage({});\n\t\t}\n\t}\n\n\tshowHealthConnectPrompt(): void {\n\t\tif (window.webkit.messageHandlers.HealthConnectPrompt) {\n\t\t\twindow.webkit.messageHandlers.HealthConnectPrompt.postMessage({});\n\t\t}\n\t}\n\n\tgetHealthConnectStatus(): Promise<Model.HealthConnectStatus> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.HealthConnectStatus>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.HealthConnectStatus) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (statusResponse) {\n\t\t\t\t\tresolve(statusResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.HealthConnectStatus.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\tshowHealthConnectPhrPrompt(): void {\n\t\tif (window.webkit.messageHandlers.HealthConnectPhrPrompt) {\n\t\t\twindow.webkit.messageHandlers.HealthConnectPhrPrompt.postMessage({});\n\t\t}\n\t}\n\n\tgetHealthConnectPhrStatus(): Promise<Model.HealthConnectPhrStatus> {\n\t\tlet mdh = this;\n\t\treturn new Promise<Model.HealthConnectPhrStatus>(function (resolve, reject) {\n\t\t\tif (mdh.isStandaloneMode()) {\n\t\t\t\tresolve(null);\n\t\t\t} else if (window.webkit.messageHandlers.HealthConnectPhrStatus) {\n\t\t\t\tlet messageID = mdh.nextMessageID();\n\t\t\t\tmdh.messageHandlers[messageID] = function (statusResponse) {\n\t\t\t\t\tresolve(statusResponse.data);\n\t\t\t\t};\n\t\t\t\twindow.webkit.messageHandlers.HealthConnectPhrStatus.postMessage({ messageID: messageID });\n\t\t\t} else {\n\t\t\t\treject();\n\t\t\t}\n\t\t});\n\t}\n\n\trequestReview(cooldownDays?: number): void {\n\t\tif (window.webkit.messageHandlers.RequestReview) {\n\t\t\twindow.webkit.messageHandlers.RequestReview.postMessage({ cooldownDays: cooldownDays });\n\t\t}\n\t}\n\n\ttrackCustomEvent(event: Model.CustomEventInfo): Promise<void> {\n\t\tconst endpoint = 'customevents';\n\t\tconst mdh = this;\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'POST', event);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function () {\n\t\t\t\treturn;\n\t\t\t});\n\t}\n\n\tgetDataCollectionSettings(): Promise<Model.DataCollectionSettings> {\n\t\tconst mdh = this;\n\t\tconst endpoint = 'datacollectionsettings';\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tgetDataAvailability(): Promise<Model.DataAvailability> {\n\t\tconst mdh = this;\n\t\tconst endpoint = 'dataavailability';\n\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, 'GET', null);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn response.json();\n\t\t\t});\n\t}\n\n\tinvokeCustomApi(customApi: string, method: string, queryParameters: string | string[][] | Record<string, string> | URLSearchParams | null | undefined, jsonResponse: boolean): Promise<any> {\n\t\tif (customApi.includes('?')) {\n\t\t\tthrow new Error(\"Cannot include query parameters directly in the \\\"customApi\\\" string. Provide as an argument for \\\"queryParameters\\\" instead.\");\n\t\t}\n\n\t\tlet endpoint = 'custom/' + customApi;\n\t\tmethod = method.toUpperCase();\n\t\tif (queryParameters !== null && queryParameters !== undefined && (method === 'GET' || method === 'DELETE')) {\n\t\t\tlet parameterString = new URLSearchParams(queryParameters).toString();\n\t\t\tendpoint += \"?\" + parameterString;\n\t\t\tqueryParameters = null;\n\t\t}\n\n\t\tconst mdh = this;\n\t\treturn this\n\t\t\t.connect()\n\t\t\t.then(function () {\n\t\t\t\treturn mdh.makeRequest(endpoint, method, queryParameters);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn MyDataHelps.validateResponse(response);\n\t\t\t})\n\t\t\t.then(function (response) {\n\t\t\t\treturn jsonResponse ? response.json() : undefined;\n\t\t\t});\n\t}\n\n\tconstructor() {\n\t\tif (this.handleConnectExternalAccountResponse()) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet mdh = this;\n\t\tlet applicationHost = getParentOrigin();\n\t\tlet supportedActions;\n\n\t\tfunction getParentOrigin(): string {\n\t\t\tlet ancestorOrigins = document.location.ancestorOrigins;\n\t\t\tif (ancestorOrigins && ancestorOrigins[0]) {\n\t\t\t\treturn ancestorOrigins[0];\n\t\t\t}\n\n\t\t\treturn '*';\n\t\t}\n\n\t\tfunction acceptableOrigin(origin) {\n\t\t\tif (origin === '*') return true;\n\n\t\t\tlet sourceURL = new URL(origin);\n\t\t\tfor (let k = 0; k < mdh.acceptableParentDomains.length; k++) {\n\t\t\t\tif (sourceURL.hostname === mdh.acceptableParentDomains[k] || sourceURL.hostname.endsWith(\".\" + mdh.acceptableParentDomains[k])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction validateWindowMessageOrigin(message) {\n\t\t\tif (mdh.isStandaloneMode() && message.origin === window.location.origin) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (applicationHost === \"*\") {\n\t\t\t\treturn acceptableOrigin(message.origin);\n\t\t\t}\n\n\t\t\treturn message.origin === applicationHost;\n\t\t}\n\n\t\tfunction addActions(actions) {\n\t\t\tfor (let action in actions) {\n\t\t\t\tif (!window.webkit.messageHandlers[action]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twindow.webkit.messageHandlers[action] = { postMessage: actions[action] };\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.log(\"Unable to add missing actions on this platform: \" + error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction receiveWindowMessage(message) {\n\t\t\tif (!validateWindowMessageOrigin(message)) {\n\t\t\t\t// todo: this can generate tons of console errors when hosting some apps within webappstep (youtube content, for example )\n\t\t\t\tconsole.error(\"message.origin '\" + message.origin + \"' is not allowed.\");\n\t\t\t\tthrow \"message.origin '\" + message.origin + \"' is not allowed.\";\n\t\t\t}\n\n\t\t\tif (message.data.messageID) {\n\t\t\t\tmdh.setActionResult(message.data);\n\t\t\t} else {\n\t\t\t\tmdh.triggerEvent(message.data);\n\t\t\t}\n\t\t}\n\n\t\tfunction windowHasAnyActions() {\n\t\t\tfor (let action in supportedActions) {\n\t\t\t\tif (window.webkit.messageHandlers[action]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let action in mdh.unsupportedActions) {\n\t\t\t\tif (window.webkit.messageHandlers[mdh.unsupportedActions[action]]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!acceptableOrigin(applicationHost)) {\n\t\t\tconsole.log(\"Detected unsupported parent origin domain.\");\n\t\t}\n\n\t\tif (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.ResearchKit) {\n\t\t\t// Presence of ResearchKit handler indicates the SDK is being used from within a WebViewStep. For pre-SDK backwards compatiblity,\n\t\t\t// WebViewStep setup registers the following handlers: GetDeviceInfo, DeleteProviderAccount, ConnectExternalAccount\n\t\t\t// ShowParticipantWebVisualizationPDF, ResearchKit\n\t\t\tsupportedActions = {\n\t\t\t\t\"GetDelegatedAccessToken\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetDelegatedAccessToken',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenExternalLink\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'OpenExternalUrl',\n\t\t\t\t\t\turl: data\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenEmbeddedLink\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'OpenEmbeddedUrl',\n\t\t\t\t\t\turl: data\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetCurrentSurveyAnswers\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetCurrentSurveyAnswers',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetStepConfiguration\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetStepConfiguration',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetSurveyContext\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetSurveyContext',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost);\n\t\t\t\t},\n\t\t\t\t\"CompleteStep\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'CompleteStep',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\tanswer: data.answer\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\tsupportedActions = {\n\t\t\t\t\"GetDelegatedAccessToken\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetDelegatedAccessToken',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetDeviceInfo\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'GetDeviceInfo', messageID: data.messageID }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"StartParticipantSurvey\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'StartParticipantSurvey',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\tsurveyName: data.surveyName,\n\t\t\t\t\t\toptions: data.options\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenExternalLink\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'OpenExternalUrl', url: data }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenEmbeddedLink\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'OpenEmbeddedUrl', url: data }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"OpenExternalApplication\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'OpenApplication',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\turl: data.url,\n\t\t\t\t\t\tmodal: data.modal,\n\t\t\t\t\t\tsecondaryViewKey: data.secondaryViewKey\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"Dismiss\": function () {\n\t\t\t\t\twindow.parent.postMessage({ name: 'Dismiss' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"PopNavigation\": function () {\n\t\t\t\t\twindow.parent.postMessage({ name: 'Back' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowTab\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'ShowTab', tabKey: data }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowParticipantDashboard\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'ShowParticipantDashboard',\n\t\t\t\t\t\tdashboardKey: data.dashboardKey,\n\t\t\t\t\t\tmodal: data.modal\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowParticipantWebVisualization\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'ShowParticipantWebVisualization',\n\t\t\t\t\t\tvisualizationKey: data.visualizationKey,\n\t\t\t\t\t\tparameters: data.parameters,\n\t\t\t\t\t\tmodal: data.modal\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowParticipantWebVisualizationPDF\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'ShowParticipantWebVisualizationPDF',\n\t\t\t\t\t\tvisualizationKey: data.visualizationKey,\n\t\t\t\t\t\tparameters: data.parameters,\n\t\t\t\t\t\tmodal: data.modal,\n\t\t\t\t\t\tlandscape: data.landscape,\n\t\t\t\t\t\thtmlViewerZoom: data.htmlViewerZoom\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"DeleteProviderAccount\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'DeleteProviderAccount',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\taccountID: data.accountID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ConnectExternalAccount\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'ConnectExternalAccount',\n\t\t\t\t\t\texternalAccountProviderID: data.externalAccountProviderID,\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\topenNewWindow: data.openNewWindow,\n\t\t\t\t\t\twidth: data.width,\n\t\t\t\t\t\theight: data.height\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"ShowProject\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'ShowProject', code: data.code }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"JoinProject\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({ name: 'JoinProject', code: data.code }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetCurrentSurveyAnswers\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetCurrentSurveyAnswers',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"GetStepConfiguration\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'GetStepConfiguration',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"CompleteStep\": function (data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'CompleteStep',\n\t\t\t\t\t\tmessageID: data.messageID,\n\t\t\t\t\t\tanswer: data.answer\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectStatus\": function(data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'HealthConnectStatus',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectPrompt\": function() {\n\t\t\t\t\twindow.parent.postMessage({ name: 'HealthConnectPrompt' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectPhrStatus\": function(data) {\n\t\t\t\t\twindow.parent.postMessage({\n\t\t\t\t\t\tname: 'HealthConnectPhrStatus',\n\t\t\t\t\t\tmessageID: data.messageID\n\t\t\t\t\t}, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectPhrPrompt\": function() {\n\t\t\t\t\twindow.parent.postMessage({ name: 'HealthConnectPhrPrompt' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectSettings\": function() {\n\t\t\t\t\twindow.parent.postMessage({ name: 'HealthConnectSettings' }, applicationHost)\n\t\t\t\t},\n\t\t\t\t\"HealthConnectMatchmaking\": function() {\n\t\t\t\t\twindow.parent.postMessage({ name: 'HealthConnectMatchmaking' }, applicationHost)\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tif (!window.webkit || !window.webkit.messageHandlers || !windowHasAnyActions()) {\n\t\t\twindow.webkit = {\n\t\t\t\tmessageHandlers: {}\n\t\t\t};\n\t\t}\n\n\t\taddActions(supportedActions);\n\n\t\twindow.addEventListener(\"message\", receiveWindowMessage, false);\n\n\t\tif (this.hasEmbeddedModeUrlParameter()) {\n\t\t\tmdh.enableStandaloneMode(true);\n\t\t}\n\t}\n\n\tprivate readonly acceptableParentDomains = [\n\t\t'localhost',\n\t\t'careevolution.com',\n\t\t'internal',\n\t\t'b3-deploys.com',\n\t\t'mydatahelps.org',\n\t\t'platform.joinallofus.org',\n\t\t'careevolution.dev',\n\t\t'ce.dev',\n\t\t'mydatahelps.dev'\n\t];\n\n\tprivate readonly accessTokenRenewalBufferSeconds = 120;\n\tprivate readonly unsupportedActions = [\"SetHeight\", \"ResearchKit\"];\n\tprivate readonly supportedEvents = [\"surveyDidFinish\", \"applicationDidBecomeVisible\", \"externalAccountSyncComplete\", \"tokenWillExpire\", \"healthConnectSyncComplete\", \"healthConnectPhrSyncComplete\", \"appleHealthSyncResume\", \"appleHealthSyncComplete\"];\n\tprivate readonly supportedLanguages = [];\n\n\tprivate currentMessageID = 1;\n\tprivate messageHandlers = [];\n\tprivate registeredEventHandlers = {};\n\tprivate refreshTokenPromise = null;\n\tprivate standaloneMode = false;\n\tprivate embeddedMode = false;\n\n\tprivate nextMessageID() {\n\t\treturn this.currentMessageID++;\n\t}\n\n\tprivate makeUrl(endpoint, apiVersion) {\n\t\tif (!this.baseUrl) {\n\t\t\tconsole.error(\"Cannot use makeUrl without MyDataHelps.baseUrl.\");\n\t\t\tthrow \"Cannot use makeUrl without MyDataHelps.baseUrl.\";\n\t\t}\n\n\t\treturn this.baseUrl + 'api/' + apiVersion + '/delegated/' + endpoint;\n\t}\n\n\tprivate makeRequest(endpoint, method, body, apiVersion = \"v1\") {\n\t\tif (!this.token || !this.token.access_token) {\n\t\t\tthrow \"No access_token available for request authorization.\";\n\t\t}\n\n\t\tlet url = this.makeUrl(endpoint, apiVersion);\n\n\t\tlet headers = new Headers();\n\t\theaders.append('Authorization', 'Bearer ' + this.token.access_token);\n\t\theaders.append('Accept', 'application/json, text/javascript, */*; q=0.01');\n\t\theaders.append('Accept-Language', this.getCurrentLanguage());\n\t\tif (!!body) {\n\t\t\theaders.append('Content-Type', 'application/json');\n\t\t}\n\n\t\tlet init: any = {\n\t\t\tmethod: method,\n\t\t\theaders: headers\n\t\t};\n\t\tif (!!body) {\n\t\t\tinit.body = JSON.stringify(body);\n\t\t}\n\n\t\treturn fetch(url, init);\n\t}\n\n\tprivate getSupportedLanguage(language: string): string {\n\t\tlanguage = language.replace(\"_\", \"-\");\n\t\tif (this.supportedLanguages.length === 0) {\n\t\t\treturn language;\n\t\t} else {\n\t\t\tif (this.supportedLanguages.find((l) => l === language)) {\n\t\t\t\treturn language;\n\t\t\t} else if (language.indexOf(\"-\") > 0) {\n\t\t\t\tlanguage = language.substring(0, language.indexOf(\"-\"));\n\t\t\t\tif (this.supportedLanguages.find((l) => l === language)) {\n\t\t\t\t\treturn language;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static validateResponse(response) {\n\t\tif (!response.ok) {\n\t\t\tthrow response.statusText;\n\t\t}\n\n\t\treturn response;\n\t}\n\n\tprivate static escapeParam(param) {\n\t\treturn String(param)\n\t\t\t.replaceAll(\"\\\\\", \"\\\\\\\\\")\n\t\t\t.replaceAll(\",\", \"\\\\,\");\n\t}\n\n\tprivate static reduceArrayAndEscape(param) {\n\t\tif (Array.isArray(param)) {\n\t\t\tlet escapedParams = param.map(function (elem) {\n\t\t\t\treturn MyDataHelps.escapeParam(elem);\n\t\t\t});\n\t\t\treturn escapedParams.join(\",\");\n\t\t}\n\n\t\treturn this.escapeParam(param);\n\t}\n\n\tprivate static convertDateToIsoString(date) {\n\t\tlet paramAsDate = new Date(date);\n\t\tif (isNaN(paramAsDate.getTime())) {\n\t\t\tthrow \"Cannot interpret parameter as Date\";\n\t\t}\n\n\t\treturn paramAsDate.toISOString();\n\t}\n\n\tprivate static flattenPropertyShallow(params, property) {\n\t\tif (params[property] === undefined || params[property] === null) return;\n\n\t\tfor (var key in params[property]) {\n\t\t\tif (params[property].hasOwnProperty(key)) {\n\t\t\t\tparams[`${property}.${key}`] = MyDataHelps.escapeParam(params[property][key]);\n\t\t\t}\n\t\t}\n\n\t\tdelete params[property];\n\t}\n\n\tprivate startEmbeddedSurveyInternal(surveyUrl) {\n\t\tlet mdhSurveyModalId = 'mydatahelps-survey-modal';\n\t\tlet mdh = this;\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tif (document.getElementById(mdhSurveyModalId)) {\n\t\t\t\treject(\"Survey already in progress\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow.addEventListener(\"message\", function listener(message) {\n\t\t\t\tif (message.origin !== new URL(mdh.baseUrl).origin) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet frame = (document.getElementById('mydatahelps-survey-frame') as HTMLFrameElement).contentWindow;\n\t\t\t\tif (message.source !== frame) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (message.data.name === 'SurveyWindowInitialized') {\n\t\t\t\t\tdocument.getElementById(mdhSurveyModalId).className += \" loaded\";\n\t\t\t\t} else if (message.data.name === 'SurveyFinished') {\n\t\t\t\t\tdocument.getElementById(mdhSurveyModalId).remove();\n\t\t\t\t\tdocument.body.className = document.body.className.replace(\"no-scroll\", \"\");\n\t\t\t\t\twindow.removeEventListener(\"message\", listener, true);\n\t\t\t\t\tresolve(message.data);\n\t\t\t\t}\n\t\t\t}, true);\n\n\t\t\tlet surveyModal = document.createElement('div');\n\t\t\tsurveyModal.className = 'mydatahelps-survey-modal';\n\t\t\tsurveyModal.id = mdhSurveyModalId;\n\t\t\tsurveyModal.innerHTML = \"<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='\" + surveyUrl + \"'></iframe></div>\";\n\t\t\tdocument.body.append(surveyModal);\n\t\t\tdocument.body.className += ' no-scroll';\n\t\t});\n\t}\n\n\tprivate startDelegatedSurvey(surveyUrl) {\n\t\tlet mdhSurveyModalId = 'mydatahelps-survey-modal';\n\t\tlet mdh = this;\n\n\t\tif (document.getElementById(mdhSurveyModalId)) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.addEventListener(\"message\", function listener(message) {\n\t\t\tif (message.origin !== new URL(mdh.baseUrl).origin) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet frame = (document.getElementById('mydatahelps-survey-frame') as HTMLFrameElement).contentWindow;\n\t\t\tif (message.source !== frame) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (message.data.name === 'GetDelegatedAccessToken') {\n\t\t\t\tmdh.getParticipantInfo().then((participant) => {\n\t\t\t\t\tframe.postMessage({ name: \"DelegatedAccessTokenResponse\", accessToken: mdh.token, baseUrl: mdh.baseUrl, participantID: participant.participantID }, '*');\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (message.data.name === 'SurveyWindowInitialized') {\n\t\t\t\tdocument.getElementById(mdhSurveyModalId).className += \" loaded\";\n\t\t\t}\n\t\t\telse if (message.data.name === 'SurveyFinished') {\n\t\t\t\tdocument.getElementById(mdhSurveyModalId).remove();\n\t\t\t\tdocument.body.className = document.body.className.replace(\"no-scroll\", \"\");\n\t\t\t\twindow.removeEventListener(\"message\", listener, true);\n\t\t\t\tmessage.data.type = 'surveyDidFinish';\n\t\t\t\tmdh.triggerEvent(message.data);\n\t\t\t}\n\t\t}, true);\n\n\t\tlet surveyModal = document.createElement('div');\n\t\tsurveyModal.className = 'mydatahelps-survey-modal';\n\t\tsurveyModal.id = mdhSurveyModalId;\n\t\tsurveyModal.innerHTML = `<div class='mydatahelps-survey'><div class='loader'>Loading...</div><iframe id='mydatahelps-survey-frame' allow='camera' sandbox='allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' src='${surveyUrl}&lang=${mdh.getCurrentLanguage()}'></iframe></div>`;\n\t\tdocument.body.append(surveyModal);\n\t\tdocument.body.className += ' no-scroll';\n\t}\n\n\tprivate handleConnectExternalAccountResponse() {\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tif (params.get('connectExternalAccount') && params.get('messageID') && params.get('success')) {\n\t\t\tconst message = {\n\t\t\t\tname: 'ConnectExternalAccountResponse',\n\t\t\t\tmessageID: parseInt(params.get('messageID')),\n\t\t\t\tsuccess: params.get('success') === 'true'\n\t\t\t};\n\t\t\tif (window.opener) {\n\t\t\t\twindow.opener.postMessage(message, window.location.origin);\n\t\t\t} else {\n\t\t\t\tconst bc = new BroadcastChannel(\"ConnectExternalAccount\");\n\t\t\t\tbc.postMessage(message);\n\t\t\t\tbc.close();\n\t\t\t}\n\t\t\twindow.close();\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate hasEmbeddedModeUrlParameter() {\n\t\tconst embeddedModeKey = '_e';\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tconst embeddedModeValue = params.get(embeddedModeKey);\n\t\tif (params.has(embeddedModeKey) && embeddedModeValue !== 'false') {\n\t\t\tif (URL.canParse(embeddedModeValue)) {\n\t\t\t\tthis.standaloneModeFinalRedirectPath = embeddedModeValue;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate static generateVerifier() {\n\t\tconst len = 32;\n\t\tconst size = Math.ceil(len / 2);\n\t\tconst buffer = new Uint8Array(size);\n\t\twindow.crypto.getRandomValues(buffer);\n\n\t\treturn Array.from(buffer)\n\t\t\t.map(b => b.toString(16).padStart(2, '0'))\n\t\t\t.join('')\n\t\t\t.slice(0, len);\n\t}\n\n\tprivate static async hashVerifier(message: string) {\n\t\t// 1. Encode the message into bytes\n\t\tconst encoder = new TextEncoder();\n\t\tconst data = encoder.encode(message);\n\n\t\t// 2. Calculate the SHA-256 hash\n\t\tconst hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\n\t\t// 3. Convert ArrayBuffer to Base64\n\t\tconst hashArray = Array.from(new Uint8Array(hashBuffer));\n\t\tconst base64 = btoa(String.fromCharCode(...hashArray));\n\n\t\t// 4. Make it URL-safe\n\t\treturn base64\n\t\t\t.replace(/\\+/g, '-')\n\t\t\t.replace(/\\//g, '_')\n\t\t\t.replace(/=+$/, '');\n\t}\n}\n\n//iOS/Android directly invoke window.MyDataHelps and window.RKStudioClient\n//so it's necessary to explicitly ensure they are present on the window\nconst mdh = new MyDataHelps();\n\nwindow.MyDataHelps = mdh;\n\n// For backwards compatibility\nwindow.RKStudioClient = {};\nwindow.RKStudioClient.setActionResult = function (data) {\n\twindow.MyDataHelps.setActionResult(data);\n};\n\nexport default mdh;\nexport * from './types';\n"],"names":["MyDataHelps","startSurvey","surveyName","options","this","isStandaloneMode","params","URLSearchParams","set","editResultID","event","startDelegatedSurvey","baseUrl","toString","window","webkit","messageHandlers","StartParticipantSurvey","messageID","nextMessageID","postMessage","completeStep","answer","JSON","stringify","ResearchKit","CompleteStep","querySurveyAnswers","queryParameters","Object","assign","hasOwnProperty","reduceArrayAndEscape","stepIdentifier","resultIdentifier","before","convertDateToIsoString","after","endpoint","mdh","connect","then","makeRequest","response","validateResponse","json","querySurveyResults","insertedBefore","insertedAfter","deleteSurveyResult","resultID","encodeURIComponent","querySurveyResultsV2","parameters","modifiedAfter","modifiedBefore","querySurveyTasks","status","queryInboxItems","target","source","key","keys","value","undefined","assignDefined","type","getInboxItem","id","updateInboxItem","update","startEmbeddedSurvey","linkIdentifier","language","getCurrentLanguage","surveyUrl","startEmbeddedSurveyInternal","openExternalUrl","url","OpenExternalLink","openEmbeddedUrl","OpenEmbeddedLink","showTab","tabKey","ShowTab","openApplication","OpenExternalApplication","modal","secondaryViewKey","openSecondaryView","projectId","viewKey","lookupSecondaryView","secondaryView","endsWith","fetch","method","headers","Accept","ok","text","Error","statusText","dismiss","Dismiss","back","PopNavigation","showDashboard","dashboardKey","ShowParticipantDashboard","title","showWebVisualization","visualizationKey","ShowParticipantWebVisualization","showWebVisualizationPdf","ShowParticipantWebVisualizationPDF","landscape","htmlViewerZoom","showProject","projectCode","ShowProject","code","joinProject","JoinProject","on","eventName","callback","supportedEvents","includes","registeredEventHandlers","push","off","eventHandlerIndex","indexOf","splice","triggerEvent","forEach","handler","setActionResult","data","prototype","call","console","error","getParticipantInfo","persistParticipantInfo","demographics","customFields","async","message","catch","log","getProjectInfo","getDeviceDataPoint","deleteDeviceDataPoint","queryDeviceData","observedBefore","observedAfter","persistDeviceData","deviceDataPoints","getDeviceDataAllDataTypes","enabled","namespace","queryDeviceDataV2","flattenPropertyShallow","queryDeviceDataV2Aggregate","aggregateFunctions","queryDeviceDataV2DailySleep","getDeviceDataV2AllDataTypes","getExternalAccountProviders","search","category","pageSize","pageNumber","searchParameters","connectExternalAccount","externalAccountProviderID","Promise","resolve","reject","connectProviderAccountResponse","success","errorMessage","standaloneMode","providerAuthWindow","standaloneModeFinalRedirectPath","location","href","openNewWindow","split","windowFeatures","width","height","w","h","outerHeight","screenY","outerWidth","screenX","open","document","write","close","verifier","generateVerifier","hashVerifier","verifierHash","queryString","finalRedirectPath","redirectUrl","URL","replace","searchParams","top","ConnectExternalAccount","getExternalAccounts","refreshExternalAccount","accountID","deleteExternalAccount","DeleteProviderAccount","deleteProviderAccountResponse","getFeaturedProviders","context","queryNotifications","sentBefore","sentAfter","queryFitbitDailySummaries","startDate","endDate","queryFitbitSleepLogs","getAppleHealthStatus","GetAppleHealthStatus","statusResponse","queryAppleHealthActivitySummaries","queryAppleHealthWorkouts","uploadFile","file","fileName","size","name","preSignedUrl","body","queryFiles","getFileDownloadUrl","deleteFile","refreshDelegatedAccessToken","token","refreshTokenPromise","tokenResponse","tokenExpires","Date","now","expires_in","setTimeout","accessTokenRenewalBufferSeconds","GetDelegatedAccessToken","isEmbeddedMode","setParticipantAccessToken","enableStandaloneMode","embeddedMode","_standaloneModeFinalRedirectPath","path","setStatusBarStyle","style","SetStatusBarStyle","getDeviceInfo","GetDeviceInfo","deviceInfoResponse","setSupportedLanguages","languages","supportedLanguages","length","i","getStepConfiguration","GetStepConfiguration","stepConfigurationResponse","getSurveyContext","deviceInfo","platform","surveyMode","GetSurveyContext","surveyContextResponse","getCurrentSurveyAnswers","GetCurrentSurveyAnswers","currentSurveyAnswersResponse","setCurrentLanguage","supportedLanguage","getSupportedLanguage","warn","lang","has","get","navigator","showGoogleFitSettings","ShowGoogleFitSettings","showHealthConnectMatchmakingPrompt","HealthConnectMatchmaking","showHealthConnectSettings","HealthConnectSettings","showHealthConnectPrompt","HealthConnectPrompt","getHealthConnectStatus","HealthConnectStatus","showHealthConnectPhrPrompt","HealthConnectPhrPrompt","getHealthConnectPhrStatus","HealthConnectPhrStatus","requestReview","cooldownDays","RequestReview","trackCustomEvent","getDataCollectionSettings","getDataAvailability","invokeCustomApi","customApi","jsonResponse","toUpperCase","parameterString","constructor","acceptableParentDomains","unsupportedActions","currentMessageID","handleConnectExternalAccountResponse","supportedActions","applicationHost","ancestorOrigins","getParentOrigin","acceptableOrigin","origin","sourceURL","k","hostname","parent","action","windowHasAnyActions","actions","addActions","addEventListener","validateWindowMessageOrigin","hasEmbeddedModeUrlParameter","makeUrl","apiVersion","access_token","Headers","append","init","find","l","substring","escapeParam","param","String","replaceAll","Array","isArray","map","elem","join","date","paramAsDate","isNaN","getTime","toISOString","property","mdhSurveyModalId","getElementById","listener","frame","contentWindow","className","remove","removeEventListener","surveyModal","createElement","innerHTML","participant","accessToken","participantID","parseInt","opener","bc","BroadcastChannel","embeddedModeValue","canParse","Math","ceil","len","buffer","Uint8Array","crypto","getRandomValues","from","b","padStart","slice","TextEncoder","encode","hashBuffer","subtle","digest","hashArray","btoa","fromCharCode","RKStudioClient"],"mappings":"MAMaA,EAWZ,WAAAC,CAAYC,EAAoBC,GAC/B,GAAIC,KAAKC,mBAAoB,CAC5B,MAAMC,EAAS,IAAIC,gBACnBD,EAAOE,IAAI,aAAcN,GACrBC,GAASM,cACZH,EAAOE,IAAI,eAAgBL,EAAQM,cAEhCN,GAASO,OACZJ,EAAOE,IAAI,QAASL,EAAQO,OAE7BN,KAAKO,qBAAqB,GAAGP,KAAKQ,kBAAkBN,EAAOO,aAC5D,MACK,GAAIC,OAAOC,OAAOC,gBAAgBC,uBAAwB,CAC9D,IAAIC,EAAYd,KAAKe,gBACrBL,OAAOC,OAAOC,gBAAgBC,uBAAuBG,YAAY,CAChEF,UAAWA,EACXhB,WAAYA,EACZC,QAASA,GAEX,CACD,CAEA,YAAAkB,CAAaC,GAKZ,GAJIA,UAAyCA,EAAS,IAChC,iBAAXA,IACVA,EAASC,KAAKC,UAAUF,IAErBR,OAAOC,OAAOC,gBAAgBS,YACjCX,OAAOC,OAAOC,gBAAgBS,YAAYL,YAAYE,QAElD,GAAIR,OAAOC,OAAOC,gBAAgBU,aAAc,CACpD,IAAIR,EAAYd,KAAKe,gBACrBL,OAAOC,OAAOC,gBAAgBU,aAAaN,YAAY,CACtDF,UAAWA,EACXI,OAAQA,GAEV,CACD,CAEA,kBAAAK,CAAmBC,IAClBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,gBAClCH,EAAgB1B,WAAaF,EAAYgC,qBAAqBJ,EAAgB1B,aAE3E0B,EAAgBG,eAAe,oBAClCH,EAAgBK,eAAiBjC,EAAYgC,qBAAqBJ,EAAgBK,iBAE/EL,EAAgBG,eAAe,sBAClCH,EAAgBM,iBAAmBlC,EAAYgC,qBAAqBJ,EAAgBM,mBAEjFN,EAAgBG,eAAe,YAClCH,EAAgBN,OAAStB,EAAYgC,qBAAqBJ,EAAgBN,SAEvEM,EAAgBG,eAAe,YAClCH,EAAgBO,OAASnC,EAAYoC,uBAAuBR,EAAgBO,SAEzEP,EAAgBG,eAAe,WAClCH,EAAgBS,MAAQrC,EAAYoC,uBAAuBR,EAAgBS,QAExET,EAAgBG,eAAe,WAClCH,EAAgBlB,MAAQV,EAAYgC,qBAAqBJ,EAAgBlB,QAG1E,MACM4B,EAAW,iBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,kBAAAC,CAAmBlB,IAClBA,EAAkB,IAAKA,IAEHG,eAAe,gBAClCH,EAAgB1B,WAAaF,EAAYgC,qBAAqBJ,EAAgB1B,aAE3E0B,EAAgBG,eAAe,WAClCH,EAAgBlB,MAAQV,EAAYgC,qBAAqBJ,EAAgBlB,QAEtEkB,EAAgBG,eAAe,YAClCH,EAAgBO,OAASnC,EAAYoC,uBAAuBR,EAAgBO,SAEzEP,EAAgBG,eAAe,WAClCH,EAAgBS,MAAQrC,EAAYoC,uBAAuBR,EAAgBS,QAExET,EAAgBG,eAAe,oBAClCH,EAAgBmB,eAAiB/C,EAAYoC,uBAAuBR,EAAgBmB,iBAEjFnB,EAAgBG,eAAe,mBAClCH,EAAgBoB,cAAgBhD,EAAYoC,uBAAuBR,EAAgBoB,gBAGpF,MACMV,EAAW,iBADG,IAAI/B,gBAAgBqB,GAAwCf,WAGhF,OAAOT,KAAKoC,UACVC,MAAK,IAAMrC,KAAKsC,YAAYJ,EAAU,MAAO,QAC7CG,KAAKzC,EAAY4C,kBACjBH,MAAKE,GAAYA,EAASE,QAC7B,CAEA,kBAAAI,CAAmBC,GAClB,MAAMZ,EAAW,iBAAmBa,mBAAmBD,GACjDX,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,SAAU,KAC5C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,oBAAAW,CAAqBxB,GACpB,MAAMyB,EAAa,IAAKzB,GAEpByB,EAAWnD,aACdmD,EAAWnD,WAAaF,EAAYgC,qBAAqBqB,EAAWnD,aAEjEmD,EAAW3C,QACd2C,EAAW3C,MAAQV,EAAYgC,qBAAqBqB,EAAW3C,QAE5D2C,EAAWnB,mBACdmB,EAAWnB,iBAAmBlC,EAAYgC,qBAAqBqB,EAAWnB,mBAEvEmB,EAAWL,gBACdK,EAAWL,cAAgBhD,EAAYoC,uBAAuBiB,EAAWL,gBAEtEK,EAAWN,iBACdM,EAAWN,eAAiB/C,EAAYoC,uBAAuBiB,EAAWN,iBAEvEM,EAAWC,gBACdD,EAAWC,cAAgBtD,EAAYoC,uBAAuBiB,EAAWC,gBAEtED,EAAWE,iBACdF,EAAWE,eAAiBvD,EAAYoC,uBAAuBiB,EAAWE,iBAG3E,MACMjB,EAAW,iBADG,IAAI/B,gBAAgB8C,GAAsCxC,WAG9E,OAAOT,KAAKoC,UACVC,MAAK,IAAMrC,KAAKsC,YAAYJ,EAAU,MAAO,KAAM,QACnDG,KAAKzC,EAAY4C,kBACjBH,MAAKE,GAAYA,EAASE,QAC7B,CAEA,gBAAAW,CAAiB5B,IAChBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,YAClCH,EAAgB6B,OAASzD,EAAYgC,qBAAqBJ,EAAgB6B,SAEvE7B,EAAgBG,eAAe,gBAClCH,EAAgB1B,WAAaF,EAAYgC,qBAAqBJ,EAAgB1B,aAE3E0B,EAAgBG,eAAe,WAClCH,EAAgBlB,MAAQV,EAAYgC,qBAAqBJ,EAAgBlB,QAG1E,MACM4B,EAAW,eADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,eAAAa,CAAgB9B,IAWfA,EAVsB,EAAC+B,EAAaC,KACnC,IAAK,MAAMC,KAAOhC,OAAOiC,KAAKF,GAAS,CACtC,MAAMG,EAAQH,EAAOC,QACPG,IAAVD,IACHJ,EAAOE,GAAOE,EAEhB,CACA,OAAOJ,CAAM,EAGIM,CAAc,CAAA,EAAIrC,IAEhBG,eAAe,UAClCH,EAAgBsC,KAAOlE,EAAYgC,qBAAqBJ,EAAgBsC,OAGrEtC,EAAgBG,eAAe,YAClCH,EAAgB6B,OAASzD,EAAYgC,qBAAqBJ,EAAgB6B,SAG3E,MACMnB,EAAW,SADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,YAAAsB,CAAaC,GACZ,MAAM9B,EAAW,SAAS8B,IACpB7B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,eAAAwB,CAAgBD,EAAgBE,GAC/B,MAAMhC,EAAW,SAAS8B,KAAME,IAC1B/B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,mBAAA0B,CAAoBC,EAAwBtE,EAAoBuE,GAC1DA,IACJA,EAAWrE,KAAKsE,sBAEjB,IAAIC,EAAYvE,KAAKQ,QAAU,eAAiB4D,EAAiB,eAAiBtE,EAAa,SAAWuE,EAC1G,OAAOrE,KAAKwE,4BAA4BD,EACzC,CAIA,eAAAE,CAAgBC,GACXhE,OAAOC,OAAOC,gBAAgB+D,kBACjCjE,OAAOC,OAAOC,gBAAgB+D,iBAAiB3D,YAAY0D,EAE7D,CAEA,eAAAE,CAAgBF,GACXhE,OAAOC,OAAOC,gBAAgBiE,kBACjCnE,OAAOC,OAAOC,gBAAgBiE,iBAAiB7D,YAAY0D,EAE7D,CAEA,OAAAI,CAAQC,GACHrE,OAAOC,OAAOC,gBAAgBoE,SACjCtE,OAAOC,OAAOC,gBAAgBoE,QAAQhE,YAAY+D,EAEpD,CAEA,eAAAE,CAAgBP,EAAa3E,GAC5B,GAAIW,OAAOC,OAAOC,gBAAgBsE,wBAAyB,CAC1D,IAAIpE,EAAYd,KAAKe,gBACrBL,OAAOC,OAAOC,gBAAgBsE,wBAAwBlE,YAAY,CACjEF,UAAWA,EACX4D,IAAKA,EACLS,SAAUpF,IAAWA,EAAQoF,OAC7BC,iBAAkBrF,GAAWA,EAAQqF,kBAEvC,CACD,CAEA,iBAAAC,CAAkBC,EAAmBC,EAAiBxF,GACrDC,KAAKwF,oBAAoBF,EAAWC,GAASlD,MAAKoD,GAC1CzF,KAAKiF,gBAAgBQ,EAAcf,IAAK,IAC3C3E,EACHoF,SAAUpF,IAAWA,EAAQoF,OAC7BC,iBAAmBrF,GAAWA,EAAQqF,kBAAqBG,KAG9D,CAEA,mBAAAC,CAAoBF,EAAmBC,GACtC,IAAI/E,EAAUR,KAAKQ,QACdA,EAAQkF,SAAS,OACrBlF,GAAW,KAGZ,OAAOmF,MADe,GAAGnF,2BAAiC8E,WAAmBC,IACjD,CAAEK,OAAQ,MAAOC,QAAS,CAAEC,OAAU,sBAChEzD,MAAKE,GACAA,EAASwD,GAKPxD,EAASE,OAJRF,EAASyD,OAAO3D,MAAK2D,IAC3B,MAAM,IAAIC,MAAM,mCAAmC1D,EAASc,UAAUd,EAAS2D,aAAaF,EAAO,MAAQA,EAAO,KAAK,KAK5H,CAEA,OAAAG,GACKzF,OAAOC,OAAOC,gBAAgBwF,SACjC1F,OAAOC,OAAOC,gBAAgBwF,QAAQpF,YAAY,CAAA,EAEpD,CAEA,IAAAqF,GACK3F,OAAOC,OAAOC,gBAAgB0F,eACjC5F,OAAOC,OAAOC,gBAAgB0F,cAActF,YAAY,CAAA,EAE1D,CAEA,aAAAuF,CAAcC,EAAsBzG,GAC/BW,OAAOC,OAAOC,gBAAgB6F,0BACjC/F,OAAOC,OAAOC,gBAAgB6F,yBAAyBzF,YAAY,CAClEwF,aAAcA,EACdrB,SAAUpF,IAAWA,EAAQoF,OAC7BuB,MAAO3G,GAAWA,EAAQ2G,MAAQ3G,EAAQ2G,WAAQ9C,GAGrD,CAEA,oBAAA+C,CAAqBC,EAA0B3D,EAAoBlD,GAC9DW,OAAOC,OAAOC,gBAAgBiG,iCACjCnG,OAAOC,OAAOC,gBAAgBiG,gCAAgC7F,YAAY,CACzE4F,iBAAkBA,EAClB3D,WAAYA,EACZkC,SAAUpF,IAAWA,EAAQoF,OAC7BuB,MAAO3G,GAAWA,EAAQ2G,MAAQ3G,EAAQ2G,WAAQ9C,GAGrD,CAEA,uBAAAkD,CAAwBF,EAA0B3D,EAAoBlD,GACjEW,OAAOC,OAAOC,gBAAgBmG,oCACjCrG,OAAOC,OAAOC,gBAAgBmG,mCAAmC/F,YAAY,CAC5E4F,iBAAkBA,EAClB3D,WAAYA,EACZ+D,aAAcjH,IAAWA,EAAQiH,WACjCC,eAAgBlH,GAAWA,EAAQkH,gBAGtC,CAEA,WAAAC,CAAYC,GACPzG,OAAOC,OAAOC,gBAAgBwG,aACjC1G,OAAOC,OAAOC,gBAAgBwG,YAAYpG,YAAY,CAAEqG,KAAMF,GAEhE,CAEA,WAAAG,CAAYH,GACPzG,OAAOC,OAAOC,gBAAgB2G,aACjC7G,OAAOC,OAAOC,gBAAgB2G,YAAYvG,YAAY,CAAEqG,KAAMF,GAEhE,CAIA,EAAAK,CAAGC,EAA4BC,GAE9B,IAAK1H,KAAK2H,gBAAgBC,SAASH,GAClC,MAAM,IAAIxB,MAAMwB,EAAY,mCAGxBzH,KAAK6H,wBAAwBJ,KACjCzH,KAAK6H,wBAAwBJ,GAAa,IAG3CzH,KAAK6H,wBAAwBJ,GAAWK,KAAKJ,EAC9C,CAEA,GAAAK,CAAIN,EAA4BC,GAE/B,IAAK1H,KAAK2H,gBAAgBC,SAASH,GAClC,MAAM,IAAIxB,MAAMwB,EAAY,mCAG7B,IAAKzH,KAAK6H,wBAAwBJ,GAAY,OAE9C,IAAIO,EAAoBhI,KAAK6H,wBAAwBJ,GAAWQ,QAAQP,IAE9C,IAAtBM,GACHhI,KAAK6H,wBAAwBJ,GAAWS,OAAOF,EAAmB,EAEpE,CAEA,YAAAG,CAAa7H,GACZ,IAAImH,EAAYnH,EAAMwD,KAClB9D,KAAK2H,gBAAgBC,SAASH,IAAczH,KAAK6H,wBAAwBJ,IAC5EzH,KAAK6H,wBAAwBJ,GAAWW,SAAQ,SAAUC,GACzDA,EAAQ/H,EACT,GAEF,CAEA,eAAAgI,CAAgBC,GACX9G,OAAO+G,UAAU7G,eAAe8G,KAAKzI,KAAKY,gBAAiB2H,EAAKzH,YACnB,mBAAzCd,KAAKY,gBAAgB2H,EAAKzH,WACjCd,KAAKY,gBAAgB2H,EAAKzH,WAAWyH,GAErCG,QAAQC,MAAM,sBAAsBJ,EAAKzH,YAE3C,CAIA,kBAAA8H,GACC,MAAMzG,EAAMnC,KAGZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YALI,cAKkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,sBAAAoG,CAAuBC,EAAkEC,GACxF,MACM5G,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YANI,cAMkB,MAAO,CAAEwG,eAAcC,gBACzD,IACC1G,MAAK2G,eAAgBzG,GACrB,IAAKA,EAASwD,GAEb,YADsBxD,EAASE,QACfwG,QAEjB,OAAO1G,EAASE,MACjB,IACCyG,OAAM,SAAUP,GAChBD,QAAQS,IAAI,kCAAoCR,EACjD,GACF,CAEA,cAAAS,GACC,MAAMjH,EAAMnC,KAGZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YALI,UAKkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,kBAAA4G,CAAmBrF,GAClB,MAAM9B,EAAW,cAAgB8B,EAC3B7B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,qBAAA6G,CAAsBtF,GACrB,MAAM9B,EAAW,cAAgB8B,EAC3B7B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,SAAU,KAC5C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,eAAAkH,CAAgB/H,IACfA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,UAClCH,EAAgBsC,KAAOlE,EAAYgC,qBAAqBJ,EAAgBsC,OAErEtC,EAAgBG,eAAe,oBAClCH,EAAgBgI,eAAiB5J,EAAYoC,uBAAuBR,EAAgBgI,iBAEjFhI,EAAgBG,eAAe,mBAClCH,EAAgBiI,cAAgB7J,EAAYoC,uBAAuBR,EAAgBiI,gBAGpF,MACMvH,EAAW,cADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,iBAAAiH,CAAkBC,GACjB,MACMxH,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YANI,aAMkB,OAAQqH,EAC1C,IACCtH,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,yBAAAuH,CAA0BC,EAAmBC,GAC5C,MAAMtI,EAA0C,CAAA,OAEhCoC,IAAZiG,IACHrI,EAAyB,QAAIqI,EAAQpJ,YAGlCqJ,IACHtI,EAA2B,UAAIsI,GAGhC,MACM5H,EAAW,2BADG,IAAI/B,gBAAgBqB,GAAiBf,aAGzD,OAAOT,KAAKoC,UACVC,MAAK,IAAMrC,KAAKsC,YAAYJ,EAAU,MAAO,QAC7CG,KAAKzC,EAAY4C,kBACjBH,MAAKE,GAAYA,EAASE,QAC7B,CAIA,iBAAAsH,CAAkBvI,IACjBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,oBAClCH,EAAgBgI,eAAiB5J,EAAYoC,uBAAuBR,EAAgBgI,iBAEjFhI,EAAgBG,eAAe,mBAClCH,EAAgBiI,cAAgB7J,EAAYoC,uBAAuBR,EAAgBiI,gBAEhFjI,EAAgBG,eAAe,oBAClCH,EAAgBmB,eAAiB/C,EAAYoC,uBAAuBR,EAAgBmB,iBAEjFnB,EAAgBG,eAAe,mBAClCH,EAAgBoB,cAAgBhD,EAAYoC,uBAAuBR,EAAgBoB,gBAEhFpB,EAAgBG,eAAe,oBAClCH,EAAgB2B,eAAiBvD,EAAYoC,uBAAuBR,EAAgB2B,iBAEjF3B,EAAgBG,eAAe,mBAClCH,EAAgB0B,cAAgBtD,EAAYoC,uBAAuBR,EAAgB0B,gBAEpFtD,EAAYoK,uBAAuBxI,EAAiB,cACpD5B,EAAYoK,uBAAuBxI,EAAiB,cAEpD,MACMU,EAAW,cADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KAAM,KAC/C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,0BAAAwH,CAA2BzI,IAC1BA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,wBAClCH,EAAgB0I,mBAAqBtK,EAAYgC,qBAAqBJ,EAAgB0I,qBAEnF1I,EAAgBG,eAAe,oBAClCH,EAAgBgI,eAAiB5J,EAAYoC,uBAAuBR,EAAgBgI,iBAEjFhI,EAAgBG,eAAe,mBAClCH,EAAgBiI,cAAgB7J,EAAYoC,uBAAuBR,EAAgBiI,gBAEhFjI,EAAgBG,eAAe,oBAClCH,EAAgBmB,eAAiB/C,EAAYoC,uBAAuBR,EAAgBmB,iBAEjFnB,EAAgBG,eAAe,mBAClCH,EAAgBoB,cAAgBhD,EAAYoC,uBAAuBR,EAAgBoB,gBAEhFpB,EAAgBG,eAAe,oBAClCH,EAAgB2B,eAAiBvD,EAAYoC,uBAAuBR,EAAgB2B,iBAEjF3B,EAAgBG,eAAe,mBAClCH,EAAgB0B,cAAgBtD,EAAYoC,uBAAuBR,EAAgB0B,gBAEpFtD,EAAYoK,uBAAuBxI,EAAiB,cACpD5B,EAAYoK,uBAAuBxI,EAAiB,cAEpD,MACMU,EAAW,wBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KAAM,KAC/C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,2BAAA0H,CAA4B3I,IAC3BA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,oBAClCH,EAAgBgI,eAAiB5J,EAAYoC,uBAAuBR,EAAgBgI,iBAEjFhI,EAAgBG,eAAe,mBAClCH,EAAgBiI,cAAgB7J,EAAYoC,uBAAuBR,EAAgBiI,gBAEhFjI,EAAgBG,eAAe,oBAClCH,EAAgBmB,eAAiB/C,EAAYoC,uBAAuBR,EAAgBmB,iBAEjFnB,EAAgBG,eAAe,mBAClCH,EAAgBoB,cAAgBhD,EAAYoC,uBAAuBR,EAAgBoB,gBAEhFpB,EAAgBG,eAAe,oBAClCH,EAAgB2B,eAAiBvD,EAAYoC,uBAAuBR,EAAgB2B,iBAEjF3B,EAAgBG,eAAe,mBAClCH,EAAgB0B,cAAgBtD,EAAYoC,uBAAuBR,EAAgB0B,gBAEpFtD,EAAYoK,uBAAuBxI,EAAiB,cACpD5B,EAAYoK,uBAAuBxI,EAAiB,cAEpD,MACMU,EAAW,mCADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KAAM,KAC/C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,2BAAA2H,CAA4BP,EAAmBC,GAC9C,MAAMtI,EAA0C,CAAA,OAEhCoC,IAAZiG,IACHrI,EAAyB,QAAIqI,EAAQpJ,YAGlCqJ,IACHtI,EAA2B,UAAIsI,GAGhC,MACM5H,EAAW,2BADG,IAAI/B,gBAAgBqB,GAAiBf,aAEnD0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KAAM,KAC/C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,2BAAA4H,CAA4BC,EAAuBC,EAAyBC,EAAkBC,GAC7F,IAAIC,EAAwB,CAAA,EACtBJ,IAAQI,EAAiBJ,OAASA,GAClCC,IAAUG,EAAiBH,SAAWA,GACtCC,IAAUE,EAAiBF,SAAWA,GACtCC,IAAYC,EAAiBD,WAAaA,GAEhD,MACMvI,EAAW,4BADG,IAAI/B,gBAAgBuK,GAAkBjK,WAEpD0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,sBAAAkI,CAAuBC,EAAmC7K,GACzD,OAAO,IAAI8K,SAAc,CAACC,EAASC,KAElC,MAAMjK,EAAYqB,EAAIpB,gBAStB,GARAoB,EAAIvB,gBAAgBE,GAAa,SAAUkK,GACtCA,GAAkCA,EAA+BC,QACpEH,IAEAC,EAAOC,EAA+BE,aAExC,EAEIlL,KAAKmL,eAAgB,CACxB,MAAMhJ,EAAMnC,KACZ,IAGIoL,EAHAC,EAAkCtL,GAASsL,iCAAmClJ,EAAIkJ,iCAAmC3K,OAAO4K,SAASC,KAIzI,GAAIxL,GAASyL,cAAe,CAC3BH,EAAkC,GAAGA,EAAgCI,MAAM,KAAK,4CAA4C3K,2BAC5H,IAAI4K,EAAiB,KACrB,GAAI3L,GAAS4L,OAAS5L,GAAS6L,OAAQ,CACtC,MAAMC,EAAI9L,GAAS4L,MACbG,EAAI/L,GAAS6L,OAGnBF,EAAiB,SAAWG,EAAI,WAAaC,EAAI,SAFvCpL,OAAOqL,YAAc,EAAIrL,OAAOsL,QAAWF,EAAI,GAEM,UADrDpL,OAAOuL,WAAa,EAAIvL,OAAOwL,QAAWL,EAAI,EAEzD,CAEAT,EAAqB1K,OAAOyL,KAAK,GAAI,eAAgBT,GACrDN,EAAmBgB,SAASD,OAC5Bf,EAAmBgB,SAASC,MAAM,gEAAgErM,KAAKQ,uHACvG4K,EAAmBgB,SAASE,OAC7B,CAEA,MAAMC,EAAW3M,EAAY4M,mBAC7B5M,EAAY6M,aAAaF,GAAUlK,MAAKqK,IACvC,MACMC,EAAc,IAAIxM,gBADC,CAAEyM,kBAAmBvB,EAAiCqB,aAAcA,IACnCjM,WACpDyB,EAAW,4BAA8B0I,EAA4B,YAAc+B,EAEzF3M,KAAKoC,UACHC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,OAAQ,KAC1C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASyD,MACjB,IACC3D,MAAK,SAAUwK,GACf,MAAMnI,EAAM,IAAIoI,IAAID,EAAYE,QAAQ,SAAU,KAC5CC,EAAe,IAAI7M,gBACzB6M,EAAa5M,IAAI,WAAYmM,GAC7BM,EAAc,GAAGnI,KAAOsI,IACpB5B,EACHA,EAAmBE,SAAWuB,EAE9BnM,OAAOuM,IAAI3B,SAAWuB,CAExB,IACC3D,OAAM,SAAUP,GAChBoC,EAAOpC,EACR,GAAE,GAEL,MAAWjI,OAAOC,OAAOC,gBAAgBsM,wBACxCxM,OAAOC,OAAOC,gBAAgBsM,uBAAuBlM,YAAY,CAChE4J,0BAA2BA,EAC3B9J,UAAWA,KACRf,GAEL,GAEF,CAEA,mBAAAoN,GACC,MACMhL,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YANI,mBAMkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,sBAAA2K,CAAuBC,GACtB,MAAMnL,EAAW,4BAA8BmL,EACzClL,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,OAAQ,KAC1C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,qBAAAiL,CAAsBD,GACrB,MAAMnL,EAAW,2BAA6Ba,mBAAmBsK,GAC3DlL,EAAMnC,KAEZ,OAAIA,KAAKC,mBACDD,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,SAAU,KAC5C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IAGK,IAAIsI,SAAQ,SAAUC,EAASC,GACrC,GAAIrK,OAAOC,OAAOC,gBAAgB2M,sBAAuB,CACxD,MAAMzM,EAAYqB,EAAIpB,gBACtBoB,EAAIvB,gBAAgBE,GAAa,SAAU0M,GACrCA,EAA8BvC,QAGlCH,EAAQ0C,GAFRzC,EAAOyC,EAIT,EACA9M,OAAOC,OAAOC,gBAAgB2M,sBAAsBvM,YAAY,CAC/DF,UAAWA,EACXuM,UAAWA,GAEb,MACCtC,GAEF,GACD,CAEA,oBAAA0C,CAAqBC,GACpB,MAAMlM,EAA0C,CAAA,EAE5CkM,IACHlM,EAA0C,yBAAIkM,GAG/C,MACMxL,EAAW,oCADG,IAAI/B,gBAAgBqB,GAAiBf,aAGzD,OAAOT,KAAKoC,UACVC,MAAK,IAAMrC,KAAKsC,YAAYJ,EAAU,MAAO,QAC7CG,KAAKzC,EAAY4C,kBACjBH,MAAKE,GAAYA,EAASE,QAC7B,CAIA,kBAAAkL,CAAmBnM,IAClBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,gBAClCH,EAAgBoM,WAAahO,EAAYoC,uBAAuBR,EAAgBoM,aAE7EpM,EAAgBG,eAAe,eAClCH,EAAgBqM,UAAYjO,EAAYoC,uBAAuBR,EAAgBqM,YAGhF,MACM3L,EAAW,iBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,yBAAAqL,CAA0BtM,IACzBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,eAClCH,EAAgBuM,UAAYnO,EAAYoC,uBAAuBR,EAAgBuM,YAE5EvM,EAAgBG,eAAe,aAClCH,EAAgBwM,QAAUpO,EAAYoC,uBAAuBR,EAAgBwM,UAG9E,MACM9L,EAAW,yBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,oBAAAwL,CAAqBzM,IACpBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,eAClCH,EAAgBuM,UAAYnO,EAAYoC,uBAAuBR,EAAgBuM,YAE5EvM,EAAgBG,eAAe,aAClCH,EAAgBwM,QAAUpO,EAAYoC,uBAAuBR,EAAgBwM,UAG9E,MACM9L,EAAW,oBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,oBAAAyL,GACC,IAAI/L,EAAMnC,KACV,OAAO,IAAI6K,SAAiC,SAAUC,EAASC,GAC9D,GAAI5I,EAAIlC,mBACP6K,EAAQ,WACF,GAAIpK,OAAOC,OAAOC,gBAAgBuN,qBAAsB,CAC9D,IAAIrN,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUsN,GAC1CtD,EAAQsD,EAAe7F,KACxB,EACA7H,OAAOC,OAAOC,gBAAgBuN,qBAAqBnN,YAAY,CAAEF,UAAWA,GAC7E,MACCiK,GAEF,GACD,CAEA,iCAAAsD,CAAkC7M,IACjCA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,eAClCH,EAAgBuM,UAAYnO,EAAYoC,uBAAuBR,EAAgBuM,YAE5EvM,EAAgBG,eAAe,aAClCH,EAAgBwM,QAAUpO,EAAYoC,uBAAuBR,EAAgBwM,UAG9E,MACM9L,EAAW,iCADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,wBAAA6L,CAAyB9M,IACxBA,EAAkBC,OAAOC,OAAO,CAAA,EAAIF,IAEhBG,eAAe,eAClCH,EAAgBuM,UAAYnO,EAAYoC,uBAAuBR,EAAgBuM,YAE5EvM,EAAgBG,eAAe,aAClCH,EAAgBwM,QAAUpO,EAAYoC,uBAAuBR,EAAgBwM,UAG9E,MACM9L,EAAW,wBADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAIA,UAAA8L,CAAWC,EAAYjE,EAAkBkE,GAExC,GAAID,EAAKE,KAAO,UACf,MAAM,IAAIzI,MAAM,wDAGjB,MAAM9D,EAAMnC,KACNkC,EAAW,kBAAoBqI,EAAW,aAAexH,mBAAmB0L,GAAYD,EAAKG,MAEnG,OAAO3O,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,OAAQ,KAC1C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,IACCJ,MAAK,SAAUI,GACf,OAAOkD,MAAMlD,EAAKmM,aAAc,CAC/BhJ,OAAQ,MACRiJ,KAAML,EACN3I,QAAS,CACR,eAAgB2I,EAAK1K,KACrB,+BAAgC,WAGnC,IACCzB,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,UAAAyM,CAAWtN,GACV,MACMU,EAAW,SADG,IAAI/B,gBAAgBqB,GAAwCf,WAE1E0B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,kBAAAsM,CAAmBtL,GAElB,IAAKA,EAAK,MAAM,IAAIwC,MAAM,mDAE1B,MAAM/D,EAAW,sBAAwBuB,EACnCtB,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,MAAO,KACzC,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,UAAAuM,CAAWvL,GAEV,IAAKA,EAAK,MAAM,IAAIwC,MAAM,iDAE1B,MAAM/D,EAAW,aAAeuB,EAC1BtB,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU,SAAU,KAC5C,IACCG,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAIA,OAAAD,GACC,MAAMD,EAAMnC,KACZ,IAAIiP,EAA8B,WACjC9M,EAAI+M,MAAQ,KAEZ/M,EAAIgN,oBAAsB,IAAItE,SAAQ,SAAUC,EAASC,GACxD,IAAIjK,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUsO,GACtCA,EAAcnE,SACjB9I,EAAIkN,aAAeC,KAAKC,MAAyC,IAAhCH,EAAc7G,KAAKiH,WACpDrN,EAAI+M,MAAQE,EAAc7G,KAC1BpG,EAAI3B,QAAU4O,EAAc5O,QAC5BiP,WAAWR,EAAsG,KAAvEG,EAAc7G,KAAKiH,WAAarN,EAAIuN,kCAC9E5E,EAAQ,QAER3I,EAAI+M,MAAQ,KACZnE,EAAOqE,EAAcnG,UAEtB9G,EAAIvB,gBAAgBE,GAAa,KACjCqB,EAAIgN,oBAAsB,IAC3B,EAEAzO,OAAOC,OAAOC,gBAAgB+O,wBAAwB3O,YAAY,CAAEF,UAAWA,GAChF,GACD,EAEA,GAAId,KAAKkP,OAASI,KAAKC,MAAQvP,KAAKqP,aACnC,OAAOxE,QAAQC,UAGhB,GAAI9K,KAAKC,qBAAuBD,KAAK4P,iBAAkB,CACtD,IAAIjH,EAAQ3I,KAAKkP,MAAQ,qCAAuC,iFAEhE,OADAxG,QAAQS,IAAIR,GACLkC,QAAQE,OAAOpC,EACvB,CAOA,OALK3I,KAAKmP,qBACTF,IAIMjP,KAAKmP,mBACb,CAEA,yBAAAU,CAA0BX,EAAoB1O,GAC7CR,KAAK8P,uBACL9P,KAAKkP,MAAQA,EACT1O,IACHR,KAAKQ,QAAUA,GAEhBR,KAAKqP,aAAeC,KAAKC,MAAiC,IAAxBvP,KAAKkP,MAAMM,WAC7C,MAAMrN,EAAMnC,KACZyP,YAAW,WACVtN,EAAIgG,aAAa,CAAErE,KAAM,mBAC1B,GAAqE,KAAhE9D,KAAKkP,MAAMM,WAAaxP,KAAK0P,iCACnC,CAIA,gBAAAzP,GACC,OAAOD,KAAKmL,cACb,CAEA,cAAAyE,GACC,OAAO5P,KAAK+P,YACb,CAEA,oBAAAD,CAAqBC,GAAwB,EAAOvP,GACnDR,KAAKmL,gBAAiB,EACtBnL,KAAK+P,aAAeA,EAChBvP,IACHR,KAAKQ,QAAUA,GAEZE,OAAOC,SACVD,OAAOC,OAAOC,gBAAkBmP,EAAe,CAC9CJ,wBAAyBjP,OAAOC,OAAOC,gBAAgB+O,wBACvDhL,iBAAkBjE,OAAOC,OAAOC,gBAAgB+D,iBAChDE,iBAAkBnE,OAAOC,OAAOC,gBAAgBiE,iBAChDK,wBAAyBxE,OAAOC,OAAOC,gBAAgBsE,wBACvDoB,cAAe5F,OAAOC,OAAOC,gBAAgB0F,cAC7CF,QAAS1F,OAAOC,OAAOC,gBAAgBwF,SACpC,CAAA,EAEN,CAEA,mCAAIiF,GACH,OAAOrL,KAAKgQ,gCACb,CAEA,mCAAI3E,CAAgC4E,GACnCjQ,KAAKgQ,iCAAmCC,CACzC,CAEA,iBAAAC,CAAkBC,GACbzP,OAAOC,OAAOC,gBAAgBwP,mBACjC1P,OAAOC,OAAOC,gBAAgBwP,kBAAkBpP,YAAY,CAAEmP,MAAOA,GAEvE,CAEA,aAAAE,GACC,IAAIlO,EAAMnC,KACV,OAAO,IAAI6K,SAA0B,SAAUC,EAASC,GACvD,GAAI5I,EAAIlC,mBACP6K,EAAQ,WACF,GAAIpK,OAAOC,OAAOC,gBAAgB0P,cAAe,CACvD,IAAIxP,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUyP,GAC1CzF,EAAQyF,EAAmBhI,KAC5B,EACA7H,OAAOC,OAAOC,gBAAgB0P,cAActP,YAAY,CAAEF,UAAWA,GACtE,MACCiK,GAEF,GACD,CAEA,qBAAAyF,CAAsBC,GACrBzQ,KAAK0Q,mBAAmBC,OAAS,EACjC,IAAK,IAAIC,EAAI,EAAGA,EAAIH,EAAUE,OAAQC,IACrC5Q,KAAK0Q,mBAAmB5I,KAAK2I,EAAUG,GAAG7D,QAAQ,IAAK,KAEzD,CAEA,oBAAA8D,GACC,IAAI1O,EAAMnC,KACV,OAAO,IAAI6K,SAAiC,SAAUC,EAASC,GAC9D,GAAI5I,EAAIlC,mBACP6K,EAAQ,WACF,GAAIpK,OAAOC,OAAOC,gBAAgBkQ,qBAAsB,CAC9D,IAAIhQ,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUiQ,GAC1CjG,EAAQiG,EAA0BxI,KACnC,EACA7H,OAAOC,OAAOC,gBAAgBkQ,qBAAqB9P,YAAY,CAAEF,UAAWA,GAC7E,MACCiK,GAEF,GACD,CAEA,gBAAAiG,GACC,IAAI7O,EAAMnC,KACV,OAAO,IAAI6K,SAAQ,SAAUC,EAASC,GACjC5I,EAAIlC,oBACP6K,EAAQ,MAET3I,EAAIkO,gBAAgBhO,MAAK,SAAU4O,GAClC,GAA4B,QAAxBA,EAAWC,SACdpG,EAAQ,CAAEqG,WAAY,gBAElB,GAAIzQ,OAAOC,OAAOC,gBAAgBwQ,iBAAkB,CACxD,IAAItQ,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUuQ,GAC1CvG,EAAQuG,EAAsB9I,KAC/B,EACA7H,OAAOC,OAAOC,gBAAgBwQ,iBAAiBpQ,YAAY,CAAEF,UAAWA,GACzE,MAECiK,GAEF,IAAG7B,OAAM,SAAUP,GAClBoC,GACD,GACD,GACD,CAEA,uBAAAuG,GACC,IAAInP,EAAMnC,KACV,OAAO,IAAI6K,SAAqC,SAAUC,EAASC,GAClE,GAAI5I,EAAIlC,mBACP6K,EAAQ,WACF,GAAIpK,OAAOC,OAAOC,gBAAgB2Q,wBAAyB,CACjE,IAAIzQ,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAU0Q,GAC1C1G,EAAQ0G,EAA6BjJ,KACtC,EACA7H,OAAOC,OAAOC,gBAAgB2Q,wBAAwBvQ,YAAY,CAAEF,UAAWA,GAChF,MACCiK,GAEF,GACD,CAEA,kBAAA0G,CAAmBpN,GAClB,GAAIA,EAAU,CACb,IAAIqN,EAAoB1R,KAAK2R,qBAAqBtN,GAC9CqN,EACH1R,KAAKqE,SAAWqN,EAEhBhJ,QAAQkJ,KAAK,YAAYvN,kBAE3B,MACCrE,KAAKqE,SAAWA,CAElB,CAEA,kBAAAC,GACC,IACIuN,EADA7E,EAAe,IAAI7M,gBAAgBO,OAAO4K,SAAShB,QAEvD,GAAI0C,EAAa8E,IAAI,QAAS,CAE7B,GADAD,EAAO7R,KAAK2R,qBAAqB3E,EAAa+E,IAAI,SAC9CF,EACH,OAAOA,EAEPnJ,QAAQkJ,KAAK,YAAY5E,EAAa+E,IAAI,wBAE5C,CACA,OAAO/R,KAAKqE,UAAY2N,UAAU3N,QACnC,CAEA,qBAAA4N,GACKvR,OAAOC,OAAOC,gBAAgBsR,uBACjCxR,OAAOC,OAAOC,gBAAgBsR,sBAAsBlR,YAAY,CAAA,EAElE,CAEA,kCAAAmR,GACKzR,OAAOC,OAAOC,gBAAgBwR,0BACjC1R,OAAOC,OAAOC,gBAAgBwR,yBAAyBpR,YAAY,CAAA,EAErE,CAEA,yBAAAqR,GACK3R,OAAOC,OAAOC,gBAAgB0R,uBACjC5R,OAAOC,OAAOC,gBAAgB0R,sBAAsBtR,YAAY,CAAA,EAElE,CAEA,uBAAAuR,GACK7R,OAAOC,OAAOC,gBAAgB4R,qBACjC9R,OAAOC,OAAOC,gBAAgB4R,oBAAoBxR,YAAY,CAAA,EAEhE,CAEA,sBAAAyR,GACC,IAAItQ,EAAMnC,KACV,OAAO,IAAI6K,SAAmC,SAAUC,EAASC,GAChE,GAAI5I,EAAIlC,mBACP6K,EAAQ,WACF,GAAIpK,OAAOC,OAAOC,gBAAgB8R,oBAAqB,CAC7D,IAAI5R,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUsN,GAC1CtD,EAAQsD,EAAe7F,KACxB,EACA7H,OAAOC,OAAOC,gBAAgB8R,oBAAoB1R,YAAY,CAAEF,UAAWA,GAC5E,MACCiK,GAEF,GACD,CAEA,0BAAA4H,GACKjS,OAAOC,OAAOC,gBAAgBgS,wBACjClS,OAAOC,OAAOC,gBAAgBgS,uBAAuB5R,YAAY,CAAA,EAEnE,CAEA,yBAAA6R,GACC,IAAI1Q,EAAMnC,KACV,OAAO,IAAI6K,SAAsC,SAAUC,EAASC,GACnE,GAAI5I,EAAIlC,mBACP6K,EAAQ,WACF,GAAIpK,OAAOC,OAAOC,gBAAgBkS,uBAAwB,CAChE,IAAIhS,EAAYqB,EAAIpB,gBACpBoB,EAAIvB,gBAAgBE,GAAa,SAAUsN,GAC1CtD,EAAQsD,EAAe7F,KACxB,EACA7H,OAAOC,OAAOC,gBAAgBkS,uBAAuB9R,YAAY,CAAEF,UAAWA,GAC/E,MACCiK,GAEF,GACD,CAEA,aAAAgI,CAAcC,GACTtS,OAAOC,OAAOC,gBAAgBqS,eACjCvS,OAAOC,OAAOC,gBAAgBqS,cAAcjS,YAAY,CAAEgS,aAAcA,GAE1E,CAEA,gBAAAE,CAAiB5S,GAChB,MACM6B,EAAMnC,KAEZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YANI,eAMkB,OAAQhC,EAC1C,IACC+B,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,WAEN,GACF,CAEA,yBAAA8Q,GACC,MAAMhR,EAAMnC,KAGZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YALI,yBAKkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,mBAAA2Q,GACC,MAAMjR,EAAMnC,KAGZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YALI,mBAKkB,MAAO,KACzC,IACCD,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOA,EAASE,MACjB,GACF,CAEA,eAAA4Q,CAAgBC,EAAmB1N,EAAgBpE,EAAoG+R,GACtJ,GAAID,EAAU1L,SAAS,KACtB,MAAM,IAAI3B,MAAM,6HAGjB,IAAI/D,EAAW,UAAYoR,EAE3B,GADA1N,EAASA,EAAO4N,cACZhS,UAAyE,QAAXoE,GAA+B,WAAXA,GAAsB,CAC3G,IAAI6N,EAAkB,IAAItT,gBAAgBqB,GAAiBf,WAC3DyB,GAAY,IAAMuR,EAClBjS,EAAkB,IACnB,CAEA,MAAMW,EAAMnC,KACZ,OAAOA,KACLoC,UACAC,MAAK,WACL,OAAOF,EAAIG,YAAYJ,EAAU0D,EAAQpE,EAC1C,IACCa,MAAK,SAAUE,GACf,OAAO3C,EAAY4C,iBAAiBD,EACrC,IACCF,MAAK,SAAUE,GACf,OAAOgR,EAAehR,EAASE,YAASmB,CACzC,GACF,CAEA,WAAA8P,GACC,GA7hDD1T,KAAAQ,QAAkB,2BA4zDDR,KAAA2T,wBAA0B,CAC1C,YACA,oBACA,WACA,iBACA,kBACA,2BACA,oBACA,SACA,mBAGgB3T,KAAA0P,gCAAkC,IAClC1P,KAAA4T,mBAAqB,CAAC,YAAa,eACnC5T,KAAA2H,gBAAkB,CAAC,kBAAmB,8BAA+B,8BAA+B,kBAAmB,4BAA6B,+BAAgC,wBAAyB,2BAC7M3H,KAAA0Q,mBAAqB,GAE9B1Q,KAAA6T,iBAAmB,EACnB7T,KAAAY,gBAAkB,GAClBZ,KAAA6H,wBAA0B,CAAA,EAC1B7H,KAAAmP,oBAAsB,KACtBnP,KAAAmL,gBAAiB,EACjBnL,KAAA+P,cAAe,EArTlB/P,KAAK8T,uCACR,OAGD,IAEIC,EAFA5R,EAAMnC,KACNgU,EAGJ,WACC,IAAIC,EAAkB7H,SAASd,SAAS2I,gBACxC,GAAIA,GAAmBA,EAAgB,GACtC,OAAOA,EAAgB,GAGxB,MAAO,GACR,CAVsBC,GAYtB,SAASC,EAAiBC,GACzB,GAAe,MAAXA,EAAgB,OAAO,EAE3B,IAAIC,EAAY,IAAIvH,IAAIsH,GACxB,IAAK,IAAIE,EAAI,EAAGA,EAAInS,EAAIwR,wBAAwBhD,OAAQ2D,IACvD,GAAID,EAAUE,WAAapS,EAAIwR,wBAAwBW,IAAMD,EAAUE,SAAS7O,SAAS,IAAMvD,EAAIwR,wBAAwBW,IAC1H,OAAO,EAGT,OAAO,CACR,CAuDKH,EAAiBH,IACrBtL,QAAQS,IAAI,8CAOZ4K,EAJGrT,OAAOC,QAAUD,OAAOC,OAAOC,iBAAmBF,OAAOC,OAAOC,gBAAgBS,YAIhE,CAClBsO,wBAA2B,SAAUpH,GACpC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,0BACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACArP,iBAAoB,SAAU4D,GAC7B7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,kBACNjK,IAAK6D,GACHyL,EACJ,EACAnP,iBAAoB,SAAU0D,GAC7B7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,kBACNjK,IAAK6D,GACHyL,EACJ,EACAzC,wBAA2B,SAAUhJ,GACpC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,0BACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACAlD,qBAAwB,SAAUvI,GACjC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,uBACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACA5C,iBAAoB,SAAU7I,GAC7B7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,mBACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACA1S,aAAgB,SAAUiH,GACzB7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,eACN7N,UAAWyH,EAAKzH,UAChBI,OAAQqH,EAAKrH,QACX8S,EACJ,GAGkB,CAClBrE,wBAA2B,SAAUpH,GACpC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,0BACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACA1D,cAAiB,SAAU/H,GAC1B7H,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,gBAAiB7N,UAAWyH,EAAKzH,WAAakT,EACjF,EACAnT,uBAA0B,SAAU0H,GACnC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,yBACN7N,UAAWyH,EAAKzH,UAChBhB,WAAYyI,EAAKzI,WACjBC,QAASwI,EAAKxI,SACZiU,EACJ,EACArP,iBAAoB,SAAU4D,GAC7B7H,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,kBAAmBjK,IAAK6D,GAAQyL,EACnE,EACAnP,iBAAoB,SAAU0D,GAC7B7H,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,kBAAmBjK,IAAK6D,GAAQyL,EACnE,EACA9O,wBAA2B,SAAUqD,GACpC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,kBACN7N,UAAWyH,EAAKzH,UAChB4D,IAAK6D,EAAK7D,IACVS,MAAOoD,EAAKpD,MACZC,iBAAkBmD,EAAKnD,kBACrB4O,EACJ,EACA5N,QAAW,WACV1F,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,WAAaqF,EAChD,EACA1N,cAAiB,WAChB5F,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,QAAUqF,EAC7C,EACAhP,QAAW,SAAUuD,GACpB7H,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,UAAW5J,OAAQwD,GAAQyL,EAC9D,EACAvN,yBAA4B,SAAU8B,GACrC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,2BACNnI,aAAc+B,EAAK/B,aACnBrB,MAAOoD,EAAKpD,OACV6O,EACJ,EACAnN,gCAAmC,SAAU0B,GAC5C7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,kCACN/H,iBAAkB2B,EAAK3B,iBACvB3D,WAAYsF,EAAKtF,WACjBkC,MAAOoD,EAAKpD,OACV6O,EACJ,EACAjN,mCAAsC,SAAUwB,GAC/C7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,qCACN/H,iBAAkB2B,EAAK3B,iBACvB3D,WAAYsF,EAAKtF,WACjBkC,MAAOoD,EAAKpD,MACZ6B,UAAWuB,EAAKvB,UAChBC,eAAgBsB,EAAKtB,gBACnB+M,EACJ,EACAzG,sBAAyB,SAAUhF,GAClC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,wBACN7N,UAAWyH,EAAKzH,UAChBuM,UAAW9E,EAAK8E,WACd2G,EACJ,EACA9G,uBAA0B,SAAU3E,GACnC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,yBACN/D,0BAA2BrC,EAAKqC,0BAChC9J,UAAWyH,EAAKzH,UAChB0K,cAAejD,EAAKiD,cACpBG,MAAOpD,EAAKoD,MACZC,OAAQrD,EAAKqD,QACXoI,EACJ,EACA5M,YAAe,SAAUmB,GACxB7H,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,cAAetH,KAAMkB,EAAKlB,MAAQ2M,EACrE,EACAzM,YAAe,SAAUgB,GACxB7H,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,cAAetH,KAAMkB,EAAKlB,MAAQ2M,EACrE,EACAzC,wBAA2B,SAAUhJ,GACpC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,0BACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACAlD,qBAAwB,SAAUvI,GACjC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,uBACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACA1S,aAAgB,SAAUiH,GACzB7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,eACN7N,UAAWyH,EAAKzH,UAChBI,OAAQqH,EAAKrH,QACX8S,EACJ,EACAtB,oBAAuB,SAASnK,GAC/B7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,sBACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACAxB,oBAAuB,WACtB9R,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,uBAAyBqF,EAC5D,EACAlB,uBAA0B,SAASvK,GAClC7H,OAAO8T,OAAOxT,YAAY,CACzB2N,KAAM,yBACN7N,UAAWyH,EAAKzH,WACdkT,EACJ,EACApB,uBAA0B,WACzBlS,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,0BAA4BqF,EAC/D,EACA1B,sBAAyB,WACxB5R,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,yBAA2BqF,EAC9D,EACA5B,yBAA4B,WAC3B1R,OAAO8T,OAAOxT,YAAY,CAAE2N,KAAM,4BAA8BqF,EACjE,GAIGtT,OAAOC,QAAWD,OAAOC,OAAOC,iBA5MrC,WACC,IAAK,IAAI6T,KAAUV,EAClB,GAAIrT,OAAOC,OAAOC,gBAAgB6T,GACjC,OAAO,EAGT,IAAK,IAAIA,KAAUtS,EAAIyR,mBACtB,GAAIlT,OAAOC,OAAOC,gBAAgBuB,EAAIyR,mBAAmBa,IACxD,OAAO,EAGT,OAAO,CACR,CAgMyDC,KACxDhU,OAAOC,OAAS,CACfC,gBAAiB,CAAA,IAzOnB,SAAoB+T,GACnB,IAAK,IAAIF,KAAUE,EAClB,IAAKjU,OAAOC,OAAOC,gBAAgB6T,GAClC,IACC/T,OAAOC,OAAOC,gBAAgB6T,GAAU,CAAEzT,YAAa2T,EAAQF,GAChE,CAAE,MAAO9L,GAER,YADAD,QAAQS,IAAI,mDAAqDR,EAElE,CAGH,CAkOAiM,CAAWb,GAEXrT,OAAOmU,iBAAiB,WAlOxB,SAA8B5L,GAC7B,IA1BD,SAAqCA,GACpC,SAAI9G,EAAIlC,oBAAsBgJ,EAAQmL,SAAW1T,OAAO4K,SAAS8I,UAIzC,MAApBJ,EACIG,EAAiBlL,EAAQmL,QAG1BnL,EAAQmL,SAAWJ,EAC3B,CAgBMc,CAA4B7L,GAGhC,MADAP,QAAQC,MAAM,mBAAqBM,EAAQmL,OAAS,qBAC9C,mBAAqBnL,EAAQmL,OAAS,oBAGzCnL,EAAQV,KAAKzH,UAChBqB,EAAImG,gBAAgBW,EAAQV,MAE5BpG,EAAIgG,aAAac,EAAQV,KAE3B,IAsNyD,GAErDvI,KAAK+U,+BACR5S,EAAI2N,sBAAqB,EAE3B,CA0BQ,aAAA/O,GACP,OAAOf,KAAK6T,kBACb,CAEQ,OAAAmB,CAAQ9S,EAAU+S,GACzB,IAAKjV,KAAKQ,QAET,MADAkI,QAAQC,MAAM,mDACR,kDAGP,OAAO3I,KAAKQ,QAAU,OAASyU,EAAa,cAAgB/S,CAC7D,CAEQ,WAAAI,CAAYJ,EAAU0D,EAAQiJ,EAAMoG,EAAa,MACxD,IAAKjV,KAAKkP,QAAUlP,KAAKkP,MAAMgG,aAC9B,KAAM,uDAGP,IAAIxQ,EAAM1E,KAAKgV,QAAQ9S,EAAU+S,GAE7BpP,EAAU,IAAIsP,QAClBtP,EAAQuP,OAAO,gBAAiB,UAAYpV,KAAKkP,MAAMgG,cACvDrP,EAAQuP,OAAO,SAAU,kDACzBvP,EAAQuP,OAAO,kBAAmBpV,KAAKsE,sBACjCuK,GACLhJ,EAAQuP,OAAO,eAAgB,oBAGhC,IAAIC,EAAY,CACfzP,OAAQA,EACRC,QAASA,GAMV,OAJMgJ,IACLwG,EAAKxG,KAAO1N,KAAKC,UAAUyN,IAGrBlJ,MAAMjB,EAAK2Q,EACnB,CAEQ,oBAAA1D,CAAqBtN,GAE5B,OADAA,EAAWA,EAAS0I,QAAQ,IAAK,KACM,IAAnC/M,KAAK0Q,mBAAmBC,QAGvB3Q,KAAK0Q,mBAAmB4E,MAAMC,GAAMA,IAAMlR,KAEnCA,EAAS4D,QAAQ,KAAO,IAClC5D,EAAWA,EAASmR,UAAU,EAAGnR,EAAS4D,QAAQ,MAC9CjI,KAAK0Q,mBAAmB4E,MAAMC,GAAMA,IAAMlR,KANxCA,OAIA,CAOT,CAEQ,uBAAO7B,CAAiBD,GAC/B,IAAKA,EAASwD,GACb,MAAMxD,EAAS2D,WAGhB,OAAO3D,CACR,CAEQ,kBAAOkT,CAAYC,GAC1B,OAAOC,OAAOD,GACZE,WAAW,KAAM,QACjBA,WAAW,IAAK,MACnB,CAEQ,2BAAOhU,CAAqB8T,GACnC,GAAIG,MAAMC,QAAQJ,GAAQ,CAIzB,OAHoBA,EAAMK,KAAI,SAAUC,GACvC,OAAOpW,EAAY6V,YAAYO,EAChC,IACqBC,KAAK,IAC3B,CAEA,OAAOjW,KAAKyV,YAAYC,EACzB,CAEQ,6BAAO1T,CAAuBkU,GACrC,IAAIC,EAAc,IAAI7G,KAAK4G,GAC3B,GAAIE,MAAMD,EAAYE,WACrB,KAAM,qCAGP,OAAOF,EAAYG,aACpB,CAEQ,6BAAOtM,CAAuB9J,EAAQqW,GAC7C,QAAyB3S,IAArB1D,EAAOqW,IAAgD,OAArBrW,EAAOqW,GAA7C,CAEA,IAAK,IAAI9S,KAAOvD,EAAOqW,GAClBrW,EAAOqW,GAAU5U,eAAe8B,KACnCvD,EAAO,GAAGqW,KAAY9S,KAAS7D,EAAY6V,YAAYvV,EAAOqW,GAAU9S,YAInEvD,EAAOqW,EARmD,CASlE,CAEQ,2BAAA/R,CAA4BD,GACnC,IAAIiS,EAAmB,2BACnBrU,EAAMnC,KAEV,OAAO,IAAI6K,SAAQ,SAAUC,EAASC,GACrC,GAAIqB,SAASqK,eAAeD,GAE3B,YADAzL,EAAO,8BAIRrK,OAAOmU,iBAAiB,WAAW,SAAS6B,EAASzN,GACpD,GAAIA,EAAQmL,SAAW,IAAItH,IAAI3K,EAAI3B,SAAS4T,OAC3C,OAED,IAAIuC,EAASvK,SAASqK,eAAe,4BAAiDG,cAClF3N,EAAQzF,SAAWmT,IAGG,4BAAtB1N,EAAQV,KAAKoG,KAChBvC,SAASqK,eAAeD,GAAkBK,WAAa,UACvB,mBAAtB5N,EAAQV,KAAKoG,OACvBvC,SAASqK,eAAeD,GAAkBM,SAC1C1K,SAASyC,KAAKgI,UAAYzK,SAASyC,KAAKgI,UAAU9J,QAAQ,YAAa,IACvErM,OAAOqW,oBAAoB,UAAWL,GAAU,GAChD5L,EAAQ7B,EAAQV,OAElB,IAAG,GAEH,IAAIyO,EAAc5K,SAAS6K,cAAc,OACzCD,EAAYH,UAAY,2BACxBG,EAAYhT,GAAKwS,EACjBQ,EAAYE,UAAY,mQAAqQ3S,EAAY,oBACzS6H,SAASyC,KAAKuG,OAAO4B,GACrB5K,SAASyC,KAAKgI,WAAa,YAC5B,GACD,CAEQ,oBAAAtW,CAAqBgE,GAC5B,IAAIiS,EAAmB,2BACnBrU,EAAMnC,KAEV,GAAIoM,SAASqK,eAAeD,GAC3B,OAGD9V,OAAOmU,iBAAiB,WAAW,SAAS6B,EAASzN,GACpD,GAAIA,EAAQmL,SAAW,IAAItH,IAAI3K,EAAI3B,SAAS4T,OAC3C,OAED,IAAIuC,EAASvK,SAASqK,eAAe,4BAAiDG,cAClF3N,EAAQzF,SAAWmT,IAGG,4BAAtB1N,EAAQV,KAAKoG,KAChBxM,EAAIyG,qBAAqBvG,MAAM8U,IAC9BR,EAAM3V,YAAY,CAAE2N,KAAM,+BAAgCyI,YAAajV,EAAI+M,MAAO1O,QAAS2B,EAAI3B,QAAS6W,cAAeF,EAAYE,eAAiB,IAAI,IAG3H,4BAAtBpO,EAAQV,KAAKoG,KACrBvC,SAASqK,eAAeD,GAAkBK,WAAa,UAEzB,mBAAtB5N,EAAQV,KAAKoG,OACrBvC,SAASqK,eAAeD,GAAkBM,SAC1C1K,SAASyC,KAAKgI,UAAYzK,SAASyC,KAAKgI,UAAU9J,QAAQ,YAAa,IACvErM,OAAOqW,oBAAoB,UAAWL,GAAU,GAChDzN,EAAQV,KAAKzE,KAAO,kBACpB3B,EAAIgG,aAAac,EAAQV,OAE3B,IAAG,GAEH,IAAIyO,EAAc5K,SAAS6K,cAAc,OACzCD,EAAYH,UAAY,2BACxBG,EAAYhT,GAAKwS,EACjBQ,EAAYE,UAAY,mQAAmQ3S,UAAkBpC,EAAImC,wCACjT8H,SAASyC,KAAKuG,OAAO4B,GACrB5K,SAASyC,KAAKgI,WAAa,YAC5B,CAEQ,oCAAA/C,GACP,MAAM5T,EAAS,IAAIC,gBAAgBO,OAAO4K,SAAShB,QACnD,GAAIpK,EAAO6R,IAAI,2BAA6B7R,EAAO6R,IAAI,cAAgB7R,EAAO6R,IAAI,WAAY,CAC7F,MAAM9I,EAAU,CACf0F,KAAM,iCACN7N,UAAWwW,SAASpX,EAAO6R,IAAI,cAC/B9G,QAAmC,SAA1B/K,EAAO6R,IAAI,YAErB,GAAIrR,OAAO6W,OACV7W,OAAO6W,OAAOvW,YAAYiI,EAASvI,OAAO4K,SAAS8I,YAC7C,CACN,MAAMoD,EAAK,IAAIC,iBAAiB,0BAChCD,EAAGxW,YAAYiI,GACfuO,EAAGlL,OACJ,CAEA,OADA5L,OAAO4L,SACA,CACR,CACD,CAEQ,2BAAAyI,GACP,MACM7U,EAAS,IAAIC,gBAAgBO,OAAO4K,SAAShB,QAC7CoN,EAAoBxX,EAAO6R,IAFT,MAGxB,GAAI7R,EAAO4R,IAHa,OAGiC,UAAtB4F,EAIlC,OAHI5K,IAAI6K,SAASD,KAChB1X,KAAKqL,gCAAkCqM,IAEjC,CAET,CAEQ,uBAAOlL,GACd,MACMkC,EAAOkJ,KAAKC,KAAKC,IACjBC,EAAS,IAAIC,WAAWtJ,GAG9B,OAFAhO,OAAOuX,OAAOC,gBAAgBH,GAEvBlC,MAAMsC,KAAKJ,GAChBhC,KAAIqC,GAAKA,EAAE3X,SAAS,IAAI4X,SAAS,EAAG,OACpCpC,KAAK,IACLqC,MAAM,EARI,GASb,CAEQ,yBAAa7L,CAAaxD,GAEjC,MACMV,GADU,IAAIgQ,aACCC,OAAOvP,GAGtBwP,QAAmBR,OAAOS,OAAOC,OAAO,UAAWpQ,GAGnDqQ,EAAY/C,MAAMsC,KAAK,IAAIH,WAAWS,IAI5C,OAHeI,KAAKlD,OAAOmD,gBAAgBF,IAIzC7L,QAAQ,MAAO,KACfA,QAAQ,MAAO,KACfA,QAAQ,MAAO,GAClB,EAKD,MAAM5K,EAAM,IAAIvC,EAEhBc,OAAOd,YAAcuC,EAGrBzB,OAAOqY,eAAiB,CAAA,EACxBrY,OAAOqY,eAAezQ,gBAAkB,SAAUC,GACjD7H,OAAOd,YAAY0I,gBAAgBC,EACpC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@careevolution/mydatahelps-js",
3
- "version": "5.7.0",
3
+ "version": "5.8.2-SecondaryViews.1",
4
4
  "description": "MyDataHelps client to be used by external applications for integrations inside the MyDataHelps platform",
5
5
  "type": "module",
6
6
  "types": "MyDataHelps.d.ts",
@@ -30,5 +30,8 @@
30
30
  "CareEvolution",
31
31
  "MyDataHelps Designer",
32
32
  "MDHD"
33
- ]
33
+ ],
34
+ "allowScripts": {
35
+ "fsevents@2.3.2": true
36
+ }
34
37
  }
package/types.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type SurveyTaskStatus = "incomplete" | "closed" | "complete";
2
2
  export type SortOrder = "descending" | "ascending";
3
- export type EventName = "applicationDidBecomeVisible" | "surveyDidFinish" | "externalAccountSyncComplete" | "tokenWillExpire" | "healthConnectSyncComplete" | "healthConnectPhrSyncComplete";
3
+ export type EventName = "applicationDidBecomeVisible" | "surveyDidFinish" | "externalAccountSyncComplete" | "tokenWillExpire" | "healthConnectSyncComplete" | "healthConnectPhrSyncComplete" | "appleHealthSyncResume" | "appleHealthSyncComplete";
4
4
  export type DeviceDataNamespace = "Project" | "Fitbit" | "AppleHealth" | "GoogleFit" | "AirNowApi" | "WeatherBit" | "Garmin" | "Omron";
5
5
  export type DeviceDataV2Namespace = "Fitbit" | "AppleHealth" | "Garmin" | "Dexcom" | "HealthConnect" | "Oura" | "GoogleHealth";
6
6
  export type DeviceDataV2AggregateIntervalType = "Minutes" | "Hours" | "Days" | "Weeks" | "Months";
@@ -458,6 +458,37 @@ export interface SurveyResult {
458
458
  event?: string;
459
459
  userType: string;
460
460
  }
461
+ export interface SurveyResultsV2Query extends QueryParameters {
462
+ surveyID?: Guid;
463
+ surveyName?: string | string[];
464
+ event?: string | string[];
465
+ instance?: number;
466
+ resultIdentifier?: string | string[];
467
+ insertedAfter?: string;
468
+ insertedBefore?: string;
469
+ modifiedAfter?: string;
470
+ modifiedBefore?: string;
471
+ includeAnswersByStep?: boolean;
472
+ }
473
+ export interface SurveyResultsV2Page {
474
+ surveyResults: SurveyResultV2[];
475
+ nextPageID?: string;
476
+ }
477
+ export interface SurveyResultV2 {
478
+ participantID: Guid;
479
+ participantIdentifier?: string;
480
+ surveyID: Guid;
481
+ surveyName?: string;
482
+ taskID?: Guid;
483
+ event?: string;
484
+ instance?: number;
485
+ answers: Partial<Record<string, string[]>>;
486
+ answersByStep?: Partial<Record<string, Partial<Record<string, string[]>>>>;
487
+ insertedDate: string;
488
+ insertedByUserType: string;
489
+ modifiedDate: string;
490
+ modifiedByUserType: string;
491
+ }
461
492
  export interface FitbitQuery {
462
493
  providerID?: number;
463
494
  pageID?: Guid;
@@ -540,6 +571,15 @@ export interface FitbitSleepLogs {
540
571
  sleepLevelRem: number;
541
572
  sleepLevelWake: number;
542
573
  }
574
+ export interface AppleHealthStatus {
575
+ available: boolean;
576
+ enabled: boolean;
577
+ lastSyncCompletionDate?: string;
578
+ syncSession?: AppleHealthSyncSession;
579
+ }
580
+ export interface AppleHealthSyncSession {
581
+ syncStartDate: string;
582
+ }
543
583
  export interface AppleHealthQuery {
544
584
  pageID?: Guid;
545
585
  pageSize?: number;
@@ -636,6 +676,14 @@ export interface EventData {
636
676
  type: string;
637
677
  messageID?: number;
638
678
  }
679
+ export interface AppleHealthSyncResumeEventData extends EventData {
680
+ syncStartDate: string;
681
+ lastSyncCompletionDate?: string;
682
+ }
683
+ export interface AppleHealthSyncCompleteEventData extends EventData {
684
+ syncStartDate: string;
685
+ lastSyncCompletionDate: string;
686
+ }
639
687
  export interface Token {
640
688
  expires_in: number;
641
689
  access_token: string;
@@ -643,6 +691,7 @@ export interface Token {
643
691
  }
644
692
  export interface OpenApplicationOptions {
645
693
  modal: boolean;
694
+ secondaryViewKey?: string;
646
695
  }
647
696
  export interface ShowDashboardOptions {
648
697
  modal: boolean;