From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jake Romer Subject: Re: ox-md.el: Export TOC and Footnotes as Markdown rather than HTML Date: Sun, 21 Aug 2016 22:31:01 -0700 Message-ID: References: <871t1z9ye1.fsf@saiph.selenimh> <87fuq6ujtz.fsf@saiph.selenimh> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a114dfab4bfdabc053aa25b46 Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:49990) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bbhpV-0004UK-RR for emacs-orgmode@gnu.org; Mon, 22 Aug 2016 01:31:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bbhpT-0005Nw-9L for emacs-orgmode@gnu.org; Mon, 22 Aug 2016 01:31:25 -0400 Received: from mail-ua0-x229.google.com ([2607:f8b0:400c:c08::229]:36525) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bbhpS-0005Nq-W1 for emacs-orgmode@gnu.org; Mon, 22 Aug 2016 01:31:23 -0400 Received: by mail-ua0-x229.google.com with SMTP id 97so170374358uav.3 for ; Sun, 21 Aug 2016 22:31:22 -0700 (PDT) In-Reply-To: <87fuq6ujtz.fsf@saiph.selenimh> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: emacs-orgmode@gnu.org, Nicolas Goaziou --001a114dfab4bfdabc053aa25b46 Content-Type: multipart/alternative; boundary=001a114dfab4bfdaa7053aa25b44 --001a114dfab4bfdaa7053aa25b44 Content-Type: text/plain; charset=UTF-8 Thanks for the pointers! I appreciate your patience -- I'm still a noob with Org :-) Here's the updated patch with entries in ORG-NEWS and the manual. Cheers, Jake On Mon, Aug 15, 2016 at 8:34 AM, Nicolas Goaziou wrote: > Hello, > > Jake Romer writes: > > > I'm not as familiar with Org's TOC facilities as I should be, so I'll > > update to handle these cases after some research. I want to avoid letting > > these patches get too big, too. > > See `org-html-toc' and `org-html--toc-text' for an illustration. > > > Here's the patch for generating the footnotes section as Markdown, let me > > know what you think. > > It looks good. However, I'm not able to apply them, they seem to be > created from a subdirectory instead of the root dir. > > > From 63d985425d3995985bd340fe195d8e25bd7f2cc6 Mon Sep 17 00:00:00 2001 > > From: Jake Romer > > Date: Sat, 13 Aug 2016 11:45:34 -0400 > > Subject: [PATCH 1/4] Extract org-md-headline-title to generate title > > > > In order to generate a headline title in the preferred Markdown > > style ('atx or 'setext), I extracted this bit of logic from > > `org-md-headline'. > > > > Since `org-md-headline' doesn't process the headline for the footnotes > > section, extracting `org-md-headline-title' will allow us to generate > > the Footnote section header in the preferred Markdown style without > > duplicating the logic for doing so. > > > > As an enhancement, `org-md-headline-title' places the anchor tag above > > the section header. This makes it so that in a browser, clicking on the > > TOC entry for that section scrolls to the section header without > > obscuring it. > > > > Example generated section title: > > > > > > Great. However, you need to supply modified variables and functions > names in the commit message, e.g., > > * lisp/ox-md.el (org-md-headline-title): New function. > (org-md-headline): Use new function. > > > Summary of Changes > > ================== > > --- > > ox-md.el | 37 +++++++++++++++++++++++-------------- > > 1 file changed, 23 insertions(+), 14 deletions(-) > > > > diff --git a/ox-md.el b/ox-md.el > > index 0aaade6..4bd445c 100644 > > --- a/ox-md.el > > +++ b/ox-md.el > > @@ -216,20 +216,29 @@ a communication channel." > > (car (last (org-export-get-headline-number > > headline info)))) > > ".")))) > > - (concat bullet (make-string (- 4 (length bullet)) ?\s) heading > tags > > - "\n\n" > > - (and contents > > - (replace-regexp-in-string "^" " " contents))))) > > - ;; Use "Setext" style. > > - ((eq style 'setext) > > - (concat heading tags anchor "\n" > > - (make-string (length heading) (if (= level 1) ?= ?-)) > > - "\n\n" > > - contents)) > > - ;; Use "atx" style. > > - (t (concat (make-string level ?#) " " heading tags anchor "\n\n" > > - contents)))))) > > - > > + (concat bullet (make-string (- 4 (length bullet)) ?\s) heading > tags "\n\n" > > + (and contents (replace-regexp-in-string "^" " " > contents))))) > > + (t (concat (org-md-headline-title style level title anchor tags) > contents)))))) > > + > > + > > +;; Headline Title > > + > > +(defun org-md-headline-title (style level title &optional anchor tags) > > I suggest to name it `org-md--headline-title' to highlight the fact that > it is an internal function. > > > + "Generate a headline title in the preferred Markdown headline style. > > +STYLE is the preferred style ('atx or 'setext) > > +LEVEL is the header level. > > +TITLE is the headline title. > > +ANCHOR is the HTML anchor tag for the section as a string. > > +TAGS are the tags set on the section." > > + (let ((anchor-lines (if anchor (concat anchor "\n\n") nil))) > > (and anchor (concat anchor "\n\n")) > > > Subject: [PATCH 2/4] Add customizable footnotes-related variables > > > > Taking a cue from `ox-html.el', this patch adds > > `org-md-footnotes-section' and `org-md-footnote-format' to allow user > > customization of the formatting for the footnotes section and individual > > footnotes, respectively. > > Ditto (variable names...) > > > +(defcustom org-md-footnotes-section "%s%s" > > + "Format for the footnotes section. > > Format string for... > > > +The first %s placeholder will be replaced with the localized Footnotes > section > > +heading, the second with the contents of the Footnotes section." > > + :group 'org-export-md > > + :type 'string) > > You need to provide additional keywords, i.e., > > :version "25.1" > :package-version '(Org . "9.0") > > > > +(defcustom org-md-footnote-format "%s" > > + "The format for the footnote reference. > > +The %s will be replaced by the footnote reference itself." > > + :group 'org-export-md > > + :type 'string) > > Ditto. > > > Subject: [PATCH 3/4] Add footnote-generating functions > > > > Introduces the following functions: > > > > * `org-md-footnote-formatted' > > * `org-md-footnote-section' > > See above. > > > +;;;; Footnote Section > > + > > +(defun org-md-footnote-formatted (footnote info) > > Suggestion: `org-md--footnote-formatted' > > > + "Formats a single footnote entry FOOTNOTE. > > You should specify the data type for FOOTNOTE, i.e., a cons cell > > (number . definition) > > > +INFO is a plist with contextual information." > > + (let* ((fn-num (car footnote)) > > + (fn-text (cdr footnote)) > > + (fn-format (plist-get info :md-footnote-format)) > > + (fn-anchor (format "fn.%d" fn-num)) > > + (fn-href (format " href=\"#fnr.%d\"" fn-num)) > > + (fn-link-to-ref (org-html--anchor fn-anchor fn-num fn-href > info))) > > + (concat (format fn-format fn-link-to-ref) " " fn-text "\n"))) > > + > > +(defun org-md-footnote-section (info) > > + "Format the footnote section. > > +INFO is a plist used as a communication channel." > > + (let* ((fn-alist (org-export-collect-footnote-definitions info)) > > + (fn-alist (loop for (n type raw) in fn-alist collect > > + (cons n (org-trim (org-export-data raw > info))))) > > `cl-loop' > > > + (headline-style (plist-get info :md-headline-style)) > > + (section-title (org-html--translate "Footnotes" info))) > > + (when fn-alist > > + (format (plist-get info :md-footnotes-section) > > + (org-md-headline-title headline-style 1 section-title) > > + (mapconcat #'(lambda (fn) (org-md-footnote-formatted fn > info)) > > (mapconcat (lambda (fn) ...) ...) > > > + fn-alist > > + "\n"))))) > > + > > ;;;; Template > > > > (defun org-md-inner-template (contents info) > > -- > > 2.9.2 > > > > > > From a2e353da09d0db9bbde14641bd94e12e156a143c Mon Sep 17 00:00:00 2001 > > From: Jake Romer > > Date: Sat, 13 Aug 2016 13:11:26 -0400 > > Subject: [PATCH 4/4] Update org-md-inner-template to Markdown footnotes > > > > Updates `org-md-inner-template' to use `org-md-footnotes-section' to > > generate a Markdown version of the footnotes section. > > > > Also appends `:md-footnote-format' and `md-footnotes-section' to the > > exporter :options-alist. > > --- > > ox-md.el | 15 +++++++++++++-- > > 1 file changed, 13 insertions(+), 2 deletions(-) > > > > diff --git a/ox-md.el b/ox-md.el > > index 19b8912..7d78ff7 100644 > > --- a/ox-md.el > > +++ b/ox-md.el > > @@ -105,7 +105,10 @@ The %s will be replaced by the footnote reference > itself." > > (src-block . org-md-example-block) > > (template . org-md-template) > > (verbatim . org-md-verbatim)) > > - :options-alist '((:md-headline-style nil nil org-md-headline-style))) > > + :options-alist > > + '((:md-headline-style nil nil org-md-headline-style) > > + (:md-footnote-format nil nil org-md-footnote-format) > > + (:md-footnotes-section nil nil org-md-footnotes-section))) > > These new parameters need to be documented in the manual: (info "(org) > Publishing options"). > > Would you mind providing an entry in ORG-NEWS and send again the patches > from root directory so I can apply them? > > Thank you! > > Regards, > > -- > Nicolas Goaziou > --001a114dfab4bfdaa7053aa25b44 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Thanks for the pointers! I appreciate your patience -- I&#= 39;m still a noob with Org :-)

Here's the updated pa= tch with entries in ORG-NEWS and the manual.

Cheer= s,

Jake



On Mon, Aug 15, 2016 at = 8:34 AM, Nicolas Goaziou <mail@nicolasgoaziou.fr> wrote= :
Hello,

Jake Romer <jkrm= r.io@gmail.com> writes:

> I'm not as familiar with Org's TOC facilities as = I should be, so I'll
> update to handle these cases after some research. I want to avoid lett= ing
> these patches get too big, too.

See `org-html-toc' and `org-html--toc-text' for an illustrat= ion.

> Here's the patch for generating the footnotes section as Markdown,= let me
> know what you think.

It looks good. However, I'm not able to apply them, they seem to= be
created from a subdirectory instead of the root dir.

> From 63d985425d3995985bd340fe195d8e25bd7f2cc6 Mon Sep 17 00:00:00= 2001
> From: Jake Romer <jkrmr@github.com>
> Date: Sat, 13 Aug 2016 11:45:34 -0400
> Subject: [PATCH 1/4] Extract org-md-headline-title to generate title >
> In order to generate a headline title in the preferred Markdown
> style ('atx or 'setext), I extracted this bit of logic from > `org-md-headline'.
>
> Since `org-md-headline' doesn't process the headline for the f= ootnotes
> section, extracting `org-md-headline-title' will allow us to gener= ate
> the Footnote section header in the preferred Markdown style without > duplicating the logic for doing so.
>
> As an enhancement, `org-md-headline-title' places the anchor tag a= bove
> the section header. This makes it so that in a browser, clicking on th= e
> TOC entry for that section scrolls to the section header without
> obscuring it.
>
> Example generated section title:
>
>=C2=A0 =C2=A0 =C2=A0<a id=3D"orgheadline1"></a>
Great. However, you need to supply modified variables and functions
names in the commit message, e.g.,

* lisp/ox-md.el (org-md-headline-title): New function.
(org-md-headline): Use new function.

>=C2=A0 =C2=A0 =C2=A0Summary of Changes
>=C2=A0 =C2=A0 =C2=A0=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D
> ---
>=C2=A0 ox-md.el | 37 +++++++++++++++++++++++--------------
>=C2=A0 1 file changed, 23 insertions(+), 14 deletions(-)
>
> diff --git a/ox-md.el b/ox-md.el
> index 0aaade6..4bd445c 100644
> --- a/ox-md.el
> +++ b/ox-md.el
> @@ -216,20 +216,29 @@ a communication channel."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0(car (last (org-export-get-headline-number
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0headline info= ))))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 "."))))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0(concat bullet (make-string (- 4 (length b= ullet)) ?\s) heading tags
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"\n\n&quo= t;
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and contents<= br> > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (replace-regexp-in-string "^" "=C2=A0 =C2=A0 " content= s)))))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0;; Use "Setext" style.
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0((eq style 'setext)
> -=C2=A0 =C2=A0 =C2=A0(concat heading tags anchor "\n"
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(make-string (length = heading) (if (=3D level 1) ?=3D ?-))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"\n\n"
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0contents))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0;; Use "atx" style.
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0(t (concat (make-string level ?#) " &= quot; heading tags anchor "\n\n"
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0contents))))))=
> -
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(concat bullet (make-string (- 4 (length b= ullet)) ?\s) heading tags "\n\n"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and contents = (replace-regexp-in-string "^" "=C2=A0 =C2=A0 " contents= )))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(t (concat (org-md-headline-title style le= vel title anchor tags) contents))))))
> +
> +
> +;; Headline Title
> +
> +(defun org-md-headline-title (style level title &optional anchor = tags)

I suggest to name it `org-md--headline-title' to highlight the fact tha= t
it is an internal function.

> +=C2=A0 "Generate a headline title in the preferred Markdown head= line style.
> +STYLE is the preferred style ('atx or 'setext)
> +LEVEL is the header level.
> +TITLE is the headline title.
> +ANCHOR is the HTML anchor tag for the section as a string.
> +TAGS are the tags set on the section."
> +=C2=A0 (let ((anchor-lines (if anchor (concat anchor "\n\n"= ) nil)))

=C2=A0 (and anchor (concat anchor "\n\n"))

> Subject: [PATCH 2/4] Add customizable footnotes-related variables
>
> Taking a cue from `ox-html.el', this patch adds
> `org-md-footnotes-section' and `org-md-footnote-format' to all= ow user
> customization of the formatting for the footnotes section and individu= al
> footnotes, respectively.

Ditto (variable names...)

> +(defcustom org-md-footnotes-section "%s%s"
> +=C2=A0 "Format for the footnotes section.

Format string for...

> +The first %s placeholder will be replaced with the localized Footnote= s section
> +heading, the second with the contents of the Footnotes section."=
> + :group 'org-export-md
> +=C2=A0 :type 'string)

You need to provide additional keywords, i.e.,

=C2=A0 :version "25.1"
=C2=A0 :package-version '(Org . "9.0")


> +(defcustom org-md-footnote-format "<sup>%s</sup>&quo= t;
> +=C2=A0 "The format for the footnote reference.
> +The %s will be replaced by the footnote reference itself."= ;
> +=C2=A0 :group 'org-export-md
> +=C2=A0 :type 'string)

Ditto.

> Subject: [PATCH 3/4] Add footnote-generating functions
>
> Introduces the following functions:
>
> * `org-md-footnote-formatted'
> * `org-md-footnote-section'

See above.

> +;;;; Footnote Section
> +
> +(defun org-md-footnote-formatted (footnote info)

Suggestion: `org-md--footnote-formatted'

> +=C2=A0 "Formats a single footnote entry FOOTNOTE.

You should specify the data type for FOOTNOTE, i.e., a cons cell

=C2=A0 (number . definition)

> +INFO is a plist with contextual information."
> +=C2=A0 (let* ((fn-num (car footnote))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(fn-text (cdr footnote))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(fn-format (plist-get info :md-foot= note-format))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(fn-anchor (format "fn.%d"= ; fn-num))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(fn-href (format " href=3D\&qu= ot;#fnr.%d\"" fn-num))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(fn-link-to-ref (org-html--anchor f= n-anchor fn-num fn-href info)))
> +=C2=A0 =C2=A0 (concat (format fn-format fn-link-to-ref) " "= fn-text "\n")))
> +
> +(defun org-md-footnote-section (info)
> +=C2=A0 "Format the footnote section.
> +INFO is a plist used as a communication channel."
> +=C2=A0 (let* ((fn-alist (org-export-collect-footnote-definitions= info))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(fn-alist (loop for (n type = raw) in fn-alist collect
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0(cons n (org-trim (org-export-data raw info)))))=

`cl-loop'

> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(headline-style (plist-get info :md= -headline-style))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(section-title (org-html--translate= "Footnotes" info)))
> +=C2=A0 =C2=A0 (when fn-alist
> +=C2=A0 =C2=A0 =C2=A0 (format (plist-get info :md-footnotes-section) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (org-md-headline-tit= le headline-style 1 section-title)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (mapconcat #'(la= mbda (fn) (org-md-footnote-formatted fn info))

=C2=A0 (mapconcat (lambda (fn) ...) ...)

> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0fn-alist
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0"\n")))))
> +
>=C2=A0 ;;;; Template
>
>=C2=A0 (defun org-md-inner-template (contents info)
> --
> 2.9.2
>
>
> From a2e353da09d0db9bbde14641bd94e12e156a143c Mon Sep 17 00:00:00= 2001
> From: Jake Romer <jkrmr@github.com>
> Date: Sat, 13 Aug 2016 13:11:26 -0400
> Subject: [PATCH 4/4] Update org-md-inner-template to Markdown footnote= s
>
> Updates `org-md-inner-template' to use `org-md-footnotes-section&#= 39; to
> generate a Markdown version of the footnotes section.
>
> Also appends `:md-footnote-format' and `md-footnotes-section' = to the
> exporter :options-alist.
> ---
>=C2=A0 ox-md.el | 15 +++++++++++++--
>=C2=A0 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/ox-md.el b/ox-md.el
> index 19b8912..7d78ff7 100644
> --- a/ox-md.el
> +++ b/ox-md.el
> @@ -105,7 +105,10 @@ The %s will be replaced by the footnote reference= itself."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= src-block . org-md-example-block)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= template . org-md-template)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= verbatim . org-md-verbatim))
> -=C2=A0 :options-alist '((:md-headline-style nil nil org-md-headli= ne-style)))
> +=C2=A0 :options-alist
> +=C2=A0 '((:md-headline-style nil nil org-md-headline-style)
> +=C2=A0 =C2=A0 (:md-footnote-format nil nil org-md-footnote-format) > +=C2=A0 =C2=A0 (:md-footnotes-section nil nil org-md-footnotes-section= )))

