From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Kelvin White Newsgroups: gmane.emacs.bugs Subject: bug#17755: 24.3; ERC user mode support Date: Wed, 18 Jun 2014 10:40:21 -0400 Message-ID: References: <87wqcnag57.fsf@localhost.i-did-not-set--mail-host-address--so-tickle-me> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a1133a8186a95fd04fc1d3d11 X-Trace: ger.gmane.org 1403110728 856 80.91.229.3 (18 Jun 2014 16:58:48 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 18 Jun 2014 16:58:48 +0000 (UTC) Cc: Lawrence Mitchell , Michael Olson , 17755@debbugs.gnu.org, Mario Lang , Diane Murray , Alex Schroeder , Julien Danjou , Francis Litterio , Jorgen Schaefer To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Jun 18 18:58:39 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WxJC2-0003Xy-63 for geb-bug-gnu-emacs@m.gmane.org; Wed, 18 Jun 2014 18:58:38 +0200 Original-Received: from localhost ([::1]:59377 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxJC1-0003gL-Qm for geb-bug-gnu-emacs@m.gmane.org; Wed, 18 Jun 2014 12:58:37 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:54194) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxH31-0001nT-22 for bug-gnu-emacs@gnu.org; Wed, 18 Jun 2014 10:41:18 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WxH2t-0007MM-Cz for bug-gnu-emacs@gnu.org; Wed, 18 Jun 2014 10:41:10 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:60729) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxH2t-0007M8-9F for bug-gnu-emacs@gnu.org; Wed, 18 Jun 2014 10:41:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1WxH2s-0004Vo-8W for bug-gnu-emacs@gnu.org; Wed, 18 Jun 2014 10:41:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Kelvin White Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 18 Jun 2014 14:41:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 17755 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 17755-submit@debbugs.gnu.org id=B17755.140310244117308 (code B ref 17755); Wed, 18 Jun 2014 14:41:02 +0000 Original-Received: (at 17755) by debbugs.gnu.org; 18 Jun 2014 14:40:41 +0000 Original-Received: from localhost ([127.0.0.1]:51879 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WxH2S-0004V0-3K for submit@debbugs.gnu.org; Wed, 18 Jun 2014 10:40:41 -0400 Original-Received: from mail-lb0-f176.google.com ([209.85.217.176]:62228) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WxH2J-0004Uc-VO for 17755@debbugs.gnu.org; Wed, 18 Jun 2014 10:40:34 -0400 Original-Received: by mail-lb0-f176.google.com with SMTP id w7so571191lbi.7 for <17755@debbugs.gnu.org>; Wed, 18 Jun 2014 07:40:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=dICeW+M0bvW+59MeOD2wAX8EpXqPLIEi7JBsiUXlvkc=; b=x50d9Xtn0YF9J61owdGp+J42FggWV2SvkdUWYJMqR0J+GCS52I/Zr2Z1GtYlltiiqW f0XaeR61AfR5jcEDs5m5uOHenhVl5kAa5GqrjsTRHKjcJlcIzwjC9vvFjz+Bx19bQ8X1 EMycOD0z7609nTT1faibHI9TGLrUlA2Cc+E/N0qBaN9PYPGlPuUfQZxvPiUZRv1qA5yZ OuxRzzoCyJXYHnpY6P/nf8zvJKvEEhXe0jcOoHrJks6TZ/IF51pNlXpHRBr+3XTL4Gd+ bTkVyQ5zgdkyhTO259P4XZwXEPq7oU96bRIWapoIA2uyC+WAV6X0uXc9H5Q+HY6T3+JB mmPQ== X-Received: by 10.152.205.11 with SMTP id lc11mr1638744lac.46.1403102421471; Wed, 18 Jun 2014 07:40:21 -0700 (PDT) Original-Received: by 10.112.57.45 with HTTP; Wed, 18 Jun 2014 07:40:21 -0700 (PDT) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-Mailman-Approved-At: Wed, 18 Jun 2014 12:54:03 -0400 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: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:90514 Archived-At: --001a1133a8186a95fd04fc1d3d11 Content-Type: multipart/alternative; boundary=001a1133a8186a95f704fc1d3d0f --001a1133a8186a95f704fc1d3d0f Content-Type: text/plain; charset=UTF-8 > Thanks, here are some comments on it. I wish someone who has worked on > ERC could say something. I never use(d) IRC and have hence no clue what is > a "user mode prefix", for example. A user mode prefix is referring to a symbol prefixed to your nickname to display to other users that you have a certain user mode. Take "&nickname" for instance. The "&" is the user mode prefix showing you have +a (admin) user mode. > > *************** > > *** 1244,1250 **** > > (erc-format-message > > 'JOIN ?n nick ?u login ?h host ?c chnl)))))) > > (when buffer (set-buffer buffer)) > > ! (erc-update-channel-member chnl nick nick t nil nil host login) > > ;; on join, we want to stay in the new channel buffer > > ;;(set-buffer ob) > > (erc-display-message parsed nil buffer str)))))) > > --- 1244,1250 ---- > > (erc-format-message > > 'JOIN ?n nick ?u login ?h host ?c chnl)))))) > > (when buffer (set-buffer buffer)) > > ! (erc-update-channel-member chnl nick nick t nil nil nil nil nil host login) > > ;; on join, we want to stay in the new channel buffer > > ;;(set-buffer ob) > > (erc-display-message parsed nil buffer str)))))) > > In my opinion, erc-update-channel-member had too many arguments already. > Maybe some of these args should be combined into an erc-channel-user object? My first approach was to change the erc-channel-user struct to use a list of modes, eliminating some of the args, but it seemed to cause issues elsewhere. I'll revisit this again soon. > > + (defsubst erc-channel-user-owner-p (nick) > > + "Return t if NICK is an owner of the current channel." > > Usually we say "non-nil" rather than "t", unless the callers need to > rely on the return value being t rather than some other non-nil value. Indeed, the callers do rely on the value being t in this case. rather than just non-nil > > + (defface erc-nick-prefix-face '((t :weight bold)) > > + "ERC face used for user mode prefix." > > + :group 'erc-faces) > > + > > + (defface erc-my-nick-prefix-face '((t :weight bold)) > > + "ERC face used for my user mode prefix." > > + :group 'erc-faces) > > Try to use the :inherit property at least to link those two (so users > who just want to change the two without making them different only need > to change one of the two) and ideally by inheriting from some other face. Good idea. I have updated this so each of these two faces inherits from the appropriate nick faces. By default the prefix will be the same color unless these are changed individually. > > + (defun erc-get-user-mode-prefix (user) > > + (when user > > + (cond ((erc-channel-user-voice-p user) "+") > > + ((erc-channel-user-half-op-p user) "%") > > + ((erc-channel-user-op-p user) "@") > > + ((erc-channel-user-admin-p user) "&") > > + ((erc-channel-user-owner-p user) "~") > > + (t "")))) > > Here I assume there's some kind of logic or convention. If not, maybe > it would be appropriate to do something like add some `help-echo' > property to those extra chars? Sure, I've updated the patch to add help-echo props > One more thing: the above suggests that maybe > voice/halfop/op/admin/owner are mutually exclusive. Is that the case? > Could these be collapsed into a single element which could have values > `voice', `halfop', `op', `admin', or `owner' (or nil)? These are actually not mutually exclusive. A user could have all of these modes enabled, but it isn't typical. In that case we only want to display the most valuable. If a user has +vo we want to display @. If a user has +oa we display &. etc. Glad you noticed this though, this should check in reverse order. > > (defun erc-format-@nick (&optional user channel-data) > > "Format the nickname of USER showing if USER is an operator or has voice. > > Operators have \"@\" and users with voice have \"+\" as a prefix. > > Use CHANNEL-DATA to determine op and voice status. > > See also `erc-format-nick-function'." > > (when user > > ! (let ((nick (erc-server-user-nickname user))) > > ! (concat (erc-propertize (erc-get-user-mode-prefix nick) 'face 'erc-nick-prefix-face) nick)))) > Please try to stay with 80 columns. Ok > BTW, IIUC, ERC is not distributed separately from Emacs any more, so we > don't need to use compatibility crutches like erc-propertize any more > (tho it's fine to use it as well for now, and it could be removed "all at > once" in another patch). Good point, I'll clean that up in another patch. > > ! "(ov)@+")) > [...] > > ! "(qaohv)~&@%+")) >Yay! Magic! ;D these are the default user modes > ! (let (prefix op-ch voice-ch names name op voice) > (setq prefix (erc-parse-prefix)) > ! (setq op-ch (cdr (assq ?o prefix)) > ! voice-ch (cdr (assq ?v prefix))) > > this should have been > > (let* ((prefix (erc-parse-prefix)) > (op-ch (cdr (assq ?o prefix))) > (voice-ch (cdr (assq ?v prefix))) > names name op voice) > > Which is both cleaner and faster. > > So when you change such code, you can take advantage of the change to > try and reduce occurrences of those "let-without-init followed by setq". This has been updated, thanks. > This also makes it sound like those op/voice/admin/owner are mutually > exclusive and should be combined into a single element. > Otherwise, please simplify the code with: > (setq op 'off voice 'off halfop 'off admin 'off owner 'off) > (cond > ((eq (elt item 0) voice-ch) > (setq name (substring item 1) > voice 'on)) > [...]) Yes, I agree. I have simplified it. > > + (when (and voice > > + (not (eq (erc-channel-user-voice cuser) voice))) > > + (setq changed t) > > + (setf (erc-channel-user-voice cuser) > > + (cond ((eq voice 'on) t) > > + ((eq voice 'off) nil) > > + (t voice)))) > > Won't this cause `changed' to "always" be set to t, since > (erc-channel-user-voice cuser) will never be `on' or `off' and hence > never be equal to `voice'? > Also, instead of using on/off and converting them from&to nil/t, maybe > it would be simpler to use nil/t plus a special value > (e.g. `:unspecified') for the case where the value is simply > not provided. Sure, I will look at revising this in a separate patch. I tried to keep this as simple as possible but I have noticed things like this and others that could be simplified and cleaned up a bit. Attached is the new patch cleaned up per your suggestions. Thanks --001a1133a8186a95f704fc1d3d0f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
> Thanks, here are some comments on it. =C2=A0I wish so= meone who has worked on
> ERC could say something. =C2=A0I never use(= d) IRC and have hence no clue what is
> a "user mode prefix"= ;, for example.

