vim-web 0.5.0-dev.22 → 0.5.0-dev.23

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/dist/vim-web.js CHANGED
@@ -55390,7 +55390,7 @@ class RenderScene {
55390
55390
  }
55391
55391
  unparent2dObjects(target) {
55392
55392
  if (target instanceof Group) {
55393
- for (const child of target.children) {
55393
+ for (const child of [...target.children]) {
55394
55394
  if (child instanceof CSS2DObject) {
55395
55395
  target.remove(child);
55396
55396
  }
@@ -55565,6 +55565,7 @@ class Selection {
55565
55565
  }
55566
55566
  add(objectOrObjects) {
55567
55567
  if (!this.enabled) return;
55568
+ if (!objectOrObjects) return;
55568
55569
  const objects = this.toArray(objectOrObjects);
55569
55570
  let changed = false;
55570
55571
  for (const obj of objects) {
@@ -67613,7 +67614,7 @@ function controlBarSectionBox(section, hasSelection, settings2) {
67613
67614
  enabled: () => isTrue(settings2.sectioningEnable),
67614
67615
  tip: "Enable Section Box",
67615
67616
  isOn: () => section.enable.get(),
67616
- style: (on) => Style.buttonExpandStyle(on),
67617
+ style: Style.buttonExpandStyle,
67617
67618
  action: () => section.enable.set(!section.enable.get()),
67618
67619
  icon: sectionBox
67619
67620
  },
@@ -67622,7 +67623,7 @@ function controlBarSectionBox(section, hasSelection, settings2) {
67622
67623
  tip: "Fit Section",
67623
67624
  enabled: () => section.enable.get() && isTrue(settings2.sectioningFitToSelection),
67624
67625
  isOn: () => hasSelection,
67625
- style: (on) => Style.buttonDisableStyle(on),
67626
+ style: Style.buttonDisableStyle,
67626
67627
  action: () => section.sectionSelection.call(),
67627
67628
  icon: sectionBoxShrink
67628
67629
  },
@@ -67630,7 +67631,7 @@ function controlBarSectionBox(section, hasSelection, settings2) {
67630
67631
  id: Ids$2.sectioningFitScene,
67631
67632
  tip: "Reset Section",
67632
67633
  enabled: () => section.enable.get() && isTrue(settings2.sectioningReset),
67633
- style: (on) => Style.buttonDefaultStyle(on),
67634
+ style: Style.buttonDefaultStyle,
67634
67635
  action: () => section.sectionScene.call(),
67635
67636
  icon: sectionBoxReset
67636
67637
  },
@@ -67639,7 +67640,7 @@ function controlBarSectionBox(section, hasSelection, settings2) {
67639
67640
  tip: "Show Section Box",
67640
67641
  enabled: () => section.enable.get() && isTrue(settings2.sectioningShow),
67641
67642
  isOn: () => section.visible.get(),
67642
- style: (on) => Style.buttonDefaultStyle(on),
67643
+ style: Style.buttonDefaultStyle,
67643
67644
  action: () => section.visible.set(!section.visible.get()),
67644
67645
  icon: visible
67645
67646
  },
@@ -67648,7 +67649,7 @@ function controlBarSectionBox(section, hasSelection, settings2) {
67648
67649
  tip: "Auto Section",
67649
67650
  enabled: () => section.enable.get() && isTrue(settings2.sectioningAuto),
67650
67651
  isOn: () => section.auto.get(),
67651
- style: (on) => Style.buttonDefaultStyle(on),
67652
+ style: Style.buttonDefaultStyle,
67652
67653
  action: () => section.auto.set(!section.auto.get()),
67653
67654
  icon: sectionBoxAuto
67654
67655
  },
@@ -67657,14 +67658,14 @@ function controlBarSectionBox(section, hasSelection, settings2) {
67657
67658
  tip: "Section Settings",
67658
67659
  enabled: () => section.enable.get() && isTrue(settings2.sectioningSettings),
67659
67660
  isOn: () => section.showOffsetPanel.get(),
67660
- style: (on) => Style.buttonDefaultStyle(on),
67661
+ style: Style.buttonDefaultStyle,
67661
67662
  action: () => section.showOffsetPanel.set(!section.showOffsetPanel.get()),
67662
67663
  icon: slidersHoriz
67663
67664
  }
67664
67665
  ]
67665
67666
  };
67666
67667
  }
67667
- function controlBarPointer(viewer, camera2, settings2, section) {
67668
+ function controlBarPointer(viewer, settings2) {
67668
67669
  const pointer2 = getPointerState(viewer);
67669
67670
  return {
67670
67671
  id: Ids$2.cursorSpan,
@@ -67728,65 +67729,57 @@ function controlBarMeasure(measure$1, settings2) {
67728
67729
  ]
67729
67730
  };
67730
67731
  }
67731
- function controlBarMiscUltra(side, settings$1) {
67732
+ function createMiscSettingsButton(side, settings$1) {
67733
+ return {
67734
+ id: Ids$2.miscSettings,
67735
+ enabled: () => isTrue(settings$1.ui.miscSettings),
67736
+ tip: "Settings",
67737
+ action: () => side.toggleContent("settings"),
67738
+ icon: settings,
67739
+ style: Style.buttonDefaultStyle
67740
+ };
67741
+ }
67742
+ function createMiscHelpButton(modal, settings2) {
67743
+ return {
67744
+ id: Ids$2.miscHelp,
67745
+ enabled: () => isTrue(settings2.ui.miscHelp),
67746
+ tip: "Help",
67747
+ action: () => modal.help(true),
67748
+ icon: help,
67749
+ style: Style.buttonDefaultStyle
67750
+ };
67751
+ }
67752
+ function controlBarMiscUltra(modal, side, settings2) {
67732
67753
  return {
67733
67754
  id: Ids$2.miscSpan,
67734
- enable: () => isTrue(settings$1.ui.miscSettings),
67755
+ enable: () => anyUltraMiscButton(settings2),
67735
67756
  style: Style.sectionDefaultStyle,
67736
67757
  buttons: [
67737
- {
67738
- id: Ids$2.miscSettings,
67739
- enabled: () => isTrue(settings$1.ui.miscSettings),
67740
- tip: "Settings",
67741
- action: () => side.toggleContent("settings"),
67742
- icon: settings,
67743
- style: Style.buttonDefaultStyle
67744
- },
67745
- {
67746
- id: Ids$2.miscHelp,
67747
- enabled: () => isTrue(settings$1.ui.miscHelp),
67748
- tip: "Help",
67749
- action: () => side.toggleContent("settings"),
67750
- icon: settings,
67751
- style: Style.buttonDefaultStyle
67752
- }
67758
+ createMiscSettingsButton(side, settings2),
67759
+ createMiscHelpButton(modal, settings2)
67753
67760
  ]
67754
67761
  };
67755
67762
  }
67756
- function controlBarMisc(modal, side, settings$1) {
67763
+ function controlBarMisc(modal, side, settings2) {
67757
67764
  const fullScreen = getFullScreenState();
67758
67765
  return {
67759
67766
  id: Ids$2.miscSpan,
67760
- enable: () => anyUiSettingButton(settings$1),
67767
+ enable: () => anyWebglMiscButton(settings2),
67761
67768
  style: Style.sectionDefaultStyle,
67762
67769
  buttons: [
67763
67770
  {
67764
67771
  id: Ids$2.miscInspector,
67765
- enabled: () => isTrue(settings$1.ui.miscProjectInspector) && (isTrue(settings$1.ui.panelBimTree) || isTrue(settings$1.ui.panelBimInfo)),
67772
+ enabled: () => showBimButton(settings2),
67766
67773
  tip: "Project Inspector",
67767
67774
  action: () => side.toggleContent("bim"),
67768
67775
  icon: treeView,
67769
67776
  style: Style.buttonDefaultStyle
67770
67777
  },
67771
- {
67772
- id: Ids$2.miscSettings,
67773
- enabled: () => isTrue(settings$1.ui.miscSettings),
67774
- tip: "Settings",
67775
- action: () => side.toggleContent("settings"),
67776
- icon: settings,
67777
- style: Style.buttonDefaultStyle
67778
- },
67779
- {
67780
- id: Ids$2.miscHelp,
67781
- enabled: () => isTrue(settings$1.ui.miscHelp),
67782
- tip: "Help",
67783
- action: () => modal.help(true),
67784
- icon: help,
67785
- style: Style.buttonDefaultStyle
67786
- },
67778
+ createMiscSettingsButton(side, settings2),
67779
+ createMiscHelpButton(modal, settings2),
67787
67780
  {
67788
67781
  id: Ids$2.miscMaximize,
67789
- enabled: () => isTrue(settings$1.ui.miscMaximise) && settings$1.capacity.canGoFullScreen,
67782
+ enabled: () => isTrue(settings2.ui.miscMaximise) && settings2.capacity.canGoFullScreen,
67790
67783
  tip: fullScreen.get() ? "Minimize" : "Fullscreen",
67791
67784
  action: () => fullScreen.toggle(),
67792
67785
  icon: fullScreen.get() ? minimize : fullsScreen,
@@ -67837,7 +67830,7 @@ function controlBarVisibility(isolation, settings2) {
67837
67830
  return {
67838
67831
  id: Ids$2.visibilitySpan,
67839
67832
  enable: () => true,
67840
- style: `${Style.sectionDefaultStyle}`,
67833
+ style: Style.sectionDefaultStyle,
67841
67834
  buttons: [
67842
67835
  {
67843
67836
  id: Ids$2.visibilityClearSelection,
@@ -67906,7 +67899,7 @@ function controlBarVisibility(isolation, settings2) {
67906
67899
  function useControlBar(viewer, camera2, modal, side, cursor, settings2, section, isolationRef, customization) {
67907
67900
  const measure2 = getMeasureState(viewer, cursor);
67908
67901
  let controlBarSections = [
67909
- controlBarPointer(viewer, camera2, settings2.ui),
67902
+ controlBarPointer(viewer, settings2.ui),
67910
67903
  controlBarCamera(camera2, settings2.ui),
67911
67904
  controlBarVisibility(isolationRef, settings2.ui),
67912
67905
  controlBarMeasure(measure2, settings2.ui),
@@ -67916,12 +67909,21 @@ function useControlBar(viewer, camera2, modal, side, cursor, settings2, section,
67916
67909
  controlBarSections = (customization == null ? void 0 : customization(controlBarSections)) ?? controlBarSections;
67917
67910
  return controlBarSections;
67918
67911
  }
67912
+ function showBimButton(settings2) {
67913
+ if (isFalse(settings2.ui.miscProjectInspector)) return false;
67914
+ if (isTrue(settings2.ui.panelBimTree)) return true;
67915
+ if (isTrue(settings2.ui.panelBimInfo)) return true;
67916
+ return false;
67917
+ }
67919
67918
  function anyUiCursorButton(settings2) {
67920
67919
  return isTrue(settings2.cursorOrbit) || isTrue(settings2.cursorLookAround) || isTrue(settings2.cursorPan) || isTrue(settings2.cursorZoom);
67921
67920
  }
67922
- function anyUiSettingButton(settings2) {
67921
+ function anyWebglMiscButton(settings2) {
67923
67922
  return isTrue(settings2.ui.miscProjectInspector) || isTrue(settings2.ui.miscSettings) || isTrue(settings2.ui.miscHelp) || isTrue(settings2.ui.miscMaximise);
67924
67923
  }
67924
+ function anyUltraMiscButton(settings2) {
67925
+ return isTrue(settings2.ui.miscSettings) || isTrue(settings2.ui.miscHelp);
67926
+ }
67925
67927
  function RestOfScreen(props) {
67926
67928
  const [, setVersion] = useState(0);
67927
67929
  const resizeObserver = useRef();
@@ -74808,7 +74810,7 @@ const errorStyle = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
74808
74810
  }, Symbol.toStringTag, { value: "Module" }));
74809
74811
  function fileOpeningError(url) {
74810
74812
  return {
74811
- title: "File Opening Error",
74813
+ title: "VIM Ultra File Error",
74812
74814
  body: serverFileOpeningErrorBody(url),
74813
74815
  footer: footer$1(),
74814
74816
  canClose: false
@@ -74816,12 +74818,8 @@ function fileOpeningError(url) {
74816
74818
  }
74817
74819
  function serverFileOpeningErrorBody(url) {
74818
74820
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74819
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74820
- "Oops, it appears that there's an ",
74821
- bold("error opening the VIM file"),
74822
- ". Please check the file exists at the path noted below."
74823
- ] })),
74824
- subTitle("Error details:"),
74821
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered an error opening the VIM file in VIM Ultra." })),
74822
+ subTitle("Details"),
74825
74823
  dotList([bullet("File path:", url)])
74826
74824
  ] });
74827
74825
  }
@@ -74830,7 +74828,7 @@ function serverFileDownloadingError(url, authToken, server) {
74830
74828
  return fileOpeningError(url);
74831
74829
  }
74832
74830
  return {
74833
- title: "File Downloading Error",
74831
+ title: "VIM Ultra Download Error",
74834
74832
  body: body$5(url, authToken, server),
74835
74833
  footer: footer$1(),
74836
74834
  canClose: false
@@ -74838,28 +74836,23 @@ function serverFileDownloadingError(url, authToken, server) {
74838
74836
  }
74839
74837
  function body$5(url, authToken, server) {
74840
74838
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74841
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74842
- "Oops, it appears that there’s an ",
74843
- bold("error downloading the VIM file"),
74844
- ". Please check the following conditions to get back up and running quickly."
74845
- ] })),
74846
- subTitle("Error details:"),
74839
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered an error downloading the VIM file in VIM Ultra." })),
74840
+ subTitle("Details"),
74847
74841
  dotList([
74848
- server ? bullet("VIM ULTRA Server:", server) : null,
74849
- bullet("File URL:", url),
74850
- authToken ? bullet("Auth Token:", authToken) : null
74842
+ server ? bullet("VIM Ultra:", server) : null,
74843
+ bullet("VIM URL:", url),
74844
+ authToken ? bullet("Access Token:", authToken) : null
74851
74845
  ]),
74852
- subTitle("Troubleshooting tips:"),
74846
+ subTitle("Tips"),
74853
74847
  numList([
74854
- "Make sure the VIM exists at the url listed above.",
74855
- "Reprocess the VIM file and refresh the Power BI report dataset.",
74856
- server ? "Check network access policies to allow the VIM Ultra Server access to the VIM File url." : ""
74848
+ "Ensure the VIM URL is valid",
74849
+ "Check your network connection and access policies"
74857
74850
  ])
74858
74851
  ] });
74859
74852
  }
74860
74853
  function serverFileLoadingError(url) {
74861
74854
  return {
74862
- title: "File Loading Error",
74855
+ title: "VIM Ultra Loading Error",
74863
74856
  body: body$4(url),
74864
74857
  footer: footer$1(),
74865
74858
  canClose: false
@@ -74867,30 +74860,20 @@ function serverFileLoadingError(url) {
74867
74860
  }
74868
74861
  function body$4(url) {
74869
74862
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74870
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74871
- "Oops, it appears that we ",
74872
- bold("couldn’t load the VIM file"),
74873
- ". This could be due to a couple of reasons, including that the file could be corrupt or not recognizable."
74874
- ] })),
74875
- subTitle("Error details:"),
74863
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered an error loading the VIM file in VIM Ultra." })),
74864
+ subTitle("Details"),
74876
74865
  dotList([bullet("File path:", url)]),
74877
- subTitle("Troubleshooting tips:"),
74866
+ subTitle("Tips"),
74878
74867
  numList([
74879
- "Reload this Power BI report",
74880
- "Reprocess the VIM file and refresh the Power BI report dataset"
74868
+ "Reload the page",
74869
+ "Ensure the VIM URL points to a valid VIM file",
74870
+ "Clear your VIM Ultra download cache"
74881
74871
  ])
74882
74872
  ] });
74883
74873
  }
