From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id YCK1GGngf2HKfwAAgWs5BA (envelope-from ) for ; Mon, 01 Nov 2021 13:41:13 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id wPJ+FGngf2GuGgAA1q6Kng (envelope-from ) for ; Mon, 01 Nov 2021 12:41:13 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 4E42AF647 for ; Mon, 1 Nov 2021 13:41:12 +0100 (CET) Received: from localhost ([::1]:40028 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mhWcg-00011s-H2 for larch@yhetil.org; Mon, 01 Nov 2021 08:41:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45674) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mhWcF-0000zk-Bb for emacs-orgmode@gnu.org; Mon, 01 Nov 2021 08:40:43 -0400 Received: from mail-pg1-x530.google.com ([2607:f8b0:4864:20::530]:38526) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mhWcB-0006B3-1b for emacs-orgmode@gnu.org; Mon, 01 Nov 2021 08:40:43 -0400 Received: by mail-pg1-x530.google.com with SMTP id e65so17081511pgc.5 for ; Mon, 01 Nov 2021 05:40:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:in-reply-to:references:date:message-id :mime-version; bh=wNLX9/Ppa8U9qpq2pVKW/1ajcrBj6VZjAq2OuQM98jo=; b=nr1XniscB/haxpVWr/o2lqZSE39+8srz3EkKTQiuPwtMvHBs16YrP+FGwdjYruKHjB TrvXAxO9DvNyA8+woTkScufJ6rTK6gzj5sOMdZIUjP7o5VpaWRWS2Ttr7LvT63T8Dewm ClHJz4/RcL/ni3ceuGHR1Qsg4BdBxfFYxnrxpty3g6Iu9AnBA87w314eRPQxrKMlB1Kk mbuLTxYpvAoE2TryHMQGG/zE5ReAowQoLKBHHjLrK84pc83xOftkVJBMP7+K/p7svr7A ds47hRUP75W9mvmAMJwq9TVkAVRPvWfgbdHca33xS6OMm8Nk4zv4PhKRu+Uz/tcV5WVS OLeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references:date :message-id:mime-version; bh=wNLX9/Ppa8U9qpq2pVKW/1ajcrBj6VZjAq2OuQM98jo=; b=t22Y65r/pP1W/ZZI/H8wxeh+RgSe4+ahONNBCUYhWdmszuRKn197lcFWzk63aFekia gzOwRc9/BxEPwgyM89XRCGwO9DwndFtzNSYBt7TjykZ3Z0tt+Alh8n60xkm2FWTtA6Tn v/Yjzigml4Pap7XY/x/J6+7sEPJu1jgrqA0IEweVMEKrVpQ58aOIGGap2UhFpXB0+iIB qj8JAQXphWHJJCcBlA3zf3I2NdOWGjSLHeDtoyU3P5k80l0b2kecwL9MZDdqqV/ru73S QWBRMkY22tVvunuhwXDKdf49Hj2c2Fx9bzlDmDuX5X6dsKdMwnC5YTYrxP0UWsIYAAFx jjgw== X-Gm-Message-State: AOAM533JKdaJxL77l8HuTpi6xo658vxz3bRg3TbuLjGqlQTrPk0Zt9tf no8x/cnFMGXblsQO3lFkMpCF6fFRmjW/S9UQ4mE= X-Google-Smtp-Source: ABdhPJwPs90vrGxMi091/hUNeAiqZrN+gcRcf5w2qXLzWI4tREhYF+anzfT8N4qecKELSOEMb8rnrA== X-Received: by 2002:a63:131c:: with SMTP id i28mr21514942pgl.396.1635770437676; Mon, 01 Nov 2021 05:40:37 -0700 (PDT) Received: from localhost ([101.99.64.65]) by smtp.gmail.com with ESMTPSA id x9sm12856095pga.28.2021.11.01.05.40.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Nov 2021 05:40:36 -0700 (PDT) From: Ihor Radchenko To: Greg Coladonato Subject: Re: [BUG] after update to 9.5, starting org mode results in cache error messages [9.5 (9.5-gd4e192 @ c:/Users/scott/.emacs.d/straight/build/org/)] In-Reply-To: References: Date: Mon, 01 Nov 2021 20:42:01 +0800 Message-ID: <874k8wavza.fsf@localhost> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=2607:f8b0:4864:20::530; envelope-from=yantar92@gmail.com; helo=mail-pg1-x530.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: emacs-orgmode@gnu.org Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: "Emacs-orgmode" X-Migadu-Flow: FLOW_IN ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1635770472; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=wNLX9/Ppa8U9qpq2pVKW/1ajcrBj6VZjAq2OuQM98jo=; b=upQyliqRfsUBu0Ubtuf90HhQuboOFJ0ThiWN+Uvp7mPz24CzpJMJ6Y3eAuaPHJtreXnLct 2WBnGdDHvXW96rgp1spPTGHuj1lDKIPpU4lw/sGCZdnO/EqHCIMPNECr4PRulU77phcsxX pXCaTvEtr5q0+kg6UZZYcEt9oKqmBDNg06nAxTwxz1rcKAdZAEYHyUk9SsI9sI9ZuCV8PH NgdfrNY2XfgUXiID4w/FXlAM3jrT1edfGWhto5e6fRPU0/vp4KLdlpOdE+EnE5WVx4dvh8 hQLEhFXT3n1ZfHnfn8vaJpLw6PesJsLhewv0zu9XleXK9KfMtdBn7Q3Y3mWKiA== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1635770472; a=rsa-sha256; cv=none; b=hdtYdw/1u2+fQNy9PFYSA1y94p7yJCMBq3t01jqBDweELmCnot6t7dbR7NropFivV68u35 v+NH1rtMawzlTxII4ZSdeZ6XFLuU+pywxp7h4G5AoeXk49sYWNsohun/whfSq0Qji7qZWD a1K5krCO7OMvhNYc1Tzw7sYxtiwQ2dUogw9VcgFwdyH96+B721xMNdQNAYk4vJ10Mt/UpF yi0wgApqspjgV5qJEki/vMOO1TTs/IF10zoCDvSpqbiMDRW+jVkfTYosihzU/eHnyt6j/s pFyAFM3N13DsKjV6f+qwOrsrfv0l9qqMZ1XzWx4oXj8GqmT3rrxWY7BtlLnpPg== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=nr1Xnisc; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (aspmx1.migadu.com: domain of emacs-orgmode-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=emacs-orgmode-bounces@gnu.org X-Migadu-Spam-Score: -2.62 Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=nr1Xnisc; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (aspmx1.migadu.com: domain of emacs-orgmode-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=emacs-orgmode-bounces@gnu.org X-Migadu-Queue-Id: 4E42AF647 X-Spam-Score: -2.62 X-Migadu-Scanner: scn0.migadu.com X-TUID: TIh+cpokPI2j --=-=-= Content-Type: text/plain Greg Coladonato writes: > I get a similar error to Scott's every time I save an org-mode file. I > turned on backtrace and got this output: Thanks for reporting and providing the detailed backtrace! Backtrace is really strange because cache is clearly updated upon changing the file, but somehow somewhere a stale element is still returned. Given that you are using org-roam, the only suspect that may create stale copies of cached elements is org-element-parse-buffer. The attached patch is making sure that org-element-parse-buffer never tries to reuse cache. Can you try the patch and see if it helps? Best, Ihor --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-org-element-current-element-Do-not-use-cache.patch >From cc2b4081796ed3caeb193b45588bfb9fd3d77625 Mon Sep 17 00:00:00 2001 Message-Id: From: Ihor Radchenko Date: Mon, 1 Nov 2021 20:38:11 +0800 Subject: [PATCH] org-element--current-element: Do not use cache --- lisp/org-element.el | 342 ++++++++++++++++++++------------------------ 1 file changed, 157 insertions(+), 185 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 9fa6fd5e2..caa714f34 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -4106,7 +4106,7 @@ ;;; Parsing Element Starting At Point ;; point. (defvar org-element--cache-sync-requests); Declared later -(defun org-element--current-element (limit &optional granularity mode structure add-to-cache) +(defun org-element--current-element (limit &optional granularity mode structure) "Parse the element starting at point. Return value is a list like (TYPE PROPS) where TYPE is the type @@ -4138,190 +4138,162 @@ (defun org-element--current-element (limit &optional granularity mode structure This function assumes point is always at the beginning of the element it has to parse." - (let* ((element (and (not (buffer-narrowed-p)) - (org-element--cache-active-p) - (not org-element--cache-sync-requests) - (org-element--cache-find (point) t))) - (element (progn (while (and element - (not (and (eq (point) (org-element-property :begin element)) - (eq mode (org-element-property :mode element))))) - (setq element (org-element-property :parent element))) - element)) - (old-element element) - (element (when - (pcase (org-element-property :granularity element) - (`nil t) - (`object t) - (`element (not (memq granularity '(nil object)))) - (`greater-element (not (memq granularity '(nil object element)))) - (`headline (eq granularity 'headline))) - element))) - (if element - element - (save-excursion - (let ((case-fold-search t) - ;; Determine if parsing depth allows for secondary strings - ;; parsing. It only applies to elements referenced in - ;; `org-element-secondary-value-alist'. - (raw-secondary-p (and granularity (not (eq granularity 'object)))) - result) - (setq - result - (cond - ;; Item. - ((eq mode 'item) - (org-element-item-parser limit structure raw-secondary-p)) - ;; Table Row. - ((eq mode 'table-row) (org-element-table-row-parser limit)) - ;; Node Property. - ((eq mode 'node-property) (org-element-node-property-parser limit)) - ;; Headline. - ((org-with-limited-levels (org-at-heading-p)) - (org-element-headline-parser limit raw-secondary-p)) - ;; Sections (must be checked after headline). - ((eq mode 'section) (org-element-section-parser limit)) - ((eq mode 'first-section) - (org-element-section-parser - (or (save-excursion (org-with-limited-levels (outline-next-heading))) - limit))) - ;; Comments. - ((looking-at "^[ \t]*#\\(?: \\|$\\)") - (org-element-comment-parser limit)) - ;; Planning. - ((and (eq mode 'planning) - (eq ?* (char-after (line-beginning-position 0))) - (looking-at org-planning-line-re)) - (org-element-planning-parser limit)) - ;; Property drawer. - ((and (pcase mode - (`planning (eq ?* (char-after (line-beginning-position 0)))) - ((or `property-drawer `top-comment) - (save-excursion - (beginning-of-line 0) - (not (looking-at "[[:blank:]]*$")))) - (_ nil)) - (looking-at org-property-drawer-re)) - (org-element-property-drawer-parser limit)) - ;; When not at bol, point is at the beginning of an item or - ;; a footnote definition: next item is always a paragraph. - ((not (bolp)) (org-element-paragraph-parser limit (list (point)))) - ;; Clock. - ((looking-at org-clock-line-re) (org-element-clock-parser limit)) - ;; Inlinetask. - ((looking-at "^\\*+ ") - (org-element-inlinetask-parser limit raw-secondary-p)) - ;; From there, elements can have affiliated keywords. - (t (let ((affiliated (org-element--collect-affiliated-keywords - limit (memq granularity '(nil object))))) - (cond - ;; Jumping over affiliated keywords put point off-limits. - ;; Parse them as regular keywords. - ((and (cdr affiliated) (>= (point) limit)) - (goto-char (car affiliated)) - (org-element-keyword-parser limit nil)) - ;; LaTeX Environment. - ((looking-at org-element--latex-begin-environment) - (org-element-latex-environment-parser limit affiliated)) - ;; Drawer. - ((looking-at org-drawer-regexp) - (org-element-drawer-parser limit affiliated)) - ;; Fixed Width - ((looking-at "[ \t]*:\\( \\|$\\)") - (org-element-fixed-width-parser limit affiliated)) - ;; Inline Comments, Blocks, Babel Calls, Dynamic Blocks and - ;; Keywords. - ((looking-at "[ \t]*#\\+") - (goto-char (match-end 0)) - (cond - ((looking-at "BEGIN_\\(\\S-+\\)") - (beginning-of-line) - (funcall (pcase (upcase (match-string 1)) - ("CENTER" #'org-element-center-block-parser) - ("COMMENT" #'org-element-comment-block-parser) - ("EXAMPLE" #'org-element-example-block-parser) - ("EXPORT" #'org-element-export-block-parser) - ("QUOTE" #'org-element-quote-block-parser) - ("SRC" #'org-element-src-block-parser) - ("VERSE" #'org-element-verse-block-parser) - (_ #'org-element-special-block-parser)) - limit - affiliated)) - ((looking-at "CALL:") - (beginning-of-line) - (org-element-babel-call-parser limit affiliated)) - ((looking-at "BEGIN:? ") - (beginning-of-line) - (org-element-dynamic-block-parser limit affiliated)) - ((looking-at "\\S-+:") - (beginning-of-line) - (org-element-keyword-parser limit affiliated)) - (t - (beginning-of-line) - (org-element-paragraph-parser limit affiliated)))) - ;; Footnote Definition. - ((looking-at org-footnote-definition-re) - (org-element-footnote-definition-parser limit affiliated)) - ;; Horizontal Rule. - ((looking-at "[ \t]*-\\{5,\\}[ \t]*$") - (org-element-horizontal-rule-parser limit affiliated)) - ;; Diary Sexp. - ((looking-at "%%(") - (org-element-diary-sexp-parser limit affiliated)) - ;; Table. - ((or (looking-at "[ \t]*|") - ;; There is no strict definition of a table.el - ;; table. Try to prevent false positive while being - ;; quick. - (let ((rule-regexp - (rx (zero-or-more (any " \t")) - "+" - (one-or-more (one-or-more "-") "+") - (zero-or-more (any " \t")) - eol)) - (non-table.el-line - (rx bol - (zero-or-more (any " \t")) - (or eol (not (any "+| \t"))))) - (next (line-beginning-position 2))) - ;; Start with a full rule. - (and - (looking-at rule-regexp) - (< next limit) ;no room for a table.el table - (save-excursion - (end-of-line) - (cond - ;; Must end with a full rule. - ((not (re-search-forward non-table.el-line limit 'move)) - (if (bolp) (forward-line -1) (beginning-of-line)) - (looking-at rule-regexp)) - ;; Ignore pseudo-tables with a single - ;; rule. - ((= next (line-beginning-position)) - nil) - ;; Must end with a full rule. - (t - (forward-line -1) - (looking-at rule-regexp))))))) - (org-element-table-parser limit affiliated)) - ;; List. - ((looking-at (org-item-re)) - (org-element-plain-list-parser - limit affiliated - (or structure (org-element--list-struct limit)))) - ;; Default element: Paragraph. - (t (org-element-paragraph-parser limit affiliated))))))) - (when result - (org-element-put-property result :mode mode) - (org-element-put-property result :granularity granularity)) - (when (and (not (buffer-narrowed-p)) - (org-element--cache-active-p) - (not org-element--cache-sync-requests) - add-to-cache) - (if (not old-element) - (setq result (org-element--cache-put result)) - (org-element-set-element old-element result) - (setq result old-element))) - result))))) + (save-excursion + (let ((case-fold-search t) + ;; Determine if parsing depth allows for secondary strings + ;; parsing. It only applies to elements referenced in + ;; `org-element-secondary-value-alist'. + (raw-secondary-p (and granularity (not (eq granularity 'object)))) + result) + (setq + result + (cond + ;; Item. + ((eq mode 'item) + (org-element-item-parser limit structure raw-secondary-p)) + ;; Table Row. + ((eq mode 'table-row) (org-element-table-row-parser limit)) + ;; Node Property. + ((eq mode 'node-property) (org-element-node-property-parser limit)) + ;; Headline. + ((org-with-limited-levels (org-at-heading-p)) + (org-element-headline-parser limit raw-secondary-p)) + ;; Sections (must be checked after headline). + ((eq mode 'section) (org-element-section-parser limit)) + ((eq mode 'first-section) + (org-element-section-parser + (or (save-excursion (org-with-limited-levels (outline-next-heading))) + limit))) + ;; Comments. + ((looking-at "^[ \t]*#\\(?: \\|$\\)") + (org-element-comment-parser limit)) + ;; Planning. + ((and (eq mode 'planning) + (eq ?* (char-after (line-beginning-position 0))) + (looking-at org-planning-line-re)) + (org-element-planning-parser limit)) + ;; Property drawer. + ((and (pcase mode + (`planning (eq ?* (char-after (line-beginning-position 0)))) + ((or `property-drawer `top-comment) + (save-excursion + (beginning-of-line 0) + (not (looking-at "[[:blank:]]*$")))) + (_ nil)) + (looking-at org-property-drawer-re)) + (org-element-property-drawer-parser limit)) + ;; When not at bol, point is at the beginning of an item or + ;; a footnote definition: next item is always a paragraph. + ((not (bolp)) (org-element-paragraph-parser limit (list (point)))) + ;; Clock. + ((looking-at org-clock-line-re) (org-element-clock-parser limit)) + ;; Inlinetask. + ((looking-at "^\\*+ ") + (org-element-inlinetask-parser limit raw-secondary-p)) + ;; From there, elements can have affiliated keywords. + (t (let ((affiliated (org-element--collect-affiliated-keywords + limit (memq granularity '(nil object))))) + (cond + ;; Jumping over affiliated keywords put point off-limits. + ;; Parse them as regular keywords. + ((and (cdr affiliated) (>= (point) limit)) + (goto-char (car affiliated)) + (org-element-keyword-parser limit nil)) + ;; LaTeX Environment. + ((looking-at org-element--latex-begin-environment) + (org-element-latex-environment-parser limit affiliated)) + ;; Drawer. + ((looking-at org-drawer-regexp) + (org-element-drawer-parser limit affiliated)) + ;; Fixed Width + ((looking-at "[ \t]*:\\( \\|$\\)") + (org-element-fixed-width-parser limit affiliated)) + ;; Inline Comments, Blocks, Babel Calls, Dynamic Blocks and + ;; Keywords. + ((looking-at "[ \t]*#\\+") + (goto-char (match-end 0)) + (cond + ((looking-at "BEGIN_\\(\\S-+\\)") + (beginning-of-line) + (funcall (pcase (upcase (match-string 1)) + ("CENTER" #'org-element-center-block-parser) + ("COMMENT" #'org-element-comment-block-parser) + ("EXAMPLE" #'org-element-example-block-parser) + ("EXPORT" #'org-element-export-block-parser) + ("QUOTE" #'org-element-quote-block-parser) + ("SRC" #'org-element-src-block-parser) + ("VERSE" #'org-element-verse-block-parser) + (_ #'org-element-special-block-parser)) + limit + affiliated)) + ((looking-at "CALL:") + (beginning-of-line) + (org-element-babel-call-parser limit affiliated)) + ((looking-at "BEGIN:? ") + (beginning-of-line) + (org-element-dynamic-block-parser limit affiliated)) + ((looking-at "\\S-+:") + (beginning-of-line) + (org-element-keyword-parser limit affiliated)) + (t + (beginning-of-line) + (org-element-paragraph-parser limit affiliated)))) + ;; Footnote Definition. + ((looking-at org-footnote-definition-re) + (org-element-footnote-definition-parser limit affiliated)) + ;; Horizontal Rule. + ((looking-at "[ \t]*-\\{5,\\}[ \t]*$") + (org-element-horizontal-rule-parser limit affiliated)) + ;; Diary Sexp. + ((looking-at "%%(") + (org-element-diary-sexp-parser limit affiliated)) + ;; Table. + ((or (looking-at "[ \t]*|") + ;; There is no strict definition of a table.el + ;; table. Try to prevent false positive while being + ;; quick. + (let ((rule-regexp + (rx (zero-or-more (any " \t")) + "+" + (one-or-more (one-or-more "-") "+") + (zero-or-more (any " \t")) + eol)) + (non-table.el-line + (rx bol + (zero-or-more (any " \t")) + (or eol (not (any "+| \t"))))) + (next (line-beginning-position 2))) + ;; Start with a full rule. + (and + (looking-at rule-regexp) + (< next limit) ;no room for a table.el table + (save-excursion + (end-of-line) + (cond + ;; Must end with a full rule. + ((not (re-search-forward non-table.el-line limit 'move)) + (if (bolp) (forward-line -1) (beginning-of-line)) + (looking-at rule-regexp)) + ;; Ignore pseudo-tables with a single + ;; rule. + ((= next (line-beginning-position)) + nil) + ;; Must end with a full rule. + (t + (forward-line -1) + (looking-at rule-regexp))))))) + (org-element-table-parser limit affiliated)) + ;; List. + ((looking-at (org-item-re)) + (org-element-plain-list-parser + limit affiliated + (or structure (org-element--list-struct limit)))) + ;; Default element: Paragraph. + (t (org-element-paragraph-parser limit affiliated))))))) + (when result + (org-element-put-property result :mode mode) + (org-element-put-property result :granularity granularity)) + result))) ;; Most elements can have affiliated keywords. When looking for an -- 2.32.0 --=-=-=--