A user mode prefix is referring to a symbol prefixed to your= nickname to display to other users that you have a certain user mode.=C2= =A0
Take "&nickname" for instance. The "&a= mp;" is the user mode prefix showing you have +a (admin) user mode.

> > ***************
> > *** 1244,= 1250 ****
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(erc-format-message
> > =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 'JOIN ?n nick ?u login ?h host ?c chnl))))))
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when buffer (set-buffe= r buffer))
> > ! =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-update-ch= annel-member chnl nick nick t nil nil host login)
> > =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; on join, we want to stay in the new chan= nel buffer
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;;(set-buffer ob)
&g= t; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-display-message pars= ed nil buffer str))))))
> > --- 1244,1250 ----
> > =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(erc-format-message
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'JOIN ?n ni= ck ?u login ?h host ?c chnl))))))
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when buffer (set-buffe= r buffer))
> > ! =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-update-ch= annel-member chnl nick nick t nil nil nil nil nil host login)
> > = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; on join, we want to stay in th= e new channel buffer
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;;(set-buffer ob)
&g= t; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-display-message pars= ed nil buffer str))))))
>
> In my opinion, erc-update-channel-m= ember had too many arguments already.
> Maybe some of these args shou= ld be combined into an erc-channel-user object?

My fi= rst approach was to change the erc-channel-user struct to use a list of mod= es,
eliminating some of the args, but it se= emed to cause issues elsewhere. =C2=A0I'll revisit this again soon.