74884
- const supportUltra = "https://docs.vimaec.com/docs/vim-for-windows/configuring-vim-ultra";
74885
- const supportControls = "https://docs.vimaec.com/docs/vim-cloud/webgl-navigation-and-controls-guide";
74886
- const urls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
74887
- __proto__: null,
74888
- supportControls,
74889
- supportUltra
74890
- }, Symbol.toStringTag, { value: "Module" }));
74891
74874
  function serverConnectionError(url) {
74892
74875
  return {
74893
- title: "Connection Error",
74876
+ title: "VIM Ultra Connection",
74894
74877
  body: body$3(url, isLocalUrl(url)),
74895
74878
  footer: footer$1(),
74896
74879
  canClose: false
@@ -74898,29 +74881,17 @@ function serverConnectionError(url) {
74898
74881
  }
74899
74882
  function body$3(url, local) {
74900
74883
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74901
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74902
- "Oops, it appears that there’s an ",
74903
- bold("error connecting to the ULTRA server"),
74904
- ". Please check the following conditions to get back up and running quickly."
74905
- ] })),
74906
- subTitle("Troubleshooting tips:"),
74884
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered an error connecting to VIM Ultra." })),
74885
+ subTitle("Tips"),
74907
74886
  numList([
74908
- /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74909
- "Ensure that VIM Ultra",
74910
- " ",
74911
- link(supportUltra, "process is running"),
74912
- " ",
74913
- "at ",
74914
- detailText(url)
74915
- ] }),
74916
- "Check your internet connection.",
74917
- "Check firewall permissions."
74887
+ `Ensure that VIM Ultra is running at ${detailText(url)}`,
74888
+ "Check your network connection and access policies"
74918
74889
  ])
