From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id EJCLGsRNX2e8UgAAe85BDQ:P1 (envelope-from ) for ; Sun, 15 Dec 2024 21:44:36 +0000 Received: from aspmx1.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2.migadu.com with LMTPS id EJCLGsRNX2e8UgAAe85BDQ (envelope-from ) for ; Sun, 15 Dec 2024 22:44:36 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=VwFKrzz1; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b=faRoFJdH; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1734299076; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:in-reply-to:in-reply-to:references:references: list-id:list-help:list-unsubscribe:list-subscribe:list-post: dkim-signature; bh=aPPXPBUkKv2XVk1Lu0C88aJaHe0U/icyBSnpqEzPbnE=; b=f4+sgBwIXWWudvV6Om7jd7TJOetjt+bIoeDvDx70k49fR6MdIoLXwxvfAvdhgOEDefC2v5 jOnK6p7xOHlethHxutbnFVZ+KPL/A95u2DcB9/DfBm1RnUzeQCcylMlc16Hvj+7Nkf/Xmt +rG+F+Y1+/KPccJEvSpImMbje8m8iBWvMtgUkSVcqQM13sDGnQJlqe1u/xyLQw1u7YR50k MHCloH3ohEAyGzDc7kwcfeL88+coNDBF5qfNVnlzzNE38vpzRBJxvTyI6BdagF94Ob8Msn SfWsH85lXtmnZ4t772QwMW7RCUGRzeAzYXq3wBgIYJ2d7nTVESsnIbTD/rsRhg== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=VwFKrzz1; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b=faRoFJdH; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Seal: i=1; s=key1; d=yhetil.org; t=1734299076; a=rsa-sha256; cv=none; b=uBrG6PTSRDD5Yc5EDgVwSHNfUPdhSAioNKARd/QJ/gfSHHBKRNz1XAt6Bnw7wKh5YuBpWl o9kjTLciG0VsBYE66hn23H7niwzJwRmw/+JPdNq3eyWY53mjHlxd4oMwmfNxBj/MQAFUuF UpErgVJVMVWXK5tWtzc4CRR6ocPdu6urPuuVvGdlrWEqmMu6JlQO2oDAP/rwr27D3k6Lt6 fMvK78tmXja+zUTdz6At8TH+/smjT+QhFMpxS2ENOfI2KlxmqG7Y1kYhcdoF1A4fz8d4qV VW6LhFdI/cpkaVj778iqeCmzdVEZme8MoXpvS1YvMgoELGXIjuzIic2DTu9V7A== 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 802185BE81 for ; Sun, 15 Dec 2024 22:44:35 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tMwPF-00071c-3J; Sun, 15 Dec 2024 16:44:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tMwPD-00071A-Hg for guix-patches@gnu.org; Sun, 15 Dec 2024 16:44:03 -0500 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tMwPD-0001aE-1x for guix-patches@gnu.org; Sun, 15 Dec 2024 16:44:03 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=Date:From:MIME-Version:To:In-Reply-To:References:Subject; bh=aPPXPBUkKv2XVk1Lu0C88aJaHe0U/icyBSnpqEzPbnE=; b=VwFKrzz1v4a6PRheppXUN4i04cpbzDNNo6DAoazwtMExlmXBEHeXH4LxjDws53eL/susLJe6ocRto30AI5my52bJWC3ud0ABFyKq/2k/liU8o41ETVGDR3KVKrOCVs0JDn4UpR6KLleVLLKjVr+9VUKN0cuiOmFFf3sSDp7qzSjonYGXdcDdzCrUXFJl7HIDKmUeY0hCP3/a/zNtDF8kMtBVRVnguR3QEC8kbrPQ/B56eEmhgJSwBtJFsJh5vlaBmhAPeFoq2I4ZPBIUdgfBsZYAK/WjoNHdkEm8TOG6DqClhrElw511isYTaWldbkwIYM8KUogLZ5HSL6Xvaa8fKQ==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1tMwPC-00053L-KU for guix-patches@gnu.org; Sun, 15 Dec 2024 16:44:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#74900] References: In-Reply-To: Resent-From: Daniel Khodabakhsh Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 15 Dec 2024 21:44:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 74900 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 74900@debbugs.gnu.org Received: via spool by 74900-submit@debbugs.gnu.org id=B74900.173429898919309 (code B ref 74900); Sun, 15 Dec 2024 21:44:02 +0000 Received: (at 74900) by debbugs.gnu.org; 15 Dec 2024 21:43:09 +0000 Received: from localhost ([127.0.0.1]:52423 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tMwOI-00051J-DT for submit@debbugs.gnu.org; Sun, 15 Dec 2024 16:43:08 -0500 Received: from mail-vs1-f49.google.com ([209.85.217.49]:60646) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tMwOE-00050h-0m for 74900@debbugs.gnu.org; Sun, 15 Dec 2024 16:43:05 -0500 Received: by mail-vs1-f49.google.com with SMTP id ada2fe7eead31-4b24d969db1so465936137.0 for <74900@debbugs.gnu.org>; Sun, 15 Dec 2024 13:43:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734298916; x=1734903716; darn=debbugs.gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=aPPXPBUkKv2XVk1Lu0C88aJaHe0U/icyBSnpqEzPbnE=; b=faRoFJdH6HRd7pirTwtYSjDoQbNi6VRIzfA/yB9/DFvxX6nLFd+YvB2dXqUKc6lWy3 JHsTWnnyxrUXayLfyVmeWsSiLxpkfkdKQyoOzC1U3ZudIcyVRmMA+l4diHsxRP6fXHsk uWlMXzLtq+CV3/Szl2ZsXsOYIJGHM9wGgRMRiA8KFEeVCgoDhMTOk5wW5tRki5m+2fJt Jn/vJrGTc967crtJgFA3OPpSXHmipbwM3nava2M5KohSTLLHY8RvN2l+ky/eKQ64V4S3 D+e+6eUgGEqNSRObDxmNvNnvNrK2adlYwfqoJ3Flnom3jYzjx/1fDwiZ2rkGFfpF6E3T +2/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734298916; x=1734903716; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=aPPXPBUkKv2XVk1Lu0C88aJaHe0U/icyBSnpqEzPbnE=; b=WAPKtexuYLRb6h2VnJxElPpy4fvLIqellcr+jU3cdj7YqCcCHpO5fp+WYD8abQqnhj CKfE958R3VBOcNj0ZYDyf3jEgFprhOeBl7i2h8t0sQOGoNtHX+nFcdFPwjp+sEtLvpMQ fSkGMEL0ftpeOfOKix2DXCHaJgLcqUWrpwDeGPOMUNoRNA3t3+jyd1Y2GDHdHkaeu7if iIn3Ni+O14TpdWl6v/vTOat5c7MKhfz0HHta8ri091hGHqDto+mZ6LoDdQz5z3KRdWsS qaqzqubXe911+D3wBzlUcPzloMD0t6/H7ELVoiDWzZ3Mz5qrgucUkfIbwqEC8eaFex0m Wc2Q== X-Gm-Message-State: AOJu0YwY8mjhhAE/cIcVGt0k1ofICYJ4tkSpGCm11O/JDnCQKkQHxaez +TlKrDTw7QQmK7ysw27elWeOzoH3sUMtVGvh8YmjAixCpWSyOxA9aOq9N0MNkrQK28N7j4pHTtU ulrmD+lIyeu+T9u3yOep8/niPmsQMUhR8 X-Gm-Gg: ASbGnculIa/7ykueP+uTQvoou1mgQuLRKsRevm3uUHVsuRGFr15lkT70fOzrd9UfRwR ZmFYiSe4ryygyCuSt+1A0IH5OezjeUtJ3QRwo4g== X-Google-Smtp-Source: AGHT+IFr19K5TkiMUXBK21SRW5+o1012tpWSGyHSMTSSJBQJA/03y3ctd3uWpRzx19SBTD0oedg48CyQgBi4A/WOnDY= X-Received: by 2002:a05:6102:4b13:b0:4b2:48cc:5c5a with SMTP id ada2fe7eead31-4b25dccbf77mr10224797137.15.1734298915594; Sun, 15 Dec 2024 13:41:55 -0800 (PST) MIME-Version: 1.0 From: Daniel Khodabakhsh Date: Sun, 15 Dec 2024 21:41:44 +0000 Message-ID: Content-Type: multipart/mixed; boundary="000000000000ccd36f062955ee49" X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Queue-Id: 802185BE81 X-Migadu-Scanner: mx13.migadu.com X-Migadu-Spam-Score: -5.87 X-Spam-Score: -5.87 X-TUID: vO/BqIwut/vu --000000000000ccd36f062955ee49 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sorry went over the line width limit in my diff below, here it is again: This change replaces the use of (guix build json) with (json) for the node ecosystem. Since guile-json is a dependency of Guix, and it's used elsewhere in the project, it makes sense to use this instead of rolling our own JSON implementation with (guix build json). This is one step to move away from (guix build json), there will be other changes to remove the other uses of it. Signed-off-by: Daniel Khodabakhsh Change-Id: I0c86b3039eb2f50a19f9d9650f5a73b3a473ad37 --- gnu/packages/node-xyz.scm | 148 +++++++++++-------------- guix/build-system/node.scm | 6 +- guix/build/node-build-system.scm | 181 ++++++++++++------------------- 3 files changed, 140 insertions(+), 195 deletions(-) diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm index cf6f50e3ce..decfb50a66 100644 --- a/gnu/packages/node-xyz.scm +++ b/gnu/packages/node-xyz.scm @@ -7,6 +7,7 @@ ;;; Copyright =C2=A9 2021 Dhruvin Gandhi ;;; Copyright =C2=A9 2022 Nicolas Graves ;;; Copyright =C2=A9 2023 Jelle Licht +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,14 +25,14 @@ ;;; along with GNU Guix. If not, see . (define-module (gnu packages node-xyz) - #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu packages sqlite) #:use-module (gnu packages python) #:use-module (gnu packages web) + #:use-module (guix build-system node) #:use-module (guix gexp) - #:use-module (guix packages) #:use-module (guix git-download) - #:use-module (guix build-system node)) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages)) ;;; ;;; Please: Try to add new module packages in alphabetic order. @@ -69,19 +70,17 @@ (define-public node-acorn ;; it would try to use the build environment and would block = the ;; automatic building by other packages making use of node-ac= orn. ;; TODO: Add utility function - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("prepare" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (other other)) - pkg-meta-alist))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("prepare" . _) #f) + (_ #t)) + scripts-alist))) + (other other)) + pkg-meta-alist))))) (replace 'build (lambda* (#:key inputs native-inputs #:allow-other-keys) (let ((esbuild (search-input-file (or native-inputs inputs) @@ -156,23 +155,17 @@ (define-public node-addon-api (lambda args (define new-test-script "echo stopping after pretest on Guix") - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons - '@ - (map (match-lambda - (("scripts" '@ . scripts-alist) - `("scripts" @ ,@(map (match-lambda - (("test" . _) - (cons "test" - new-test-script)) - (other - other)) - scripts-alist))) - (other - other)) - pkg-meta-alist)))))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (map + (match-lambda + (("test" . _) (cons "test" new-test-script)) + (other other)) + scripts-alist))) + (other other)) + pkg-meta-alist)))))))) (home-page "https://github.com/nodejs/node-addon-api") (synopsis "Node.js API (Node-API) header-only C++ wrappers") (description "This module contains header-only C++ wrapper classes whi= ch @@ -1221,22 +1214,19 @@ (define-public node-serialport-bindings "node-abi")))) (add-after 'chdir 'avoid-prebuild-install (lambda args - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("install" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (("gypfile" . _) - '("gypfile" . #f)) - (other - other)) - pkg-meta-alist)))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("install" . _) #f) + (_ #t)) + scripts-alist))) + (("gypfile" . _) + (cons "gypfile" #f)) + (other other)) + pkg-meta-alist)))))) #:tests? #f)) (synopsis "Abstract base class for Node SerialPort bindings") (description "Node SerialPort is a modular suite of Node.js packages f= or @@ -1522,39 +1512,33 @@ (define-public node-sqlite3 (substitute* ".npmignore" (("lib/binding") "#lib/binding # <- patched for Guix")) - (with-atomic-json-file-replacement "package.json" - (match-lambda - (('@ . pkg-meta-alist) - (match (assoc-ref pkg-meta-alist "binary") - (('@ . binary-alist) - ;; When it builds from source, node-pre-gyp supplies - ;; module_name and module_path based on the entries u= nder - ;; "binary" from "package.json", so this package's - ;; "binding.gyp" doesn't define them. Thus, we also n= eed - ;; to supply them. The GYP_DEFINES environment variab= le - ;; turns out to be the easiest way to make sure they = are - ;; propagated from npm to node-gyp to gyp. - (setenv "GYP_DEFINES" - (string-append - "module_name=3D" - (assoc-ref binary-alist "module_name") - " " - "module_path=3D" - (assoc-ref binary-alist "module_path"))))) - ;; We need to remove the install script from "package.js= on", - ;; as it would try to use node-pre-gyp and would block t= he - ;; automatic building performed by `npm install`. - (cons '@ (map (match-lambda - (("scripts" @ . scripts-alist) - `("scripts" @ ,@(filter (match-lambda - (("install" .= _) - #f) - (_ - #t)) - scripts-alist))= ) - (other - other)) - pkg-meta-alist)))))))))) + (with-atomic-json-file-replacement (lambda (pkg-meta-alist) + (let ((binary-alist (assoc-ref pkg-meta-alist "binary"))) + ;; When it builds from source, node-pre-gyp supplies + ;; module_name and module_path based on the entries under + ;; "binary" from "package.json", so this package's + ;; "binding.gyp" doesn't define them. Thus, we also need + ;; to supply them. The GYP_DEFINES environment variable + ;; turns out to be the easiest way to make sure they are + ;; propagated from npm to node-gyp to gyp. + (setenv "GYP_DEFINES" (string-append + "module_name=3D" + (assoc-ref binary-alist "module_name") + " module_path=3D" + (assoc-ref binary-alist "module_path")))) + ;; We need to remove the install script from "package.json"= , + ;; as it would try to use node-pre-gyp and would block the + ;; automatic building performed by `npm install`. + (map + (match-lambda + (("scripts" . scripts-alist) + (cons "scripts" (filter + (match-lambda + (("install" . _) #f) + (_ #t)) + scripts-alist))) + (other other)) + pkg-meta-alist)))))))) (home-page "https://github.com/mapbox/node-sqlite3") (synopsis "Node.js bindings for SQLite3") (description diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm index 57fe5f6030..425b8cd9b3 100644 --- a/guix/build-system/node.scm +++ b/guix/build-system/node.scm @@ -4,6 +4,7 @@ ;;; Copyright =C2=A9 2021 Ludovic Court=C3=A8s ;;; Copyright =C2=A9 2021 Pierre Langlois ;;; Copyright =C2=A9 2021 Philip McGrath +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,7 +37,10 @@ (define-module (guix build-system node) (define %node-build-system-modules ;; Build-side modules imported by default. `((guix build node-build-system) - (guix build json) + (json) + (json builder) + (json parser) + (json record) ,@%default-gnu-imported-modules)) (define (default-node) diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-syste= m.scm index fb23894bc1..46e0ddd71d 100644 --- a/guix/build/node-build-system.scm +++ b/guix/build/node-build-system.scm @@ -4,6 +4,7 @@ ;;; Copyright =C2=A9 2019, 2021 Timothy Sample ;;; Copyright =C2=A9 2021, 2022 Philip McGrath ;;; Copyright =C2=A9 2022 Liliana Marie Prikler +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -23,10 +24,10 @@ (define-module (guix build node-build-system) #:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module (guix build utils) - #:use-module (guix build json) #:use-module (ice-9 ftw) #:use-module (ice-9 regex) #:use-module (ice-9 match) + #:use-module (json) #:use-module (srfi srfi-1) #:use-module (srfi srfi-71) #:export (%standard-phases @@ -34,13 +35,14 @@ (define-module (guix build node-build-system) delete-dependencies node-build)) -(define (with-atomic-json-file-replacement file proc) +(define* (with-atomic-json-file-replacement proc + #:optional (file "package.json")) "Like 'with-atomic-file-replacement', but PROC is called with a single argument---the result of parsing FILE's contents as json---and should a va= lue to be written as json to the replacement FILE." (with-atomic-file-replacement file (lambda (in out) - (write-json (proc (read-json in)) out)))) + (scm->json (proc (json->scm in)) out)))) (define* (assoc-ref* alist key #:optional default) "Like assoc-ref, but return DEFAULT instead of #f if no value exists." @@ -48,10 +50,6 @@ (define* (assoc-ref* alist key #:optional default) (#f default) ((_ . value) value))) -(define* (jsobject-ref obj key #:optional default) - (match obj - (('@ . alist) (assoc-ref* alist key default)))) - (define* (alist-pop alist key #:optional (=3D equal?)) "Return two values, the first pair in ALIST with key KEY, and the other elements. Equality calls are made as (=3D KEY ALISTCAR)." @@ -63,67 +61,17 @@ (define* (alist-pop alist key #:optional (=3D equal?)) (values (car after) (append before (cdr after))) (values #f before)))) -(define* (alist-update alist key proc #:optional default (=3D equal?)) +(define* (alist-update alist key proc #:optional (=3D equal?)) "Return an association list like ALIST, but with KEY mapped to the resul= t of PROC applied to the first value found under the comparison (=3D KEY ALISTC= AR). -If no such value exists, use DEFAULT instead. +If no such value exists, return the list unchanged. Unlike acons, this removes the previous association of KEY (assuming it is unique), but the result may still share storage with ALIST." (let ((pair rest (alist-pop alist key =3D))) - (acons key - (proc (if (pair? pair) - (cdr pair) - default)) - rest))) - -(define (jsobject-update* js . updates) - "Return a json object like JS, but with all UPDATES applied. Each updat= e is -a list (KEY PROC [DEFAULT]), so that KEY is mapped to the result of PROC -applied to the value to which KEY is mapped in JS. If no such mapping exi= sts, -PROC is instead applied to DEFAULT, or to '#f' is no DEFAULT is specified. -The update takes place from left to right, so later UPDATERs will receive = the -values returned by earlier UPDATERs for the same KEY." - (match js - (('@ . alist) - (let loop ((alist alist) - (updates updates)) - (match updates - (() (cons '@ alist)) - (((key proc) . updates) - (loop (alist-update alist key proc #f equal?) updates)) - (((key proc default) . updates) - (loop (alist-update alist key proc default equal?) updates))))))= ) - -(define (jsobject-union combine seed . objects) - "Merge OBJECTS into SEED by applying (COMBINE KEY VAL0 VAL), where VAL0 -is the value found in the (possibly updated) SEED and VAL is the new value -found in one of the OBJECTS." - (match seed - (('@ . aseed) - (match objects - (() seed) - ((('@ . alists) ...) - (cons - '@ - (fold (lambda (alist aseed) - (if (null? aseed) alist - (fold - (match-lambda* - (((k . v) aseed) - (let ((pair tail (alist-pop alist k))) - (match pair - (#f (acons k v aseed)) - ((_ . v0) (acons k (combine k v0 v) aseed))))= )) - aseed - alist))) - aseed - alists))))))) + (if (pair? pair) + (acons key (proc (cdr pair)) rest) + alist))) -;; Possibly useful helper functions: -;; (define (newest key val0 val) val) -;; (define (unkeyed->keyed proc) (lambda (_key val0 val) (proc val0 val))) - - ;;; ;;; Phases. ;;; @@ -142,8 +90,8 @@ (define (set-home . _) (define (module-name module) (let* ((package.json (string-append module "/package.json")) - (package-meta (call-with-input-file package.json read-json))) - (jsobject-ref package-meta "name"))) + (package-meta (call-with-input-file package.json json->scm))) + (assoc-ref package-meta "name"))) (define (index-modules input-paths) (define (list-modules directory) @@ -167,49 +115,60 @@ (define* (patch-dependencies #:key inputs #:allow-other-keys) (define index (index-modules (map cdr inputs))) - (define resolve-dependencies - (match-lambda - (('@ . alist) - (cons '@ (map (match-lambda - ((key . value) - (cons key (hash-ref index key value)))) - alist))))) + (define (resolve-dependencies dependencies) + (map + (match-lambda + ((dependency . version) + (cons dependency (hash-ref index dependency version)))) + dependencies)) - (with-atomic-json-file-replacement "package.json" + (with-atomic-json-file-replacement (lambda (pkg-meta) - (jsobject-update* - pkg-meta - `("devDependencies" ,resolve-dependencies (@)) - `("dependencies" ,(lambda (deps) - (resolve-dependencies - (jsobject-union - (lambda (k a b) b) - (jsobject-ref pkg-meta "peerDependencies" '(@= )) - deps))) - (@))))) + (fold + (lambda (proc pkg-meta) (proc pkg-meta)) + pkg-meta + (list + (lambda (pkg-meta) + (alist-update pkg-meta "devDependencies" resolve-dependencies)= ) + (lambda (pkg-meta) + (assoc-set! + pkg-meta + "dependencies" + (resolve-dependencies + ; Combined "peerDependencies" and "dependencies" dependenc= ies + ; with "dependencies" taking precedent. + (fold + (lambda (dependency dependencies) + (apply assoc-set! dependencies dependency)) + (assoc-ref* pkg-meta "peerDependencies" '()) + (assoc-ref* pkg-meta "dependencies" '()) + )))))))) #t) -(define (delete-dependencies absent) +(define (delete-dependencies dependencies-to-remove) "Rewrite 'package.json' to allow the build to proceed without packages -listed in ABSENT, a list of strings naming npm packages. +listed in 'dependencies-to-remove', a list of strings naming npm packages. To prevent the deleted dependencies from being reintroduced, use this func= tion only after the 'patch-dependencies' phase." - (define delete-from-jsobject - (match-lambda - (('@ . alist) - (cons '@ (filter (match-lambda - ((k . _) - (not (member k absent)))) - alist))))) - - (with-atomic-json-file-replacement "package.json" + (with-atomic-json-file-replacement (lambda (pkg-meta) - (jsobject-update* - pkg-meta - `("devDependencies" ,delete-from-jsobject (@)) - `("dependencies" ,delete-from-jsobject (@)) - `("peerDependencies" ,delete-from-jsobject (@)))))) + (fold + (lambda (dependency-key pkg-meta) + (alist-update + pkg-meta + dependency-key + (lambda (dependencies) + (remove + (lambda (dependency) + (member (car dependency) dependencies-to-remove)) + dependencies)))) + pkg-meta + (list + "devDependencies" + "dependencies" + "peerDependencies" + "optionalDependencies"))))) (define* (delete-lockfiles #:key inputs #:allow-other-keys) "Delete 'package-lock.json', 'yarn.lock', and 'npm-shrinkwrap.json', if = they @@ -228,8 +187,8 @@ (define* (configure #:key outputs inputs #:allow-other-= keys) #t)) (define* (build #:key inputs #:allow-other-keys) - (let ((package-meta (call-with-input-file "package.json" read-json))) - (if (jsobject-ref (jsobject-ref package-meta "scripts" '(@)) "build" #= f) + (let ((package-meta (call-with-input-file "package.json" json->scm))) + (if (assoc-ref* (assoc-ref* package-meta "scripts" '()) "build" #f) (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm"))) (invoke npm "run" "build")) (format #t "there is no build script to run~%")) @@ -301,22 +260,20 @@ (define* (avoid-node-gyp-rebuild #:key outputs #:allow-other-keys) ;; even need to overwrite this file. Therefore, let's use some helpers ;; that we'd otherwise not need. (define pkg-meta - (call-with-input-file installed-package.json read-json)) + (call-with-input-file installed-package.json json->scm)) (define scripts - (jsobject-ref pkg-meta "scripts" '(@))) - (define (jsobject-set js key val) - (jsobject-update* js (list key (const val)))) + (assoc-ref* pkg-meta "scripts" '())) - (when (equal? "node-gyp rebuild" (jsobject-ref scripts "install" #f)) + (when (equal? "node-gyp rebuild" (assoc-ref* scripts "install" #f)) (call-with-output-file installed-package.json (lambda (out) - (write-json - (jsobject-set pkg-meta - "scripts" - (jsobject-set scripts - "install" - "echo Guix: avoiding node-gyp rebuild= ")) - out))))) + (scm->json + (assoc-set! pkg-meta + "scripts" + (assoc-set! scripts + "install" + "echo Guix: avoiding node-gyp rebuild")) + out))))) (define %standard-phases (modify-phases gnu:%standard-phases base-commit: cfd4f56f75a20b6732d463180d211f796c9032e5 --=20 2.46.0 --000000000000ccd36f062955ee49 Content-Type: text/x-patch; charset="UTF-8"; name="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch" Content-Disposition: attachment; filename="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m4q4sbju0 RnJvbSA2OTQ4OWFjNjNmMzk3ODQ5ZDUxYmMyMDY1NDAyZWRiMWEwMWQwODQ2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21h aWwuY29tPgpEYXRlOiBTdW4sIDE1IERlYyAyMDI0IDExOjMwOjMzIC0wODAwClN1YmplY3Q6IFtQ QVRDSF0gUmVwbGFjZSAoZ3VpeCBidWlsZCBqc29uKSB3aXRoIChqc29uKSBpbiBub2RlIGJ1aWxk IHN5c3RlbQoKVGhpcyBjaGFuZ2UgcmVwbGFjZXMgdGhlIHVzZSBvZiAoZ3VpeCBidWlsZCBqc29u KSB3aXRoIChqc29uKSBmb3IgdGhlIG5vZGUgZWNvc3lzdGVtLgpTaW5jZSBndWlsZS1qc29uIGlz IGEgZGVwZW5kZW5jeSBvZiBHdWl4LCBhbmQgaXQncyB1c2VkIGVsc2V3aGVyZSBpbiB0aGUgcHJv amVjdCwgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZiByb2xsaW5nIG91ciBv d24gSlNPTiBpbXBsZW1lbnRhdGlvbiB3aXRoIChndWl4IGJ1aWxkIGpzb24pLgpUaGlzIGlzIG9u ZSBzdGVwIHRvIG1vdmUgYXdheSBmcm9tIChndWl4IGJ1aWxkIGpzb24pLCB0aGVyZSB3aWxsIGJl IG90aGVyIGNoYW5nZXMgdG8gcmVtb3ZlIHRoZSBvdGhlciB1c2VzIG9mIGl0LgoKU2lnbmVkLW9m Zi1ieTogRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KQ2hhbmdl LUlkOiBJMGM4NmIzMDM5ZWIyZjUwYTE5ZjlkOTY1MGY1YTczYjNhNDczYWQzNwotLS0KIGdudS9w YWNrYWdlcy9ub2RlLXh5ei5zY20gICAgICAgIHwgMTQ4ICsrKysrKysrKysrLS0tLS0tLS0tLS0t LS0KIGd1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtICAgICAgIHwgICA2ICstCiBndWl4L2J1aWxk L25vZGUtYnVpbGQtc3lzdGVtLnNjbSB8IDE4MSArKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t LS0tCiAzIGZpbGVzIGNoYW5nZWQsIDE0MCBpbnNlcnRpb25zKCspLCAxOTUgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvZ251L3BhY2thZ2VzL25vZGUteHl6LnNjbSBiL2dudS9wYWNrYWdlcy9u b2RlLXh5ei5zY20KaW5kZXggY2Y2ZjUwZTNjZS4uZGVjZmI1MGE2NiAxMDA2NDQKLS0tIGEvZ251 L3BhY2thZ2VzL25vZGUteHl6LnNjbQorKysgYi9nbnUvcGFja2FnZXMvbm9kZS14eXouc2NtCkBA IC03LDYgKzcsNyBAQAogOzs7IENvcHlyaWdodCDCqSAyMDIxIERocnV2aW4gR2FuZGhpIDxjb250 YWN0QGRocnV2aW4uZGV2PgogOzs7IENvcHlyaWdodCDCqSAyMDIyIE5pY29sYXMgR3JhdmVzIDxu Z3JhdmVzQG5ncmF2ZXMuZnI+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjMgSmVsbGUgTGljaHQgPGps aWNodEBmc2ZlLm9yZz4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hvZGFiYWtoc2gg PGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg R05VIEd1aXguCiA7OzsKQEAgLTI0LDE0ICsyNSwxNCBAQAogOzs7IGFsb25nIHdpdGggR05VIEd1 aXguICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKIChkZWZp bmUtbW9kdWxlIChnbnUgcGFja2FnZXMgbm9kZS14eXopCi0gICM6dXNlLW1vZHVsZSAoKGd1aXgg bGljZW5zZXMpICM6cHJlZml4IGxpY2Vuc2U6KQogICAjOnVzZS1tb2R1bGUgKGdudSBwYWNrYWdl cyBzcWxpdGUpCiAgICM6dXNlLW1vZHVsZSAoZ251IHBhY2thZ2VzIHB5dGhvbikKICAgIzp1c2Ut bW9kdWxlIChnbnUgcGFja2FnZXMgd2ViKQorICAjOnVzZS1tb2R1bGUgKGd1aXggYnVpbGQtc3lz dGVtIG5vZGUpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnZXhwKQotICAjOnVzZS1tb2R1bGUgKGd1 aXggcGFja2FnZXMpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnaXQtZG93bmxvYWQpCi0gICM6dXNl LW1vZHVsZSAoZ3VpeCBidWlsZC1zeXN0ZW0gbm9kZSkpCisgICM6dXNlLW1vZHVsZSAoKGd1aXgg bGljZW5zZXMpICM6cHJlZml4IGxpY2Vuc2U6KQorICAjOnVzZS1tb2R1bGUgKGd1aXggcGFja2Fn ZXMpKQogCiA7OzsKIDs7OyBQbGVhc2U6IFRyeSB0byBhZGQgbmV3IG1vZHVsZSBwYWNrYWdlcyBp biBhbHBoYWJldGljIG9yZGVyLgpAQCAtNjksMTkgKzcwLDE3IEBAIChkZWZpbmUtcHVibGljIG5v ZGUtYWNvcm4KICAgICAgICAgICAgICA7OyBpdCB3b3VsZCB0cnkgdG8gdXNlIHRoZSBidWlsZCBl bnZpcm9ubWVudCBhbmQgd291bGQgYmxvY2sgdGhlCiAgICAgICAgICAgICAgOzsgYXV0b21hdGlj IGJ1aWxkaW5nIGJ5IG90aGVyIHBhY2thZ2VzIG1ha2luZyB1c2Ugb2Ygbm9kZS1hY29ybi4KICAg ICAgICAgICAgICA7OyBUT0RPOiBBZGQgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICAgICAgICh3 aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKLSAgICAgICAg ICAgICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBrZy1tZXRhLWFs aXN0KQotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0Y2gtbGFtYmRhCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgQCAuIHNjcmlwdHMtYWxp c3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMiIEAgLEAo ZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJwcmVwYXJlIiAuIF8pCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29u LWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAg ICAobWFwCisgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAg ICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCisgICAgICAgICAgICAgICAgICAgICAoY29u cyAic2NyaXB0cyIgKGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRh CisgICAgICAgICAgICAgICAgICAgICAgICAgKCgicHJlcGFyZSIgLiBfKSAjZikKKyAgICAgICAg ICAgICAgICAgICAgICAgICAoXyAjdCkpCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMt YWxpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQorICAgICAgICAgICAg ICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpCiAgICAgICAgICAocmVwbGFjZSAnYnVpbGQKICAgICAg ICAgICAgKGxhbWJkYSogKCM6a2V5IGlucHV0cyBuYXRpdmUtaW5wdXRzICM6YWxsb3ctb3RoZXIt a2V5cykKICAgICAgICAgICAgICAobGV0ICgoZXNidWlsZCAoc2VhcmNoLWlucHV0LWZpbGUgKG9y IG5hdGl2ZS1pbnB1dHMgaW5wdXRzKQpAQCAtMTU2LDIzICsxNTUsMTcgQEAgKGRlZmluZS1wdWJs aWMgbm9kZS1hZGRvbi1hcGkKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCiAgICAgICAgICAgICAg KGRlZmluZSBuZXctdGVzdC1zY3JpcHQKICAgICAgICAgICAgICAgICJlY2hvIHN0b3BwaW5nIGFm dGVyIHByZXRlc3Qgb24gR3VpeCIpCi0gICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmls ZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJk YQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAg ICAgICAoY29ucwotICAgICAgICAgICAgICAgICAgICdACi0gICAgICAgICAgICAgICAgICAgKG1h cCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiICdA IC4gc2NyaXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMi IEAgLEAobWFwIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKCgidGVzdCIgLiBfKQotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInRlc3QiCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXctdGVzdC1zY3JpcHQp KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3Ro ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90 aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNj cmlwdHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICBwa2ct bWV0YS1hbGlzdCkpKSkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1maWxl LXJlcGxhY2VtZW50IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAgICAgKG1h cAorICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAgICAgKCgi c2NyaXB0cyIgLiBzY3JpcHRzLWFsaXN0KQorICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInNj cmlwdHMiIChtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAg ICAgICAgICAgICAgICAgICAgICgoInRlc3QiIC4gXykgKGNvbnMgInRlc3QiIG5ldy10ZXN0LXNj cmlwdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAg ICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhl ciBvdGhlcikpCisgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAo aG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUtYWRkb24tYXBpIikKICAg ICAoc3lub3BzaXMgIk5vZGUuanMgQVBJIChOb2RlLUFQSSkgaGVhZGVyLW9ubHkgQysrIHdyYXBw ZXJzIikKICAgICAoZGVzY3JpcHRpb24gIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGhlYWRlci1vbmx5 IEMrKyB3cmFwcGVyIGNsYXNzZXMgd2hpY2gKQEAgLTEyMjEsMjIgKzEyMTQsMTkgQEAgKGRlZmlu ZS1wdWJsaWMgbm9kZS1zZXJpYWxwb3J0LWJpbmRpbmdzCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAibm9kZS1hYmkiKSkpKQogICAgICAgICAgKGFkZC1hZnRlciAnY2hkaXIg J2F2b2lkLXByZWJ1aWxkLWluc3RhbGwKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAg ICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgot ICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtn LW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAoY29ucyAnQCAobWFwIChtYXRjaC1sYW1i ZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiBAIC4gc2Ny aXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgic2NyaXB0 cyIgQCAsQChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoImluc3RhbGwiIC4gXykKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg I2YpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgI3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKCgiZ3lwZmlsZSIgLiBfKQotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAnKCJneXBmaWxlIiAuICNmKSkKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAob3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg b3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkp KSkpKSkpCisgICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAo bGFtYmRhIChwa2ctbWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAg ICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2Ny aXB0cy1hbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVy CisgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAg ICAgICAgICAoKCJpbnN0YWxsIiAuIF8pICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChf ICN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAg ICAgICAgICAgICgoImd5cGZpbGUiIC4gXykKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJn eXBmaWxlIiAjZikpCisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAg ICAgICAgICAgcGtnLW1ldGEtYWxpc3QpKSkpKSkKICAgICAgICAjOnRlc3RzPyAjZikpCiAgICAg KHN5bm9wc2lzICJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBOb2RlIFNlcmlhbFBvcnQgYmluZGlu Z3MiKQogICAgIChkZXNjcmlwdGlvbiAiTm9kZSBTZXJpYWxQb3J0IGlzIGEgbW9kdWxhciBzdWl0 ZSBvZiBOb2RlLmpzIHBhY2thZ2VzIGZvcgpAQCAtMTUyMiwzOSArMTUxMiwzMyBAQCAoZGVmaW5l LXB1YmxpYyBub2RlLXNxbGl0ZTMKICAgICAgICAgICAgICAoc3Vic3RpdHV0ZSogIi5ucG1pZ25v cmUiCiAgICAgICAgICAgICAgICAoKCJsaWIvYmluZGluZyIpCiAgICAgICAgICAgICAgICAgIiNs aWIvYmluZGluZyAjIDwtIHBhdGNoZWQgZm9yIEd1aXgiKSkKLSAgICAgICAgICAgICAod2l0aC1h dG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAgICAgICAgICAg ICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0YS1hbGlzdCkK LSAgICAgICAgICAgICAgICAgIChtYXRjaCAoYXNzb2MtcmVmIHBrZy1tZXRhLWFsaXN0ICJiaW5h cnkiKQotICAgICAgICAgICAgICAgICAgICAoKCdAIC4gYmluYXJ5LWFsaXN0KQotICAgICAgICAg ICAgICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUtcHJlLWd5cCBz dXBwbGllcwotICAgICAgICAgICAgICAgICAgICAgOzsgbW9kdWxlX25hbWUgYW5kIG1vZHVsZV9w YXRoIGJhc2VkIG9uIHRoZSBlbnRyaWVzIHVuZGVyCi0gICAgICAgICAgICAgICAgICAgICA7OyAi YmluYXJ5IiBmcm9tICJwYWNrYWdlLmpzb24iLCBzbyB0aGlzIHBhY2thZ2UncwotICAgICAgICAg ICAgICAgICAgICAgOzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3 ZSBhbHNvIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgIDs7IHRvIHN1cHBseSB0aGVtLiBUaGUg R1lQX0RFRklORVMgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgIDs7 IHR1cm5zIG91dCB0byBiZSB0aGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBzdXJlIHRoZXkgYXJlCi0g ICAgICAgICAgICAgICAgICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRv IGd5cC4KLSAgICAgICAgICAgICAgICAgICAgIChzZXRlbnYgIkdZUF9ERUZJTkVTIgotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWFwcGVuZAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIm1vZHVsZV9uYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVfbmFtZSIpCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGVf cGF0aD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1h bGlzdCAibW9kdWxlX3BhdGgiKSkpKSkKLSAgICAgICAgICAgICAgICAgIDs7IFdlIG5lZWQgdG8g cmVtb3ZlIHRoZSBpbnN0YWxsIHNjcmlwdCBmcm9tICJwYWNrYWdlLmpzb24iLAotICAgICAgICAg ICAgICAgICAgOzsgYXMgaXQgd291bGQgdHJ5IHRvIHVzZSBub2RlLXByZS1neXAgYW5kIHdvdWxk IGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgOzsgYXV0b21hdGljIGJ1aWxkaW5nIHBlcmZv cm1lZCBieSBgbnBtIGluc3RhbGxgLgotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAo bWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0 cyIgQCAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGAoInNjcmlwdHMiIEAgLEAoZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAu IF8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICNmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcgotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29u LWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAg ICAobGV0ICgoYmluYXJ5LWFsaXN0IChhc3NvYy1yZWYgcGtnLW1ldGEtYWxpc3QgImJpbmFyeSIp KSkKKyAgICAgICAgICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUt cHJlLWd5cCBzdXBwbGllcworICAgICAgICAgICAgICAgICA7OyBtb2R1bGVfbmFtZSBhbmQgbW9k dWxlX3BhdGggYmFzZWQgb24gdGhlIGVudHJpZXMgdW5kZXIKKyAgICAgICAgICAgICAgICAgOzsg ImJpbmFyeSIgZnJvbSAicGFja2FnZS5qc29uIiwgc28gdGhpcyBwYWNrYWdlJ3MKKyAgICAgICAg ICAgICAgICAgOzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3ZSBh bHNvIG5lZWQKKyAgICAgICAgICAgICAgICAgOzsgdG8gc3VwcGx5IHRoZW0uIFRoZSBHWVBfREVG SU5FUyBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICA7OyB0dXJucyBvdXQg dG8gYmUgdGhlIGVhc2llc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZQorICAgICAgICAgICAg ICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRvIGd5cC4KKyAgICAgICAg ICAgICAgICAgKHNldGVudiAiR1lQX0RFRklORVMiIChzdHJpbmctYXBwZW5kCisgICAgICAgICAg ICAgICAgICAgIm1vZHVsZV9uYW1lPSIKKyAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJp bmFyeS1hbGlzdCAibW9kdWxlX25hbWUiKQorICAgICAgICAgICAgICAgICAgICIgbW9kdWxlX3Bh dGg9IgorICAgICAgICAgICAgICAgICAgIChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVf cGF0aCIpKSkpCisgICAgICAgICAgICAgICA7OyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgaW5zdGFs bCBzY3JpcHQgZnJvbSAicGFja2FnZS5qc29uIiwKKyAgICAgICAgICAgICAgIDs7IGFzIGl0IHdv dWxkIHRyeSB0byB1c2Ugbm9kZS1wcmUtZ3lwIGFuZCB3b3VsZCBibG9jayB0aGUKKyAgICAgICAg ICAgICAgIDs7IGF1dG9tYXRpYyBidWlsZGluZyBwZXJmb3JtZWQgYnkgYG5wbSBpbnN0YWxsYC4K KyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAg ICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkKKyAgICAgICAgICAg ICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAg IChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAuIF8p ICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChfICN0KSkKKyAgICAgICAgICAgICAgICAg ICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikp CisgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAoaG9tZS1wYWdl ICJodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L25vZGUtc3FsaXRlMyIpCiAgICAgKHN5bm9wc2lz ICJOb2RlLmpzIGJpbmRpbmdzIGZvciBTUUxpdGUzIikKICAgICAoZGVzY3JpcHRpb24KZGlmZiAt LWdpdCBhL2d1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9k ZS5zY20KaW5kZXggNTdmZTVmNjAzMC4uNDI1YjhjZDliMyAxMDA2NDQKLS0tIGEvZ3VpeC9idWls ZC1zeXN0ZW0vbm9kZS5zY20KKysrIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9kZS5zY20KQEAgLTQs NiArNCw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgTHVkb3ZpYyBDb3VydMOocyA8bHVkb0Bn bnUub3JnPgogOzs7IENvcHlyaWdodCDCqSAyMDIxIFBpZXJyZSBMYW5nbG9pcyA8cGllcnJlLmxh bmdsb2lzQGdteC5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgUGhpbGlwIE1jR3JhdGggPHBo aWxpcEBwaGlsaXBtY2dyYXRoLmNvbT4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hv ZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlz IHBhcnQgb2YgR05VIEd1aXguCiA7OzsKQEAgLTM2LDcgKzM3LDEwIEBAIChkZWZpbmUtbW9kdWxl IChndWl4IGJ1aWxkLXN5c3RlbSBub2RlKQogKGRlZmluZSAlbm9kZS1idWlsZC1zeXN0ZW0tbW9k dWxlcwogICA7OyBCdWlsZC1zaWRlIG1vZHVsZXMgaW1wb3J0ZWQgYnkgZGVmYXVsdC4KICAgYCgo Z3VpeCBidWlsZCBub2RlLWJ1aWxkLXN5c3RlbSkKLSAgICAoZ3VpeCBidWlsZCBqc29uKQorICAg IChqc29uKQorICAgIChqc29uIGJ1aWxkZXIpCisgICAgKGpzb24gcGFyc2VyKQorICAgIChqc29u IHJlY29yZCkKICAgICAsQCVkZWZhdWx0LWdudS1pbXBvcnRlZC1tb2R1bGVzKSkKIAogKGRlZmlu ZSAoZGVmYXVsdC1ub2RlKQpkaWZmIC0tZ2l0IGEvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3Rl bS5zY20gYi9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQppbmRleCBmYjIzODk0YmMx Li40NmUwZGRkNzFkIDEwMDY0NAotLS0gYS9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNj bQorKysgYi9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQpAQCAtNCw2ICs0LDcgQEAK IDs7OyBDb3B5cmlnaHQgwqkgMjAxOSwgMjAyMSBUaW1vdGh5IFNhbXBsZSA8c2FtcGxldEBuZ3ly by5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEsIDIwMjIgUGhpbGlwIE1jR3JhdGggPHBoaWxp cEBwaGlsaXBtY2dyYXRoLmNvbT4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMiBMaWxpYW5hIE1hcmll IFByaWtsZXIgPGxpbGlhbmEucHJpa2xlckBnbWFpbC5jb20+Cis7OzsgQ29weXJpZ2h0IMKpIDIw MjQgRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7 IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0yMywxMCArMjQsMTAgQEAK IChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAjOnVzZS1t b2R1bGUgKChndWl4IGJ1aWxkIGdudS1idWlsZC1zeXN0ZW0pICM6cHJlZml4IGdudTopCiAgICM6 dXNlLW1vZHVsZSAoZ3VpeCBidWlsZCB1dGlscykKLSAgIzp1c2UtbW9kdWxlIChndWl4IGJ1aWxk IGpzb24pCiAgICM6dXNlLW1vZHVsZSAoaWNlLTkgZnR3KQogICAjOnVzZS1tb2R1bGUgKGljZS05 IHJlZ2V4KQogICAjOnVzZS1tb2R1bGUgKGljZS05IG1hdGNoKQorICAjOnVzZS1tb2R1bGUgKGpz b24pCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBz cmZpLTcxKQogICAjOmV4cG9ydCAoJXN0YW5kYXJkLXBoYXNlcwpAQCAtMzQsMTMgKzM1LDE0IEBA IChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAgICAgICAg ICAgZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAgbm9kZS1idWlsZCkpCiAKLShkZWZp bmUgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCBmaWxlIHByb2MpCisoZGVmaW5l KiAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50IHByb2MKKyAgIzpvcHRpb25hbCAo ZmlsZSAicGFja2FnZS5qc29uIikpCiAgICJMaWtlICd3aXRoLWF0b21pYy1maWxlLXJlcGxhY2Vt ZW50JywgYnV0IFBST0MgaXMgY2FsbGVkIHdpdGggYSBzaW5nbGUKIGFyZ3VtZW50LS0tdGhlIHJl c3VsdCBvZiBwYXJzaW5nIEZJTEUncyBjb250ZW50cyBhcyBqc29uLS0tYW5kIHNob3VsZCBhIHZh bHVlCiB0byBiZSB3cml0dGVuIGFzIGpzb24gdG8gdGhlIHJlcGxhY2VtZW50IEZJTEUuIgogICAo d2l0aC1hdG9taWMtZmlsZS1yZXBsYWNlbWVudCBmaWxlCiAgICAgKGxhbWJkYSAoaW4gb3V0KQot ICAgICAgKHdyaXRlLWpzb24gKHByb2MgKHJlYWQtanNvbiBpbikpIG91dCkpKSkKKyAgICAgIChz Y20tPmpzb24gKHByb2MgKGpzb24tPnNjbSBpbikpIG91dCkpKSkKIAogKGRlZmluZSogKGFzc29j LXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKICAgIkxpa2UgYXNzb2MtcmVmLCBi dXQgcmV0dXJuIERFRkFVTFQgaW5zdGVhZCBvZiAjZiBpZiBubyB2YWx1ZSBleGlzdHMuIgpAQCAt NDgsMTAgKzUwLDYgQEAgKGRlZmluZSogKGFzc29jLXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwg ZGVmYXVsdCkKICAgICAoI2YgZGVmYXVsdCkKICAgICAoKF8gLiB2YWx1ZSkgdmFsdWUpKSkKIAot KGRlZmluZSogKGpzb2JqZWN0LXJlZiBvYmoga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKLSAgKG1h dGNoIG9iagotICAgICgoJ0AgLiBhbGlzdCkgKGFzc29jLXJlZiogYWxpc3Qga2V5IGRlZmF1bHQp KSkpCi0KIChkZWZpbmUqIChhbGlzdC1wb3AgYWxpc3Qga2V5ICM6b3B0aW9uYWwgKD0gZXF1YWw/ KSkKICAgIlJldHVybiB0d28gdmFsdWVzLCB0aGUgZmlyc3QgcGFpciBpbiBBTElTVCB3aXRoIGtl eSBLRVksIGFuZCB0aGUgb3RoZXIKIGVsZW1lbnRzLiAgRXF1YWxpdHkgY2FsbHMgYXJlIG1hZGUg YXMgKD0gS0VZIEFMSVNUQ0FSKS4iCkBAIC02Myw2NyArNjEsMTcgQEAgKGRlZmluZSogKGFsaXN0 LXBvcCBhbGlzdCBrZXkgIzpvcHRpb25hbCAoPSBlcXVhbD8pKQogICAgICAgICAodmFsdWVzIChj YXIgYWZ0ZXIpIChhcHBlbmQgYmVmb3JlIChjZHIgYWZ0ZXIpKSkKICAgICAgICAgKHZhbHVlcyAj ZiBiZWZvcmUpKSkpCiAKLShkZWZpbmUqIChhbGlzdC11cGRhdGUgYWxpc3Qga2V5IHByb2MgIzpv cHRpb25hbCBkZWZhdWx0ICg9IGVxdWFsPykpCisoZGVmaW5lKiAoYWxpc3QtdXBkYXRlIGFsaXN0 IGtleSBwcm9jICM6b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgIlJldHVybiBhbiBhc3NvY2lhdGlv biBsaXN0IGxpa2UgQUxJU1QsIGJ1dCB3aXRoIEtFWSBtYXBwZWQgdG8gdGhlIHJlc3VsdCBvZgog UFJPQyBhcHBsaWVkIHRvIHRoZSBmaXJzdCB2YWx1ZSBmb3VuZCB1bmRlciB0aGUgY29tcGFyaXNv biAoPSBLRVkgQUxJU1RDQVIpLgotSWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMsIHVzZSBERUZBVUxU IGluc3RlYWQuCitJZiBubyBzdWNoIHZhbHVlIGV4aXN0cywgcmV0dXJuIHRoZSBsaXN0IHVuY2hh bmdlZC4KIFVubGlrZSBhY29ucywgdGhpcyByZW1vdmVzIHRoZSBwcmV2aW91cyBhc3NvY2lhdGlv biBvZiBLRVkgKGFzc3VtaW5nIGl0IGlzCiB1bmlxdWUpLCBidXQgdGhlIHJlc3VsdCBtYXkgc3Rp bGwgc2hhcmUgc3RvcmFnZSB3aXRoIEFMSVNULiIKICAgKGxldCAoKHBhaXIgcmVzdCAoYWxpc3Qt cG9wIGFsaXN0IGtleSA9KSkpCi0gICAgKGFjb25zIGtleQotICAgICAgICAgICAocHJvYyAoaWYg KHBhaXI/IHBhaXIpCi0gICAgICAgICAgICAgICAgICAgICAoY2RyIHBhaXIpCi0gICAgICAgICAg ICAgICAgICAgICBkZWZhdWx0KSkKLSAgICAgICAgICAgcmVzdCkpKQotCi0oZGVmaW5lIChqc29i amVjdC11cGRhdGUqIGpzIC4gdXBkYXRlcykKLSAgIlJldHVybiBhIGpzb24gb2JqZWN0IGxpa2Ug SlMsIGJ1dCB3aXRoIGFsbCBVUERBVEVTIGFwcGxpZWQuICBFYWNoIHVwZGF0ZSBpcwotYSBsaXN0 IChLRVkgUFJPQyBbREVGQVVMVF0pLCBzbyB0aGF0IEtFWSBpcyBtYXBwZWQgdG8gdGhlIHJlc3Vs dCBvZiBQUk9DCi1hcHBsaWVkIHRvIHRoZSB2YWx1ZSB0byB3aGljaCBLRVkgaXMgbWFwcGVkIGlu IEpTLiAgSWYgbm8gc3VjaCBtYXBwaW5nIGV4aXN0cywKLVBST0MgaXMgaW5zdGVhZCBhcHBsaWVk IHRvIERFRkFVTFQsIG9yIHRvICcjZicgaXMgbm8gREVGQVVMVCBpcyBzcGVjaWZpZWQuCi1UaGUg dXBkYXRlIHRha2VzIHBsYWNlIGZyb20gbGVmdCB0byByaWdodCwgc28gbGF0ZXIgVVBEQVRFUnMg d2lsbCByZWNlaXZlIHRoZQotdmFsdWVzIHJldHVybmVkIGJ5IGVhcmxpZXIgVVBEQVRFUnMgZm9y IHRoZSBzYW1lIEtFWS4iCi0gIChtYXRjaCBqcwotICAgICgoJ0AgLiBhbGlzdCkKLSAgICAgKGxl dCBsb29wICgoYWxpc3QgYWxpc3QpCi0gICAgICAgICAgICAgICAgKHVwZGF0ZXMgdXBkYXRlcykp Ci0gICAgICAgKG1hdGNoIHVwZGF0ZXMKLSAgICAgICAgICgoKSAoY29ucyAnQCBhbGlzdCkpCi0g ICAgICAgICAoKChrZXkgcHJvYykgLiB1cGRhdGVzKQotICAgICAgICAgIChsb29wIChhbGlzdC11 cGRhdGUgYWxpc3Qga2V5IHByb2MgI2YgZXF1YWw/KSB1cGRhdGVzKSkKLSAgICAgICAgICgoKGtl eSBwcm9jIGRlZmF1bHQpIC4gdXBkYXRlcykKLSAgICAgICAgICAobG9vcCAoYWxpc3QtdXBkYXRl IGFsaXN0IGtleSBwcm9jIGRlZmF1bHQgZXF1YWw/KSB1cGRhdGVzKSkpKSkpKQotCi0oZGVmaW5l IChqc29iamVjdC11bmlvbiBjb21iaW5lIHNlZWQgLiBvYmplY3RzKQotICAiTWVyZ2UgT0JKRUNU UyBpbnRvIFNFRUQgYnkgYXBwbHlpbmcgKENPTUJJTkUgS0VZIFZBTDAgVkFMKSwgd2hlcmUgVkFM MAotaXMgdGhlIHZhbHVlIGZvdW5kIGluIHRoZSAocG9zc2libHkgdXBkYXRlZCkgU0VFRCBhbmQg VkFMIGlzIHRoZSBuZXcgdmFsdWUKLWZvdW5kIGluIG9uZSBvZiB0aGUgT0JKRUNUUy4iCi0gICht YXRjaCBzZWVkCi0gICAgKCgnQCAuIGFzZWVkKQotICAgICAobWF0Y2ggb2JqZWN0cwotICAgICAg ICgoKSBzZWVkKQotICAgICAgICgoKCdAIC4gYWxpc3RzKSAuLi4pCi0gICAgICAgIChjb25zCi0g ICAgICAgICAnQAotICAgICAgICAgKGZvbGQgKGxhbWJkYSAoYWxpc3QgYXNlZWQpCi0gICAgICAg ICAgICAgICAgIChpZiAobnVsbD8gYXNlZWQpIGFsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAo Zm9sZAotICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEqCi0gICAgICAgICAgICAg ICAgICAgICAgICAoKChrIC4gdikgYXNlZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGxl dCAoKHBhaXIgdGFpbCAoYWxpc3QtcG9wIGFsaXN0IGspKSkKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgIChtYXRjaCBwYWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgjZiAoYWNv bnMgayB2IGFzZWVkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfIC4gdjApIChh Y29ucyBrIChjb21iaW5lIGsgdjAgdikgYXNlZWQpKSkpKSkKLSAgICAgICAgICAgICAgICAgICAg ICBhc2VlZAotICAgICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpCi0gICAgICAgICAgICAgICBh c2VlZAotICAgICAgICAgICAgICAgYWxpc3RzKSkpKSkpKQorICAgIChpZiAocGFpcj8gcGFpcikK KyAgICAgIChhY29ucyBrZXkgKHByb2MgKGNkciBwYWlyKSkgcmVzdCkKKyAgICAgIGFsaXN0KSkp CiAKLTs7IFBvc3NpYmx5IHVzZWZ1bCBoZWxwZXIgZnVuY3Rpb25zOgotOzsgKGRlZmluZSAobmV3 ZXN0IGtleSB2YWwwIHZhbCkgdmFsKQotOzsgKGRlZmluZSAodW5rZXllZC0+a2V5ZWQgcHJvYykg KGxhbWJkYSAoX2tleSB2YWwwIHZhbCkgKHByb2MgdmFsMCB2YWwpKSkKLQotDAogOzs7CiA7Ozsg UGhhc2VzLgogOzs7CkBAIC0xNDIsOCArOTAsOCBAQCAoZGVmaW5lIChzZXQtaG9tZSAuIF8pCiAK IChkZWZpbmUgKG1vZHVsZS1uYW1lIG1vZHVsZSkKICAgKGxldCogKChwYWNrYWdlLmpzb24gKHN0 cmluZy1hcHBlbmQgbW9kdWxlICIvcGFja2FnZS5qc29uIikpCi0gICAgICAgICAocGFja2FnZS1t ZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24gcmVhZC1qc29uKSkpCi0gICAg KGpzb2JqZWN0LXJlZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCisgICAgICAgICAocGFja2FnZS1t ZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24ganNvbi0+c2NtKSkpCisgICAg KGFzc29jLXJlZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCiAKIChkZWZpbmUgKGluZGV4LW1vZHVs ZXMgaW5wdXQtcGF0aHMpCiAgIChkZWZpbmUgKGxpc3QtbW9kdWxlcyBkaXJlY3RvcnkpCkBAIC0x NjcsNDkgKzExNSw2MCBAQCAoZGVmaW5lKiAocGF0Y2gtZGVwZW5kZW5jaWVzICM6a2V5IGlucHV0 cyAjOmFsbG93LW90aGVyLWtleXMpCiAKICAgKGRlZmluZSBpbmRleCAoaW5kZXgtbW9kdWxlcyAo bWFwIGNkciBpbnB1dHMpKSkKIAotICAoZGVmaW5lIHJlc29sdmUtZGVwZW5kZW5jaWVzCi0gICAg KG1hdGNoLWxhbWJkYQotICAgICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdAIChtYXAg KG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAoKGtleSAuIHZhbHVlKQotICAg ICAgICAgICAgICAgICAgICAgICAgKGNvbnMga2V5IChoYXNoLXJlZiBpbmRleCBrZXkgdmFsdWUp KSkpCi0gICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKSkpCisgIChkZWZpbmUgKHJlc29sdmUt ZGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcykKKyAgICAobWFwCisgICAgICAobWF0Y2gtbGFtYmRh CisgICAgICAgICgoZGVwZW5kZW5jeSAuIHZlcnNpb24pCisgICAgICAgICAgKGNvbnMgZGVwZW5k ZW5jeSAoaGFzaC1yZWYgaW5kZXggZGVwZW5kZW5jeSB2ZXJzaW9uKSkpKQorICAgICAgZGVwZW5k ZW5jaWVzKSkKIAotICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdl Lmpzb24iCisgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQKICAgICAobGFtYmRh IChwa2ctbWV0YSkKLSAgICAgIChqc29iamVjdC11cGRhdGUqCi0gICAgICAgcGtnLW1ldGEKLSAg ICAgICBgKCJkZXZEZXBlbmRlbmNpZXMiICxyZXNvbHZlLWRlcGVuZGVuY2llcyAoQCkpCi0gICAg ICAgYCgiZGVwZW5kZW5jaWVzIiAsKGxhbWJkYSAoZGVwcykKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgIChyZXNvbHZlLWRlcGVuZGVuY2llcwotICAgICAgICAgICAgICAgICAgICAgICAgICAg IChqc29iamVjdC11bmlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChr IGEgYikgYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXJlZiBwa2ct bWV0YSAicGVlckRlcGVuZGVuY2llcyIgJyhAKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZGVwcykpKQotICAgICAgICAgKEApKSkpKQorICAgICAgKGZvbGQKKyAgICAgICAgKGxhbWJk YSAocHJvYyBwa2ctbWV0YSkgKHByb2MgcGtnLW1ldGEpKQorICAgICAgICBwa2ctbWV0YQorICAg ICAgICAobGlzdAorICAgICAgICAgIChsYW1iZGEgKHBrZy1tZXRhKQorICAgICAgICAgICAgKGFs aXN0LXVwZGF0ZSBwa2ctbWV0YSAiZGV2RGVwZW5kZW5jaWVzIiByZXNvbHZlLWRlcGVuZGVuY2ll cykpCisgICAgICAgICAgKGxhbWJkYSAocGtnLW1ldGEpCisgICAgICAgICAgICAoYXNzb2Mtc2V0 IQorICAgICAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIgor ICAgICAgICAgICAgICAocmVzb2x2ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICA7IENv bWJpbmVkICJwZWVyRGVwZW5kZW5jaWVzIiBhbmQgImRlcGVuZGVuY2llcyIgZGVwZW5kZW5jaWVz CisgICAgICAgICAgICAgICAgOyB3aXRoICJkZXBlbmRlbmNpZXMiIHRha2luZyBwcmVjZWRlbnQu CisgICAgICAgICAgICAgICAgKGZvbGQKKyAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVu ZGVuY3kgZGVwZW5kZW5jaWVzKQorICAgICAgICAgICAgICAgICAgICAoYXBwbHkgYXNzb2Mtc2V0 ISBkZXBlbmRlbmNpZXMgZGVwZW5kZW5jeSkpCisgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVm KiBwa2ctbWV0YSAicGVlckRlcGVuZGVuY2llcyIgJygpKQorICAgICAgICAgICAgICAgICAgKGFz c29jLXJlZiogcGtnLW1ldGEgImRlcGVuZGVuY2llcyIgJygpKQorICAgICAgICAgICAgICAgICkp KSkpKSkpCiAgICN0KQogCi0oZGVmaW5lIChkZWxldGUtZGVwZW5kZW5jaWVzIGFic2VudCkKKyhk ZWZpbmUgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzLXRvLXJlbW92ZSkKICAgIlJl d3JpdGUgJ3BhY2thZ2UuanNvbicgdG8gYWxsb3cgdGhlIGJ1aWxkIHRvIHByb2NlZWQgd2l0aG91 dCBwYWNrYWdlcwotbGlzdGVkIGluIEFCU0VOVCwgYSBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIG5w bSBwYWNrYWdlcy4KK2xpc3RlZCBpbiAnZGVwZW5kZW5jaWVzLXRvLXJlbW92ZScsIGEgbGlzdCBv ZiBzdHJpbmdzIG5hbWluZyBucG0gcGFja2FnZXMuCiAKIFRvIHByZXZlbnQgdGhlIGRlbGV0ZWQg ZGVwZW5kZW5jaWVzIGZyb20gYmVpbmcgcmVpbnRyb2R1Y2VkLCB1c2UgdGhpcyBmdW5jdGlvbgog b25seSBhZnRlciB0aGUgJ3BhdGNoLWRlcGVuZGVuY2llcycgcGhhc2UuIgotICAoZGVmaW5lIGRl bGV0ZS1mcm9tLWpzb2JqZWN0Ci0gICAgKG1hdGNoLWxhbWJkYQotICAgICAgKCgnQCAuIGFsaXN0 KQotICAgICAgIChjb25zICdAIChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAg ICAgICAgICAgICAoKGsgLiBfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAobWVt YmVyIGsgYWJzZW50KSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgYWxpc3QpKSkpKQotCi0g ICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKKyAgKHdp dGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudAogICAgIChsYW1iZGEgKHBrZy1tZXRhKQot ICAgICAgKGpzb2JqZWN0LXVwZGF0ZSoKLSAgICAgICBwa2ctbWV0YQotICAgICAgIGAoImRldkRl cGVuZGVuY2llcyIgLGRlbGV0ZS1mcm9tLWpzb2JqZWN0IChAKSkKLSAgICAgICBgKCJkZXBlbmRl bmNpZXMiICxkZWxldGUtZnJvbS1qc29iamVjdCAoQCkpCi0gICAgICAgYCgicGVlckRlcGVuZGVu Y2llcyIgLGRlbGV0ZS1mcm9tLWpzb2JqZWN0IChAKSkpKSkpCisgICAgICAoZm9sZAorICAgICAg ICAobGFtYmRhIChkZXBlbmRlbmN5LWtleSBwa2ctbWV0YSkKKyAgICAgICAgICAoYWxpc3QtdXBk YXRlCisgICAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAgICAgZGVwZW5kZW5jeS1rZXkKKyAg ICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY2llcykKKyAgICAgICAgICAgICAgKHJlbW92ZQor ICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY3kpCisgICAgICAgICAgICAgICAgICAo bWVtYmVyIChjYXIgZGVwZW5kZW5jeSkgZGVwZW5kZW5jaWVzLXRvLXJlbW92ZSkpCisgICAgICAg ICAgICAgICAgZGVwZW5kZW5jaWVzKSkpKQorICAgICAgICBwa2ctbWV0YQorICAgICAgICAobGlz dAorICAgICAgICAgICJkZXZEZXBlbmRlbmNpZXMiCisgICAgICAgICAgImRlcGVuZGVuY2llcyIK KyAgICAgICAgICAicGVlckRlcGVuZGVuY2llcyIKKyAgICAgICAgICAib3B0aW9uYWxEZXBlbmRl bmNpZXMiKSkpKSkKIAogKGRlZmluZSogKGRlbGV0ZS1sb2NrZmlsZXMgIzprZXkgaW5wdXRzICM6 YWxsb3ctb3RoZXIta2V5cykKICAgIkRlbGV0ZSAncGFja2FnZS1sb2NrLmpzb24nLCAneWFybi5s b2NrJywgYW5kICducG0tc2hyaW5rd3JhcC5qc29uJywgaWYgdGhleQpAQCAtMjI4LDggKzE4Nyw4 IEBAIChkZWZpbmUqIChjb25maWd1cmUgIzprZXkgb3V0cHV0cyBpbnB1dHMgIzphbGxvdy1vdGhl ci1rZXlzKQogICAgICN0KSkKIAogKGRlZmluZSogKGJ1aWxkICM6a2V5IGlucHV0cyAjOmFsbG93 LW90aGVyLWtleXMpCi0gIChsZXQgKChwYWNrYWdlLW1ldGEgKGNhbGwtd2l0aC1pbnB1dC1maWxl ICJwYWNrYWdlLmpzb24iIHJlYWQtanNvbikpKQotICAgIChpZiAoanNvYmplY3QtcmVmIChqc29i amVjdC1yZWYgcGFja2FnZS1tZXRhICJzY3JpcHRzIiAnKEApKSAiYnVpbGQiICNmKQorICAobGV0 ICgocGFja2FnZS1tZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSAicGFja2FnZS5qc29uIiBqc29u LT5zY20pKSkKKyAgICAoaWYgKGFzc29jLXJlZiogKGFzc29jLXJlZiogcGFja2FnZS1tZXRhICJz Y3JpcHRzIiAnKCkpICJidWlsZCIgI2YpCiAgICAgICAgIChsZXQgKChucG0gKHN0cmluZy1hcHBl bmQgKGFzc29jLXJlZiBpbnB1dHMgIm5vZGUiKSAiL2Jpbi9ucG0iKSkpCiAgICAgICAgICAgKGlu dm9rZSBucG0gInJ1biIgImJ1aWxkIikpCiAgICAgICAgIChmb3JtYXQgI3QgInRoZXJlIGlzIG5v IGJ1aWxkIHNjcmlwdCB0byBydW5+JSIpKQpAQCAtMzAxLDIyICsyNjAsMjAgQEAgKGRlZmluZSog KGF2b2lkLW5vZGUtZ3lwLXJlYnVpbGQgIzprZXkgb3V0cHV0cyAjOmFsbG93LW90aGVyLWtleXMp CiAgIDs7IGV2ZW4gbmVlZCB0byBvdmVyd3JpdGUgdGhpcyBmaWxlLiAgVGhlcmVmb3JlLCBsZXQn cyB1c2Ugc29tZSBoZWxwZXJzCiAgIDs7IHRoYXQgd2UnZCBvdGhlcndpc2Ugbm90IG5lZWQuCiAg IChkZWZpbmUgcGtnLW1ldGEKLSAgICAoY2FsbC13aXRoLWlucHV0LWZpbGUgaW5zdGFsbGVkLXBh Y2thZ2UuanNvbiByZWFkLWpzb24pKQorICAgIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBpbnN0YWxs ZWQtcGFja2FnZS5qc29uIGpzb24tPnNjbSkpCiAgIChkZWZpbmUgc2NyaXB0cwotICAgIChqc29i amVjdC1yZWYgcGtnLW1ldGEgInNjcmlwdHMiICcoQCkpKQotICAoZGVmaW5lIChqc29iamVjdC1z ZXQganMga2V5IHZhbCkKLSAgICAoanNvYmplY3QtdXBkYXRlKiBqcyAobGlzdCBrZXkgKGNvbnN0 IHZhbCkpKSkKKyAgICAoYXNzb2MtcmVmKiBwa2ctbWV0YSAic2NyaXB0cyIgJygpKSkKIAotICAo d2hlbiAoZXF1YWw/ICJub2RlLWd5cCByZWJ1aWxkIiAoanNvYmplY3QtcmVmIHNjcmlwdHMgImlu c3RhbGwiICNmKSkKKyAgKHdoZW4gKGVxdWFsPyAibm9kZS1neXAgcmVidWlsZCIgKGFzc29jLXJl Ziogc2NyaXB0cyAiaW5zdGFsbCIgI2YpKQogICAgIChjYWxsLXdpdGgtb3V0cHV0LWZpbGUgaW5z dGFsbGVkLXBhY2thZ2UuanNvbgogICAgICAgKGxhbWJkYSAob3V0KQotICAgICAgICAod3JpdGUt anNvbgotICAgICAgICAgKGpzb2JqZWN0LXNldCBwa2ctbWV0YQotICAgICAgICAgICAgICAgICAg ICAgICAic2NyaXB0cyIKLSAgICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXNldCBzY3Jp cHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGwiCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVjaG8gR3VpeDogYXZvaWRpbmcgbm9k ZS1neXAgcmVidWlsZCIpKQotICAgICAgICAgb3V0KSkpKSkKKyAgICAgICAgKHNjbS0+anNvbgor ICAgICAgICAgIChhc3NvYy1zZXQhIHBrZy1tZXRhCisgICAgICAgICAgICAgICAgICAgICAgInNj cmlwdHMiCisgICAgICAgICAgICAgICAgICAgICAgKGFzc29jLXNldCEgc2NyaXB0cworICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsIgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJlY2hvIEd1aXg6IGF2b2lkaW5nIG5vZGUtZ3lwIHJlYnVpbGQiKSkK KyAgICAgICAgICBvdXQpKSkpKQogCiAoZGVmaW5lICVzdGFuZGFyZC1waGFzZXMKICAgKG1vZGlm eS1waGFzZXMgZ251OiVzdGFuZGFyZC1waGFzZXMKCmJhc2UtY29tbWl0OiBjZmQ0ZjU2Zjc1YTIw YjY3MzJkNDYzMTgwZDIxMWY3OTZjOTAzMmU1Ci0tIAoyLjQ2LjAKCg== --000000000000ccd36f062955ee49--