> > += (defsubst erc-channel-user-owner-p (nick)
> > + =C2=A0 "Retu= rn t if NICK is an owner of the current channel."
>
> Usually we say "non-nil" rather than "t", = unless the callers need to
> rely on the r= eturn value being t rather than some other non-nil value.

Indeed, the callers do rely on the val= ue being t in this case. rather than just non-nil

> > + (defface erc-nick-p= refix-face '((t :weight bold))
> > + =C2=A0 "ERC face used for user mode prefix."
> = > + =C2=A0 :group 'erc-faces)
> > +
> > + (defface= erc-my-nick-prefix-face '((t :weight bold))
> > + =C2=A0 &quo= t;ERC face used for my user mode prefix."
> > + =C2=A0 :group 'erc-faces)
>
> Try to use the :i= nherit property at least to link those two (so users
> who just want = to change the two without making them different only need
> to change= one of the two) and ideally by inheriting from some other face.

Good = idea. I have updated this so each of these two faces inherits from the appr= opriate nick faces.
By default the prefix w= ill be the same color unless these are changed individually.

> > += (defun erc-get-user-mode-prefix (user)
> > + =C2=A0 (when user> > + =C2=A0 =C2=A0 (cond ((erc-channel-user-voice-p user) "+&q= uot;)
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((erc-channel-user-= half-op-p user) "%")
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((erc-channel-user-op-p user= ) "@")
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((erc-ch= annel-user-admin-p user) "&")
> > + =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 ((erc-channel-user-owner-p user) "~")
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (t ""))))
>
> Here I assume there's some kind of logic or convention. = =C2=A0If not, maybe
> it would be appropriate to do something like ad= d some `help-echo'
> property to those extra chars?

Sure, I've updated the patch to ad= d help-echo props=C2=A0

> One more thing: the above suggests that maybe
>= ; voice/halfop/op/admin/owner are mutually exclusive. =C2=A0Is that the cas= e?
> Could these be collapsed into a single element which could have values=
> `voice', `halfop', `op', `admin', or `owner' (= or nil)?

These are actually not mutually exclusive. A user could have all of these m= odes enabled, but it isn't typical.
In = that case we only want to display the most valuable. If a user has +vo we w= ant to display @.=C2=A0
If a user has +oa we display &. etc. Glad yo= u noticed this though, this should check in reverse order.

> > =C2=A0 (def= un erc-format-@nick (&optional user channel-data)
> > =C2=A0 =C2=A0 "Format the nickname of USER showing if USER i= s an operator or has voice.
> > =C2=A0 Operators have \"@\&qu= ot; and users with voice have \"+\" as a prefix.
> > =C2= =A0 Use CHANNEL-DATA to determine op and voice status.
> > =C2=A0 See also `erc-format-nick-function'."
> >= ; =C2=A0 =C2=A0 (when user
> > ! =C2=A0 =C2=A0 (let ((nick (erc-se= rver-user-nickname user)))
> > ! =C2=A0 =C2=A0 =C2=A0 (concat (erc= -propertize (erc-get-user-mode-prefix nick) 'face 'erc-nick-prefix-= face) nick))))

> Please try to stay with 80 columns.

Ok

> BTW, IIUC, ERC is not distributed separately from Emac= s any more, so we
> don't need to use compatibility crutches like= erc-propertize any more
> (tho it's fine to use it as well for now, and it could be removed = "all at
> once" in another patch).

Good point, I'll clean= that up in another patch.

> > != =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"(ov)@+")= )
> [...]
> > ! =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0"(qaohv)~&@%+"))

>Yay! =C2=A0Ma= gic!

;D these are the default user modes

> ! = =C2=A0 (let (prefix op-ch voice-ch names name op voice)
> =C2=A0 =C2= =A0 =C2=A0 (setq prefix (erc-parse-prefix))
> ! =C2=A0 =C2=A0 (setq op-ch (cdr (assq ?o prefix))
> ! =C2=A0 = =C2=A0 =C2=A0 =C2=A0 voice-ch (cdr (assq ?v prefix)))
>
> this = should have been
>
> =C2=A0 =C2=A0 =C2=A0(let* ((prefix (erc-pa= rse-prefix))
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(op-ch (cdr (= assq ?o prefix)))
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (voice-ch (cdr (assq ?v pref= ix)))
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 names name op voice= )
>
> Which is both cleaner and faster.
>
> So when= you change such code, you can take advantage of the change to
> try and reduce occurrences of those "let-without-init followed by= setq".

This has been updated, thanks.=C2=A0

> This also makes it sound like those o= p/voice/admin/owner are mutually
> e= xclusive and should be combined into a single element.

> Otherwis= e, please simplify the code with:

> =C2=A0 (setq op 'off voice 'off halfop 'off admin '= ;off owner 'off)
> =C2=A0 (cond
> =C2=A0 =C2=A0((eq (elt it= em 0) voice-ch)
> =C2=A0 =C2=A0 (setq name (substring item 1)
>= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 voice 'on))
> =C2=A0 =C2=A0[...])

Yes, I agree. I have simplified it.

> > + =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (and voice
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0(not (eq (erc-channel-user-voice cuser) voice)))
> > = + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq changed t)
> > += =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setf (erc-channel-user-voice cu= ser)
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 (cond ((eq voice 'on) t)
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 ((eq voice 'off) nil)
> > + =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (t v= oice))))
>
> Won't this cause `changed' to "always= " be set to t, since
> (erc-channel-user-voice cuser) will never= be `on' or `off' and hence
> never be equal to `voice'?

> Also, instead of using on/off and conver= ting them from&to nil/t, maybe
> it would be simpler to use nil/t= plus a special value
> (e.g. `:unspecified') for the case where the value is simply
> not provided.

Sure, I will look at revising this in a separate patch. I = tried to keep this as simple=C2=A0
as possi= ble but I have noticed things like this and others that could be simplified= =C2=A0
and cleaned up a bit.

Attached is the new patch cleane= d up per your suggestions.

Thanks

--001a1133a8186a95f704fc1d3d0f-- --001a1133a8186a95fd04fc1d3d11 Content-Type: text/plain; charset=US-ASCII; name="erc-patch.diff" Content-Disposition: attachment; filename="erc-patch.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hwkqpqyh0 KioqIHByb2plY3RzL2VtYWNzL2xpc3AvZXJjL2VyYy5lbAkyMDE0LTA2LTE4IDEwOjA4OjE1LjYz OTUxOTE1NyAtMDQwMAotLS0gcHJvamVjdHMvZW1hY3MtZGV2L2xpc3AvZXJjL2VyYy5lbAkyMDE0 LTA2LTE4IDEwOjE1OjQxLjM5NTcxODU1NCAtMDQwMAoqKioqKioqKioqKioqKioKKioqIDM3MCwz NzYgKioqKgogICAgKQogIAogIChjbC1kZWZzdHJ1Y3QgKGVyYy1jaGFubmVsLXVzZXIgKDp0eXBl IHZlY3RvcikgOm5hbWVkKQohICAgb3Agdm9pY2UKICAgIDs7IExhc3QgbWVzc2FnZSB0aW1lIChp biB0aGUgZm9ybSBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgICA7OyAoY3VycmVudC10aW1lKQog ICAgOzsKLS0tIDM3MCwzNzYgLS0tLQogICAgKQogIAogIChjbC1kZWZzdHJ1Y3QgKGVyYy1jaGFu bmVsLXVzZXIgKDp0eXBlIHZlY3RvcikgOm5hbWVkKQohICAgdm9pY2UgaGFsZm9wIG9wIGFkbWlu IG93bmVyCiAgICA7OyBMYXN0IG1lc3NhZ2UgdGltZSAoaW4gdGhlIGZvcm0gb2YgdGhlIHJldHVy biB2YWx1ZSBvZgogICAgOzsgKGN1cnJlbnQtdGltZSkKICAgIDs7CioqKioqKioqKioqKioqKgoq KiogNDc1LDQ4MCAqKioqCi0tLSA0NzUsNDk2IC0tLS0KICAgICAgICAgICAgICAgZXJjLWNoYW5u ZWwtdXNlcnMpCiAgICAgIChjbHJoYXNoIGVyYy1jaGFubmVsLXVzZXJzKSkpCiAgCisgKGRlZnN1 YnN0IGVyYy1jaGFubmVsLXVzZXItb3duZXItcCAobmljaykKKyAgICJSZXR1cm4gdCBpZiBOSUNL IGlzIGFuIG93bmVyIG9mIHRoZSBjdXJyZW50IGNoYW5uZWwuIgorICAgKGFuZCBuaWNrCisgICAg ICAgIChoYXNoLXRhYmxlLXAgZXJjLWNoYW5uZWwtdXNlcnMpCisgICAgICAgIChsZXQgKChjZGF0 YSAoZXJjLWdldC1jaGFubmVsLXVzZXIgbmljaykpKQorICAgICAgICAgIChhbmQgY2RhdGEgKGNk ciBjZGF0YSkKKyAgICAgICAgICAgICAgIChlcmMtY2hhbm5lbC11c2VyLW93bmVyIChjZHIgY2Rh dGEpKSkpKSkKKyAKKyAoZGVmc3Vic3QgZXJjLWNoYW5uZWwtdXNlci1hZG1pbi1wIChuaWNrKQor ICAgIlJldHVybiB0IGlmIE5JQ0sgaXMgYW4gYWRtaW4gaW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4i CisgICAoYW5kIG5pY2sKKyAgICAgICAgKGhhc2gtdGFibGUtcCBlcmMtY2hhbm5lbC11c2VycykK KyAgICAgICAgKGxldCAoKGNkYXRhIChlcmMtZ2V0LWNoYW5uZWwtdXNlciBuaWNrKSkpCisgICAg ICAgICAgKGFuZCBjZGF0YSAoY2RyIGNkYXRhKQorICAgICAgICAgICAgICAgKGVyYy1jaGFubmVs LXVzZXItYWRtaW4gKGNkciBjZGF0YSkpKSkpKQorIAogIChkZWZzdWJzdCBlcmMtY2hhbm5lbC11 c2VyLW9wLXAgKG5pY2spCiAgICAiUmV0dXJuIHQgaWYgTklDSyBpcyBhbiBvcGVyYXRvciBpbiB0 aGUgY3VycmVudCBjaGFubmVsLiIKICAgIChhbmQgbmljawoqKioqKioqKioqKioqKioKKioqIDQ4 Myw0ODggKioqKgotLS0gNDk5LDUxMiAtLS0tCiAgICAgICAgICAgKGFuZCBjZGF0YSAoY2RyIGNk YXRhKQogICAgICAgICAgICAgICAgKGVyYy1jaGFubmVsLXVzZXItb3AgKGNkciBjZGF0YSkpKSkp KQogIAorIChkZWZzdWJzdCBlcmMtY2hhbm5lbC11c2VyLWhhbGZvcC1wIChuaWNrKQorICAgIlJl dHVybiB0IGlmIE5JQ0sgaXMgYSBoYWxmLW9wZXJhdG9yIGluIHRoZSBjdXJyZW50IGNoYW5uZWwu IgorICAgKGFuZCBuaWNrCisgICAgICAgIChoYXNoLXRhYmxlLXAgZXJjLWNoYW5uZWwtdXNlcnMp CisgICAgICAgIChsZXQgKChjZGF0YSAoZXJjLWdldC1jaGFubmVsLXVzZXIgbmljaykpKQorICAg ICAgICAgIChhbmQgY2RhdGEgKGNkciBjZGF0YSkKKyAgICAgICAgICAgICAgIChlcmMtY2hhbm5l bC11c2VyLWhhbGZvcCAoY2RyIGNkYXRhKSkpKSkpCisgCiAgKGRlZnN1YnN0IGVyYy1jaGFubmVs LXVzZXItdm9pY2UtcCAobmljaykKICAgICJSZXR1cm4gdCBpZiBOSUNLIGhhcyB2b2ljZSBpbiB0 aGUgY3VycmVudCBjaGFubmVsLiIKICAgIChhbmQgbmljawoqKioqKioqKioqKioqKioKKioqIDEx MjIsMTEyNyAqKioqCi0tLSAxMTQ2LDExNTkgLS0tLQogICAgIkVSQyBkZWZhdWx0IGZhY2UuIgog ICAgOmdyb3VwICdlcmMtZmFjZXMpCiAgCisgKGRlZmZhY2UgZXJjLW5pY2stcHJlZml4LWZhY2Ug JygodCA6aW5oZXJpdCBlcmMtbmljay1kZWZhdWx0LWZhY2UgOndlaWdodCBib2xkKSkKKyAgICJF UkMgZmFjZSB1c2VkIGZvciB1c2VyIG1vZGUgcHJlZml4LiIKKyAgIDpncm91cCAnZXJjLWZhY2Vz KQorIAorIChkZWZmYWNlIGVyYy1teS1uaWNrLXByZWZpeC1mYWNlICcoKHQgOmluaGVyaXQgZXJj LW15LW5pY2stZmFjZSA6d2VpZ2h0IGJvbGQpKQorICAgIkVSQyBmYWNlIHVzZWQgZm9yIG15IHVz ZXIgbW9kZSBwcmVmaXguIgorICAgOmdyb3VwICdlcmMtZmFjZXMpCisgCiAgKGRlZmZhY2UgZXJj LWRpcmVjdC1tc2ctZmFjZSAnKCh0IDpmb3JlZ3JvdW5kICJJbmRpYW5SZWQiKSkKICAgICJFUkMg ZmFjZSB1c2VkIGZvciBtZXNzYWdlcyB5b3UgcmVjZWl2ZSBpbiB0aGUgbWFpbiBlcmMgYnVmZmVy LiIKICAgIDpncm91cCAnZXJjLWZhY2VzKQoqKioqKioqKioqKioqKioKKioqIDQxOTAsNDE5NiAq KioqCiAgKGRlZnVuIGVyYy1mb3JtYXQtbmljayAoJm9wdGlvbmFsIHVzZXIgX2NoYW5uZWwtZGF0 YSkKICAgICJSZXR1cm4gdGhlIG5pY2tuYW1lIG9mIFVTRVIuCiAgU2VlIGFsc28gYGVyYy1mb3Jt YXQtbmljay1mdW5jdGlvbicuIgohICAgKHdoZW4gdXNlciAoZXJjLXNlcnZlci11c2VyLW5pY2tu YW1lIHVzZXIpKSkKICAKICAoZGVmdW4gZXJjLWZvcm1hdC1AbmljayAoJm9wdGlvbmFsIHVzZXIg Y2hhbm5lbC1kYXRhKQogICAgIkZvcm1hdCB0aGUgbmlja25hbWUgb2YgVVNFUiBzaG93aW5nIGlm IFVTRVIgaXMgYW4gb3BlcmF0b3Igb3IgaGFzIHZvaWNlLgotLS0gNDIyMiw0MjQ1IC0tLS0KICAo ZGVmdW4gZXJjLWZvcm1hdC1uaWNrICgmb3B0aW9uYWwgdXNlciBfY2hhbm5lbC1kYXRhKQogICAg IlJldHVybiB0aGUgbmlja25hbWUgb2YgVVNFUi4KICBTZWUgYWxzbyBgZXJjLWZvcm1hdC1uaWNr LWZ1bmN0aW9uJy4iCiEgICAobGV0ICgobmljayAoZXJjLXNlcnZlci11c2VyLW5pY2tuYW1lIHVz ZXIpKSkKISAgICAgKGNvbmNhdCAoZXJjLXByb3BlcnRpemUKISAgICAgICAgICAgICAgKGVyYy1n ZXQtdXNlci1tb2RlLXByZWZpeCBuaWNrKQohICAgICAgICAgICAgICAnZmFjZSAnZXJjLW5pY2st cHJlZml4LWZhY2UpIG5pY2spKSkKISAKISAoZGVmdW4gZXJjLWdldC11c2VyLW1vZGUtcHJlZml4 ICh1c2VyKQohICAgKHdoZW4gdXNlcgohICAgICAoY29uZCAoKGVyYy1jaGFubmVsLXVzZXItb3du ZXItcCB1c2VyKQohICAgICAgICAgICAgKHByb3BlcnRpemUgIn4iICdoZWxwLWVjaG8gIm93bmVy IikpCiEgICAgICAgICAgICgoZXJjLWNoYW5uZWwtdXNlci1hZG1pbi1wIHVzZXIpCiEgICAgICAg ICAgICAocHJvcGVydGl6ZSAiJiIgJ2hlbHAtZWNobyAiYWRtaW4iKSkKISAgICAgICAgICAgKChl cmMtY2hhbm5lbC11c2VyLW9wLXAgdXNlcikKISAgICAgICAgICAgIChwcm9wZXJ0aXplICJAIiAn aGVscC1lY2hvICJvcGVyYXRvciIpKQohICAgICAgICAgICAoKGVyYy1jaGFubmVsLXVzZXItaGFs Zm9wLXAgdXNlcikKISAgICAgICAgICAgIChwcm9wZXJ0aXplICIlIiAnaGVscC1lY2hvICJoYWxm LW9wIikpCiEgICAgICAgICAgICgoZXJjLWNoYW5uZWwtdXNlci12b2ljZS1wIHVzZXIpCiEgICAg ICAgICAgICBwcm9wZXJ0aXplICIrIiAnaGVscC1lY2hvICJ2b2ljZSIpCiEgICAgICAgICAgICh0 ICIiKSkpKQogIAogIChkZWZ1biBlcmMtZm9ybWF0LUBuaWNrICgmb3B0aW9uYWwgdXNlciBjaGFu bmVsLWRhdGEpCiAgICAiRm9ybWF0IHRoZSBuaWNrbmFtZSBvZiBVU0VSIHNob3dpbmcgaWYgVVNF UiBpcyBhbiBvcGVyYXRvciBvciBoYXMgdm9pY2UuCioqKioqKioqKioqKioqKgoqKiogNDE5OCw0 MjE1ICoqKioKICBVc2UgQ0hBTk5FTC1EQVRBIHRvIGRldGVybWluZSBvcCBhbmQgdm9pY2Ugc3Rh dHVzLgogIFNlZSBhbHNvIGBlcmMtZm9ybWF0LW5pY2stZnVuY3Rpb24nLiIKICAgICh3aGVuIHVz ZXIKISAgICAgKGxldCAoKG9wIChhbmQgY2hhbm5lbC1kYXRhIChlcmMtY2hhbm5lbC11c2VyLW9w IGNoYW5uZWwtZGF0YSkgIkAiKSkKISAJICAodm9pY2UgKGFuZCBjaGFubmVsLWRhdGEgKGVyYy1j aGFubmVsLXVzZXItdm9pY2UgY2hhbm5lbC1kYXRhKSAiKyIpKSkKISAgICAgICAoY29uY2F0IHZv aWNlIG9wIChlcmMtc2VydmVyLXVzZXItbmlja25hbWUgdXNlcikpKSkpCiAgCiAgKGRlZnVuIGVy Yy1mb3JtYXQtbXktbmljayAoKQogICAgIlJldHVybiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgdXNl cidzIG1lc3NhZ2UsIGNvcnJlY3RseSBwcm9wZXJ0aXplZC4iCiAgICAoaWYgZXJjLXNob3ctbXkt bmljawohICAgICAgIChsZXQgKChvcGVuICI8IikKICAJICAgIChjbG9zZSAiPiAiKQohIAkgICAg KG5pY2sgKGVyYy1jdXJyZW50LW5pY2spKSkKICAJKGNvbmNhdAogIAkgKGVyYy1wcm9wZXJ0aXpl IG9wZW4gJ2ZhY2UgJ2VyYy1kZWZhdWx0LWZhY2UpCiAgCSAoZXJjLXByb3BlcnRpemUgbmljayAn ZmFjZSAnZXJjLW15LW5pY2stZmFjZSkKICAJIChlcmMtcHJvcGVydGl6ZSBjbG9zZSAnZmFjZSAn ZXJjLWRlZmF1bHQtZmFjZSkpKQogICAgICAobGV0ICgocHJlZml4ICI+ICIpKQotLS0gNDI0Nyw0 MjY3IC0tLS0KICBVc2UgQ0hBTk5FTC1EQVRBIHRvIGRldGVybWluZSBvcCBhbmQgdm9pY2Ugc3Rh dHVzLgogIFNlZSBhbHNvIGBlcmMtZm9ybWF0LW5pY2stZnVuY3Rpb24nLiIKICAgICh3aGVuIHVz ZXIKISAgICAgKGxldCAoKG5pY2sgKGVyYy1zZXJ2ZXItdXNlci1uaWNrbmFtZSB1c2VyKSkpCiEg ICAgICAgKGNvbmNhdCAoZXJjLXByb3BlcnRpemUKISAgICAgICAgICAgICAgICAoZXJjLWdldC11 c2VyLW1vZGUtcHJlZml4IG5pY2spCiEgICAgICAgICAgICAgICAgJ2ZhY2UgJ2VyYy1uaWNrLXBy ZWZpeC1mYWNlKSBuaWNrIG5pY2spKSkpCiAgCiAgKGRlZnVuIGVyYy1mb3JtYXQtbXktbmljayAo KQogICAgIlJldHVybiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgdXNlcidzIG1lc3NhZ2UsIGNvcnJl Y3RseSBwcm9wZXJ0aXplZC4iCiAgICAoaWYgZXJjLXNob3ctbXktbmljawohICAgICAgIChsZXQq ICgob3BlbiAiPCIpCiAgICAgICAgICAgICAgIChjbG9zZSAiPiAiKQohICAgICAgICAgICAgICAo bmljayAoZXJjLWN1cnJlbnQtbmljaykpCiEgICAgICAgICAgICAgIChtb2RlIChlcmMtZ2V0LXVz ZXItbW9kZS1wcmVmaXggbmljaykpKQogICAgICAgICAgKGNvbmNhdAogICAgICAgICAgIChlcmMt cHJvcGVydGl6ZSBvcGVuICdmYWNlICdlcmMtZGVmYXVsdC1mYWNlKQorICAgICAgICAgIChlcmMt cHJvcGVydGl6ZSBtb2RlICdmYWNlICdlcmMtbXktbmljay1wcmVmaXgtZmFjZSkKICAgICAgICAg ICAoZXJjLXByb3BlcnRpemUgbmljayAnZmFjZSAnZXJjLW15LW5pY2stZmFjZSkKICAgICAgICAg ICAoZXJjLXByb3BlcnRpemUgY2xvc2UgJ2ZhY2UgJ2VyYy1kZWZhdWx0LWZhY2UpKSkKICAgICAg KGxldCAoKHByZWZpeCAiPiAiKSkKKioqKioqKioqKioqKioqCioqKiA0Njg1LDQ2OTEgKioqKgog ICAgKGxldCAoKHN0ciAob3IgKGNkciAoYXNzb2MgIlBSRUZJWCIgKGVyYy13aXRoLXNlcnZlci1i dWZmZXIKICAJCQkJCWVyYy1zZXJ2ZXItcGFyYW1ldGVycykpKQogIAkJIDs7IHByb3ZpZGUgYSBz YW5lIGRlZmF1bHQKISAJCSAiKG92KUArIikpCiAgCXR5cGVzIGNoYXJzKQogICAgICAod2hlbiAo c3RyaW5nLW1hdGNoICJeKFxcKFteKV0rXFwpKVxcKC4rXFwpJCIgc3RyKQogICAgICAgIChzZXRx IHR5cGVzIChtYXRjaC1zdHJpbmcgMSBzdHIpCi0tLSA0NzM3LDQ3NDMgLS0tLQogICAgKGxldCAo KHN0ciAob3IgKGNkciAoYXNzb2MgIlBSRUZJWCIgKGVyYy13aXRoLXNlcnZlci1idWZmZXIKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJjLXNlcnZlci1wYXJhbWV0 ZXJzKSkpCiAgICAgICAgICAgICAgICAgICA7OyBwcm92aWRlIGEgc2FuZSBkZWZhdWx0CiEgICAg ICAgICAgICAgICAgICAiKHFhb2h2KX4mQCUrIikpCiAgICAgICAgICB0eXBlcyBjaGFycykKICAg ICAgKHdoZW4gKHN0cmluZy1tYXRjaCAiXihcXChbXildK1xcKSlcXCguK1xcKSQiIHN0cikKICAg ICAgICAoc2V0cSB0eXBlcyAobWF0Y2gtc3RyaW5nIDEgc3RyKQoqKioqKioqKioqKioqKioKKioq IDQ3MDUsNDc0NCAqKioqCiAgVXBkYXRlIGBlcmMtY2hhbm5lbC11c2VycycgYWNjb3JkaW5nIHRv IE5BTUVTLVNUUklORy4KICBOQU1FUy1TVFJJTkcgaXMgYSBzdHJpbmcgbGlzdGluZyBzb21lIG9m IHRoZSBuYW1lcyBvbiB0aGUKICBjaGFubmVsLiIKISAgIChsZXQgKHByZWZpeCBvcC1jaCB2b2lj ZS1jaCBuYW1lcyBuYW1lIG9wIHZvaWNlKQohICAgICAoc2V0cSBwcmVmaXggKGVyYy1wYXJzZS1w cmVmaXgpKQohICAgICAoc2V0cSBvcC1jaCAoY2RyIChhc3NxID9vIHByZWZpeCkpCiEgCSAgdm9p Y2UtY2ggKGNkciAoYXNzcSA/diBwcmVmaXgpKSkKISAgICAgOzsgV2UgbmVlZCB0byBkZWxldGUg IiIgYmVjYXVzZSBpbiBYRW1hY3MsIChzcGxpdC1zdHJpbmcgImEgIikKISAgICAgOzsgcmV0dXJu cyAoImEiICIiKS4KICAgICAgKHNldHEgbmFtZXMgKGRlbGV0ZSAiIiAoc3BsaXQtc3RyaW5nIG5h bWVzLXN0cmluZykpKQogICAgICAobGV0ICgoZXJjLWNoYW5uZWwtbWVtYmVycy1jaGFuZ2VkLWhv b2sgbmlsKSkKICAgICAgICAoZG9saXN0IChpdGVtIG5hbWVzKQogIAkobGV0ICgodXBkYXRlcCB0 KSkKICAJICAoaWYgKHJhc3NxIChlbHQgaXRlbSAwKSBwcmVmaXgpCiAgCSAgICAgIChjb25kICgo PSAobGVuZ3RoIGl0ZW0pIDEpCiAgCQkgICAgIChzZXRxIHVwZGF0ZXAgbmlsKSkKLSAJCSAgICAo KGVxIChlbHQgaXRlbSAwKSBvcC1jaCkKLSAJCSAgICAgKHNldHEgbmFtZSAoc3Vic3RyaW5nIGl0 ZW0gMSkKLSAJCQkgICBvcCAnb24KLSAJCQkgICB2b2ljZSAnb2ZmKSkKICAJCSAgICAoKGVxIChl bHQgaXRlbSAwKSB2b2ljZS1jaCkKICAJCSAgICAgKHNldHEgbmFtZSAoc3Vic3RyaW5nIGl0ZW0g MSkKLSAJCQkgICBvcCAnb2ZmCiAgCQkJICAgdm9pY2UgJ29uKSkKISAJCSAgICAodCAoc2V0cSBu YW1lIChzdWJzdHJpbmcgaXRlbSAxKQohIAkJCSAgICAgb3AgJ29mZgohIAkJCSAgICAgdm9pY2Ug J29mZikpKQohIAkgICAgKHNldHEgbmFtZSBpdGVtCiEgCQkgIG9wICdvZmYKISAJCSAgdm9pY2Ug J29mZikpCiAgCSAgKHdoZW4gdXBkYXRlcAogIAkgICAgKHB1dGhhc2ggKGVyYy1kb3duY2FzZSBu YW1lKSB0CiAgCQkgICAgIGVyYy1jaGFubmVsLW5ldy1tZW1iZXItbmFtZXMpCiAgCSAgICAoZXJj LXVwZGF0ZS1jdXJyZW50LWNoYW5uZWwtbWVtYmVyCiEgCSAgICAgbmFtZSBuYW1lIHQgb3Agdm9p Y2UpKSkpKQogICAgICAocnVuLWhvb2tzICdlcmMtY2hhbm5lbC1tZW1iZXJzLWNoYW5nZWQtaG9v aykpKQogIAogIChkZWZjdXN0b20gZXJjLWNoYW5uZWwtbWVtYmVycy1jaGFuZ2VkLWhvb2sgbmls CiAgICAiVGhpcyBob29rIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSB2YXJpYWJsZSBgY2hhbm5l bC1tZW1iZXJzJyBjaGFuZ2VzLgogIFRoZSBidWZmZXIgd2hlcmUgdGhlIGNoYW5nZSBoYXBwZW5l ZCBpcyBjdXJyZW50IHdoaWxlIHRoaXMgaG9vayBpcyBjYWxsZWQuIgotLS0gNDc1Nyw0ODAwIC0t LS0KICBVcGRhdGUgYGVyYy1jaGFubmVsLXVzZXJzJyBhY2NvcmRpbmcgdG8gTkFNRVMtU1RSSU5H LgogIE5BTUVTLVNUUklORyBpcyBhIHN0cmluZyBsaXN0aW5nIHNvbWUgb2YgdGhlIG5hbWVzIG9u IHRoZQogIGNoYW5uZWwuIgohICAgKGxldCogKChwcmVmaXggKGVyYy1wYXJzZS1wcmVmaXgpKQoh ICAgICAgICAgIChvcC1jaCAoY2RyIChhc3NxID9vIHByZWZpeCkpKQohICAgICAgICAgICh2b2lj ZS1jaCAoY2RyIChhc3NxID92IHByZWZpeCkpKQohICAgICAgICAgIChhZG0tY2ggKGNkciAoYXNz cSA/YSBwcmVmaXgpKSkKISAgICAgICAgICAob3duLWNoIChjZHIgKGFzc3EgP3EgcHJlZml4KSkp CiEgICAgICAgICAgbmFtZXMgbmFtZSBvcCB2b2ljZSBoYWxmb3AgYWRtaW4gb3duZXIpCiAgICAg IChzZXRxIG5hbWVzIChkZWxldGUgIiIgKHNwbGl0LXN0cmluZyBuYW1lcy1zdHJpbmcpKSkKICAg ICAgKGxldCAoKGVyYy1jaGFubmVsLW1lbWJlcnMtY2hhbmdlZC1ob29rIG5pbCkpCiAgICAgICAg KGRvbGlzdCAoaXRlbSBuYW1lcykKICAgICAgICAgIChsZXQgKCh1cGRhdGVwIHQpKQorICAgICAg ICAgICAoc2V0cSBuYW1lIGl0ZW0gb3AgJ29mZiB2b2ljZSAnb2ZmIGhhbGZvcCAnb2ZmIGFkbWlu ICdvZmYgb3duZXIgJ29mZikKICAgICAgICAgICAgKGlmIChyYXNzcSAoZWx0IGl0ZW0gMCkgcHJl Zml4KQogICAgICAgICAgICAgICAgKGNvbmQgKCg9IChsZW5ndGggaXRlbSkgMSkKICAgICAgICAg ICAgICAgICAgICAgICAoc2V0cSB1cGRhdGVwIG5pbCkpCiAgICAgICAgICAgICAgICAgICAgICAo KGVxIChlbHQgaXRlbSAwKSB2b2ljZS1jaCkKICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBu YW1lIChzdWJzdHJpbmcgaXRlbSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNl ICdvbikpCiEgICAgICAgICAgICAgICAgICAgICAoKGVxIChlbHQgaXRlbSAwKSBob3AtY2gpCiEg ICAgICAgICAgICAgICAgICAgICAgKHNldHEgbmFtZSAoc3Vic3RyaW5nIGl0ZW0gMSkKISAgICAg ICAgICAgICAgICAgICAgICAgICAgICBoYWxmb3AgJ29uKSkKISAgICAgICAgICAgICAgICAgICAg ICgoZXEgKGVsdCBpdGVtIDApIG9wLWNoKQohICAgICAgICAgICAgICAgICAgICAgIChzZXRxIG5h bWUgKHN1YnN0cmluZyBpdGVtIDEpCiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgJ29u KSkKISAgICAgICAgICAgICAgICAgICAgICgoZXEgKGVsdCBpdGVtIDApIGFkbS1jaCkKISAgICAg ICAgICAgICAgICAgICAgICAoc2V0cSBuYW1lIChzdWJzdHJpbmcgaXRlbSAxKQohICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGFkbWluICdvbikpCiEgICAgICAgICAgICAgICAgICAgICAoKGVx IChlbHQgaXRlbSAwKSBvd24tY2gpCiEgICAgICAgICAgICAgICAgICAgICAgKHNldHEgbmFtZSAo c3Vic3RyaW5nIGl0ZW0gMSkKISAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciAnb24p KQohICAgICAgICAgICAgICAgICAgICAgKHQgKHNldHEgbmFtZSAoc3Vic3RyaW5nIGl0ZW0gMSkp KSkpCiAgICAgICAgICAgICh3aGVuIHVwZGF0ZXAKICAgICAgICAgICAgICAocHV0aGFzaCAoZXJj LWRvd25jYXNlIG5hbWUpIHQKICAgICAgICAgICAgICAgICAgICAgICBlcmMtY2hhbm5lbC1uZXct bWVtYmVyLW5hbWVzKQogICAgICAgICAgICAgIChlcmMtdXBkYXRlLWN1cnJlbnQtY2hhbm5lbC1t ZW1iZXIKISAgICAgICAgICAgICAgbmFtZSBuYW1lIHQgdm9pY2UgaGFsZm9wIG9wIGFkbWluIG93 bmVyKSkpKSkKICAgICAgKHJ1bi1ob29rcyAnZXJjLWNoYW5uZWwtbWVtYmVycy1jaGFuZ2VkLWhv b2spKSkKICAKKyAKICAoZGVmY3VzdG9tIGVyYy1jaGFubmVsLW1lbWJlcnMtY2hhbmdlZC1ob29r IG5pbAogICAgIlRoaXMgaG9vayBpcyBjYWxsZWQgZXZlcnkgdGltZSB0aGUgdmFyaWFibGUgYGNo YW5uZWwtbWVtYmVycycgY2hhbmdlcy4KICBUaGUgYnVmZmVyIHdoZXJlIHRoZSBjaGFuZ2UgaGFw cGVuZWQgaXMgY3VycmVudCB3aGlsZSB0aGlzIGhvb2sgaXMgY2FsbGVkLiIKKioqKioqKioqKioq KioqCioqKiA0Nzk1LDQ4MTAgKioqKgogICAgICBjaGFuZ2VkKSkKICAKICAoZGVmdW4gZXJjLXVw ZGF0ZS1jdXJyZW50LWNoYW5uZWwtbWVtYmVyCiEgICAobmljayBuZXctbmljayAmb3B0aW9uYWwg YWRkIG9wIHZvaWNlIGhvc3QgbG9naW4gZnVsbC1uYW1lIGluZm8KICAJdXBkYXRlLW1lc3NhZ2Ut dGltZSkKICAgICJVcGRhdGUgdGhlIHN0b3JlZCB1c2VyIGluZm9ybWF0aW9uIGZvciB0aGUgdXNl ciB3aXRoIG5pY2tuYW1lIE5JQ0suCiAgYGVyYy11cGRhdGUtdXNlcicgaXMgY2FsbGVkIHRvIGhh bmRsZSBjaGFuZ2VzIHRvIG5pY2tuYW1lLAohIEhPU1QsIExPR0lOLCBGVUxMLU5BTUUsIGFuZCBJ TkZPLiAgSWYgT1Agb3IgVk9JQ0UgYXJlIG5vbi1uaWwsCiEgdGhleSBtdXN0IGJlIGVxdWFsIHRv IGVpdGhlciBgb24nIG9yIGBvZmYnLCBpbiB3aGljaCBjYXNlIHRoZQohIG9wZXJhdG9yIG9yIHZv aWNlIHN0YXR1cyBvZiB0aGUgdXNlciBpbiB0aGUgY3VycmVudCBjaGFubmVsIGlzCiEgY2hhbmdl ZCBhY2NvcmRpbmdseS4gIElmIFVQREFURS1NRVNTQUdFLVRJTUUgaXMgbm9uLW5pbCwgdGhlCiEg bGFzdC1tZXNzYWdlLXRpbWUgb2YgdGhlIHVzZXIgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbCBpcyBz ZXQKISB0byAoY3VycmVudC10aW1lKS4KICAKICBJZiBBREQgaXMgbm9uLW5pbCwgdGhlIHVzZXIg d2lsbCBiZSBhZGRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKICBpbmZvcm1hdGlvbiBpZiBpdCBpcyBu b3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSB1c2VyIG9yIGNoYW5uZWwKLS0tIDQ4NTEsNDg2NSAt LS0tCiAgICAgIGNoYW5nZWQpKQogIAogIChkZWZ1biBlcmMtdXBkYXRlLWN1cnJlbnQtY2hhbm5l bC1tZW1iZXIKISAgIChuaWNrIG5ldy1uaWNrICZvcHRpb25hbCBhZGQgdm9pY2UgaGFsZm9wIG9w IGFkbWluIG93bmVyIGhvc3QgbG9naW4gZnVsbC1uYW1lIGluZm8KICAgICAgICAgIHVwZGF0ZS1t ZXNzYWdlLXRpbWUpCiAgICAiVXBkYXRlIHRoZSBzdG9yZWQgdXNlciBpbmZvcm1hdGlvbiBmb3Ig dGhlIHVzZXIgd2l0aCBuaWNrbmFtZSBOSUNLLgogIGBlcmMtdXBkYXRlLXVzZXInIGlzIGNhbGxl ZCB0byBoYW5kbGUgY2hhbmdlcyB0byBuaWNrbmFtZSwKISBIT1NULCBMT0dJTiwgRlVMTC1OQU1F LCBhbmQgSU5GTy4gIElmIFZPSUNFIEhBTEZPUCBPUCBBRE1JTiBvciBPV05FUgohIGFyZSBub24t bmlsLCB0aGV5IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIGBvbicgb3IgYG9mZicsIGluIHdoaWNo CiEgY2FzZSB0aGUgc3RhdHVzIG9mIHRoZSB1c2VyIGluIHRoZSBjdXJyZW50IGNoYW5uZWwgaXMg Y2hhbmdlZCBhY2NvcmRpbmdseS4KISBJZiBVUERBVEUtTUVTU0FHRS1USU1FIGlzIG5vbi1uaWws IHRoZSBsYXN0LW1lc3NhZ2UtdGltZSBvZiB0aGUgdXNlcgohICBpbiB0aGUgY3VycmVudCBjaGFu bmVsIGlzIHNldCB0byAoY3VycmVudC10aW1lKS4KICAKICBJZiBBREQgaXMgbm9uLW5pbCwgdGhl IHVzZXIgd2lsbCBiZSBhZGRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKICBpbmZvcm1hdGlvbiBpZiBp dCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSB1c2VyIG9yIGNoYW5uZWwKKioqKioqKioq KioqKioqCioqKiA0ODIyLDQ4MjcgKioqKgotLS0gNDg3Nyw0ODk2IC0tLS0KICAgICAgKGlmIGN1 c2VyCiAgICAgICAgICAocHJvZ24KICAgICAgICAgICAgKGVyYy1sb2cgKGZvcm1hdCAidXBkYXRl LW1lbWJlcjogdXNlciA9ICVTLCBjdXNlciA9ICVTIiB1c2VyIGN1c2VyKSkKKyAgICAgICAgICAg KHdoZW4gKGFuZCB2b2ljZQorICAgICAgICAgICAgICAgICAgICAgIChub3QgKGVxIChlcmMtY2hh bm5lbC11c2VyLXZvaWNlIGN1c2VyKSB2b2ljZSkpKQorICAgICAgICAgICAgIChzZXRxIGNoYW5n ZWQgdCkKKyAgICAgICAgICAgICAoc2V0ZiAoZXJjLWNoYW5uZWwtdXNlci12b2ljZSBjdXNlcikK KyAgICAgICAgICAgICAgICAgICAoY29uZCAoKGVxIHZvaWNlICdvbikgdCkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAoKGVxIHZvaWNlICdvZmYpIG5pbCkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAodCB2b2ljZSkpKSkKKyAgICAgICAgICAgKHdoZW4gKGFuZCBoYWxmb3AKKyAgICAgICAg ICAgICAgICAgICAgICAobm90IChlcSAoZXJjLWNoYW5uZWwtdXNlci1oYWxmb3AgY3VzZXIpIGhh bGZvcCkpKQorICAgICAgICAgICAgIChzZXRxIGNoYW5nZWQgdCkKKyAgICAgICAgICAgICAoc2V0 ZiAoZXJjLWNoYW5uZWwtdXNlci1oYWxmb3AgY3VzZXIpCisgICAgICAgICAgICAgICAgICAgKGNv bmQgKChlcSBoYWxmb3AgJ29uKSB0KQorICAgICAgICAgICAgICAgICAgICAgICAgICgoZXEgaGFs Zm9wICdvZmYpIG5pbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAodCBoYWxmb3ApKSkpCiAg ICAgICAgICAgICh3aGVuIChhbmQgb3AKICAgICAgICAgICAgICAgICAgICAgICAobm90IChlcSAo ZXJjLWNoYW5uZWwtdXNlci1vcCBjdXNlcikgb3ApKSkKICAgICAgICAgICAgICAoc2V0cSBjaGFu Z2VkIHQpCioqKioqKioqKioqKioqKgoqKiogNDgyOSw0ODQxICoqKioKICAJCSAgKGNvbmQgKChl cSBvcCAnb24pIHQpCiAgCQkJKChlcSBvcCAnb2ZmKSBuaWwpCiAgCQkJKHQgb3ApKSkpCiEgCSAg KHdoZW4gKGFuZCB2b2ljZQohIAkJICAgICAobm90IChlcSAoZXJjLWNoYW5uZWwtdXNlci12b2lj ZSBjdXNlcikgdm9pY2UpKSkKICAJICAgICAgKHNldHEgY2hhbmdlZCB0KQohIAkgICAgKHNldGYg KGVyYy1jaGFubmVsLXVzZXItdm9pY2UgY3VzZXIpCiEgCQkgIChjb25kICgoZXEgdm9pY2UgJ29u KSB0KQohIAkJCSgoZXEgdm9pY2UgJ29mZikgbmlsKQohIAkJCSh0IHZvaWNlKSkpKQogIAkgICh3 aGVuIHVwZGF0ZS1tZXNzYWdlLXRpbWUKICAJICAgIChzZXRmIChlcmMtY2hhbm5lbC11c2VyLWxh c3QtbWVzc2FnZS10aW1lIGN1c2VyKSAoY3VycmVudC10aW1lKSkpCiAgCSAgKHNldHEgdXNlci1j aGFuZ2VkCi0tLSA0ODk4LDQ5MTcgLS0tLQogICAgICAgICAgICAgICAgICAgIChjb25kICgoZXEg b3AgJ29uKSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICgoZXEgb3AgJ29mZikgbmlsKQog ICAgICAgICAgICAgICAgICAgICAgICAgICh0IG9wKSkpKQohICAgICAgICAgICAod2hlbiAoYW5k IGFkbWluCiEgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoZXEgKGVyYy1jaGFubmVsLXVzZXIt YWRtaW4gY3VzZXIpIGFkbWluKSkpCiAgICAgICAgICAgICAgKHNldHEgY2hhbmdlZCB0KQohICAg ICAgICAgICAgIChzZXRmIChlcmMtY2hhbm5lbC11c2VyLWFkbWluIGN1c2VyKQohICAgICAgICAg ICAgICAgICAgIChjb25kICgoZXEgYWRtaW4gJ29uKSB0KQohICAgICAgICAgICAgICAgICAgICAg ICAgICgoZXEgYWRtaW4gJ29mZikgbmlsKQohICAgICAgICAgICAgICAgICAgICAgICAgICh0IGFk bWluKSkpKQohICAgICAgICAgICAod2hlbiAoYW5kIG93bmVyCiEgICAgICAgICAgICAgICAgICAg ICAgKG5vdCAoZXEgKGVyYy1jaGFubmVsLXVzZXItb3duZXIgY3VzZXIpIG93bmVyKSkpCiEgICAg ICAgICAgICAgKHNldHEgY2hhbmdlZCB0KQohICAgICAgICAgICAgIChzZXRmIChlcmMtY2hhbm5l bC11c2VyLW93bmVyIGN1c2VyKQohICAgICAgICAgICAgICAgICAgIChjb25kICgoZXEgb3duZXIg J29uKSB0KQohICAgICAgICAgICAgICAgICAgICAgICAgICgoZXEgb3duZXIgJ29mZikgbmlsKQoh ICAgICAgICAgICAgICAgICAgICAgICAgICh0IG93bmVyKSkpKQogICAgICAgICAgICAod2hlbiB1 cGRhdGUtbWVzc2FnZS10aW1lCiAgICAgICAgICAgICAgKHNldGYgKGVyYy1jaGFubmVsLXVzZXIt bGFzdC1tZXNzYWdlLXRpbWUgY3VzZXIpIChjdXJyZW50LXRpbWUpKSkKICAgICAgICAgICAgKHNl dHEgdXNlci1jaGFuZ2VkCioqKioqKioqKioqKioqKgoqKiogNDg1Niw0ODY3ICoqKioKICAJCShj b25zIChjdXJyZW50LWJ1ZmZlcikKICAJCSAgICAgIChlcmMtc2VydmVyLXVzZXItYnVmZmVycyB1 c2VyKSkpKQogIAkoc2V0cSBjdXNlciAobWFrZS1lcmMtY2hhbm5lbC11c2VyCi0gCQkgICAgIDpv cCAoY29uZCAoKGVxIG9wICdvbikgdCkKLSAJCQkgICAgICAgKChlcSBvcCAnb2ZmKSBuaWwpCi0g CQkJICAgICAgICh0IG9wKSkKICAJCSAgICAgOnZvaWNlIChjb25kICgoZXEgdm9pY2UgJ29uKSB0 KQogIAkJCQkgICgoZXEgdm9pY2UgJ29mZikgbmlsKQogIAkJCQkgICh0IHZvaWNlKSkKICAJCSAg ICAgOmxhc3QtbWVzc2FnZS10aW1lCiAgCQkgICAgIChpZiB1cGRhdGUtbWVzc2FnZS10aW1lIChj dXJyZW50LXRpbWUpKSkpCiAgCShwdXRoYXNoIChlcmMtZG93bmNhc2UgbmljaykgKGNvbnMgdXNl ciBjdXNlcikKLS0tIDQ5MzIsNDk1MiAtLS0tCiAgICAgICAgICAgICAgICAgIChjb25zIChjdXJy ZW50LWJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAgKGVyYy1zZXJ2ZXItdXNlci1idWZm ZXJzIHVzZXIpKSkpCiAgICAgICAgICAoc2V0cSBjdXNlciAobWFrZS1lcmMtY2hhbm5lbC11c2Vy CiAgICAgICAgICAgICAgICAgICAgICAgOnZvaWNlIChjb25kICgoZXEgdm9pY2UgJ29uKSB0KQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVxIHZvaWNlICdvZmYpIG5pbCkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgdm9pY2UpKQorICAgICAgICAg ICAgICAgICAgICAgIDpoYWxmb3AgKGNvbmQgKChlcSBoYWxmb3AgJ29uKSB0KQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKChlcSBoYWxmb3AgJ29mZikgbmlsKQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKHQgaGFsZm9wKSkKKyAgICAgICAgICAgICAgICAgICAg ICA6b3AgKGNvbmQgKChlcSBvcCAnb24pIHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICgoZXEgb3AgJ29mZikgbmlsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo dCBvcCkpCisgICAgICAgICAgICAgICAgICAgICAgOmFkbWluIChjb25kICgoZXEgYWRtaW4gJ29u KSB0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVxIGFkbWluICdvZmYp IG5pbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgYWRtaW4pKQorICAg ICAgICAgICAgICAgICAgICAgIDpvd25lciAoY29uZCAoKGVxIG93bmVyICdvbikgdCkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlcSBvd25lciAnb2ZmKSBuaWwpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0IG93bmVyKSkKICAgICAgICAgICAgICAg ICAgICAgICA6bGFzdC1tZXNzYWdlLXRpbWUKICAgICAgICAgICAgICAgICAgICAgICAoaWYgdXBk YXRlLW1lc3NhZ2UtdGltZSAoY3VycmVudC10aW1lKSkpKQogICAgICAgICAgKHB1dGhhc2ggKGVy Yy1kb3duY2FzZSBuaWNrKSAoY29ucyB1c2VyIGN1c2VyKQoqKioqKioqKioqKioqKioKKioqIDQ4 NzIsNDg3OCAqKioqCiAgICAgIChvciBjaGFuZ2VkIHVzZXItY2hhbmdlZCBhZGQpKSkKICAKICAo ZGVmdW4gZXJjLXVwZGF0ZS1jaGFubmVsLW1lbWJlciAoY2hhbm5lbCBuaWNrIG5ldy1uaWNrCiEg CQkJCSAgJm9wdGlvbmFsIGFkZCBvcCB2b2ljZSBob3N0IGxvZ2luCiAgCQkJCSAgZnVsbC1uYW1l IGluZm8gdXBkYXRlLW1lc3NhZ2UtdGltZSkKICAgICJVcGRhdGUgdXNlciBhbmQgY2hhbm5lbCBp bmZvcm1hdGlvbiBmb3IgdGhlIHVzZXIgd2l0aAogIG5pY2tuYW1lIE5JQ0sgaW4gY2hhbm5lbCBD SEFOTkVMLgotLS0gNDk1Nyw0OTYzIC0tLS0KICAgICAgKG9yIGNoYW5nZWQgdXNlci1jaGFuZ2Vk IGFkZCkpKQogIAogIChkZWZ1biBlcmMtdXBkYXRlLWNoYW5uZWwtbWVtYmVyIChjaGFubmVsIG5p Y2sgbmV3LW5pY2sKISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm b3B0aW9uYWwgYWRkIHZvaWNlIGhhbGZvcCBvcCBhZG1pbiBvd25lciBob3N0IGxvZ2luCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbC1uYW1lIGluZm8gdXBk YXRlLW1lc3NhZ2UtdGltZSkKICAgICJVcGRhdGUgdXNlciBhbmQgY2hhbm5lbCBpbmZvcm1hdGlv biBmb3IgdGhlIHVzZXIgd2l0aAogIG5pY2tuYW1lIE5JQ0sgaW4gY2hhbm5lbCBDSEFOTkVMLgoq KioqKioqKioqKioqKioKKioqIDQ4ODAsNDg4NiAqKioqCiAgU2VlIGFsc286IGBlcmMtdXBkYXRl LWN1cnJlbnQtY2hhbm5lbC1tZW1iZXInLiIKICAgIChlcmMtd2l0aC1idWZmZXIKICAgICAoY2hh bm5lbCkKISAgICAoZXJjLXVwZGF0ZS1jdXJyZW50LWNoYW5uZWwtbWVtYmVyIG5pY2sgbmV3LW5p Y2sgYWRkIG9wIHZvaWNlIGhvc3QKICAJCQkJICAgICAgbG9naW4gZnVsbC1uYW1lIGluZm8KICAJ CQkJICAgICAgdXBkYXRlLW1lc3NhZ2UtdGltZSkpKQogIAotLS0gNDk2NSw0OTcxIC0tLS0KICBT ZWUgYWxzbzogYGVyYy11cGRhdGUtY3VycmVudC1jaGFubmVsLW1lbWJlcicuIgogICAgKGVyYy13 aXRoLWJ1ZmZlcgogICAgICAgIChjaGFubmVsKQohICAgICAoZXJjLXVwZGF0ZS1jdXJyZW50LWNo YW5uZWwtbWVtYmVyIG5pY2sgbmV3LW5pY2sgYWRkIHZvaWNlIGhhbGZvcCBvcCBhZG1pbiBvd25l ciBob3N0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naW4gZnVs bC1uYW1lIGluZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRh dGUtbWVzc2FnZS10aW1lKSkpCiAgCioqKioqKioqKioqKioqKgoqKiogNDk3OSw0OTg1ICoqKioK ICAJKHdoaWxlIGNoYXJzCiAgCSAgKGNvbmQgKChzdHJpbmc9IChjYXIgY2hhcnMpICIrIikgKHNl dHEgYWRkLXAgdCkpCiAgCQkoKHN0cmluZz0gKGNhciBjaGFycykgIi0iKSAoc2V0cSBhZGQtcCBu aWwpKQohIAkJKChzdHJpbmctbWF0Y2ggIl5bb3ZiT1ZCXSIgKGNhciBjaGFycykpCiAgCQkgKHNl dHEgYXJnLW1vZGVzIChjb25zIChsaXN0IChjYXIgY2hhcnMpCiAgCQkJCQkgICAgIChpZiBhZGQt cCAnb24gJ29mZikKICAJCQkJCSAgICAgKGlmIGFyZ3MgKGNhciBhcmdzKSBuaWwpKQotLS0gNTA2 NCw1MDcwIC0tLS0KICAgICAgICAgICh3aGlsZSBjaGFycwogICAgICAgICAgICAoY29uZCAoKHN0 cmluZz0gKGNhciBjaGFycykgIisiKSAoc2V0cSBhZGQtcCB0KSkKICAgICAgICAgICAgICAgICAg KChzdHJpbmc9IChjYXIgY2hhcnMpICItIikgKHNldHEgYWRkLXAgbmlsKSkKISAgICAgICAgICAg ICAgICAgKChzdHJpbmctbWF0Y2ggIl5bcWFvdmhiUUFPVkhCXSIgKGNhciBjaGFycykpCiAgICAg ICAgICAgICAgICAgICAoc2V0cSBhcmctbW9kZXMgKGNvbnMgKGxpc3QgKGNhciBjaGFycykKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgYWRkLXAgJ29u ICdvZmYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlm IGFyZ3MgKGNhciBhcmdzKSBuaWwpKQoqKioqKioqKioqKioqKioKKioqIDUwMzUsNTA0NSAqKioq CiAgCQkgKGxldCAoKG1vZGUgKG50aCAwIChjYXIgYXJnLW1vZGVzKSkpCiAgCQkgICAgICAgKG9u b2ZmIChudGggMSAoY2FyIGFyZy1tb2RlcykpKQogIAkJICAgICAgIChhcmcgKG50aCAyIChjYXIg YXJnLW1vZGVzKSkpKQohIAkJICAgKGNvbmQgKChzdHJpbmctbWF0Y2ggIl5bb09dIiBtb2RlKQog IAkJCSAgKGVyYy11cGRhdGUtY2hhbm5lbC1tZW1iZXIgdGd0IGFyZyBhcmcgbmlsIG9ub2ZmKSkK ISAJCQkgKChzdHJpbmctbWF0Y2ggIl5bVnZdIiBtb2RlKQohIAkJCSAgKGVyYy11cGRhdGUtY2hh bm5lbC1tZW1iZXIgdGd0IGFyZyBhcmcgbmlsIG5pbAohIAkJCQkJCSAgICAgb25vZmYpKQogIAkJ CSAoKHN0cmluZy1tYXRjaCAiXltMbF0iIG1vZGUpCiAgCQkJICAoZXJjLXVwZGF0ZS1jaGFubmVs LWxpbWl0IHRndCBvbm9mZiBhcmcpKQogIAkJCSAoKHN0cmluZy1tYXRjaCAiXltLa10iIG1vZGUp Ci0tLSA1MTIwLDUxMzUgLS0tLQogICAgICAgICAgICAgICAgICAgKGxldCAoKG1vZGUgKG50aCAw IChjYXIgYXJnLW1vZGVzKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAob25vZmYgKG50aCAx IChjYXIgYXJnLW1vZGVzKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAoYXJnIChudGggMiAo Y2FyIGFyZy1tb2RlcykpKSkKISAgICAgICAgICAgICAgICAgICAgKGNvbmQgKChzdHJpbmctbWF0 Y2ggIl5bVnZdIiBtb2RlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyYy11cGRhdGUt Y2hhbm5lbC1tZW1iZXIgdGd0IGFyZyBhcmcgbmlsIG9ub2ZmKSkKISAgICAgICAgICAgICAgICAg ICAgICAgICAgKChzdHJpbmctbWF0Y2ggIl5baEhdIiBtb2RlKQohICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGVyYy11cGRhdGUtY2hhbm5lbC1tZW1iZXIgdGd0IGFyZyBhcmcgbmlsIG5pbCBv bm9mZikpCiEgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1hdGNoICJeW29PXSIg bW9kZSkKISAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcmMtdXBkYXRlLWNoYW5uZWwtbWVt YmVyIHRndCBhcmcgYXJnIG5pbCBuaWwgbmlsIG9ub2ZmKSkKISAgICAgICAgICAgICAgICAgICAg ICAgICAgKChzdHJpbmctbWF0Y2ggIl5bYUFdIiBtb2RlKQohICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGVyYy11cGRhdGUtY2hhbm5lbC1tZW1iZXIgdGd0IGFyZyBhcmcgbmlsIG5pbCBuaWwg bmlsIG9ub2ZmKSkKISAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJpbmctbWF0Y2ggIl5b cVFdIiBtb2RlKQohICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyYy11cGRhdGUtY2hhbm5l bC1tZW1iZXIgdGd0IGFyZyBhcmcgbmlsIG5pbCBuaWwgbmlsIG5pbCBvbm9mZikpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1hdGNoICJeW0xsXSIgbW9kZSkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChlcmMtdXBkYXRlLWNoYW5uZWwtbGltaXQgdGd0IG9ub2ZmIGFy ZykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1hdGNoICJeW0trXSIgbW9k ZSkKKioqKioqKioqKioqKioqCioqKiA1OTc4LDYwMDMgKioqKgogIAkgKHVzZXIgKGlmIGNoYW5u ZWwtZGF0YQogIAkJICAgKGNhciBjaGFubmVsLWRhdGEpCiAgCQkgKGVyYy1nZXQtc2VydmVyLXVz ZXIgd29yZCkpKQohIAkgaG9zdCBsb2dpbiBmdWxsLW5hbWUgbmljayBvcCB2b2ljZSkKICAgICAg KHdoZW4gdXNlcgogICAgICAgIChzZXRxIG5pY2sgKGVyYy1zZXJ2ZXItdXNlci1uaWNrbmFtZSB1 c2VyKQogIAkgICAgaG9zdCAoZXJjLXNlcnZlci11c2VyLWhvc3QgdXNlcikKICAJICAgIGxvZ2lu IChlcmMtc2VydmVyLXVzZXItbG9naW4gdXNlcikKICAJICAgIGZ1bGwtbmFtZSAoZXJjLXNlcnZl ci11c2VyLWZ1bGwtbmFtZSB1c2VyKSkKICAgICAgICAoaWYgY3VzZXIKISAJICAoc2V0cSBvcCAo ZXJjLWNoYW5uZWwtdXNlci1vcCBjdXNlcikKISAJCXZvaWNlIChlcmMtY2hhbm5lbC11c2VyLXZv aWNlIGN1c2VyKSkpCiAgICAgICAgKGlmIChjYWxsZWQtaW50ZXJhY3RpdmVseS1wICdpbnRlcmFj dGl2ZSkKICAJICAobWVzc2FnZSAiJXMgaXMgJXNAJXMlcyVzIgogIAkJICAgbmljayBsb2dpbiBo b3N0CiAgCQkgICAoaWYgZnVsbC1uYW1lIChmb3JtYXQgIiAoJXMpIiBmdWxsLW5hbWUpICIiKQoh IAkJICAgKGlmIChvciBvcCB2b2ljZSkKICAJCQkgICAgICAgKGZvcm1hdCAiIGFuZCBpcyArJXMl cyBvbiAlcyIKLSAJCQkgICAgICAgKGlmIG9wICJvIiAiIikKICAJCQkgICAgICAgKGlmIHZvaWNl ICJ2IiAiIikKICAJCQkgICAgICAgKGVyYy1kZWZhdWx0LXRhcmdldCkpCiAgCQkJICAgICAiIikp CiEgCXVzZXIpKSkpCiAgCiAgKGRlZnVuIGVyYy1hd2F5LXRpbWUgKCkKICAgICJSZXR1cm4gbm9u LW5pbCBpZiB0aGUgY3VycmVudCBFUkMgcHJvY2VzcyBpcyBzZXQgYXdheS4KLS0tIDYwNjgsNjA5 OSAtLS0tCiAgICAgICAgICAgKHVzZXIgKGlmIGNoYW5uZWwtZGF0YQogICAgICAgICAgICAgICAg ICAgICAoY2FyIGNoYW5uZWwtZGF0YSkKICAgICAgICAgICAgICAgICAgIChlcmMtZ2V0LXNlcnZl ci11c2VyIHdvcmQpKSkKISAgICAgICAgICBob3N0IGxvZ2luIGZ1bGwtbmFtZSBuaWNrIHZvaWNl IGhhbGZvcCBvcCBhZG1pbiBvd25lcikKICAgICAgKHdoZW4gdXNlcgogICAgICAgIChzZXRxIG5p Y2sgKGVyYy1zZXJ2ZXItdXNlci1uaWNrbmFtZSB1c2VyKQogICAgICAgICAgICAgIGhvc3QgKGVy Yy1zZXJ2ZXItdXNlci1ob3N0IHVzZXIpCiAgICAgICAgICAgICAgbG9naW4gKGVyYy1zZXJ2ZXIt dXNlci1sb2dpbiB1c2VyKQogICAgICAgICAgICAgIGZ1bGwtbmFtZSAoZXJjLXNlcnZlci11c2Vy LWZ1bGwtbmFtZSB1c2VyKSkKICAgICAgICAoaWYgY3VzZXIKISAgICAgICAgICAgKHNldHEgdm9p Y2UgKGVyYy1jaGFubmVsLXVzZXItdm9pY2UgY3VzZXIpCiEgICAgICAgICAgICAgICAgIGhhbGZv cCAoZXJjLWNoYW5uZWwtdXNlci1oYWxmb3AgY3VzZXIpCiEgICAgICAgICAgICAgICAgIG9wIChl cmMtY2hhbm5lbC11c2VyLW9wIGN1c2VyKQohICAgICAgICAgICAgICAgICBhZG1pbiAoZXJjLWNo YW5uZWwtdXNlci1hZG1pbiBjdXNlcikKISAgICAgICAgICAgICAgICAgb3duZXIgKGVyYy1jaGFu bmVsLXVzZXItb3duZXIgY3VzZXIpKSkpCiAgICAgIChpZiAoY2FsbGVkLWludGVyYWN0aXZlbHkt cCAnaW50ZXJhY3RpdmUpCiAgICAgICAgICAobWVzc2FnZSAiJXMgaXMgJXNAJXMlcyVzIgogICAg ICAgICAgICAgICAgICAgbmljayBsb2dpbiBob3N0CiAgICAgICAgICAgICAgICAgICAoaWYgZnVs bC1uYW1lIChmb3JtYXQgIiAoJXMpIiBmdWxsLW5hbWUpICIiKQohICAgICAgICAgICAgICAgICAg KGlmIChvciB2b2ljZSBoYWxmb3Agb3AgYWRtaW4gb3duZXIpCiAgICAgICAgICAgICAgICAgICAg ICAgKGZvcm1hdCAiIGFuZCBpcyArJXMlcyBvbiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChpZiB2b2ljZSAidiIgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo aWYgaGFsZm9wICJoIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBvcCAi byIgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgYWRtaW4gImEiICIiKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIG93bmVyICJxIiAiIikKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChlcmMtZGVmYXVsdC10YXJnZXQpKQogICAgICAgICAgICAg ICAgICAgICAiIikpCiEgICAgICAgdXNlcikpKQogIAogIChkZWZ1biBlcmMtYXdheS10aW1lICgp CiAgICAiUmV0dXJuIG5vbi1uaWwgaWYgdGhlIGN1cnJlbnQgRVJDIHByb2Nlc3MgaXMgc2V0IGF3 YXkuCg== --001a1133a8186a95fd04fc1d3d11--