74919
74890
  ] });
74920
74891
  }
74921
74892
  function serverCompatibilityError(url, localVersion, remoteVersion) {
74922
74893
  return {
74923
- title: "Compatibility Error",
74894
+ title: "VIM Ultra Compatibility",
74924
74895
  body: body$2(url, localVersion, remoteVersion),
74925
74896
  footer: footer$1(),
74926
74897
  canClose: false
@@ -74928,28 +74899,23 @@ function serverCompatibilityError(url, localVersion, remoteVersion) {
74928
74899
  }
74929
74900
  function body$2(url, localVersion, remoteVersion) {
74930
74901
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74931
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74932
- "Oops, it appears that you’re running a ",
74933
- " ",
74934
- bold("version of VIM Ultra Server that isn’t compatible with this visual"),
74935
- ". Please check the following conditions to get back up and running quickly."
74936
- ] })),
74937
- subTitle("Error details:"),
74902
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "The VIM Ultra version is incompatible with this visual." })),
74903
+ subTitle("Details"),
74938
74904
  dotList([
74939
74905
  bullet("Url:", url),
74940
74906
  bullet("Local Version:", localVersion),
74941
74907
  bullet("Remote Version:", remoteVersion)
74942
74908
  ]),
74943
- subTitle("Troubleshooting tips:"),
74909
+ subTitle("Tips"),
74944
74910
  numList([
74945
- "Update your PowerBI visual with the compatible version.",
74946
- "Or, run the compatible version of VIM Ultra."
74911
+ "Update this visual to a compatible version.",
74912
+ "Start a compatible version of VIM Ultra."
74947
74913
  ])