These new parameters need to be documented in the manual: (info "(org)=
Publishing options").

Would you mind providing an entry in ORG-NEWS and send again the patches from root directory so I can apply them?

Thank you!

Regards,

--
Nicolas Goaziou

--001a114dfab4bfdaa7053aa25b44-- --001a114dfab4bfdabc053aa25b46 Content-Type: application/octet-stream; name="render-fn-as-md.patch" Content-Disposition: attachment; filename="render-fn-as-md.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_is5lsf4f0 RnJvbSBjMWQ4NmQ4NzI4MDBkMzVkYzEzZTk1MjMzMzUxNTRhNmNjOWExMWNhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWtlIFJvbWVyIDxqa3JtckBnaXRodWIuY29tPgpEYXRlOiBT dW4sIDIxIEF1ZyAyMDE2IDE0OjA4OjI5IC0wNzAwClN1YmplY3Q6IFtQQVRDSF0gb3gtbWQuZWw6 IEV4cG9ydCBmb290bm90ZXMgc2VjdGlvbiBhcyBNYXJrZG93bgoKKiBsaXNwL294LW1kLmVsIChv cmctbWQtLWhlYWRsaW5lLXRpdGxlKTogTmV3IGZ1bmN0aW9uLiAgRXh0cmFjdCBsb2dpYwp1c2Vk IHRvIGdlbmVyYXRlIHNlY3Rpb24gaGVhZGVyIGluIHRoZSBwcmVmZXJyZWQgc3R5bGUgb2YKTWFy a2Rvd24gKGkuZS4sIHNldGV4dCBvciBhdHgpLgoob3JnLW1kLWhlYWRsaW5lKTogVXNlIGBvcmct bWQtaGVhZGxpbmUtdGl0bGUnIHRvIGdlbmVyYXRlIHNlY3Rpb24KaGVhZGVycy4KKG9yZy1tZC0t Zm9vdG5vdGUtZm9ybWF0dGVkKTogTmV3IGZ1bmN0aW9uLiAgRm9ybWF0IGEgc2luZ2xlIGZvb3Ru b3RlCmVudHJ5IGFzIE1hcmtkb3duLCB1c2luZyBIVE1MIG9ubHkgd2hlcmUgbmVjZXNzYXJ5Lgoo b3JnLW1kLWZvb3Rub3RlLXNlY3Rpb24pOiBOZXcgZnVuY3Rpb24uICBGb3JtYXQgdGhlIGZvb3Ru b3RlIHNlY3Rpb24sCmluY2x1ZGluZyB0aGUgc2VjdGlvbiB0aXRsZSB1c2luZyBgb3JnLW1kLS1o ZWFkbGluZS10aXRsZScgYW5kCmluZGl2aWR1YWwgZW50cmllcyB1c2luZyBgb3JnLW1kLS1mb290 bm90ZS1mb3JtYXR0ZWQnLgoob3JnLW1kLWlubmVyLXRlbXBsYXRlKTogVXBkYXRlIHRvIHVzZSBg b3JnLW1kLWZvb3Rub3RlLXNlY3Rpb24nLgoob3JnLW1kLWZvb3Rub3Rlcy1zZWN0aW9uKTogTmV3 IGN1c3RvbWl6YWJsZSB2YXJpYWJsZS4gIEZvcm1hdCBzdHJpbmcgZm9yCmZvb3Rub3RlcyBzZWN0 aW9uLgoob3JnLW1kLWZvb3Rub3RlLWZvcm1hdCk6IE5ldyBjdXN0b21pemFibGUgdmFyaWFibGUu ICBGb3JtYXQgc3RyaW5nIGZvcgppbmRpdmlkdWFsIGZvb3Rub3RlLgoKVXBkYXRlIG94LW1kLmVs IHRvIGV4cG9ydCB0aGUgRm9vdG5vdGVzIHNlY3Rpb24gYXMgTWFya2Rvd24sIHVzaW5nIEhUTUwK b25seSB3aGVyZSBuZWNlc3NhcnkgLSBuYW1lbHksIGluIGZvb3Rub3RlIGFuZCBmb290bm90ZSBy ZWZlcmVuY2UgbGlua3MuCi0tLQogZG9jL29yZy50ZXhpICB8ICAgMiArKwogZXRjL09SRy1ORVdT ICB8ICAxMSArKysrKysrCiBsaXNwL294LW1kLmVsIHwgMTAwICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0KIDMgZmlsZXMgY2hhbmdlZCwg OTcgaW5zZXJ0aW9ucygrKSwgMTYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZG9jL29yZy50 ZXhpIGIvZG9jL29yZy50ZXhpCmluZGV4IDk4NjgxMTMuLjI2ZWYzNzYgMTAwNjQ0Ci0tLSBhL2Rv Yy9vcmcudGV4aQorKysgYi9kb2Mvb3JnLnRleGkKQEAgLTE0NDQ0LDYgKzE0NDQ0LDggQEAgaG93 ZXZlciwgb3ZlcnJpZGUgZXZlcnl0aGluZy4KIAogQG11bHRpdGFibGUge0Bjb2RlezptZC1oZWFk bGluZS1zdHlsZX19IHtAY29kZXtvcmctbWQtaGVhZGxpbmUtc3R5bGV9fQogQGl0ZW0gQGNvZGV7 Om1kLWhlYWRsaW5lLXN0eWxlfSBAdGFiIEBjb2Rle29yZy1tZC1oZWFkbGluZS1zdHlsZX0KK0Bp dGVtIEBjb2RlezptZC1mb290bm90ZS1mb3JtYXR9IEB0YWIgQGNvZGV7b3JnLW1kLWZvb3Rub3Rl LWZvcm1hdH0KK0BpdGVtIEBjb2RlezptZC1mb290bm90ZXMtc2VjdGlvbn0gQHRhYiBAY29kZXtv cmctbWQtZm9vdG5vdGVzLXNlY3Rpb259CiBAZW5kIG11bHRpdGFibGUKIAogQHN1YnN1YmhlYWRp bmcgT0RUIHNwZWNpZmljIHByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2V0Yy9PUkctTkVXUyBiL2V0 Yy9PUkctTkVXUwppbmRleCAyN2I2YWM5Li45MWE0NThiIDEwMDY0NAotLS0gYS9ldGMvT1JHLU5F V1MKKysrIGIvZXRjL09SRy1ORVdTCkBAIC0zNzMsNiArMzczLDEyIEBAIEl0IHJlcGxhY2VzIHRo ZSBkZXByZWNhdGVkIH5uZXh0fiBhcmd1bWVudCB0byB+b3JnLXByZXZpb3VzLWxpbmUtZW1wdHkt cH4uCiAqKiogfm9yZy1zaG93LWNoaWxkcmVufiAKIEl0IGlzIGEgZmFzdGVyIGltcGxlbWVudGF0 aW9uIG9mIH5vdXRsaW5lLXNob3ctY2hpbGRyZW5+LgogCisqKiogfm9yZy1tZC1oZWFkbGluZX4K K0dlbmVyYXRlcyBhIE1hcmtkb3duIHNlY3Rpb24gaGVhZGxpbmUgaW4gdGhlIHByZWZlcnJlZCBz dHlsZSAoU2V0ZXh0IG9yIEF0eCkuCisKKyoqKiB+b3JnLW1kLWZvb3Rub3RlLXNlY3Rpb25+CitF eHBvcnRzIGEgZm9vdG5vdGUgc2VjdGlvbiBhcyBNYXJrZG93bi4KKwogKiogUmVtb3ZlZCBmdW5j dGlvbnMKICoqKiB+b3JnLWFnZW5kYS1maWx0ZXItYnktdGFnLXJlZmluZX4gaGFzIGJlZW4gcmVt b3ZlZC4KIFVzZSB+b3JnLWFnZW5kYS1maWx0ZXItYnktdGFnfiBpbnN0ZWFkLgpAQCAtNTAzLDYg KzUwOSwxMSBAQCBtb2RpZmllZCBhbnl3YXkuCiBUaGV5IGFyZSBzdGlsbCBzdXBwb3J0ZWQgaW4g T3JnIDkuMCBidXQgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQgaW4KIGEgbGF0ZXIgcmVsZWFz ZS4gIFVzZSB+ZmlsZX4gbGluayB0eXBlIGFsb25nIHdpdGggdW5pdmVyc2FsIGFyZ3VtZW50cwog dG8gZm9yY2Ugb3BlbmluZyBpdCBpbiBlaXRoZXIgRW1hY3Mgb3Igd2l0aCBzeXN0ZW0gYXBwbGlj YXRpb24uCisqKiogTWFya2Rvd24gZm9vdG5vdGUgZXhwb3J0IGN1c3RvbWl6YXRpb24KK1Zhcmlh YmxlcyB+b3JnLW1kLWZvb3Rub3Rlcy1zZWN0aW9ufiBhbmQgfm9yZy1tZC1mb290bm90ZS1mb3Jt YXR+CitpbnRyb2R1Y2VkIGZvciBveC1tZC5lbC4gIEJvdGggbmV3IHZhcmlhYmxlcyBkZWZpbmUg dGVtcGxhdGUgc3RyaW5ncword2hpY2ggY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBmb3Jt YXQgb2YgdGhlIGV4cG9ydGVkIGZvb3Rub3Rlcworc2VjdGlvbiBhbmQgaW5kaXZpZHVhbCBmb290 bm90ZXMsIHJlc3BlY3RpdmVseS4KICogVmVyc2lvbiA4LjMKIAogKiogSW5jb21wYXRpYmxlIGNo YW5nZXMKZGlmZiAtLWdpdCBhL2xpc3Avb3gtbWQuZWwgYi9saXNwL294LW1kLmVsCmluZGV4IDc2 MzVmYzcuLjQ2N2ZlNzMgMTAwNjQ0Ci0tLSBhL2xpc3Avb3gtbWQuZWwKKysrIGIvbGlzcC9veC1t ZC5lbApAQCAtNTEsNiArNTEsMjUgQEAgVGhpcyB2YXJpYWJsZSBjYW4gYmUgc2V0IHRvIGVpdGhl ciBgYXR4JyBvciBgc2V0ZXh0Jy4iCiAJICAoY29uc3QgOnRhZyAiVXNlIFwiU2V0ZXh0XCIgc3R5 bGUiIHNldGV4dCkpKQogCiAKKzs7OzsgRm9vdG5vdGVzCisKKyhkZWZjdXN0b20gb3JnLW1kLWZv b3Rub3Rlcy1zZWN0aW9uICIlcyVzIgorICAiRm9ybWF0IHN0cmluZyBmb3IgdGhlIGZvb3Rub3Rl cyBzZWN0aW9uLgorVGhlIGZpcnN0ICVzIHBsYWNlaG9sZGVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0 aCB0aGUgbG9jYWxpemVkIEZvb3Rub3RlcyBzZWN0aW9uCitoZWFkaW5nLCB0aGUgc2Vjb25kIHdp dGggdGhlIGNvbnRlbnRzIG9mIHRoZSBGb290bm90ZXMgc2VjdGlvbi4iCisgOmdyb3VwICdvcmct ZXhwb3J0LW1kCisgOnR5cGUgJ3N0cmluZworIDp2ZXJzaW9uICIyNS4xIgorIDpwYWNrYWdlLXZl cnNpb24gJyhPcmcgLiAiOS4wIikpCisKKyhkZWZjdXN0b20gb3JnLW1kLWZvb3Rub3RlLWZvcm1h dCAiPHN1cD4lczwvc3VwPiIKKyAgIkZvcm1hdCBzdHJpbmcgZm9yIHRoZSBmb290bm90ZSByZWZl cmVuY2UuCitUaGUgJXMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZm9vdG5vdGUgcmVmZXJlbmNl IGl0c2VsZi4iCisgIDpncm91cCAnb3JnLWV4cG9ydC1tZAorICA6dHlwZSAnc3RyaW5nCisgIDp2 ZXJzaW9uICIyNS4xIgorICA6cGFja2FnZS12ZXJzaW9uICcoT3JnIC4gIjkuMCIpKQorCiAMCiA7 OzsgRGVmaW5lIEJhY2stRW5kCiAKQEAgLTg5LDcgKzEwOCwxMCBAQCBUaGlzIHZhcmlhYmxlIGNh biBiZSBzZXQgdG8gZWl0aGVyIGBhdHgnIG9yIGBzZXRleHQnLiIKIAkJICAgICAoc3JjLWJsb2Nr IC4gb3JnLW1kLWV4YW1wbGUtYmxvY2spCiAJCSAgICAgKHRlbXBsYXRlIC4gb3JnLW1kLXRlbXBs YXRlKQogCQkgICAgICh2ZXJiYXRpbSAuIG9yZy1tZC12ZXJiYXRpbSkpCi0gIDpvcHRpb25zLWFs aXN0ICcoKDptZC1oZWFkbGluZS1zdHlsZSBuaWwgbmlsIG9yZy1tZC1oZWFkbGluZS1zdHlsZSkp KQorICA6b3B0aW9ucy1hbGlzdAorICAnKCg6bWQtaGVhZGxpbmUtc3R5bGUgbmlsIG5pbCBvcmct bWQtaGVhZGxpbmUtc3R5bGUpCisgICAgKDptZC1mb290bm90ZS1mb3JtYXQgbmlsIG5pbCBvcmct bWQtZm9vdG5vdGUtZm9ybWF0KQorICAgICg6bWQtZm9vdG5vdGVzLXNlY3Rpb24gbmlsIG5pbCBv cmctbWQtZm9vdG5vdGVzLXNlY3Rpb24pKSkKIAogDAogOzs7IEZpbHRlcnMKQEAgLTIxNSwyMCAr MjM3LDI5IEBAIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLiIKIAkJCSAgKGNhciAobGFzdCAob3Jn LWV4cG9ydC1nZXQtaGVhZGxpbmUtbnVtYmVyCiAJCQkJICAgICAgaGVhZGxpbmUgaW5mbykpKSkK IAkJCSAiLiIpKSkpCi0JICAoY29uY2F0IGJ1bGxldCAobWFrZS1zdHJpbmcgKC0gNCAobGVuZ3Ro IGJ1bGxldCkpID9ccykgaGVhZGluZyB0YWdzCi0JCSAgIlxuXG4iCi0JCSAgKGFuZCBjb250ZW50 cwotCQkgICAgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAiXiIgIiAgICAiIGNvbnRlbnRz KSkpKSkKLSAgICAgICA7OyBVc2UgIlNldGV4dCIgc3R5bGUuCi0gICAgICAgKChlcSBzdHlsZSAn c2V0ZXh0KQotCShjb25jYXQgaGVhZGluZyB0YWdzIGFuY2hvciAiXG4iCi0JCShtYWtlLXN0cmlu ZyAobGVuZ3RoIGhlYWRpbmcpIChpZiAoPSBsZXZlbCAxKSA/PSA/LSkpCi0JCSJcblxuIgotCQlj b250ZW50cykpCi0gICAgICAgOzsgVXNlICJhdHgiIHN0eWxlLgotICAgICAgICh0IChjb25jYXQg KG1ha2Utc3RyaW5nIGxldmVsID8jKSAiICIgaGVhZGluZyB0YWdzIGFuY2hvciAiXG5cbiIKLQkJ ICBjb250ZW50cykpKSkpKQotCisJICAoY29uY2F0IGJ1bGxldCAobWFrZS1zdHJpbmcgKC0gNCAo bGVuZ3RoIGJ1bGxldCkpID9ccykgaGVhZGluZyB0YWdzICJcblxuIgorCQkgIChhbmQgY29udGVu dHMgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAiXiIgIiAgICAiIGNvbnRlbnRzKSkpKSkKKyAg ICAgICAodCAoY29uY2F0IChvcmctbWQtLWhlYWRsaW5lLXRpdGxlIHN0eWxlIGxldmVsIHRpdGxl IGFuY2hvciB0YWdzKSBjb250ZW50cykpKSkpKQorCisKKzs7IEhlYWRsaW5lIFRpdGxlCisKKyhk ZWZ1biBvcmctbWQtLWhlYWRsaW5lLXRpdGxlIChzdHlsZSBsZXZlbCB0aXRsZSAmb3B0aW9uYWwg YW5jaG9yIHRhZ3MpCisgICJHZW5lcmF0ZSBhIGhlYWRsaW5lIHRpdGxlIGluIHRoZSBwcmVmZXJy ZWQgTWFya2Rvd24gaGVhZGxpbmUgc3R5bGUuCitTVFlMRSBpcyB0aGUgcHJlZmVycmVkIHN0eWxl ICgnYXR4IG9yICdzZXRleHQpCitMRVZFTCBpcyB0aGUgaGVhZGVyIGxldmVsLgorVElUTEUgaXMg dGhlIGhlYWRsaW5lIHRpdGxlLgorQU5DSE9SIGlzIHRoZSBIVE1MIGFuY2hvciB0YWcgZm9yIHRo ZSBzZWN0aW9uIGFzIGEgc3RyaW5nLgorVEFHUyBhcmUgdGhlIHRhZ3Mgc2V0IG9uIHRoZSBzZWN0 aW9uLiIKKyAgKGxldCAoKGFuY2hvci1saW5lcyAoYW5kIGFuY2hvciAoY29uY2F0IGFuY2hvciAi XG5cbiIpKSkpCisgICAgOzsgVXNlICJTZXRleHQiIHN0eWxlCisgICAgKGlmIChhbmQgKGVxIHN0 eWxlICdzZXRleHQpICg8IGxldmVsIDMpKQorICAgICAgICAobGV0KiAoKHVuZGVybGluZS1jaGFy IChpZiAoPSBsZXZlbCAxKSA/PSA/LSkpCisgICAgICAgICAgICAgICAodW5kZXJsaW5lIChjb25j YXQgKG1ha2Utc3RyaW5nIChsZW5ndGggdGl0bGUpIHVuZGVybGluZS1jaGFyKSAiXG4iKSkpCisg ICAgICAgICAgKGNvbmNhdCAiXG4iIGFuY2hvci1saW5lcyB0aXRsZSB0YWdzICJcbiIgdW5kZXJs aW5lICJcbiIpKQorICAgICAgICA7OyBVc2UgIkF0eCIgc3R5bGUKKyAgICAgICAgKGxldCAoKGxl dmVsLW1hcmsgKG1ha2Utc3RyaW5nIGxldmVsID8jKSkpCisgICAgICAgICAgKGNvbmNhdCAiXG4i IGFuY2hvci1saW5lcyBsZXZlbC1tYXJrICIgIiB0aXRsZSB0YWdzICJcblxuIikpKSkpCiAKIDs7 OzsgSG9yaXpvbnRhbCBSdWxlCiAKQEAgLTQ2NSw2ICs0OTYsMzUgQEAgYSBjb21tdW5pY2F0aW9u IGNoYW5uZWwuIgogICBjb250ZW50cykKIAogCis7Ozs7IEZvb3Rub3RlIFNlY3Rpb24KKworKGRl ZnVuIG9yZy1tZC0tZm9vdG5vdGUtZm9ybWF0dGVkIChmb290bm90ZSBpbmZvKQorICAiRm9ybWF0 cyBhIHNpbmdsZSBmb290bm90ZSBlbnRyeSBGT09UTk9URS4KK0ZPT1ROT1RFIGlzIGEgY29ucyBj ZWxsIG9mIHRoZSBmb3JtIChudW1iZXIgLiBkZWZpbml0aW9uKS4KK0lORk8gaXMgYSBwbGlzdCB3 aXRoIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgorICAobGV0KiAoKGZuLW51bSAoY2FyIGZvb3Ru b3RlKSkKKyAgICAgICAgIChmbi10ZXh0IChjZHIgZm9vdG5vdGUpKQorICAgICAgICAgKGZuLWZv cm1hdCAocGxpc3QtZ2V0IGluZm8gOm1kLWZvb3Rub3RlLWZvcm1hdCkpCisgICAgICAgICAoZm4t YW5jaG9yIChmb3JtYXQgImZuLiVkIiBmbi1udW0pKQorICAgICAgICAgKGZuLWhyZWYgKGZvcm1h dCAiIGhyZWY9XCIjZm5yLiVkXCIiIGZuLW51bSkpCisgICAgICAgICAoZm4tbGluay10by1yZWYg KG9yZy1odG1sLS1hbmNob3IgZm4tYW5jaG9yIGZuLW51bSBmbi1ocmVmIGluZm8pKSkKKyAgICAo Y29uY2F0IChmb3JtYXQgZm4tZm9ybWF0IGZuLWxpbmstdG8tcmVmKSAiICIgZm4tdGV4dCAiXG4i KSkpCisKKyhkZWZ1biBvcmctbWQtZm9vdG5vdGUtc2VjdGlvbiAoaW5mbykKKyAgIkZvcm1hdCB0 aGUgZm9vdG5vdGUgc2VjdGlvbi4KK0lORk8gaXMgYSBwbGlzdCB1c2VkIGFzIGEgY29tbXVuaWNh dGlvbiBjaGFubmVsLiIKKyAgKGxldCogKChmbi1hbGlzdCAob3JnLWV4cG9ydC1jb2xsZWN0LWZv b3Rub3RlLWRlZmluaXRpb25zIGluZm8pKQorICAgICAgICAgKGZuLWFsaXN0IChjbC1sb29wIGZv ciAobiB0eXBlIHJhdykgaW4gZm4tYWxpc3QgY29sbGVjdAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChjb25zIG4gKG9yZy10cmltIChvcmctZXhwb3J0LWRhdGEgcmF3IGluZm8pKSkpKQor ICAgICAgICAgKGhlYWRsaW5lLXN0eWxlIChwbGlzdC1nZXQgaW5mbyA6bWQtaGVhZGxpbmUtc3R5 bGUpKQorICAgICAgICAgKHNlY3Rpb24tdGl0bGUgKG9yZy1odG1sLS10cmFuc2xhdGUgIkZvb3Ru b3RlcyIgaW5mbykpKQorICAgICh3aGVuIGZuLWFsaXN0CisgICAgICAoZm9ybWF0IChwbGlzdC1n ZXQgaW5mbyA6bWQtZm9vdG5vdGVzLXNlY3Rpb24pCisgICAgICAgICAgICAgIChvcmctbWQtLWhl YWRsaW5lLXRpdGxlIGhlYWRsaW5lLXN0eWxlIDEgc2VjdGlvbi10aXRsZSkKKyAgICAgICAgICAg ICAgKG1hcGNvbmNhdCAobGFtYmRhIChmbikgKG9yZy1tZC0tZm9vdG5vdGUtZm9ybWF0dGVkIGZu IGluZm8pKQorICAgICAgICAgICAgICAgICAgICAgICAgIGZuLWFsaXN0CisgICAgICAgICAgICAg ICAgICAgICAgICAgIlxuIikpKSkpCisKIDs7OzsgVGVtcGxhdGUKIAogKGRlZnVuIG9yZy1tZC1p bm5lci10ZW1wbGF0ZSAoY29udGVudHMgaW5mbykKQEAgLTQ3Myw3ICs1MzMsMTUgQEAgQ09OVEVO VFMgaXMgdGhlIHRyYW5zY29kZWQgY29udGVudHMgc3RyaW5nLiAgSU5GTyBpcyBhIHBsaXN0CiBo b2xkaW5nIGV4cG9ydCBvcHRpb25zLiIKICAgOzsgTWFrZSBzdXJlIENPTlRFTlRTIGlzIHNlcGFy YXRlZCBmcm9tIHRhYmxlIG9mIGNvbnRlbnRzIGFuZAogICA7OyBmb290bm90ZXMgd2l0aCBhdCBs ZWFzdCBhIGJsYW5rIGxpbmUuCi0gIChvcmctdHJpbSAob3JnLWh0bWwtaW5uZXItdGVtcGxhdGUg KGNvbmNhdCAiXG4iIGNvbnRlbnRzICJcbiIpIGluZm8pKSkKKyAgKG9yZy10cmltIChjb25jYXQK KyAgICAgICAgICAgICA7OyBUYWJsZSBvZiBjb250ZW50cy4KKyAgICAgICAgICAgICAobGV0ICgo ZGVwdGggKHBsaXN0LWdldCBpbmZvIDp3aXRoLXRvYykpKQorICAgICAgICAgICAgICAgKHdoZW4g ZGVwdGggKG9yZy1odG1sLXRvYyBkZXB0aCBpbmZvKSkpCisgICAgICAgICAgICAgOzsgRG9jdW1l bnQgY29udGVudHMuCisgICAgICAgICAgICAgY29udGVudHMKKyAgICAgICAgICAgICAiXG4iCisg ICAgICAgICAgICAgOzsgRm9vdG5vdGVzIHNlY3Rpb24uCisgICAgICAgICAgICAgKG9yZy1tZC1m b290bm90ZS1zZWN0aW9uIGluZm8pKSkpCiAKIChkZWZ1biBvcmctbWQtdGVtcGxhdGUgKGNvbnRl bnRzIF9pbmZvKQogICAiUmV0dXJuIGNvbXBsZXRlIGRvY3VtZW50IHN0cmluZyBhZnRlciBNYXJr ZG93biBjb252ZXJzaW9uLgotLSAKMi45LjMKCg== --001a114dfab4bfdabc053aa25b46--