@odoo/o-spreadsheet 17.3.0 → 17.3.2

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.
@@ -3,9 +3,9 @@
3
3
  /**
4
4
  * This file is generated by o-spreadsheet build tools. Do not edit it.
5
5
  * @see https://github.com/odoo/o-spreadsheet
6
- * @version 17.3.0
7
- * @date 2024-05-31T14:21:26.547Z
8
- * @hash 271202e
6
+ * @version 17.3.2
7
+ * @date 2024-06-10T09:38:56.657Z
8
+ * @hash c3b358f
9
9
  */
10
10
 
11
11
  'use strict';
@@ -311,7 +311,10 @@ function deepCopy(obj) {
311
311
  * Check if the object is a plain old javascript object.
312
312
  */
313
313
  function isPlainObject(obj) {
314
- return typeof obj === "object" && obj?.constructor === Object;
314
+ return (typeof obj === "object" &&
315
+ obj !== null &&
316
+ // obj.constructor can be undefined when there's no prototype (`Object.create(null, {})`)
317
+ (obj?.constructor === Object || obj?.constructor === undefined));
315
318
  }
316
319
  /**
317
320
  * Sanitize the name of a sheet, by eventually removing quotes
@@ -8961,7 +8964,7 @@ class NotificationStore {
8961
8964
  "askConfirmation",
8962
8965
  "updateNotificationCallbacks",
8963
8966
  ];
8964
- notifyUser = (notification) => window.alert(notification);
8967
+ notifyUser = (notification) => window.alert(notification.text);
8965
8968
  askConfirmation = (content, confirm, cancel) => {
8966
8969
  if (window.confirm(content)) {
8967
8970
  confirm();
@@ -20902,8 +20905,15 @@ class Composer extends owl.Component {
20902
20905
  }
20903
20906
  onPaste(ev) {
20904
20907
  if (this.composerStore.editionMode !== "inactive") {
20908
+ // let the browser clipboard work
20905
20909
  ev.stopPropagation();
20906
20910
  }
20911
+ else {
20912
+ // the user meant to paste in the sheet, not open the composer with the pasted content
20913
+ // While we're not editing, we still have the focus and should therefore prevent
20914
+ // the native "paste" to occur.
20915
+ ev.preventDefault();
20916
+ }
20907
20917
  }
20908
20918
  /*
20909
20919
  * Triggered automatically by the content-editable between the keydown and key up
@@ -20912,9 +20922,6 @@ class Composer extends owl.Component {
20912
20922
  if (!this.shouldProcessInputEvents) {
20913
20923
  return;
20914
20924
  }
20915
- if (ev.inputType === "insertFromPaste" && this.composerStore.editionMode === "inactive") {
20916
- return;
20917
- }
20918
20925
  ev.stopPropagation();
20919
20926
  let content;
20920
20927
  if (this.composerStore.editionMode === "inactive") {
@@ -25323,8 +25330,7 @@ function zoneToRect(zone) {
25323
25330
  */
25324
25331
  function useSpreadsheetRect() {
25325
25332
  const position = owl.useState({ x: 0, y: 0, width: 0, height: 0 });
25326
- let spreadsheetElement = document.querySelector(".o-spreadsheet");
25327
- updatePosition();
25333
+ let spreadsheetElement = null;
25328
25334
  function updatePosition() {
25329
25335
  if (!spreadsheetElement) {
25330
25336
  spreadsheetElement = document.querySelector(".o-spreadsheet");
@@ -35753,7 +35759,14 @@ pivotRegistry.add("SPREADSHEET", {
35753
35759
 
35754
35760
  class PivotSidePanelStore extends SpreadsheetStore {
35755
35761
  pivotId;
35756
- mutators = ["applyUpdate", "renamePivot", "update"];
35762
+ mutators = [
35763
+ "reset",
35764
+ "deferUpdates",
35765
+ "applyUpdate",
35766
+ "discardPendingUpdate",
35767
+ "renamePivot",
35768
+ "update",
35769
+ ];
35757
35770
  updatesAreDeferred = true;
35758
35771
  draft = null;
35759
35772
  constructor(get, pivotId) {
@@ -37911,10 +37924,7 @@ class GridComposer extends owl.Component {
37911
37924
  }
37912
37925
  get containerStyle() {
37913
37926
  if (this.composerStore.editionMode === "inactive") {
37914
- return `
37915
- position: absolute;
37916
- z-index: -1000;
37917
- `;
37927
+ return `z-index: -1000;`;
37918
37928
  }
37919
37929
  const isFormula = this.composerStore.currentContent.startsWith("=");
37920
37930
  const cell = this.env.model.getters.getActiveCell();
@@ -38790,6 +38800,7 @@ class FilterIcon extends owl.Component {
38790
38800
 
38791
38801
  class FilterIconsOverlay extends owl.Component {
38792
38802
  static template = "o-spreadsheet-FilterIconsOverlay";
38803
+ static props = {};
38793
38804
  static components = {
38794
38805
  GridCellIcon,
38795
38806
  FilterIcon,
@@ -54560,17 +54571,18 @@ class PivotUIPlugin extends UIPlugin {
54560
54571
  const pivotCol = position.col - mainPosition.col;
54561
54572
  const pivotRow = position.row - mainPosition.row;
54562
54573
  const pivotCell = pivotCells[pivotCol][pivotRow];
54563
- const domain = pivotCell.domain;
54574
+ let domain = pivotCell.domain;
54564
54575
  if (domain?.at(-2) === "measure") {
54565
- return domain.slice(0, -2);
54576
+ domain = domain.slice(0, -2);
54566
54577
  }
54567
- return domain;
54578
+ return { domainArgs: domain, isHeader: pivotCell.isHeader };
54568
54579
  }
54569
- const domain = args.slice(functionName === "PIVOT.VALUE" ? 2 : 1);
54580
+ let domain = args.slice(functionName === "PIVOT.VALUE" ? 2 : 1);
54570
54581
  if (domain.at(-2) === "measure") {
54571
- return domain.slice(0, -2);
54582
+ domain = domain.slice(0, -2);
54572
54583
  }
54573
- return domain;
54584
+ const isHeader = functionName === "PIVOT.HEADER";
54585
+ return { domainArgs: domain, isHeader };
54574
54586
  }
54575
54587
  getPivot(pivotId) {
54576
54588
  return this.pivots[pivotId];
@@ -62782,7 +62794,9 @@ class Spreadsheet extends owl.Component {
62782
62794
  if (nextProps.model !== this.props.model) {
62783
62795
  throw new Error("Changing the props model is not supported at the moment.");
62784
62796
  }
62785
- if (!deepEquals(nextProps, this.props)) {
62797
+ if (nextProps.notifyUser !== this.props.notifyUser ||
62798
+ nextProps.askConfirmation !== this.props.askConfirmation ||
62799
+ nextProps.raiseError !== this.props.raiseError) {
62786
62800
  this.notificationStore.updateNotificationCallbacks({ ...nextProps });
62787
62801
  }
62788
62802
  });
@@ -66979,6 +66993,6 @@ exports.tokenColors = tokenColors;
66979
66993
  exports.tokenize = tokenize;
66980
66994
 
66981
66995
 
66982
- __info__.version = "17.3.0";
66983
- __info__.date = "2024-05-31T14:21:26.547Z";
66984
- __info__.hash = "271202e";
66996
+ __info__.version = "17.3.2";
66997
+ __info__.date = "2024-06-10T09:38:56.657Z";
66998
+ __info__.hash = "c3b358f";
@@ -4272,7 +4272,13 @@ declare class PivotUIPlugin extends UIPlugin {
4272
4272
  * If the cell is the result of PIVOT, the result is the domain of the cell
4273
4273
  * as if it was the individual pivot formula
4274
4274
  */
4275
- getPivotDomainArgsFromPosition(position: CellPosition): (CellValue | Matrix<CellValue> | undefined)[] | undefined;
4275
+ getPivotDomainArgsFromPosition(position: CellPosition): {
4276
+ domainArgs: string[] | undefined;
4277
+ isHeader: boolean;
4278
+ } | {
4279
+ domainArgs: (CellValue | Matrix<CellValue> | undefined)[];
4280
+ isHeader: boolean;
4281
+ } | undefined;
4276
4282
  getPivot(pivotId: UID): Pivot<PivotRuntimeDefinition>;
4277
4283
  isPivotUnused(pivotId: UID): boolean;
4278
4284
  /**
@@ -8270,6 +8276,7 @@ declare class FilterIcon extends Component<Props$v, SpreadsheetChildEnv> {
8270
8276
 
8271
8277
  declare class FilterIconsOverlay extends Component<{}, SpreadsheetChildEnv> {
8272
8278
  static template: string;
8279
+ static props: {};
8273
8280
  static components: {
8274
8281
  GridCellIcon: typeof GridCellIcon;
8275
8282
  FilterIcon: typeof FilterIcon;
@@ -9162,7 +9169,7 @@ declare class PivotLayoutConfigurator extends Component<Props$c, SpreadsheetChil
9162
9169
 
9163
9170
  declare class PivotSidePanelStore extends SpreadsheetStore {
9164
9171
  private pivotId;
9165
- mutators: readonly ["applyUpdate", "renamePivot", "update"];
9172
+ mutators: readonly ["reset", "deferUpdates", "applyUpdate", "discardPendingUpdate", "renamePivot", "update"];
9166
9173
  private updatesAreDeferred;
9167
9174
  private draft;
9168
9175
  constructor(get: Get, pivotId: UID);
@@ -3,9 +3,9 @@
3
3
  /**
4
4
  * This file is generated by o-spreadsheet build tools. Do not edit it.
5
5
  * @see https://github.com/odoo/o-spreadsheet
6
- * @version 17.3.0
7
- * @date 2024-05-31T14:21:26.547Z
8
- * @hash 271202e
6
+ * @version 17.3.2
7
+ * @date 2024-06-10T09:38:56.657Z
8
+ * @hash c3b358f
9
9
  */
10
10
 
11
11
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -309,7 +309,10 @@ function deepCopy(obj) {
309
309
  * Check if the object is a plain old javascript object.
310
310
  */
311
311
  function isPlainObject(obj) {
312
- return typeof obj === "object" && obj?.constructor === Object;
312
+ return (typeof obj === "object" &&
313
+ obj !== null &&
314
+ // obj.constructor can be undefined when there's no prototype (`Object.create(null, {})`)
315
+ (obj?.constructor === Object || obj?.constructor === undefined));
313
316
  }
314
317
  /**
315
318
  * Sanitize the name of a sheet, by eventually removing quotes
@@ -8959,7 +8962,7 @@ class NotificationStore {
8959
8962
  "askConfirmation",
8960
8963
  "updateNotificationCallbacks",
8961
8964
  ];
8962
- notifyUser = (notification) => window.alert(notification);
8965
+ notifyUser = (notification) => window.alert(notification.text);
8963
8966
  askConfirmation = (content, confirm, cancel) => {
8964
8967
  if (window.confirm(content)) {
8965
8968
  confirm();
@@ -20900,8 +20903,15 @@ class Composer extends Component {
20900
20903
  }
20901
20904
  onPaste(ev) {
20902
20905
  if (this.composerStore.editionMode !== "inactive") {
20906
+ // let the browser clipboard work
20903
20907
  ev.stopPropagation();
20904
20908
  }
20909
+ else {
20910
+ // the user meant to paste in the sheet, not open the composer with the pasted content
20911
+ // While we're not editing, we still have the focus and should therefore prevent
20912
+ // the native "paste" to occur.
20913
+ ev.preventDefault();
20914
+ }
20905
20915
  }
20906
20916
  /*
20907
20917
  * Triggered automatically by the content-editable between the keydown and key up
@@ -20910,9 +20920,6 @@ class Composer extends Component {
20910
20920
  if (!this.shouldProcessInputEvents) {
20911
20921
  return;
20912
20922
  }
20913
- if (ev.inputType === "insertFromPaste" && this.composerStore.editionMode === "inactive") {
20914
- return;
20915
- }
20916
20923
  ev.stopPropagation();
20917
20924
  let content;
20918
20925
  if (this.composerStore.editionMode === "inactive") {
@@ -25321,8 +25328,7 @@ function zoneToRect(zone) {
25321
25328
  */
25322
25329
  function useSpreadsheetRect() {
25323
25330
  const position = useState({ x: 0, y: 0, width: 0, height: 0 });
25324
- let spreadsheetElement = document.querySelector(".o-spreadsheet");
25325
- updatePosition();
25331
+ let spreadsheetElement = null;
25326
25332
  function updatePosition() {
25327
25333
  if (!spreadsheetElement) {
25328
25334
  spreadsheetElement = document.querySelector(".o-spreadsheet");
@@ -35751,7 +35757,14 @@ pivotRegistry.add("SPREADSHEET", {
35751
35757
 
35752
35758
  class PivotSidePanelStore extends SpreadsheetStore {
35753
35759
  pivotId;
35754
- mutators = ["applyUpdate", "renamePivot", "update"];
35760
+ mutators = [
35761
+ "reset",
35762
+ "deferUpdates",
35763
+ "applyUpdate",
35764
+ "discardPendingUpdate",
35765
+ "renamePivot",
35766
+ "update",
35767
+ ];
35755
35768
  updatesAreDeferred = true;
35756
35769
  draft = null;
35757
35770
  constructor(get, pivotId) {
@@ -37909,10 +37922,7 @@ class GridComposer extends Component {
37909
37922
  }
37910
37923
  get containerStyle() {
37911
37924
  if (this.composerStore.editionMode === "inactive") {
37912
- return `
37913
- position: absolute;
37914
- z-index: -1000;
37915
- `;
37925
+ return `z-index: -1000;`;
37916
37926
  }
37917
37927
  const isFormula = this.composerStore.currentContent.startsWith("=");
37918
37928
  const cell = this.env.model.getters.getActiveCell();
@@ -38788,6 +38798,7 @@ class FilterIcon extends Component {
38788
38798
 
38789
38799
  class FilterIconsOverlay extends Component {
38790
38800
  static template = "o-spreadsheet-FilterIconsOverlay";
38801
+ static props = {};
38791
38802
  static components = {
38792
38803
  GridCellIcon,
38793
38804
  FilterIcon,
@@ -54558,17 +54569,18 @@ class PivotUIPlugin extends UIPlugin {
54558
54569
  const pivotCol = position.col - mainPosition.col;
54559
54570
  const pivotRow = position.row - mainPosition.row;
54560
54571
  const pivotCell = pivotCells[pivotCol][pivotRow];
54561
- const domain = pivotCell.domain;
54572
+ let domain = pivotCell.domain;
54562
54573
  if (domain?.at(-2) === "measure") {
54563
- return domain.slice(0, -2);
54574
+ domain = domain.slice(0, -2);
54564
54575
  }
54565
- return domain;
54576
+ return { domainArgs: domain, isHeader: pivotCell.isHeader };
54566
54577
  }
54567
- const domain = args.slice(functionName === "PIVOT.VALUE" ? 2 : 1);
54578
+ let domain = args.slice(functionName === "PIVOT.VALUE" ? 2 : 1);
54568
54579
  if (domain.at(-2) === "measure") {
54569
- return domain.slice(0, -2);
54580
+ domain = domain.slice(0, -2);
54570
54581
  }
54571
- return domain;
54582
+ const isHeader = functionName === "PIVOT.HEADER";
54583
+ return { domainArgs: domain, isHeader };
54572
54584
  }
54573
54585
  getPivot(pivotId) {
54574
54586
  return this.pivots[pivotId];
@@ -62780,7 +62792,9 @@ class Spreadsheet extends Component {
62780
62792
  if (nextProps.model !== this.props.model) {
62781
62793
  throw new Error("Changing the props model is not supported at the moment.");
62782
62794
  }
62783
- if (!deepEquals(nextProps, this.props)) {
62795
+ if (nextProps.notifyUser !== this.props.notifyUser ||
62796
+ nextProps.askConfirmation !== this.props.askConfirmation ||
62797
+ nextProps.raiseError !== this.props.raiseError) {
62784
62798
  this.notificationStore.updateNotificationCallbacks({ ...nextProps });
62785
62799
  }
62786
62800
  });
@@ -66934,6 +66948,6 @@ const constants = {
66934
66948
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
66935
66949
 
66936
66950
 
66937
- __info__.version = "17.3.0";
66938
- __info__.date = "2024-05-31T14:21:26.547Z";
66939
- __info__.hash = "271202e";
66951
+ __info__.version = "17.3.2";
66952
+ __info__.date = "2024-06-10T09:38:56.657Z";
66953
+ __info__.hash = "c3b358f";
@@ -3,9 +3,9 @@
3
3
  /**
4
4
  * This file is generated by o-spreadsheet build tools. Do not edit it.
5
5
  * @see https://github.com/odoo/o-spreadsheet
6
- * @version 17.3.0
7
- * @date 2024-05-31T14:21:26.547Z
8
- * @hash 271202e
6
+ * @version 17.3.2
7
+ * @date 2024-06-10T09:38:56.657Z
8
+ * @hash c3b358f
9
9
  */
10
10
 
11
11
  (function (exports, owl) {
@@ -310,7 +310,10 @@
310
310
  * Check if the object is a plain old javascript object.
311
311
  */
312
312
  function isPlainObject(obj) {
313
- return typeof obj === "object" && obj?.constructor === Object;
313
+ return (typeof obj === "object" &&
314
+ obj !== null &&
315
+ // obj.constructor can be undefined when there's no prototype (`Object.create(null, {})`)
316
+ (obj?.constructor === Object || obj?.constructor === undefined));
314
317
  }
315
318
  /**
316
319
  * Sanitize the name of a sheet, by eventually removing quotes
@@ -8960,7 +8963,7 @@ stores.inject(MyMetaStore, storeInstance);
8960
8963
  "askConfirmation",
8961
8964
  "updateNotificationCallbacks",
8962
8965
  ];
8963
- notifyUser = (notification) => window.alert(notification);
8966
+ notifyUser = (notification) => window.alert(notification.text);
8964
8967
  askConfirmation = (content, confirm, cancel) => {
8965
8968
  if (window.confirm(content)) {
8966
8969
  confirm();
@@ -20901,8 +20904,15 @@ stores.inject(MyMetaStore, storeInstance);
20901
20904
  }
20902
20905
  onPaste(ev) {
20903
20906
  if (this.composerStore.editionMode !== "inactive") {
20907
+ // let the browser clipboard work
20904
20908
  ev.stopPropagation();
20905
20909
  }
20910
+ else {
20911
+ // the user meant to paste in the sheet, not open the composer with the pasted content
20912
+ // While we're not editing, we still have the focus and should therefore prevent
20913
+ // the native "paste" to occur.
20914
+ ev.preventDefault();
20915
+ }
20906
20916
  }
20907
20917
  /*
20908
20918
  * Triggered automatically by the content-editable between the keydown and key up
@@ -20911,9 +20921,6 @@ stores.inject(MyMetaStore, storeInstance);
20911
20921
  if (!this.shouldProcessInputEvents) {
20912
20922
  return;
20913
20923
  }
20914
- if (ev.inputType === "insertFromPaste" && this.composerStore.editionMode === "inactive") {
20915
- return;
20916
- }
20917
20924
  ev.stopPropagation();
20918
20925
  let content;
20919
20926
  if (this.composerStore.editionMode === "inactive") {
@@ -25322,8 +25329,7 @@ stores.inject(MyMetaStore, storeInstance);
25322
25329
  */
25323
25330
  function useSpreadsheetRect() {
25324
25331
  const position = owl.useState({ x: 0, y: 0, width: 0, height: 0 });
25325
- let spreadsheetElement = document.querySelector(".o-spreadsheet");
25326
- updatePosition();
25332
+ let spreadsheetElement = null;
25327
25333
  function updatePosition() {
25328
25334
  if (!spreadsheetElement) {
25329
25335
  spreadsheetElement = document.querySelector(".o-spreadsheet");
@@ -35752,7 +35758,14 @@ stores.inject(MyMetaStore, storeInstance);
35752
35758
 
35753
35759
  class PivotSidePanelStore extends SpreadsheetStore {
35754
35760
  pivotId;
35755
- mutators = ["applyUpdate", "renamePivot", "update"];
35761
+ mutators = [
35762
+ "reset",
35763
+ "deferUpdates",
35764
+ "applyUpdate",
35765
+ "discardPendingUpdate",
35766
+ "renamePivot",
35767
+ "update",
35768
+ ];
35756
35769
  updatesAreDeferred = true;
35757
35770
  draft = null;
35758
35771
  constructor(get, pivotId) {
@@ -37910,10 +37923,7 @@ stores.inject(MyMetaStore, storeInstance);
37910
37923
  }
37911
37924
  get containerStyle() {
37912
37925
  if (this.composerStore.editionMode === "inactive") {
37913
- return `
37914
- position: absolute;
37915
- z-index: -1000;
37916
- `;
37926
+ return `z-index: -1000;`;
37917
37927
  }
37918
37928
  const isFormula = this.composerStore.currentContent.startsWith("=");
37919
37929
  const cell = this.env.model.getters.getActiveCell();
@@ -38789,6 +38799,7 @@ stores.inject(MyMetaStore, storeInstance);
38789
38799
 
38790
38800
  class FilterIconsOverlay extends owl.Component {
38791
38801
  static template = "o-spreadsheet-FilterIconsOverlay";
38802
+ static props = {};
38792
38803
  static components = {
38793
38804
  GridCellIcon,
38794
38805
  FilterIcon,
@@ -54559,17 +54570,18 @@ stores.inject(MyMetaStore, storeInstance);
54559
54570
  const pivotCol = position.col - mainPosition.col;
54560
54571
  const pivotRow = position.row - mainPosition.row;
54561
54572
  const pivotCell = pivotCells[pivotCol][pivotRow];
54562
- const domain = pivotCell.domain;
54573
+ let domain = pivotCell.domain;
54563
54574
  if (domain?.at(-2) === "measure") {
54564
- return domain.slice(0, -2);
54575
+ domain = domain.slice(0, -2);
54565
54576
  }
54566
- return domain;
54577
+ return { domainArgs: domain, isHeader: pivotCell.isHeader };
54567
54578
  }
54568
- const domain = args.slice(functionName === "PIVOT.VALUE" ? 2 : 1);
54579
+ let domain = args.slice(functionName === "PIVOT.VALUE" ? 2 : 1);
54569
54580
  if (domain.at(-2) === "measure") {
54570
- return domain.slice(0, -2);
54581
+ domain = domain.slice(0, -2);
54571
54582
  }
54572
- return domain;
54583
+ const isHeader = functionName === "PIVOT.HEADER";
54584
+ return { domainArgs: domain, isHeader };
54573
54585
  }
54574
54586
  getPivot(pivotId) {
54575
54587
  return this.pivots[pivotId];
@@ -62781,7 +62793,9 @@ stores.inject(MyMetaStore, storeInstance);
62781
62793
  if (nextProps.model !== this.props.model) {
62782
62794
  throw new Error("Changing the props model is not supported at the moment.");
62783
62795
  }
62784
- if (!deepEquals(nextProps, this.props)) {
62796
+ if (nextProps.notifyUser !== this.props.notifyUser ||
62797
+ nextProps.askConfirmation !== this.props.askConfirmation ||
62798
+ nextProps.raiseError !== this.props.raiseError) {
62785
62799
  this.notificationStore.updateNotificationCallbacks({ ...nextProps });
62786
62800
  }
62787
62801
  });
@@ -66978,9 +66992,9 @@ stores.inject(MyMetaStore, storeInstance);
66978
66992
  exports.tokenize = tokenize;
66979
66993
 
66980
66994
 
66981
- __info__.version = "17.3.0";
66982
- __info__.date = "2024-05-31T14:21:26.547Z";
66983
- __info__.hash = "271202e";
66995
+ __info__.version = "17.3.2";
66996
+ __info__.date = "2024-06-10T09:38:56.657Z";
66997
+ __info__.hash = "c3b358f";
66984
66998
 
66985
66999
 
66986
67000
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);