74948
74914
  ] });
74949
74915
  }
74950
74916
  function serverStreamError(url) {
74951
74917
  return {
74952
- title: "Stream Error",
74918
+ title: "VIM Ultra Stream Error",
74953
74919
  body: body$1(),
74954
74920
  footer: footer$1(),
74955
74921
  canClose: false
@@ -74957,16 +74923,12 @@ function serverStreamError(url) {
74957
74923
  }
74958
74924
  function body$1(url) {
74959
74925
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74960
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74961
- "Oops, it appears that there’s an ",
74962
- bold("error starting a stream on the VIM Ultra Server"),
74963
- ". Please check the following conditions to get back up and running quickly."
74964
- ] })),
74965
- subTitle("Troubleshooting tips:"),
74926
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered a streaming error with VIM Ultra." })),
74927
+ subTitle("Tips"),
74966
74928
  numList([
74967
- "Close other applications that may be using the server.",
74968
- "Try reconnecting to the server.",
74969
- "Restart the server."
74929
+ "Reload the page",
74930
+ "Close other applications that may be using VIM Ultra",
74931
+ "Restart VIM Ultra"
74970
74932
  ])
74971
74933
  ] });
74972
74934
  }
@@ -76772,12 +76734,12 @@ function useUltraSectionBox(viewer) {
76772
76734
  };
