From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: MON KEY Newsgroups: gmane.emacs.bugs Subject: bug#6644: `describe-variable' misses on certain permanent-locals [PATCH] (putative) Date: Thu, 15 Jul 2010 20:14:09 -0400 Message-ID: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=000e0cd6e4b2106cb0048b76196e X-Trace: dough.gmane.org 1279240274 25821 80.91.229.12 (16 Jul 2010 00:31:14 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Fri, 16 Jul 2010 00:31:14 +0000 (UTC) To: 6644@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Jul 16 02:31:12 2010 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1OZYpL-0003vI-Hg for geb-bug-gnu-emacs@m.gmane.org; Fri, 16 Jul 2010 02:31:12 +0200 Original-Received: from localhost ([127.0.0.1]:46973 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OZYpK-0001p2-7A for geb-bug-gnu-emacs@m.gmane.org; Thu, 15 Jul 2010 20:30:54 -0400 Original-Received: from [140.186.70.92] (port=53084 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OZYot-0001a2-Qo for bug-gnu-emacs@gnu.org; Thu, 15 Jul 2010 20:30:30 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OZYor-0005XI-SF for bug-gnu-emacs@gnu.org; Thu, 15 Jul 2010 20:30:27 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:43608) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OZYor-0005XC-PK for bug-gnu-emacs@gnu.org; Thu, 15 Jul 2010 20:30:25 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1OZYZy-0006ha-VZ; Thu, 15 Jul 2010 20:15:03 -0400 X-Loop: help-debbugs@gnu.org Resent-From: MON KEY Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-To: owner@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 16 Jul 2010 00:15:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 6644 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.127923924925731 (code B ref -1); Fri, 16 Jul 2010 00:15:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 16 Jul 2010 00:14:09 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OZYZ5-0006gy-SC for submit@debbugs.gnu.org; Thu, 15 Jul 2010 20:14:09 -0400 Original-Received: from mx10.gnu.org ([199.232.76.166]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OZYZ3-0006gc-Im for submit@debbugs.gnu.org; Thu, 15 Jul 2010 20:14:07 -0400 Original-Received: from lists.gnu.org ([199.232.76.165]:36002) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1OZYZF-00050z-C6 for submit@debbugs.gnu.org; Thu, 15 Jul 2010 20:14:17 -0400 Original-Received: from [140.186.70.92] (port=56834 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OZYZC-0006sI-2Q for bug-gnu-emacs@gnu.org; Thu, 15 Jul 2010 20:14:16 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OZYZA-0003q4-1x for bug-gnu-emacs@gnu.org; Thu, 15 Jul 2010 20:14:13 -0400 Original-Received: from mail-gx0-f169.google.com ([209.85.161.169]:45463) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OZYZ9-0003py-PU for bug-gnu-emacs@gnu.org; Thu, 15 Jul 2010 20:14:12 -0400 Original-Received: by gxk4 with SMTP id 4so1241949gxk.0 for ; Thu, 15 Jul 2010 17:14:09 -0700 (PDT) Original-Received: by 10.150.162.3 with SMTP id k3mr781508ybe.97.1279239249750; Thu, 15 Jul 2010 17:14:09 -0700 (PDT) Original-Received: by 10.151.98.19 with HTTP; Thu, 15 Jul 2010 17:14:09 -0700 (PDT) X-Google-Sender-Auth: ZGcLcovr5qfgxQXXnyCj27EPHlU X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Thu, 15 Jul 2010 20:15:02 -0400 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:38567 Archived-At: --000e0cd6e4b2106cb0048b76196e Content-Type: text/plain; charset=UTF-8 As currently written `describe-variable' will, for certain variables, only inform if a variable is permanently local when it is set to have a local value in current-buffer. This happens for example with `kill-buffer-hook' which _is_ a permanent-local. And in thes situations, `describe-variable' (and by proxy "*Help*") can not tell us if a variable is permanent-local unless the docstring explicitly states as such. At first blush it would appear that `describe-variable's binding of `locus' happens at the buffer level and therfor _should_ identify a permanent-local per: ,---- | (with-current-buffer buffer | (setq val (symbol-value variable) | locus (variable-binding-locus variable))) `---- This is because the following heuristics won't always recognize the permanent-local property where a `locus' pivots on a `bufferp' check: ,---- | (if valvoid | nil | (with-current-buffer standard-output | (setq val-start-pos (point)) | (princ "value is ") | (terpri) | (let ((from (point))) | (pp val) | (if (< (point) (+ from 20)) | (delete-region (1- from) from))))) | (terpri) | (when locus | (if (bufferp locus) ;<- A permanent-local's locus is elsewhere! | (princ (format "%socal in buffer %s; " | (if (get variable 'permanent-local) | "Permanently l" "L") | (buffer-name))) | (princ (format "It is a frame-local variable; "))) | (if (not (default-boundp variable)) | (princ "globally void") | (let ((val (default-value variable))) | (with-current-buffer standard-output | (princ "global value is ") | (terpri) | (let ((from (point))) | (pp val) | (if (< (point) (+ from 20)) | (delete-region (1- from) from)))))) | (terpri)) `---- W/re `describe-variable's current behavior around permanent-local it does not serve its purpose well. When a user asks that for the description of a variable variable that variable has a permanent-local property it is important that a user be informed as such. Specifically that: - a variable _is_ permanent-local; - that though currently null, _if_ set it would be permanent-local in current-buffer; - that if non-nil the value is permanent-local in current-buffer and will persist across invocations of `kill-all-local-variables' unless explicitly removed. IOW, knowing that a variable is: "Local in buffer ;" Is not the same as saying that a variable is; "Permanently local in ;" Which isn't the same as saying either of following about a variable; "This variable is a permanent-local. It satisfies the predicate `local-variable-p' in . This value will persist in current-buffer until explicitly removed;" "This variable is a permanent-local. Its current value is null in . This variable satisfies the predicate `local-variable-if-set-p'. When set with `make-local-variable' the value will persist in current-buffer until explicitly removed;" Following fncn `%describe-variable-miss-permanent-local-example' illustrates what I perceive to be the "problem": ;;; ============================== (defun %describe-variable-miss-permanent-local-example () "Illustrate `describe-variable' not identifying permanent-local variables. Display results in buffer \"*BUFFER-W-OUT-LOCAL-KB-HOOK*\"." (interactive) (let ((dvdr (concat "\n" (make-string 80 59) "\n")) (w-lcl "*BUFFER-W-LOCAL-KB-HOOK*") (w/o-lcl "*BUFFER-W-OUT-LOCAL-KB-HOOK*") kbh tmp-fncn) (with-current-buffer (get-buffer-create w-lcl) (fset 'tmp-fncn #'(lambda () "does nothing." nil)) (add-hook 'kill-buffer-hook 'tmp-fncn nil t) (setq kbh (buffer-local-value 'kill-buffer-hook (current-buffer))) (with-current-buffer (get-buffer-create w/o-lcl) (erase-buffer) (save-excursion (insert (substring dvdr 1) ";; Local value of `kill-buffer-hook' in buffer: " w-lcl "\n;;\n" (format "%S" kbh) dvdr) (setq kbh (buffer-local-value 'kill-buffer-hook (current-buffer))) (insert dvdr ";; Local value of `kill-buffer-hook' in buffer: " w/o-lcl "\n;;\n" (format "%S" kbh) dvdr dvdr ";; Evaluating `describe-variable' for `kill-buffer-hook' with buffer: " w/o-lcl "\n;; NOTE, with `current-buffer' there is no indication " "of `kill-buffer-hook' being permanent-local" dvdr "\n" (describe-variable 'kill-buffer-hook (current-buffer)) "\n" dvdr ";; Evaluating `describe-variable' for `kill-buffer-hook' with buffer: " w-lcl "\n;; NOTE, contrasted with above, now there _is_ indication " "of `kill-buffer-hook' as permanent-local.\n" ";; Additionally, there is also indication that the " "varaible's global value differs from the local." dvdr "\n" (describe-variable 'kill-buffer-hook (get-buffer w-lcl)) "\n" dvdr))) (prog1 (unintern 'tmp-fncn) (kill-buffer (current-buffer)))) (pop-to-buffer (get-buffer w/o-lcl)))) ;; ;; (%describe-variable-miss-permanent-local-example) ;; ;; (unintern '%describe-variable-miss-permanent-local-example) ;;; ============================== Following is a lightly tested modified version of `describe-variable' tweaked to report more intelligently when variables are buffer-local and/or permanent-local. Following that is a patch to lisp/help-fns.el current through Bzr-1000827: ;;;###autoload (defun describe-variable (variable &optional buffer frame) "Display the full documentation of VARIABLE (a symbol). Returns the documentation as a string, also. If VARIABLE has a buffer-local value in BUFFER or FRAME \(default to the current buffer and current frame), it is displayed along with the global value." (interactive (let ((v (variable-at-point)) (enable-recursive-minibuffers t) val) (setq val (completing-read (if (symbolp v) (format "Describe variable (default %s): " v) "Describe variable: ") obarray '(lambda (vv) (or (boundp vv) (get vv 'variable-documentation))) t nil nil (if (symbolp v) (symbol-name v)))) (list (if (equal val "") v (intern val))))) (let (file-name (ploc (get variable 'permanent-local))) (unless (buffer-live-p buffer) (setq buffer (current-buffer))) (unless (frame-live-p frame) (setq frame (selected-frame))) (if (not (symbolp variable)) (message "You did not specify a variable") (save-excursion (let ((valvoid (not (with-current-buffer buffer (boundp variable)))) val val-start-pos locus) ;; Extract the value before setting up the output buffer, ;; in case `buffer' *is* the output buffer. (unless valvoid (with-selected-frame frame (with-current-buffer buffer (setq val (symbol-value variable) locus (variable-binding-locus variable))))) (help-setup-xref (list #'describe-variable variable buffer) (called-interactively-p 'interactive)) (with-help-window (help-buffer) (with-current-buffer buffer (prin1 variable) (setq file-name (find-lisp-object-file-name variable 'defvar)) (if file-name (progn (princ " is a variable defined in `") (princ (if (eq file-name 'C-source) "C source code" (file-name-nondirectory file-name))) (princ "'.\n") (with-current-buffer standard-output (save-excursion (re-search-backward "`\\([^`']+\\)'" nil t) (help-xref-button 1 'help-variable-def variable file-name))) (unless ploc (if valvoid (princ "It is void as a variable.") (princ "Its ")))) (unless ploc (if valvoid (princ " is void as a variable.") (if (bufferp locus) (when (null (buffer-local-value variable (get-buffer buffer))) (terpri)) (princ "'s ")))))) (with-current-buffer standard-output (if valvoid nil (progn (setq val-start-pos (point)) (if (bufferp locus) (if ploc (if (buffer-local-value variable (get-buffer buffer)) (princ "Its local value is ") (princ "Its default local value is ")) (princ "Its non-local global value is ")) (if ploc (princ "Its value is ") (princ "value is "))) (terpri) (let ((from (point))) (pp val) ;; Hyperlinks in variable's value are quite frequently ;; inappropriate e.g C-h v features ;; (help-xref-on-pp from (point)) (if (< (point) (if ploc (+ from 20) (+ from 20))) (delete-region (1- from) from))))) (when (and ploc (not (bufferp locus))) (terpri) (princ "It has a non-nil permanent-local property;"))) (terpri) (progn (cond ((bufferp locus) (princ (format "It is a %slocal variable in buffer %s;\n" (if ploc "permanent-" "buffer-") (buffer-name)))) ((framep locus) (princ (format "It is a frame-local variable;"))) ((null locus) "It is a global variable;")) (when (or (framep locus) (bufferp locus) ploc) (if (not (default-boundp variable)) (princ "Value as global: void") (unless (null (buffer-local-value variable (get-buffer buffer))) (let ((val (default-value variable))) (with-current-buffer standard-output (princ "Value as global: ") (terpri) ;; Fixme: pp can take an age if you happen to ;; ask for a very large expression. We should ;; probably print it raw once and check it's a ;; sensible size before prettyprinting. -- fx (let ((from (point))) (pp val) ;; See previous comment for this function. ;; (help-xref-on-pp from (point)) (if (< (point) (+ from 20)) (delete-region (1- from) from)))))))) (terpri)) ;; If the value is large, move it to the end. (with-current-buffer standard-output (when (> (count-lines (point-min) (point-max)) 10) ;; Note that setting the syntax table like below ;; makes forward-sexp move over a `'s' at the end ;; of a symbol. (set-syntax-table emacs-lisp-mode-syntax-table) (goto-char val-start-pos) ;; The line below previously read as ;; (delete-region (point) (progn (end-of-line) (point))) ;; which suppressed display of the buffer local value for ;; large values. (when (looking-at "value is") (replace-match "")) (save-excursion (insert "\n\nValue:") (set (make-local-variable 'help-button-cache) (point-marker))) (insert "value is shown ") (insert-button "below" 'action help-button-cache 'follow-link t 'help-echo "mouse-2, RET: show value") (insert ".\n"))) (terpri) (let* ((alias (condition-case nil (indirect-variable variable) (error variable))) (obsolete (get variable 'byte-obsolete-variable)) (use (car obsolete)) (safe-var (get variable 'safe-local-variable)) (doc (or (documentation-property variable 'variable-documentation) (documentation-property alias 'variable-documentation))) (extra-line nil)) ;; Add a note for variables that have been make-var-buffer-local. (when (and (local-variable-if-set-p variable) (or (not (local-variable-p variable)) (with-temp-buffer (local-variable-if-set-p variable)))) (setq extra-line t) (princ " Automatically becomes buffer-local when set in any fashion.\n")) ;; Mention if it's an alias (unless (eq alias variable) (setq extra-line t) (princ (format " This variable is an alias for `%s'.\n" alias))) (when obsolete (setq extra-line t) (princ " This variable is obsolete") (if (cdr obsolete) (princ (format " since %s" (cdr obsolete)))) (princ (cond ((stringp use) (concat ";\n " use)) (use (format ";\n use `%s' instead." (car obsolete))) (t "."))) (terpri)) (when (member (cons variable val) file-local-variables-alist) (setq extra-line t) (if (member (cons variable val) dir-local-variables-alist) (let ((file (and (buffer-file-name) (not (file-remote-p (buffer-file-name))) (dir-locals-find-file (buffer-file-name))))) (princ " This variable is a directory local variable") (when file (princ (concat "\n from the file \"" (if (consp file) (car file) file) "\""))) (princ ".\n")) (princ " This variable is a file local variable.\n"))) (when (memq variable ignored-local-variables) (setq extra-line t) (princ " This variable is ignored when used as a file local \ variable.\n")) ;; Can be both risky and safe, eg auto-fill-function. (when (risky-local-variable-p variable) (setq extra-line t) (princ " This variable is potentially risky when used as a \ file local variable.\n") (when (assq variable safe-local-variable-values) (princ " However, you have added it to \ `safe-local-variable-values'.\n"))) (when safe-var (setq extra-line t) (princ " This variable is safe as a file local variable ") (princ "if its value\n satisfies the predicate ") (princ (if (byte-code-function-p safe-var) "which is byte-compiled expression.\n" (format "`%s'.\n" safe-var)))) (if extra-line (terpri)) (princ "Documentation:\n") (with-current-buffer standard-output (insert (or doc "Not documented as a variable.")))) ;; Make a link to customize if this variable can be customized. (when (custom-variable-p variable) (let ((customize-label "customize")) (terpri) (terpri) (princ (concat "You can " customize-label " this variable.")) (with-current-buffer standard-output (save-excursion (re-search-backward (concat "\\(" customize-label "\\)") nil t) (help-xref-button 1 'help-customize-variable variable)))) ;; Note variable's version or package version (let ((output (describe-variable-custom-version-info variable))) (when output (terpri) (terpri) (princ output)))) (with-current-buffer standard-output ;; Return the text we displayed. (buffer-string)))))))) ;;; ============================== ;;; PATCH to describe-variable as provided above in full *** ediff7517N_J 2010-07-15 19:06:56.253304353 -0400 --- help-fns.el Bzr-100827 2010-07-15 19:06:56.304504327 -0400 *************** *** 20,27 **** (if (symbolp v) (symbol-name v)))) (list (if (equal val "") v (intern val))))) ! (let (file-name ! (ploc (get variable 'permanent-local))) (unless (buffer-live-p buffer) (setq buffer (current-buffer))) (unless (frame-live-p frame) (setq frame (selected-frame))) (if (not (symbolp variable)) --- 20,26 ---- (if (symbolp v) (symbol-name v)))) (list (if (equal val "") v (intern val))))) ! (let (file-name) (unless (buffer-live-p buffer) (setq buffer (current-buffer))) (unless (frame-live-p frame) (setq frame (selected-frame))) (if (not (symbolp variable)) *************** *** 55,87 **** (re-search-backward "`\\([^`']+\\)'" nil t) (help-xref-button 1 'help-variable-def variable file-name))) ! (unless ploc ! (if valvoid ! (princ "It is void as a variable.") ! (princ "Its ")))) ! (unless ploc ! (if valvoid ! (princ " is void as a variable.") ! (if (bufferp locus) ! (when (null (buffer-local-value variable (get-buffer buffer))) ! (terpri)) ! (princ "'s ")))))) ! ! (with-current-buffer standard-output ! (if valvoid ! nil ! (progn ! (setq val-start-pos (point)) ! (if (bufferp locus) ! (if ploc ! (if (buffer-local-value variable (get-buffer buffer)) ! (princ "Its local value is ") ! (princ "Its default local value is ")) ! (princ "Its non-local global value is ")) ! (if ploc ! (princ "Its value is ") ! (princ "value is "))) ! (terpri) ! (let ((from (point))) ! (pp val) ! ;; Hyperlinks in variable's value are quite frequently --- 54,222 ---- (re-search-backward "`\\([^`']+\\)'" nil t) (help-xref-button 1 'help-variable-def variable file-name))) ! (if valvoid ! (princ "It is void as a variable.") ! (princ "Its "))) ! (if valvoid ! (princ " is void as a variable.") ! (princ "'s ")))) ! (if valvoid ! nil ! (with-current-buffer standard-output ! (setq val-start-pos (point)) ! (princ "value is ") ! (terpri) ! (let ((from (point))) ! (pp val) ! ;; Hyperlinks in variable's value are quite frequently ! ;; inappropriate e.g C-h v features ! ;; (help-xref-on-pp from (point)) ! (if (< (point) (+ from 20)) ! (delete-region (1- from) from))))) ! (terpri) ! ! (when locus ! (if (bufferp locus) ! (princ (format "%socal in buffer %s; " ! (if (get variable 'permanent-local) ! "Permanently l" "L") ! (buffer-name))) ! (princ (format "It is a frame-local variable; "))) ! (if (not (default-boundp variable)) ! (princ "globally void") ! (let ((val (default-value variable))) ! (with-current-buffer standard-output ! (princ "global value is ") ! (terpri) ! ;; Fixme: pp can take an age if you happen to ! ;; ask for a very large expression. We should ! ;; probably print it raw once and check it's a ! ;; sensible size before prettyprinting. -- fx ! (let ((from (point))) ! (pp val) ! ;; See previous comment for this function. ! ;; (help-xref-on-pp from (point)) ! (if (< (point) (+ from 20)) ! (delete-region (1- from) from)))))) ! (terpri)) ! ! ;; If the value is large, move it to the end. ! (with-current-buffer standard-output ! (when (> (count-lines (point-min) (point-max)) 10) ! ;; Note that setting the syntax table like below ! ;; makes forward-sexp move over a `'s' at the end ! ;; of a symbol. ! (set-syntax-table emacs-lisp-mode-syntax-table) ! (goto-char val-start-pos) ! ;; The line below previously read as ! ;; (delete-region (point) (progn (end-of-line) (point))) ! ;; which suppressed display of the buffer local value for ! ;; large values. ! (when (looking-at "value is") (replace-match "")) ! (save-excursion ! (insert "\n\nValue:") ! (set (make-local-variable 'help-button-cache) ! (point-marker))) ! (insert "value is shown ") ! (insert-button "below" ! 'action help-button-cache ! 'follow-link t ! 'help-echo "mouse-2, RET: show value") ! (insert ".\n"))) ! (terpri) ! ! (let* ((alias (condition-case nil ! (indirect-variable variable) ! (error variable))) ! (obsolete (get variable 'byte-obsolete-variable)) ! (use (car obsolete)) ! (safe-var (get variable 'safe-local-variable)) ! (doc (or (documentation-property variable 'variable-documentation) ! (documentation-property alias 'variable-documentation))) ! (extra-line nil)) ! ;; Add a note for variables that have been make-var-buffer-local. ! (when (and (local-variable-if-set-p variable) ! (or (not (local-variable-p variable)) ! (with-temp-buffer ! (local-variable-if-set-p variable)))) ! (setq extra-line t) ! (princ " Automatically becomes buffer-local when set in any fashion.\n")) ! ! ;; Mention if it's an alias ! (unless (eq alias variable) ! (setq extra-line t) ! (princ (format " This variable is an alias for `%s'.\n" alias))) ! ! (when obsolete ! (setq extra-line t) ! (princ " This variable is obsolete") ! (if (cdr obsolete) (princ (format " since %s" (cdr obsolete)))) ! (princ (cond ((stringp use) (concat ";\n " use)) ! (use (format ";\n use `%s' instead." (car obsolete))) ! (t "."))) ! (terpri)) ! ! (when (member (cons variable val) file-local-variables-alist) ! (setq extra-line t) ! (if (member (cons variable val) dir-local-variables-alist) ! (let ((file (and (buffer-file-name) ! (not (file-remote-p (buffer-file-name))) ! (dir-locals-find-file (buffer-file-name))))) ! (princ " This variable is a directory local variable") ! (when file ! (princ (concat "\n from the file \"" ! (if (consp file) ! (car file) ! file) ! "\""))) ! (princ ".\n")) ! (princ " This variable is a file local variable.\n"))) ! ! (when (memq variable ignored-local-variables) ! (setq extra-line t) ! (princ " This variable is ignored when used as a file local \ ! variable.\n")) ! ! ;; Can be both risky and safe, eg auto-fill-function. ! (when (risky-local-variable-p variable) ! (setq extra-line t) ! (princ " This variable is potentially risky when used as a \ ! file local variable.\n") ! (when (assq variable safe-local-variable-values) ! (princ " However, you have added it to \ ! `safe-local-variable-values'.\n"))) ! ! (when safe-var ! (setq extra-line t) ! (princ " This variable is safe as a file local variable ") ! (princ "if its value\n satisfies the predicate ") ! (princ (if (byte-code-function-p safe-var) ! "which is byte-compiled expression.\n" ! (format "`%s'.\n" safe-var)))) ! ! (if extra-line (terpri)) ! (princ "Documentation:\n") ! (with-current-buffer standard-output ! (insert (or doc "Not documented as a variable.")))) ! ! ;; Make a link to customize if this variable can be customized. ! (when (custom-variable-p variable) ! (let ((customize-label "customize")) ! (terpri) ! (terpri) ! (princ (concat "You can " customize-label " this variable.")) ! (with-current-buffer standard-output ! (save-excursion ! (re-search-backward ! (concat "\\(" customize-label "\\)") nil t) ! (help-xref-button 1 'help-customize-variable variable)))) ! ;; Note variable's version or package version ! (let ((output (describe-variable-custom-version-info variable))) ! (when output ! (terpri) ! (terpri) ! (princ output)))) ! ! (with-current-buffer standard-output ! ;; Return the text we displayed. ! (buffer-string)))))))) --000e0cd6e4b2106cb0048b76196e Content-Type: application/octet-stream; name="describe-variable-mods-2010-07-15.el" Content-Disposition: attachment; filename="describe-variable-mods-2010-07-15.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gbo1jhnc0 Ozs7IDpGSUxFLUNSRUFURUQgPFRpbWVzdGFtcDogI3syMDEwLTA3LTE1VDEzOjQzOjQyLTA0OjAw Wn0jezEwMjg0fSAtIGJ5IE1PTj4KCjs7IGBkZXNjcmliZS12YXJpYWJsZScgbWlzc2VzIG9uIGNl cnRhaW4gcGVybWFuZW50LWxvY2FscyBbUEFUQ0hdCgo7OyBBcyBjdXJyZW50bHkgd3JpdHRlbiBg ZGVzY3JpYmUtdmFyaWFibGUnIHdpbGwsIGZvciBjZXJ0YWluIHZhcmlhYmxlcywKOzsgb25seSBp bmZvcm0gaWYgYSB2YXJpYWJsZSBpcyBwZXJtYW5lbnRseSBsb2NhbCB3aGVuIGl0IGlzIHNldCB0 byBoYXZlCjs7IGEgbG9jYWwgdmFsdWUgaW4gY3VycmVudC1idWZmZXIuCgo7OyBUaGlzIGhhcHBl bnMgZm9yIGV4YW1wbGUgd2l0aCBga2lsbC1idWZmZXItaG9vaycgd2hpY2ggX2lzXyBhCjs7IHBl cm1hbmVudC1sb2NhbC4gQW5kIGluIHRoZXMgc2l0dWF0aW9ucywgYGRlc2NyaWJlLXZhcmlhYmxl JyAoYW5kIGJ5Cjs7IHByb3h5ICIqSGVscCoiKSBjYW4gbm90IHRlbGwgdXMgaWYgYSB2YXJpYWJs ZSBpcyBwZXJtYW5lbnQtbG9jYWwKOzsgdW5sZXNzIHRoZSBkb2NzdHJpbmcgZXhwbGljaXRseSBz dGF0ZXMgYXMgc3VjaC4KCjs7IEF0IGZpcnN0IGJsdXNoIGl0IHdvdWxkIGFwcGVhciB0aGF0IGBk ZXNjcmliZS12YXJpYWJsZSdzIGJpbmRpbmcgb2YKOzsgYGxvY3VzJyBoYXBwZW5zIGF0IHRoZSBi dWZmZXIgbGV2ZWwgYW5kIHRoZXJmb3IgX3Nob3VsZF8gaWRlbnRpZnkgYQo7OyBwZXJtYW5lbnQt bG9jYWwgcGVyOgoKOzsgLC0tLS0KOzsgfCAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIKOzsg fCAgIChzZXRxIHZhbCAoc3ltYm9sLXZhbHVlIHZhcmlhYmxlKQo7OyB8ICAgICAgICAgbG9jdXMg KHZhcmlhYmxlLWJpbmRpbmctbG9jdXMgdmFyaWFibGUpKSkKOzsgYC0tLS0KCjs7IFRoaXMgaXMg YmVjYXVzZSB0aGUgZm9sbG93aW5nIGhldXJpc3RpY3Mgd29uJ3QgYWx3YXlzIHJlY29nbml6ZSB0 aGUKOzsgcGVybWFuZW50LWxvY2FsIHByb3BlcnR5IHdoZXJlIGEgYGxvY3VzJyBwaXZvdHMgb24g YSBgYnVmZmVycCcgY2hlY2s6Cgo7OyAsLS0tLQo7OyB8ICAoaWYgdmFsdm9pZAo7OyB8ICAgICAg bmlsCjs7IHwgICAgKHdpdGgtY3VycmVudC1idWZmZXIgc3RhbmRhcmQtb3V0cHV0Cjs7IHwgICAg ICAoc2V0cSB2YWwtc3RhcnQtcG9zIChwb2ludCkpCjs7IHwgICAgICAocHJpbmMgInZhbHVlIGlz ICIpCjs7IHwgICAgICAodGVycHJpKQo7OyB8ICAgICAgKGxldCAoKGZyb20gKHBvaW50KSkpCjs7 IHwgICAgICAgIChwcCB2YWwpCjs7IHwgICAgICAgIChpZiAoPCAocG9pbnQpICgrIGZyb20gMjAp KQo7OyB8ICAgICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKDEtIGZyb20pIGZyb20pKSkpKQo7OyB8 IAkgICAgKHRlcnByaSkKOzsgfCAgKHdoZW4gbG9jdXMKOzsgfCAgICAoaWYgKGJ1ZmZlcnAgbG9j dXMpIDs8LSBBIHBlcm1hbmVudC1sb2NhbCdzIGxvY3VzIGlzIGVsc2V3aGVyZSEKOzsgfCAgICAg ICAgKHByaW5jIChmb3JtYXQgIiVzb2NhbCBpbiBidWZmZXIgJXM7ICIKOzsgfCAgICAgICAgICAg ICAgICAgICAgICAgKGlmIChnZXQgdmFyaWFibGUgJ3Blcm1hbmVudC1sb2NhbCkKOzsgfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICJQZXJtYW5lbnRseSBsIiAiTCIpCjs7IHwgICAgICAgICAg ICAgICAgICAgICAgIChidWZmZXItbmFtZSkpKQo7OyB8ICAgICAgKHByaW5jIChmb3JtYXQgIkl0 IGlzIGEgZnJhbWUtbG9jYWwgdmFyaWFibGU7ICIpKSkKOzsgfCAgICAoaWYgKG5vdCAoZGVmYXVs dC1ib3VuZHAgdmFyaWFibGUpKQo7OyB8ICAgICAgICAocHJpbmMgImdsb2JhbGx5IHZvaWQiKQo7 OyB8ICAgICAgKGxldCAoKHZhbCAoZGVmYXVsdC12YWx1ZSB2YXJpYWJsZSkpKQo7OyB8ICAgICAg ICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKOzsgfCAgICAgICAgICAocHJp bmMgImdsb2JhbCB2YWx1ZSBpcyAiKQo7OyB8ICAgICAgICAgICh0ZXJwcmkpCjs7IHwgICAgICAg ICAgKGxldCAoKGZyb20gKHBvaW50KSkpCjs7IHwgICAgICAgICAgICAocHAgdmFsKQo7OyB8ICAg ICAgICAgICAgKGlmICg8IChwb2ludCkgKCsgZnJvbSAyMCkpCjs7IHwgICAgICAgICAgICAgICAg KGRlbGV0ZS1yZWdpb24gKDEtIGZyb20pIGZyb20pKSkpKSkKOzsgfCAgICAodGVycHJpKSkKOzsg YC0tLS0KCjs7IFcvcmUgYGRlc2NyaWJlLXZhcmlhYmxlJ3MgY3VycmVudCBiZWhhdmlvciBhcm91 bmQgcGVybWFuZW50LWxvY2FsIGl0Cjs7IGRvZXMgbm90IHNlcnZlIGl0cyBwdXJwb3NlIHdlbGwu Cgo7OyBXaGVuIGEgdXNlciBhc2tzIHRoYXQgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBhIHZhcmlh YmxlIHZhcmlhYmxlIHRoYXQKOzsgdmFyaWFibGUgaGFzIGEgcGVybWFuZW50LWxvY2FsIHByb3Bl cnR5IGl0IGlzIGltcG9ydGFudCB0aGF0IGEgdXNlciBiZQo7OyBpbmZvcm1lZCBhcyBzdWNoLgoK OzsgU3BlY2lmaWNhbGx5IHRoYXQ6Cgo7OyAtIGEgdmFyaWFibGUgX2lzXyBwZXJtYW5lbnQtbG9j YWw7Cgo7OyAtIHRoYXQgdGhvdWdoIGN1cnJlbnRseSBudWxsLCBfaWZfIHNldCBpdCB3b3VsZCBi ZSBwZXJtYW5lbnQtbG9jYWwgaW4KOzsgICBjdXJyZW50LWJ1ZmZlcjsKCjs7IC0gdGhhdCBpZiBu b24tbmlsIHRoZSB2YWx1ZSBpcyBwZXJtYW5lbnQtbG9jYWwgaW4gY3VycmVudC1idWZmZXIgYW5k Cjs7ICAgd2lsbCBwZXJzaXN0IGFjcm9zcyBpbnZvY2F0aW9ucyBvZiBga2lsbC1hbGwtbG9jYWwt dmFyaWFibGVzJyB1bmxlc3MKOzsgICBleHBsaWNpdGx5IHJlbW92ZWQuCgo7OyBJT1csIGtub3dp bmcgdGhhdCBhIHZhcmlhYmxlIGlzOgoKOzsgICJMb2NhbCBpbiBidWZmZXIgPFNPTUUtQlVGRkVS PjsiCgo7OyBJcyBub3QgdGhlIHNhbWUgYXMgc2F5aW5nIHRoYXQgYSB2YXJpYWJsZSBpczsgCiAK OzsgICJQZXJtYW5lbnRseSBsb2NhbCBpbiA8U09NRS1CVUZGRVI+OyIKCjs7IFdoaWNoIGlzbid0 IHRoZSBzYW1lIGFzIHNheWluZyBlaXRoZXIgb2YgZm9sbG93aW5nIGFib3V0IGEgdmFyaWFibGU7 Cgo7OyAgIlRoaXMgdmFyaWFibGUgaXMgYSBwZXJtYW5lbnQtbG9jYWwuCjs7ICAgSXQgc2F0aXNm aWVzIHRoZSBwcmVkaWNhdGUgYGxvY2FsLXZhcmlhYmxlLXAnIGluIDxTT01FLUJVRkZFUj4uCjs7 ICAgVGhpcyB2YWx1ZSB3aWxsIHBlcnNpc3QgaW4gY3VycmVudC1idWZmZXIgdW50aWwgZXhwbGlj aXRseSByZW1vdmVkOyIKCjs7ICAiVGhpcyB2YXJpYWJsZSBpcyBhIHBlcm1hbmVudC1sb2NhbC4g Cjs7ICAgSXRzIGN1cnJlbnQgdmFsdWUgaXMgbnVsbCBpbiA8U09NRS1CVUZGRVI+Lgo7OyAgIFRo aXMgdmFyaWFibGUgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUgYGxvY2FsLXZhcmlhYmxlLWlmLXNl dC1wJy4KOzsgICBXaGVuIHNldCB3aXRoIGBtYWtlLWxvY2FsLXZhcmlhYmxlJyB0aGUgdmFsdWUg d2lsbCBwZXJzaXN0IGluCjs7ICAgY3VycmVudC1idWZmZXIgdW50aWwgZXhwbGljaXRseSByZW1v dmVkOyIKCjs7IEZvbGxvd2luZyBmbmNuIGAlZGVzY3JpYmUtdmFyaWFibGUtbWlzcy1wZXJtYW5l bnQtbG9jYWwtZXhhbXBsZScKOzsgaWxsdXN0cmF0ZXMgd2hhdCBJIHBlcmNlaXZlIHRvIGJlIHRo ZSAicHJvYmxlbSI6Cgo7OzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CihkZWZ1biAl ZGVzY3JpYmUtdmFyaWFibGUtbWlzcy1wZXJtYW5lbnQtbG9jYWwtZXhhbXBsZSAoKQogICJJbGx1 c3RyYXRlIGBkZXNjcmliZS12YXJpYWJsZScgbm90IGlkZW50aWZ5aW5nIHBlcm1hbmVudC1sb2Nh bCB2YXJpYWJsZXMuCkRpc3BsYXkgcmVzdWx0cyBpbiBidWZmZXIgXCIqQlVGRkVSLVctT1VULUxP Q0FMLUtCLUhPT0sqXCIuIgogIChpbnRlcmFjdGl2ZSkKICAobGV0ICgoZHZkciAoY29uY2F0ICJc biIgKG1ha2Utc3RyaW5nIDgwIDU5KSAiXG4iKSkKICAgICAgICAody1sY2wgIipCVUZGRVItVy1M T0NBTC1LQi1IT09LKiIpCiAgICAgICAgKHcvby1sY2wgIipCVUZGRVItVy1PVVQtTE9DQUwtS0It SE9PSyoiKQogICAgICAgIGtiaCB0bXAtZm5jbikKICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIChn ZXQtYnVmZmVyLWNyZWF0ZSB3LWxjbCkKICAgICAgKGZzZXQgJ3RtcC1mbmNuICMnKGxhbWJkYSAo KSAiZG9lcyBub3RoaW5nLiIgbmlsKSkKICAgICAgKGFkZC1ob29rICdraWxsLWJ1ZmZlci1ob29r ICd0bXAtZm5jbiBuaWwgdCkKICAgICAgKHNldHEga2JoIChidWZmZXItbG9jYWwtdmFsdWUgJ2tp bGwtYnVmZmVyLWhvb2sgKGN1cnJlbnQtYnVmZmVyKSkpCiAgICAgICh3aXRoLWN1cnJlbnQtYnVm ZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSB3L28tbGNsKQogICAgICAgIChlcmFzZS1idWZmZXIpCiAg ICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAoaW5zZXJ0IChzdWJzdHJpbmcgZHZkciAx KQogICAgICAgICAgICAgICAgICAiOzsgTG9jYWwgdmFsdWUgb2YgYGtpbGwtYnVmZmVyLWhvb2sn IGluIGJ1ZmZlcjogIiB3LWxjbCAiXG47O1xuIgogICAgICAgICAgICAgICAgICAoZm9ybWF0ICIl UyIga2JoKSBkdmRyKQogICAgICAgICAgKHNldHEga2JoIChidWZmZXItbG9jYWwtdmFsdWUgJ2tp bGwtYnVmZmVyLWhvb2sgKGN1cnJlbnQtYnVmZmVyKSkpCiAgICAgICAgICAoaW5zZXJ0IGR2ZHIg Ijs7IExvY2FsIHZhbHVlIG9mIGBraWxsLWJ1ZmZlci1ob29rJyBpbiBidWZmZXI6ICIgdy9vLWxj bCAiXG47O1xuIgogICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlUyIga2JoKSBkdmRyIGR2ZHIK ICAgICAgICAgICAgICAgICAgIjs7IEV2YWx1YXRpbmcgYGRlc2NyaWJlLXZhcmlhYmxlJyBmb3Ig YGtpbGwtYnVmZmVyLWhvb2snIHdpdGggYnVmZmVyOiAiIAogICAgICAgICAgICAgICAgICB3L28t bGNsICJcbjs7IE5PVEUsIHdpdGggYGN1cnJlbnQtYnVmZmVyJyB0aGVyZSBpcyBubyBpbmRpY2F0 aW9uICIKICAgICAgICAgICAgICAgICAgIm9mIGBraWxsLWJ1ZmZlci1ob29rJyBiZWluZyBwZXJt YW5lbnQtbG9jYWwiIGR2ZHIgIlxuIiAKICAgICAgICAgICAgICAgICAgKGRlc2NyaWJlLXZhcmlh YmxlICdraWxsLWJ1ZmZlci1ob29rIChjdXJyZW50LWJ1ZmZlcikpICJcbiIgZHZkciAKICAgICAg ICAgICAgICAgICAgIjs7IEV2YWx1YXRpbmcgYGRlc2NyaWJlLXZhcmlhYmxlJyBmb3IgYGtpbGwt YnVmZmVyLWhvb2snIHdpdGggYnVmZmVyOiAiCiAgICAgICAgICAgICAgICAgIHctbGNsICJcbjs7 IE5PVEUsIGNvbnRyYXN0ZWQgd2l0aCBhYm92ZSwgbm93IHRoZXJlIF9pc18gaW5kaWNhdGlvbiAi CiAgICAgICAgICAgICAgICAgICJvZiBga2lsbC1idWZmZXItaG9vaycgYXMgcGVybWFuZW50LWxv Y2FsLlxuIgogICAgICAgICAgICAgICAgICAiOzsgQWRkaXRpb25hbGx5LCB0aGVyZSBpcyBhbHNv IGluZGljYXRpb24gdGhhdCB0aGUgIgogICAgICAgICAgICAgICAgICAidmFyYWlibGUncyBnbG9i YWwgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBsb2NhbC4iIGR2ZHIgIlxuIiAKICAgICAgICAgICAg ICAgICAgKGRlc2NyaWJlLXZhcmlhYmxlICdraWxsLWJ1ZmZlci1ob29rIChnZXQtYnVmZmVyIHct bGNsKSkgIlxuIiBkdmRyKSkpCiAgICAgIChwcm9nMQogICAgICAgICAgKHVuaW50ZXJuICd0bXAt Zm5jbikKICAgICAgICAoa2lsbC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkpKQogICAgKHBvcC10 by1idWZmZXIgKGdldC1idWZmZXIgdy9vLWxjbCkpKSkKOzsKOzsgKCVkZXNjcmliZS12YXJpYWJs ZS1taXNzLXBlcm1hbmVudC1sb2NhbC1leGFtcGxlKQo7Owo7OyAodW5pbnRlcm4gJyVkZXNjcmli ZS12YXJpYWJsZS1taXNzLXBlcm1hbmVudC1sb2NhbC1leGFtcGxlKQoKOzs7ID09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQo7OyBGb2xsb3dpbmcgaXMgYSBsaWdodGx5IHRlc3RlZCBtb2Rp ZmllZCB2ZXJzaW9uIG9mIGBkZXNjcmliZS12YXJpYWJsZScKOzsgdHdlYWtlZCB0byByZXBvcnQg bW9yZSBpbnRlbGxpZ2VudGx5IHdoZW4gdmFyaWFibGVzIGFyZSBidWZmZXItbG9jYWwKOzsgYW5k L29yIHBlcm1hbmVudC1sb2NhbC4gIEZvbGxvd2luZyB0aGF0IGlzIGEgcGF0Y2ggdG8gbGlzcC9o ZWxwLWZucy5lbAo7OyBjdXJyZW50IHRocm91Z2ggQnpyLTEwMDA4Mjc6Cgo7OzsjIyNhdXRvbG9h ZAooZGVmdW4gZGVzY3JpYmUtdmFyaWFibGUgKHZhcmlhYmxlICZvcHRpb25hbCBidWZmZXIgZnJh bWUpCiAgIkRpc3BsYXkgdGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBvZiBWQVJJQUJMRSAoYSBzeW1i b2wpLgpSZXR1cm5zIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgc3RyaW5nLCBhbHNvLgpJZiBWQVJJ QUJMRSBoYXMgYSBidWZmZXItbG9jYWwgdmFsdWUgaW4gQlVGRkVSIG9yIEZSQU1FClwoZGVmYXVs dCB0byB0aGUgY3VycmVudCBidWZmZXIgYW5kIGN1cnJlbnQgZnJhbWUpLAppdCBpcyBkaXNwbGF5 ZWQgYWxvbmcgd2l0aCB0aGUgZ2xvYmFsIHZhbHVlLiIKICAoaW50ZXJhY3RpdmUKICAgKGxldCAo KHYgKHZhcmlhYmxlLWF0LXBvaW50KSkKCSAoZW5hYmxlLXJlY3Vyc2l2ZS1taW5pYnVmZmVycyB0 KQoJIHZhbCkKICAgICAoc2V0cSB2YWwgKGNvbXBsZXRpbmctcmVhZCAoaWYgKHN5bWJvbHAgdikK CQkJCSAgICAoZm9ybWF0CgkJCQkgICAgICJEZXNjcmliZSB2YXJpYWJsZSAoZGVmYXVsdCAlcyk6 ICIgdikKCQkJCSAgIkRlc2NyaWJlIHZhcmlhYmxlOiAiKQoJCQkJb2JhcnJheQoJCQkJJyhsYW1i ZGEgKHZ2KQoJCQkJICAgKG9yIChib3VuZHAgdnYpCgkJCQkgICAgICAgKGdldCB2diAndmFyaWFi bGUtZG9jdW1lbnRhdGlvbikpKQoJCQkJdCBuaWwgbmlsCgkJCQkoaWYgKHN5bWJvbHAgdikgKHN5 bWJvbC1uYW1lIHYpKSkpCiAgICAgKGxpc3QgKGlmIChlcXVhbCB2YWwgIiIpCgkgICAgICAgdiAo aW50ZXJuIHZhbCkpKSkpCiAgKGxldCAoZmlsZS1uYW1lCiAgICAgICAgKHBsb2MgKGdldCB2YXJp YWJsZSAncGVybWFuZW50LWxvY2FsKSkpCiAgICAodW5sZXNzIChidWZmZXItbGl2ZS1wIGJ1ZmZl cikgKHNldHEgYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKQogICAgKHVubGVzcyAoZnJhbWUtbGl2 ZS1wIGZyYW1lKSAoc2V0cSBmcmFtZSAoc2VsZWN0ZWQtZnJhbWUpKSkKICAgIChpZiAobm90IChz eW1ib2xwIHZhcmlhYmxlKSkKCShtZXNzYWdlICJZb3UgZGlkIG5vdCBzcGVjaWZ5IGEgdmFyaWFi bGUiKQogICAgICAoc2F2ZS1leGN1cnNpb24KCShsZXQgKCh2YWx2b2lkIChub3QgKHdpdGgtY3Vy cmVudC1idWZmZXIgYnVmZmVyIChib3VuZHAgdmFyaWFibGUpKSkpCgkgICAgICB2YWwgdmFsLXN0 YXJ0LXBvcyBsb2N1cykKCSAgOzsgRXh0cmFjdCB0aGUgdmFsdWUgYmVmb3JlIHNldHRpbmcgdXAg dGhlIG91dHB1dCBidWZmZXIsCgkgIDs7IGluIGNhc2UgYGJ1ZmZlcicgKmlzKiB0aGUgb3V0cHV0 IGJ1ZmZlci4KCSAgKHVubGVzcyB2YWx2b2lkCgkgICAgKHdpdGgtc2VsZWN0ZWQtZnJhbWUgZnJh bWUKCSAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgoJCShzZXRxIHZhbCAoc3ltYm9s LXZhbHVlIHZhcmlhYmxlKQoJCSAgICAgIGxvY3VzICh2YXJpYWJsZS1iaW5kaW5nLWxvY3VzIHZh cmlhYmxlKSkpKSkKCSAgKGhlbHAtc2V0dXAteHJlZiAobGlzdCAjJ2Rlc2NyaWJlLXZhcmlhYmxl IHZhcmlhYmxlIGJ1ZmZlcikKCQkJICAgKGNhbGxlZC1pbnRlcmFjdGl2ZWx5LXAgJ2ludGVyYWN0 aXZlKSkKCSAgKHdpdGgtaGVscC13aW5kb3cgKGhlbHAtYnVmZmVyKQoJICAgICh3aXRoLWN1cnJl bnQtYnVmZmVyIGJ1ZmZlcgoJICAgICAgKHByaW4xIHZhcmlhYmxlKQoJICAgICAgKHNldHEgZmls ZS1uYW1lIChmaW5kLWxpc3Atb2JqZWN0LWZpbGUtbmFtZSB2YXJpYWJsZSAnZGVmdmFyKSkKCgkg ICAgICAoaWYgZmlsZS1uYW1lCgkJICAocHJvZ24KCQkgICAgKHByaW5jICIgaXMgYSB2YXJpYWJs ZSBkZWZpbmVkIGluIGAiKQoJCSAgICAocHJpbmMgKGlmIChlcSBmaWxlLW5hbWUgJ0Mtc291cmNl KQoJCQkgICAgICAgIkMgc291cmNlIGNvZGUiCgkJCSAgICAgKGZpbGUtbmFtZS1ub25kaXJlY3Rv cnkgZmlsZS1uYW1lKSkpCgkJICAgIChwcmluYyAiJy5cbiIpCgkJICAgICh3aXRoLWN1cnJlbnQt YnVmZmVyIHN0YW5kYXJkLW91dHB1dAoJCSAgICAgIChzYXZlLWV4Y3Vyc2lvbgoJCQkocmUtc2Vh cmNoLWJhY2t3YXJkICJgXFwoW15gJ10rXFwpJyIgbmlsIHQpCgkJCShoZWxwLXhyZWYtYnV0dG9u IDEgJ2hlbHAtdmFyaWFibGUtZGVmCgkJCQkJICB2YXJpYWJsZSBmaWxlLW5hbWUpKSkKCQkgICAg KHVubGVzcyBwbG9jCiAgICAgICAgICAgICAgICAgICAgICAoaWYgdmFsdm9pZAogICAgICAgICAg ICAgICAgICAgICAgICAgIChwcmluYyAiSXQgaXMgdm9pZCBhcyBhIHZhcmlhYmxlLiIpCiAgICAg ICAgICAgICAgICAgICAgICAgIChwcmluYyAiSXRzICIpKSkpCiAgICAgICAgICAgICAgICAodW5s ZXNzIHBsb2MKICAgICAgICAgICAgICAgICAgKGlmIHZhbHZvaWQKICAgICAgICAgICAgICAgICAg ICAgIChwcmluYyAiIGlzIHZvaWQgYXMgYSB2YXJpYWJsZS4iKQogICAgICAgICAgICAgICAgICAg IChpZiAoYnVmZmVycCBsb2N1cykKICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gKG51bGwg KGJ1ZmZlci1sb2NhbC12YWx1ZSB2YXJpYWJsZSAoZ2V0LWJ1ZmZlciBidWZmZXIpKSkKICAgICAg ICAgICAgICAgICAgICAgICAgICAodGVycHJpKSkKICAgICAgICAgICAgICAgICAgICAgIChwcmlu YyAiJ3MgIikpKSkpKQogICAgICAgICAgICAgIAogICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1 ZmZlciBzdGFuZGFyZC1vdXRwdXQKICAgICAgICAgICAgICAoaWYgdmFsdm9pZAogICAgICAgICAg ICAgICAgICBuaWwKICAgICAgICAgICAgICAgIChwcm9nbgogICAgICAgICAgICAgICAgICAoc2V0 cSB2YWwtc3RhcnQtcG9zIChwb2ludCkpCiAgICAgICAgICAgICAgICAgIChpZiAoYnVmZmVycCBs b2N1cykKICAgICAgICAgICAgICAgICAgICAgIChpZiBwbG9jCiAgICAgICAgICAgICAgICAgICAg ICAgICAgKGlmIChidWZmZXItbG9jYWwtdmFsdWUgdmFyaWFibGUgKGdldC1idWZmZXIgYnVmZmVy KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByaW5jICJJdHMgbG9jYWwgdmFsdWUg aXMgIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmluYyAiSXRzIGRlZmF1bHQgbG9j YWwgdmFsdWUgaXMgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIChwcmluYyAiSXRzIG5vbi1s b2NhbCBnbG9iYWwgdmFsdWUgaXMgIikpCiAgICAgICAgICAgICAgICAgICAgKGlmIHBsb2MKICAg ICAgICAgICAgICAgICAgICAgICAgKHByaW5jICJJdHMgdmFsdWUgaXMgIikKICAgICAgICAgICAg ICAgICAgICAgIChwcmluYyAidmFsdWUgaXMgIikpKQogICAgICAgICAgICAgICAgICAodGVycHJp KQogICAgICAgICAgICAgICAgICAobGV0ICgoZnJvbSAocG9pbnQpKSkKICAgICAgICAgICAgICAg ICAgICAocHAgdmFsKQogICAgICAgICAgICAgICAgICAgIDs7IEh5cGVybGlua3MgaW4gdmFyaWFi bGUncyB2YWx1ZSBhcmUgcXVpdGUgZnJlcXVlbnRseQogICAgICAgICAgICAgICAgICAgIDs7IGlu YXBwcm9wcmlhdGUgZS5nIEMtaCB2IDxSRVQ+IGZlYXR1cmVzIDxSRVQ+CiAgICAgICAgICAgICAg ICAgICAgOzsgKGhlbHAteHJlZi1vbi1wcCBmcm9tIChwb2ludCkpCiAgICAgICAgICAgICAgICAg ICAgKGlmICg8IChwb2ludCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBwbG9jIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsgZnJvbSAyMCkKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoKyBmcm9tIDIwKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIChkZWxl dGUtcmVnaW9uICgxLSBmcm9tKSBmcm9tKSkpKSkKICAgICAgICAgICAgICAod2hlbiAoYW5kIHBs b2MgKG5vdCAoYnVmZmVycCBsb2N1cykpKQogICAgICAgICAgICAgICAgKHRlcnByaSkgICAgCiAg ICAgICAgICAgICAgICAocHJpbmMgIkl0IGhhcyBhIG5vbi1uaWwgcGVybWFuZW50LWxvY2FsIHBy b3BlcnR5OyIpKSkKICAgICAgICAgICAgKHRlcnByaSkKICAgICAgICAgICAgCiAgICAgICAgICAg IChwcm9nbgogICAgICAgICAgICAgIChjb25kICgoYnVmZmVycCBsb2N1cykKICAgICAgICAgICAg ICAgICAgICAgKHByaW5jIChmb3JtYXQgIkl0IGlzIGEgJXNsb2NhbCB2YXJpYWJsZSBpbiBidWZm ZXIgJXM7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBwbG9jCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVybWFuZW50LSIgImJ1ZmZl ci0iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLW5hbWUpKSkp CiAgICAgICAgICAgICAgICAgICAgKChmcmFtZXAgbG9jdXMpIAogICAgICAgICAgICAgICAgICAg ICAocHJpbmMgKGZvcm1hdCAiSXQgaXMgYSBmcmFtZS1sb2NhbCB2YXJpYWJsZTsiKSkpCiAgICAg ICAgICAgICAgICAgICAgKChudWxsIGxvY3VzKQogICAgICAgICAgICAgICAgICAgICAiSXQgaXMg YSBnbG9iYWwgdmFyaWFibGU7IikpCiAgICAgICAgICAgICAgKHdoZW4gKG9yIChmcmFtZXAgbG9j dXMpIChidWZmZXJwIGxvY3VzKSBwbG9jKQogICAgICAgICAgICAgICAgKGlmIChub3QgKGRlZmF1 bHQtYm91bmRwIHZhcmlhYmxlKSkKICAgICAgICAgICAgICAgICAgICAocHJpbmMgIlZhbHVlIGFz IGdsb2JhbDogdm9pZCIpCiAgICAgICAgICAgICAgICAgICh1bmxlc3MgKG51bGwgKGJ1ZmZlci1s b2NhbC12YWx1ZSB2YXJpYWJsZSAoZ2V0LWJ1ZmZlciBidWZmZXIpKSkKICAgICAgICAgICAgICAg ICAgICAobGV0ICgodmFsIChkZWZhdWx0LXZhbHVlIHZhcmlhYmxlKSkpCiAgICAgICAgICAgICAg ICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKICAgICAgICAgICAg ICAgICAgICAgICAgKHByaW5jICJWYWx1ZSBhcyBnbG9iYWw6ICIpCiAgICAgICAgICAgICAgICAg ICAgICAgICh0ZXJwcmkpCiAgICAgICAgICAgICAgICAgICAgICAgIDs7IEZpeG1lOiBwcCBjYW4g dGFrZSBhbiBhZ2UgaWYgeW91IGhhcHBlbiB0bwogICAgICAgICAgICAgICAgICAgICAgICA7OyBh c2sgZm9yIGEgdmVyeSBsYXJnZSBleHByZXNzaW9uLiAgV2Ugc2hvdWxkCiAgICAgICAgICAgICAg ICAgICAgICAgIDs7IHByb2JhYmx5IHByaW50IGl0IHJhdyBvbmNlIGFuZCBjaGVjayBpdCdzIGEK ICAgICAgICAgICAgICAgICAgICAgICAgOzsgc2Vuc2libGUgc2l6ZSBiZWZvcmUgcHJldHR5cHJp bnRpbmcuICAtLSBmeAogICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgoZnJvbSAocG9pbnQp KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAocHAgdmFsKQogICAgICAgICAgICAgICAgICAg ICAgICAgIDs7IFNlZSBwcmV2aW91cyBjb21tZW50IGZvciB0aGlzIGZ1bmN0aW9uLgogICAgICAg ICAgICAgICAgICAgICAgICAgIDs7IChoZWxwLXhyZWYtb24tcHAgZnJvbSAocG9pbnQpKQogICAg ICAgICAgICAgICAgICAgICAgICAgIChpZiAoPCAocG9pbnQpICgrIGZyb20gMjApKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlLXJlZ2lvbiAoMS0gZnJvbSkgZnJvbSkpKSkp KSkpCiAgICAgICAgICAgICAgKHRlcnByaSkpCiAgICAgICAgICAgIAoJICAgIDs7IElmIHRoZSB2 YWx1ZSBpcyBsYXJnZSwgbW92ZSBpdCB0byB0aGUgZW5kLgoJICAgICh3aXRoLWN1cnJlbnQtYnVm ZmVyIHN0YW5kYXJkLW91dHB1dAoJICAgICAgKHdoZW4gKD4gKGNvdW50LWxpbmVzIChwb2ludC1t aW4pIChwb2ludC1tYXgpKSAxMCkKCQk7OyBOb3RlIHRoYXQgc2V0dGluZyB0aGUgc3ludGF4IHRh YmxlIGxpa2UgYmVsb3cKCQk7OyBtYWtlcyBmb3J3YXJkLXNleHAgbW92ZSBvdmVyIGEgYCdzJyBh dCB0aGUgZW5kCgkJOzsgb2YgYSBzeW1ib2wuCgkJKHNldC1zeW50YXgtdGFibGUgZW1hY3MtbGlz cC1tb2RlLXN5bnRheC10YWJsZSkKCQkoZ290by1jaGFyIHZhbC1zdGFydC1wb3MpCgkJOzsgVGhl IGxpbmUgYmVsb3cgcHJldmlvdXNseSByZWFkIGFzCgkJOzsgKGRlbGV0ZS1yZWdpb24gKHBvaW50 KSAocHJvZ24gKGVuZC1vZi1saW5lKSAocG9pbnQpKSkKCQk7OyB3aGljaCBzdXBwcmVzc2VkIGRp c3BsYXkgb2YgdGhlIGJ1ZmZlciBsb2NhbCB2YWx1ZSBmb3IKCQk7OyBsYXJnZSB2YWx1ZXMuCgkJ KHdoZW4gKGxvb2tpbmctYXQgInZhbHVlIGlzIikgKHJlcGxhY2UtbWF0Y2ggIiIpKQoJCShzYXZl LWV4Y3Vyc2lvbgoJCSAgKGluc2VydCAiXG5cblZhbHVlOiIpCgkJICAoc2V0IChtYWtlLWxvY2Fs LXZhcmlhYmxlICdoZWxwLWJ1dHRvbi1jYWNoZSkKCQkgICAgICAgKHBvaW50LW1hcmtlcikpKQoJ CShpbnNlcnQgInZhbHVlIGlzIHNob3duICIpCgkJKGluc2VydC1idXR0b24gImJlbG93IgoJCQkg ICAgICAgJ2FjdGlvbiBoZWxwLWJ1dHRvbi1jYWNoZQoJCQkgICAgICAgJ2ZvbGxvdy1saW5rIHQK CQkJICAgICAgICdoZWxwLWVjaG8gIm1vdXNlLTIsIFJFVDogc2hvdyB2YWx1ZSIpCgkJKGluc2Vy dCAiLlxuIikpKQogICAgICAgICAgICAodGVycHJpKQogICAgICAgICAgICAKICAgICAgICAgICAg KGxldCogKChhbGlhcyAoY29uZGl0aW9uLWNhc2UgbmlsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChpbmRpcmVjdC12YXJpYWJsZSB2YXJpYWJsZSkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChlcnJvciB2YXJpYWJsZSkpKQogICAgICAgICAgICAgICAgICAgKG9ic29sZXRlIChn ZXQgdmFyaWFibGUgJ2J5dGUtb2Jzb2xldGUtdmFyaWFibGUpKQoJCSAgICh1c2UgKGNhciBvYnNv bGV0ZSkpCgkJICAgKHNhZmUtdmFyIChnZXQgdmFyaWFibGUgJ3NhZmUtbG9jYWwtdmFyaWFibGUp KQogICAgICAgICAgICAgICAgICAgKGRvYyAob3IgKGRvY3VtZW50YXRpb24tcHJvcGVydHkgdmFy aWFibGUgJ3ZhcmlhYmxlLWRvY3VtZW50YXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoZG9jdW1lbnRhdGlvbi1wcm9wZXJ0eSBhbGlhcyAndmFyaWFibGUtZG9jdW1lbnRhdGlvbikp KQogICAgICAgICAgICAgICAgICAgKGV4dHJhLWxpbmUgbmlsKSkKICAgICAgICAgICAgICA7OyBB ZGQgYSBub3RlIGZvciB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4gbWFrZS12YXItYnVmZmVyLWxv Y2FsLgogICAgICAgICAgICAgICh3aGVuIChhbmQgKGxvY2FsLXZhcmlhYmxlLWlmLXNldC1wIHZh cmlhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChub3QgKGxvY2FsLXZhcmlhYmxl LXAgdmFyaWFibGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoLXRlbXAtYnVm ZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYWwtdmFyaWFibGUtaWYtc2V0 LXAgdmFyaWFibGUpKSkpCiAgICAgICAgICAgICAgICAoc2V0cSBleHRyYS1saW5lIHQpCiAgICAg ICAgICAgICAgICAocHJpbmMgIiAgQXV0b21hdGljYWxseSBiZWNvbWVzIGJ1ZmZlci1sb2NhbCB3 aGVuIHNldCBpbiBhbnkgZmFzaGlvbi5cbiIpKQoKICAgICAgICAgICAgICA7OyBNZW50aW9uIGlm IGl0J3MgYW4gYWxpYXMKICAgICAgICAgICAgICAodW5sZXNzIChlcSBhbGlhcyB2YXJpYWJsZSkK ICAgICAgICAgICAgICAgIChzZXRxIGV4dHJhLWxpbmUgdCkKICAgICAgICAgICAgICAgIChwcmlu YyAoZm9ybWF0ICIgIFRoaXMgdmFyaWFibGUgaXMgYW4gYWxpYXMgZm9yIGAlcycuXG4iIGFsaWFz KSkpCgogICAgICAgICAgICAgICh3aGVuIG9ic29sZXRlCiAgICAgICAgICAgICAgICAoc2V0cSBl eHRyYS1saW5lIHQpCiAgICAgICAgICAgICAgICAocHJpbmMgIiAgVGhpcyB2YXJpYWJsZSBpcyBv YnNvbGV0ZSIpCiAgICAgICAgICAgICAgICAoaWYgKGNkciBvYnNvbGV0ZSkgKHByaW5jIChmb3Jt YXQgIiBzaW5jZSAlcyIgKGNkciBvYnNvbGV0ZSkpKSkKCQkocHJpbmMgKGNvbmQgKChzdHJpbmdw IHVzZSkgKGNvbmNhdCAiO1xuICAiIHVzZSkpCgkJCSAgICAgKHVzZSAoZm9ybWF0ICI7XG4gIHVz ZSBgJXMnIGluc3RlYWQuIiAoY2FyIG9ic29sZXRlKSkpCgkJCSAgICAgKHQgIi4iKSkpCiAgICAg ICAgICAgICAgICAodGVycHJpKSkKCgkgICAgICAod2hlbiAobWVtYmVyIChjb25zIHZhcmlhYmxl IHZhbCkgZmlsZS1sb2NhbC12YXJpYWJsZXMtYWxpc3QpCgkJKHNldHEgZXh0cmEtbGluZSB0KQoJ CShpZiAobWVtYmVyIChjb25zIHZhcmlhYmxlIHZhbCkgZGlyLWxvY2FsLXZhcmlhYmxlcy1hbGlz dCkKCQkgICAgKGxldCAoKGZpbGUgKGFuZCAoYnVmZmVyLWZpbGUtbmFtZSkKCQkJCSAgICAgKG5v dCAoZmlsZS1yZW1vdGUtcCAoYnVmZmVyLWZpbGUtbmFtZSkpKQoJCQkJICAgICAoZGlyLWxvY2Fs cy1maW5kLWZpbGUgKGJ1ZmZlci1maWxlLW5hbWUpKSkpKQoJCSAgICAgIChwcmluYyAiICBUaGlz IHZhcmlhYmxlIGlzIGEgZGlyZWN0b3J5IGxvY2FsIHZhcmlhYmxlIikKCQkgICAgICAod2hlbiBm aWxlCgkJCShwcmluYyAoY29uY2F0ICJcbiAgZnJvbSB0aGUgZmlsZSBcIiIKCQkJCSAgICAgICAo aWYgKGNvbnNwIGZpbGUpCgkJCQkJICAgKGNhciBmaWxlKQoJCQkJCSBmaWxlKQoJCQkJICAgICAg ICJcIiIpKSkKCQkgICAgICAocHJpbmMgIi5cbiIpKQoJCSAgKHByaW5jICIgIFRoaXMgdmFyaWFi bGUgaXMgYSBmaWxlIGxvY2FsIHZhcmlhYmxlLlxuIikpKQoKCSAgICAgICh3aGVuIChtZW1xIHZh cmlhYmxlIGlnbm9yZWQtbG9jYWwtdmFyaWFibGVzKQoJCShzZXRxIGV4dHJhLWxpbmUgdCkKCQko cHJpbmMgIiAgVGhpcyB2YXJpYWJsZSBpcyBpZ25vcmVkIHdoZW4gdXNlZCBhcyBhIGZpbGUgbG9j YWwgXAp2YXJpYWJsZS5cbiIpKQoKCSAgICAgIDs7IENhbiBiZSBib3RoIHJpc2t5IGFuZCBzYWZl LCBlZyBhdXRvLWZpbGwtZnVuY3Rpb24uCgkgICAgICAod2hlbiAocmlza3ktbG9jYWwtdmFyaWFi bGUtcCB2YXJpYWJsZSkKCQkoc2V0cSBleHRyYS1saW5lIHQpCgkJKHByaW5jICIgIFRoaXMgdmFy aWFibGUgaXMgcG90ZW50aWFsbHkgcmlza3kgd2hlbiB1c2VkIGFzIGEgXApmaWxlIGxvY2FsIHZh cmlhYmxlLlxuIikKCQkod2hlbiAoYXNzcSB2YXJpYWJsZSBzYWZlLWxvY2FsLXZhcmlhYmxlLXZh bHVlcykKCQkgIChwcmluYyAiICBIb3dldmVyLCB5b3UgaGF2ZSBhZGRlZCBpdCB0byBcCmBzYWZl LWxvY2FsLXZhcmlhYmxlLXZhbHVlcycuXG4iKSkpCgoJICAgICAgKHdoZW4gc2FmZS12YXIKICAg ICAgICAgICAgICAgIChzZXRxIGV4dHJhLWxpbmUgdCkKCQkocHJpbmMgIiAgVGhpcyB2YXJpYWJs ZSBpcyBzYWZlIGFzIGEgZmlsZSBsb2NhbCB2YXJpYWJsZSAiKQoJCShwcmluYyAiaWYgaXRzIHZh bHVlXG4gIHNhdGlzZmllcyB0aGUgcHJlZGljYXRlICIpCgkJKHByaW5jIChpZiAoYnl0ZS1jb2Rl LWZ1bmN0aW9uLXAgc2FmZS12YXIpCgkJCSAgICJ3aGljaCBpcyBieXRlLWNvbXBpbGVkIGV4cHJl c3Npb24uXG4iCgkJCSAoZm9ybWF0ICJgJXMnLlxuIiBzYWZlLXZhcikpKSkKCiAgICAgICAgICAg ICAgKGlmIGV4dHJhLWxpbmUgKHRlcnByaSkpCgkgICAgICAocHJpbmMgIkRvY3VtZW50YXRpb246 XG4iKQoJICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgc3RhbmRhcmQtb3V0cHV0CgkJKGluc2Vy dCAob3IgZG9jICJOb3QgZG9jdW1lbnRlZCBhcyBhIHZhcmlhYmxlLiIpKSkpCgoJICAgIDs7IE1h a2UgYSBsaW5rIHRvIGN1c3RvbWl6ZSBpZiB0aGlzIHZhcmlhYmxlIGNhbiBiZSBjdXN0b21pemVk LgoJICAgICh3aGVuIChjdXN0b20tdmFyaWFibGUtcCB2YXJpYWJsZSkKCSAgICAgIChsZXQgKChj dXN0b21pemUtbGFiZWwgImN1c3RvbWl6ZSIpKQoJCSh0ZXJwcmkpCgkJKHRlcnByaSkKCQkocHJp bmMgKGNvbmNhdCAiWW91IGNhbiAiIGN1c3RvbWl6ZS1sYWJlbCAiIHRoaXMgdmFyaWFibGUuIikp CgkJKHdpdGgtY3VycmVudC1idWZmZXIgc3RhbmRhcmQtb3V0cHV0CgkJICAoc2F2ZS1leGN1cnNp b24KCQkgICAgKHJlLXNlYXJjaC1iYWNrd2FyZAoJCSAgICAgKGNvbmNhdCAiXFwoIiBjdXN0b21p emUtbGFiZWwgIlxcKSIpIG5pbCB0KQoJCSAgICAoaGVscC14cmVmLWJ1dHRvbiAxICdoZWxwLWN1 c3RvbWl6ZS12YXJpYWJsZSB2YXJpYWJsZSkpKSkKCSAgICAgIDs7IE5vdGUgdmFyaWFibGUncyB2 ZXJzaW9uIG9yIHBhY2thZ2UgdmVyc2lvbgoJICAgICAgKGxldCAoKG91dHB1dCAoZGVzY3JpYmUt dmFyaWFibGUtY3VzdG9tLXZlcnNpb24taW5mbyB2YXJpYWJsZSkpKQoJCSh3aGVuIG91dHB1dAoJ CSAgKHRlcnByaSkKCQkgICh0ZXJwcmkpCgkJICAocHJpbmMgb3V0cHV0KSkpKQoKCSAgICAod2l0 aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKCSAgICAgIDs7IFJldHVybiB0aGUgdGV4 dCB3ZSBkaXNwbGF5ZWQuCgkgICAgICAoYnVmZmVyLXN0cmluZykpKSkpKSkpCgo7OzsgPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CgoqKiogZWRpZmY3NTE3Tl9KCTIwMTAtMDctMTUgMTk6 MDY6NTYuMjUzMzA0MzUzIC0wNDAwCi0tLSBoZWxwLWZucy5lbCBCenItMTAwODI3CTIwMTAtMDct MTUgMTk6MDY6NTYuMzA0NTA0MzI3IC0wNDAwCioqKioqKioqKioqKioqKgoqKiogMjAsMjcgKioq KgogIAkJCQkoaWYgKHN5bWJvbHAgdikgKHN5bWJvbC1uYW1lIHYpKSkpCiAgICAgICAobGlzdCAo aWYgKGVxdWFsIHZhbCAiIikKICAJICAgICAgIHYgKGludGVybiB2YWwpKSkpKQohICAgKGxldCAo ZmlsZS1uYW1lCiEgICAgICAgICAocGxvYyAoZ2V0IHZhcmlhYmxlICdwZXJtYW5lbnQtbG9jYWwp KSkKICAgICAgKHVubGVzcyAoYnVmZmVyLWxpdmUtcCBidWZmZXIpIChzZXRxIGJ1ZmZlciAoY3Vy cmVudC1idWZmZXIpKSkKICAgICAgKHVubGVzcyAoZnJhbWUtbGl2ZS1wIGZyYW1lKSAoc2V0cSBm cmFtZSAoc2VsZWN0ZWQtZnJhbWUpKSkKICAgICAgKGlmIChub3QgKHN5bWJvbHAgdmFyaWFibGUp KQotLS0gMjAsMjYgLS0tLQogIAkJCQkoaWYgKHN5bWJvbHAgdikgKHN5bWJvbC1uYW1lIHYpKSkp CiAgICAgICAobGlzdCAoaWYgKGVxdWFsIHZhbCAiIikKICAJICAgICAgIHYgKGludGVybiB2YWwp KSkpKQohICAgKGxldCAoZmlsZS1uYW1lKQogICAgICAodW5sZXNzIChidWZmZXItbGl2ZS1wIGJ1 ZmZlcikgKHNldHEgYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKQogICAgICAodW5sZXNzIChmcmFt ZS1saXZlLXAgZnJhbWUpIChzZXRxIGZyYW1lIChzZWxlY3RlZC1mcmFtZSkpKQogICAgICAoaWYg KG5vdCAoc3ltYm9scCB2YXJpYWJsZSkpCioqKioqKioqKioqKioqKgoqKiogNTUsODcgKioqKgog IAkJCShyZS1zZWFyY2gtYmFja3dhcmQgImBcXChbXmAnXStcXCknIiBuaWwgdCkKICAJCQkoaGVs cC14cmVmLWJ1dHRvbiAxICdoZWxwLXZhcmlhYmxlLWRlZgogIAkJCQkJICB2YXJpYWJsZSBmaWxl LW5hbWUpKSkKISAJCSAgICAodW5sZXNzIHBsb2MKISAgICAgICAgICAgICAgICAgICAgICAgKGlm IHZhbHZvaWQKISAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmluYyAiSXQgaXMgdm9pZCBh cyBhIHZhcmlhYmxlLiIpCiEgICAgICAgICAgICAgICAgICAgICAgICAgKHByaW5jICJJdHMgIikp KSkKISAgICAgICAgICAgICAgICAgKHVubGVzcyBwbG9jCiEgICAgICAgICAgICAgICAgICAgKGlm IHZhbHZvaWQKISAgICAgICAgICAgICAgICAgICAgICAgKHByaW5jICIgaXMgdm9pZCBhcyBhIHZh cmlhYmxlLiIpCiEgICAgICAgICAgICAgICAgICAgICAoaWYgKGJ1ZmZlcnAgbG9jdXMpCiEgICAg ICAgICAgICAgICAgICAgICAgICAgKHdoZW4gKG51bGwgKGJ1ZmZlci1sb2NhbC12YWx1ZSB2YXJp YWJsZSAoZ2V0LWJ1ZmZlciBidWZmZXIpKSkKISAgICAgICAgICAgICAgICAgICAgICAgICAgICh0 ZXJwcmkpKQohICAgICAgICAgICAgICAgICAgICAgICAocHJpbmMgIidzICIpKSkpKSkKISAgICAg ICAgICAgICAgIAohICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91 dHB1dAohICAgICAgICAgICAgICAgKGlmIHZhbHZvaWQKISAgICAgICAgICAgICAgICAgICBuaWwK ISAgICAgICAgICAgICAgICAgKHByb2duCiEgICAgICAgICAgICAgICAgICAgKHNldHEgdmFsLXN0 YXJ0LXBvcyAocG9pbnQpKQohICAgICAgICAgICAgICAgICAgIChpZiAoYnVmZmVycCBsb2N1cykK ISAgICAgICAgICAgICAgICAgICAgICAgKGlmIHBsb2MKISAgICAgICAgICAgICAgICAgICAgICAg ICAgIChpZiAoYnVmZmVyLWxvY2FsLXZhbHVlIHZhcmlhYmxlIChnZXQtYnVmZmVyIGJ1ZmZlcikp CiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByaW5jICJJdHMgbG9jYWwgdmFsdWUg aXMgIikKISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByaW5jICJJdHMgZGVmYXVsdCBs b2NhbCB2YWx1ZSBpcyAiKSkKISAgICAgICAgICAgICAgICAgICAgICAgICAocHJpbmMgIkl0cyBu b24tbG9jYWwgZ2xvYmFsIHZhbHVlIGlzICIpKQohICAgICAgICAgICAgICAgICAgICAgKGlmIHBs b2MKISAgICAgICAgICAgICAgICAgICAgICAgICAocHJpbmMgIkl0cyB2YWx1ZSBpcyAiKQohICAg ICAgICAgICAgICAgICAgICAgICAocHJpbmMgInZhbHVlIGlzICIpKSkKISAgICAgICAgICAgICAg ICAgICAodGVycHJpKQohICAgICAgICAgICAgICAgICAgIChsZXQgKChmcm9tIChwb2ludCkpKQoh ICAgICAgICAgICAgICAgICAgICAgKHBwIHZhbCkKISAgICAgICAgICAgICAgICAgICAgIDs7IEh5 cGVybGlua3MgaW4gdmFyaWFibGUncyB2YWx1ZSBhcmUgcXVpdGUgZnJlcXVlbnRseQotLS0gNTQs MjIyIC0tLS0KICAJCQkocmUtc2VhcmNoLWJhY2t3YXJkICJgXFwoW15gJ10rXFwpJyIgbmlsIHQp CiAgCQkJKGhlbHAteHJlZi1idXR0b24gMSAnaGVscC12YXJpYWJsZS1kZWYKICAJCQkJCSAgdmFy aWFibGUgZmlsZS1uYW1lKSkpCiEgCQkgICAgKGlmIHZhbHZvaWQKISAJCQkocHJpbmMgIkl0IGlz IHZvaWQgYXMgYSB2YXJpYWJsZS4iKQohIAkJICAgICAgKHByaW5jICJJdHMgIikpKQohIAkJKGlm IHZhbHZvaWQKISAJCSAgICAocHJpbmMgIiBpcyB2b2lkIGFzIGEgdmFyaWFibGUuIikKISAJCSAg KHByaW5jICIncyAiKSkpKQohIAkgICAgKGlmIHZhbHZvaWQKISAJCW5pbAohIAkgICAgICAod2l0 aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKISAJCShzZXRxIHZhbC1zdGFydC1wb3Mg KHBvaW50KSkKISAJCShwcmluYyAidmFsdWUgaXMgIikKISAJCSh0ZXJwcmkpCiEgCQkobGV0ICgo ZnJvbSAocG9pbnQpKSkKISAJCSAgKHBwIHZhbCkKISAJCSAgOzsgSHlwZXJsaW5rcyBpbiB2YXJp YWJsZSdzIHZhbHVlIGFyZSBxdWl0ZSBmcmVxdWVudGx5CiEgCQkgIDs7IGluYXBwcm9wcmlhdGUg ZS5nIEMtaCB2IDxSRVQ+IGZlYXR1cmVzIDxSRVQ+CiEgCQkgIDs7IChoZWxwLXhyZWYtb24tcHAg ZnJvbSAocG9pbnQpKQohIAkJICAoaWYgKDwgKHBvaW50KSAoKyBmcm9tIDIwKSkKISAJCSAgICAg IChkZWxldGUtcmVnaW9uICgxLSBmcm9tKSBmcm9tKSkpKSkKISAJICAgICh0ZXJwcmkpCiEgCiEg CSAgICAod2hlbiBsb2N1cwohIAkgICAgICAoaWYgKGJ1ZmZlcnAgbG9jdXMpCiEgCQkgIChwcmlu YyAoZm9ybWF0ICIlc29jYWwgaW4gYnVmZmVyICVzOyAiCiEgCQkJCSAoaWYgKGdldCB2YXJpYWJs ZSAncGVybWFuZW50LWxvY2FsKQohIAkJCQkgICAgICJQZXJtYW5lbnRseSBsIiAiTCIpCiEgCQkJ CSAoYnVmZmVyLW5hbWUpKSkKISAJCShwcmluYyAoZm9ybWF0ICJJdCBpcyBhIGZyYW1lLWxvY2Fs IHZhcmlhYmxlOyAiKSkpCiEgCSAgICAgIChpZiAobm90IChkZWZhdWx0LWJvdW5kcCB2YXJpYWJs ZSkpCiEgCQkgIChwcmluYyAiZ2xvYmFsbHkgdm9pZCIpCiEgCQkobGV0ICgodmFsIChkZWZhdWx0 LXZhbHVlIHZhcmlhYmxlKSkpCiEgCQkgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91 dHB1dAohIAkJICAgIChwcmluYyAiZ2xvYmFsIHZhbHVlIGlzICIpCiEgCQkgICAgKHRlcnByaSkK ISAJCSAgICA7OyBGaXhtZTogcHAgY2FuIHRha2UgYW4gYWdlIGlmIHlvdSBoYXBwZW4gdG8KISAJ CSAgICA7OyBhc2sgZm9yIGEgdmVyeSBsYXJnZSBleHByZXNzaW9uLiAgV2Ugc2hvdWxkCiEgCQkg ICAgOzsgcHJvYmFibHkgcHJpbnQgaXQgcmF3IG9uY2UgYW5kIGNoZWNrIGl0J3MgYQohIAkJICAg IDs7IHNlbnNpYmxlIHNpemUgYmVmb3JlIHByZXR0eXByaW50aW5nLiAgLS0gZngKISAJCSAgICAo bGV0ICgoZnJvbSAocG9pbnQpKSkKISAJCSAgICAgIChwcCB2YWwpCiEgCQkgICAgICA7OyBTZWUg cHJldmlvdXMgY29tbWVudCBmb3IgdGhpcyBmdW5jdGlvbi4KISAJCSAgICAgIDs7IChoZWxwLXhy ZWYtb24tcHAgZnJvbSAocG9pbnQpKQohIAkJICAgICAgKGlmICg8IChwb2ludCkgKCsgZnJvbSAy MCkpCiEgCQkJICAoZGVsZXRlLXJlZ2lvbiAoMS0gZnJvbSkgZnJvbSkpKSkpKQohICAgICAgICAg ICAgICAgKHRlcnByaSkpCiEgCiEgCSAgICA7OyBJZiB0aGUgdmFsdWUgaXMgbGFyZ2UsIG1vdmUg aXQgdG8gdGhlIGVuZC4KISAJICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1 dAohIAkgICAgICAod2hlbiAoPiAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkp IDEwKQohIAkJOzsgTm90ZSB0aGF0IHNldHRpbmcgdGhlIHN5bnRheCB0YWJsZSBsaWtlIGJlbG93 CiEgCQk7OyBtYWtlcyBmb3J3YXJkLXNleHAgbW92ZSBvdmVyIGEgYCdzJyBhdCB0aGUgZW5kCiEg CQk7OyBvZiBhIHN5bWJvbC4KISAJCShzZXQtc3ludGF4LXRhYmxlIGVtYWNzLWxpc3AtbW9kZS1z eW50YXgtdGFibGUpCiEgCQkoZ290by1jaGFyIHZhbC1zdGFydC1wb3MpCiEgCQk7OyBUaGUgbGlu ZSBiZWxvdyBwcmV2aW91c2x5IHJlYWQgYXMKISAJCTs7IChkZWxldGUtcmVnaW9uIChwb2ludCkg KHByb2duIChlbmQtb2YtbGluZSkgKHBvaW50KSkpCiEgCQk7OyB3aGljaCBzdXBwcmVzc2VkIGRp c3BsYXkgb2YgdGhlIGJ1ZmZlciBsb2NhbCB2YWx1ZSBmb3IKISAJCTs7IGxhcmdlIHZhbHVlcy4K ISAJCSh3aGVuIChsb29raW5nLWF0ICJ2YWx1ZSBpcyIpIChyZXBsYWNlLW1hdGNoICIiKSkKISAJ CShzYXZlLWV4Y3Vyc2lvbgohIAkJICAoaW5zZXJ0ICJcblxuVmFsdWU6IikKISAJCSAgKHNldCAo bWFrZS1sb2NhbC12YXJpYWJsZSAnaGVscC1idXR0b24tY2FjaGUpCiEgCQkgICAgICAgKHBvaW50 LW1hcmtlcikpKQohIAkJKGluc2VydCAidmFsdWUgaXMgc2hvd24gIikKISAJCShpbnNlcnQtYnV0 dG9uICJiZWxvdyIKISAJCQkgICAgICAgJ2FjdGlvbiBoZWxwLWJ1dHRvbi1jYWNoZQohIAkJCSAg ICAgICAnZm9sbG93LWxpbmsgdAohIAkJCSAgICAgICAnaGVscC1lY2hvICJtb3VzZS0yLCBSRVQ6 IHNob3cgdmFsdWUiKQohIAkJKGluc2VydCAiLlxuIikpKQohICAgICAgICAgICAgICh0ZXJwcmkp CiEgCiEgICAgICAgICAgICAgKGxldCogKChhbGlhcyAoY29uZGl0aW9uLWNhc2UgbmlsCiEgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGlyZWN0LXZhcmlhYmxlIHZhcmlhYmxlKQoh ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IgdmFyaWFibGUpKSkKISAgICAgICAg ICAgICAgICAgICAgKG9ic29sZXRlIChnZXQgdmFyaWFibGUgJ2J5dGUtb2Jzb2xldGUtdmFyaWFi bGUpKQohIAkJICAgKHVzZSAoY2FyIG9ic29sZXRlKSkKISAJCSAgIChzYWZlLXZhciAoZ2V0IHZh cmlhYmxlICdzYWZlLWxvY2FsLXZhcmlhYmxlKSkKISAgICAgICAgICAgICAgICAgICAgKGRvYyAo b3IgKGRvY3VtZW50YXRpb24tcHJvcGVydHkgdmFyaWFibGUgJ3ZhcmlhYmxlLWRvY3VtZW50YXRp b24pCiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb2N1bWVudGF0aW9uLXByb3BlcnR5 IGFsaWFzICd2YXJpYWJsZS1kb2N1bWVudGF0aW9uKSkpCiEgICAgICAgICAgICAgICAgICAgIChl eHRyYS1saW5lIG5pbCkpCiEgICAgICAgICAgICAgICA7OyBBZGQgYSBub3RlIGZvciB2YXJpYWJs ZXMgdGhhdCBoYXZlIGJlZW4gbWFrZS12YXItYnVmZmVyLWxvY2FsLgohICAgICAgICAgICAgICAg KHdoZW4gKGFuZCAobG9jYWwtdmFyaWFibGUtaWYtc2V0LXAgdmFyaWFibGUpCiEgICAgICAgICAg ICAgICAgICAgICAgICAgIChvciAobm90IChsb2NhbC12YXJpYWJsZS1wIHZhcmlhYmxlKSkKISAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiEgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChsb2NhbC12YXJpYWJsZS1pZi1zZXQtcCB2YXJpYWJsZSkp KSkKISAgICAgICAgICAgICAgICAgKHNldHEgZXh0cmEtbGluZSB0KQohICAgICAgICAgICAgICAg ICAocHJpbmMgIiAgQXV0b21hdGljYWxseSBiZWNvbWVzIGJ1ZmZlci1sb2NhbCB3aGVuIHNldCBp biBhbnkgZmFzaGlvbi5cbiIpKQohIAohICAgICAgICAgICAgICAgOzsgTWVudGlvbiBpZiBpdCdz IGFuIGFsaWFzCiEgICAgICAgICAgICAgICAodW5sZXNzIChlcSBhbGlhcyB2YXJpYWJsZSkKISAg ICAgICAgICAgICAgICAgKHNldHEgZXh0cmEtbGluZSB0KQohICAgICAgICAgICAgICAgICAocHJp bmMgKGZvcm1hdCAiICBUaGlzIHZhcmlhYmxlIGlzIGFuIGFsaWFzIGZvciBgJXMnLlxuIiBhbGlh cykpKQohIAohICAgICAgICAgICAgICAgKHdoZW4gb2Jzb2xldGUKISAgICAgICAgICAgICAgICAg KHNldHEgZXh0cmEtbGluZSB0KQohICAgICAgICAgICAgICAgICAocHJpbmMgIiAgVGhpcyB2YXJp YWJsZSBpcyBvYnNvbGV0ZSIpCiEgICAgICAgICAgICAgICAgIChpZiAoY2RyIG9ic29sZXRlKSAo cHJpbmMgKGZvcm1hdCAiIHNpbmNlICVzIiAoY2RyIG9ic29sZXRlKSkpKQohIAkJKHByaW5jIChj b25kICgoc3RyaW5ncCB1c2UpIChjb25jYXQgIjtcbiAgIiB1c2UpKQohIAkJCSAgICAgKHVzZSAo Zm9ybWF0ICI7XG4gIHVzZSBgJXMnIGluc3RlYWQuIiAoY2FyIG9ic29sZXRlKSkpCiEgCQkJICAg ICAodCAiLiIpKSkKISAgICAgICAgICAgICAgICAgKHRlcnByaSkpCiEgCiEgCSAgICAgICh3aGVu IChtZW1iZXIgKGNvbnMgdmFyaWFibGUgdmFsKSBmaWxlLWxvY2FsLXZhcmlhYmxlcy1hbGlzdCkK ISAJCShzZXRxIGV4dHJhLWxpbmUgdCkKISAJCShpZiAobWVtYmVyIChjb25zIHZhcmlhYmxlIHZh bCkgZGlyLWxvY2FsLXZhcmlhYmxlcy1hbGlzdCkKISAJCSAgICAobGV0ICgoZmlsZSAoYW5kIChi dWZmZXItZmlsZS1uYW1lKQohIAkJCQkgICAgIChub3QgKGZpbGUtcmVtb3RlLXAgKGJ1ZmZlci1m aWxlLW5hbWUpKSkKISAJCQkJICAgICAoZGlyLWxvY2Fscy1maW5kLWZpbGUgKGJ1ZmZlci1maWxl LW5hbWUpKSkpKQohIAkJICAgICAgKHByaW5jICIgIFRoaXMgdmFyaWFibGUgaXMgYSBkaXJlY3Rv cnkgbG9jYWwgdmFyaWFibGUiKQohIAkJICAgICAgKHdoZW4gZmlsZQohIAkJCShwcmluYyAoY29u Y2F0ICJcbiAgZnJvbSB0aGUgZmlsZSBcIiIKISAJCQkJICAgICAgIChpZiAoY29uc3AgZmlsZSkK ISAJCQkJCSAgIChjYXIgZmlsZSkKISAJCQkJCSBmaWxlKQohIAkJCQkgICAgICAgIlwiIikpKQoh IAkJICAgICAgKHByaW5jICIuXG4iKSkKISAJCSAgKHByaW5jICIgIFRoaXMgdmFyaWFibGUgaXMg YSBmaWxlIGxvY2FsIHZhcmlhYmxlLlxuIikpKQohIAohIAkgICAgICAod2hlbiAobWVtcSB2YXJp YWJsZSBpZ25vcmVkLWxvY2FsLXZhcmlhYmxlcykKISAJCShzZXRxIGV4dHJhLWxpbmUgdCkKISAJ CShwcmluYyAiICBUaGlzIHZhcmlhYmxlIGlzIGlnbm9yZWQgd2hlbiB1c2VkIGFzIGEgZmlsZSBs b2NhbCBcCiEgdmFyaWFibGUuXG4iKSkKISAKISAJICAgICAgOzsgQ2FuIGJlIGJvdGggcmlza3kg YW5kIHNhZmUsIGVnIGF1dG8tZmlsbC1mdW5jdGlvbi4KISAJICAgICAgKHdoZW4gKHJpc2t5LWxv Y2FsLXZhcmlhYmxlLXAgdmFyaWFibGUpCiEgCQkoc2V0cSBleHRyYS1saW5lIHQpCiEgCQkocHJp bmMgIiAgVGhpcyB2YXJpYWJsZSBpcyBwb3RlbnRpYWxseSByaXNreSB3aGVuIHVzZWQgYXMgYSBc CiEgZmlsZSBsb2NhbCB2YXJpYWJsZS5cbiIpCiEgCQkod2hlbiAoYXNzcSB2YXJpYWJsZSBzYWZl LWxvY2FsLXZhcmlhYmxlLXZhbHVlcykKISAJCSAgKHByaW5jICIgIEhvd2V2ZXIsIHlvdSBoYXZl IGFkZGVkIGl0IHRvIFwKISBgc2FmZS1sb2NhbC12YXJpYWJsZS12YWx1ZXMnLlxuIikpKQohIAoh IAkgICAgICAod2hlbiBzYWZlLXZhcgohICAgICAgICAgICAgICAgICAoc2V0cSBleHRyYS1saW5l IHQpCiEgCQkocHJpbmMgIiAgVGhpcyB2YXJpYWJsZSBpcyBzYWZlIGFzIGEgZmlsZSBsb2NhbCB2 YXJpYWJsZSAiKQohIAkJKHByaW5jICJpZiBpdHMgdmFsdWVcbiAgc2F0aXNmaWVzIHRoZSBwcmVk aWNhdGUgIikKISAJCShwcmluYyAoaWYgKGJ5dGUtY29kZS1mdW5jdGlvbi1wIHNhZmUtdmFyKQoh IAkJCSAgICJ3aGljaCBpcyBieXRlLWNvbXBpbGVkIGV4cHJlc3Npb24uXG4iCiEgCQkJIChmb3Jt YXQgImAlcycuXG4iIHNhZmUtdmFyKSkpKQohIAohICAgICAgICAgICAgICAgKGlmIGV4dHJhLWxp bmUgKHRlcnByaSkpCiEgCSAgICAgIChwcmluYyAiRG9jdW1lbnRhdGlvbjpcbiIpCiEgCSAgICAg ICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAohIAkJKGluc2VydCAob3IgZG9j ICJOb3QgZG9jdW1lbnRlZCBhcyBhIHZhcmlhYmxlLiIpKSkpCiEgCiEgCSAgICA7OyBNYWtlIGEg bGluayB0byBjdXN0b21pemUgaWYgdGhpcyB2YXJpYWJsZSBjYW4gYmUgY3VzdG9taXplZC4KISAJ ICAgICh3aGVuIChjdXN0b20tdmFyaWFibGUtcCB2YXJpYWJsZSkKISAJICAgICAgKGxldCAoKGN1 c3RvbWl6ZS1sYWJlbCAiY3VzdG9taXplIikpCiEgCQkodGVycHJpKQohIAkJKHRlcnByaSkKISAJ CShwcmluYyAoY29uY2F0ICJZb3UgY2FuICIgY3VzdG9taXplLWxhYmVsICIgdGhpcyB2YXJpYWJs ZS4iKSkKISAJCSh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAohIAkJICAoc2F2 ZS1leGN1cnNpb24KISAJCSAgICAocmUtc2VhcmNoLWJhY2t3YXJkCiEgCQkgICAgIChjb25jYXQg IlxcKCIgY3VzdG9taXplLWxhYmVsICJcXCkiKSBuaWwgdCkKISAJCSAgICAoaGVscC14cmVmLWJ1 dHRvbiAxICdoZWxwLWN1c3RvbWl6ZS12YXJpYWJsZSB2YXJpYWJsZSkpKSkKISAJICAgICAgOzsg Tm90ZSB2YXJpYWJsZSdzIHZlcnNpb24gb3IgcGFja2FnZSB2ZXJzaW9uCiEgCSAgICAgIChsZXQg KChvdXRwdXQgKGRlc2NyaWJlLXZhcmlhYmxlLWN1c3RvbS12ZXJzaW9uLWluZm8gdmFyaWFibGUp KSkKISAJCSh3aGVuIG91dHB1dAohIAkJICAodGVycHJpKQohIAkJICAodGVycHJpKQohIAkJICAo cHJpbmMgb3V0cHV0KSkpKQohIAohIAkgICAgKHdpdGgtY3VycmVudC1idWZmZXIgc3RhbmRhcmQt b3V0cHV0CiEgCSAgICAgIDs7IFJldHVybiB0aGUgdGV4dCB3ZSBkaXNwbGF5ZWQuCiEgCSAgICAg IChidWZmZXItc3RyaW5nKSkpKSkpKSkKCjs7OyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KOzs7IEVPRgo= --000e0cd6e4b2106cb0048b76196e--