76773
76735
  return useSectionBox(ultraAdapter);
76774
76736
  }
76775
- function useUltraControlBar(viewer, section, isolation, camera2, settings2, side, customization) {
76737
+ function useUltraControlBar(viewer, section, isolation, camera2, settings2, side, modal, customization) {
76776
76738
  let bar = [
76777
76739
  controlBarCamera(camera2, settings2.ui),
76778
76740
  controlBarVisibility(isolation, settings2.ui),
76779
76741
  controlBarSectionBox(section, viewer.selection.any(), settings2.ui),
76780
- controlBarMiscUltra(side, settings2)
76742
+ controlBarMiscUltra(modal, side, settings2)
76781
76743
  ];
76782
76744
  bar = (customization == null ? void 0 : customization(bar)) ?? bar;
76783
76745
  return bar;
@@ -77036,6 +76998,7 @@ function Viewer3(props) {
77036
76998
  camera2,
77037
76999
  settings2.value,
77038
77000
  side,
77001
+ modalHandle.current,
77039
77002
  (_2) => _2
77040
77003
  );
77041
77004
  useViewerInput(props.core.inputs, camera2);
@@ -77152,6 +77115,13 @@ const index$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
77152
77115
  createViewer,
77153
77116
  getDefaultUltraSettings
77154
77117
  }, Symbol.toStringTag, { value: "Module" }));
77118
+ const supportUltra = "https://docs.vimaec.com/docs/vim-for-windows/configuring-vim-ultra";
77119
+ const supportControls = "https://docs.vimaec.com/docs/vim-cloud/webgl-navigation-and-controls-guide";
77120
+ const urls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
77121
+ __proto__: null,
77122
+ supportControls,
77123
+ supportUltra
77124
+ }, Symbol.toStringTag, { value: "Module" }));
77155
77125
  const SectionBoxPanel = {
77156
77126
  Ids
77157
77127
  };