From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dario Faggioli Subject: Re: xen/arm: Assertion 'timer->status >= TIMER_STATUS_inactive' failed at timer.c:279 Date: Tue, 26 Apr 2016 19:49:10 +0200 Message-ID: <1461692950.3525.71.camel@citrix.com> References: <571F7A44.5000705@arm.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1443857693962132866==" Return-path: In-Reply-To: <571F7A44.5000705@arm.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Julien Grall , George Dunlap Cc: Varun.Swara@arm.com, Xen Devel , Steve Capper List-Id: xen-devel@lists.xenproject.org --===============1443857693962132866== Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-G3zZ8vr8oLt4AIFzAF8A" --=-G3zZ8vr8oLt4AIFzAF8A Content-Type: multipart/mixed; boundary="=-8GNV4+X+6ZeJU+tj8BJi" --=-8GNV4+X+6ZeJU+tj8BJi Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, 2016-04-26 at 15:25 +0100, Julien Grall wrote: > Hi Dario, >=20 Hi, > A couple of people have been reported Xen crash on the ARM64 > Foundation Model [1] with recent unstable. >=20 Ok, thanks for reporting. > The crash seems to happen when Xen fails to bring up secondary CPUs > (see stack trace below). >=20 Ah... I see. > From my understanding, csched_free_pdata is trying to kill the > timer spc->ticker. However the status of this timer is > TIMER_STATUS_invalid. >=20 > This is because csched_init_pdata has set a deadline for the > timer (set_timer) and the softirq to schedule the timer has > not yet happen (indeed Xen is still in early boot). >=20 Yes, this is sort of what happens (only slightly different, see the changelog of the atached patch patch). > I am not sure how to fix this issue. How will you recommend > to fix it? >=20 Yeah, well, doing it cleanly includes a slight change in the scheduler hooks API, IMO... and we indeed should do it cleanly :-)) George, what do you think? Honestly, this is similar to what I was thinking to do already (I mean, having an deinit_pdata hook, "symmetric" with the init_pdata one), when working on that series, because I do think it's cleaner... then, I abandoned the idea, as it looked to not be necessary... But apparently it may actually be! :-) Let me know, and I'll resubmit the patch properly (together with another bugfix I have in my queue). Dario --- commit eca4d65fb67a71c0f6563aafbfdd68e566c53c32 Author: Dario Faggioli Date:=C2=A0=C2=A0=C2=A0Tue Apr 26 17:42:36 2016 +0200 =C2=A0=C2=A0=C2=A0=C2=A0xen: sched: fix killing an uninitialized timer in f= ree_pdata. =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0commit 64269d9365 "sched: implement .init_pdata in = Credit, =C2=A0=C2=A0=C2=A0=C2=A0Credit2 and RTDS" helped fixing Credit2 runqueues, = and =C2=A0=C2=A0=C2=A0=C2=A0the races we had in switching scheduler for pCPUs, = but =C2=A0=C2=A0=C2=A0=C2=A0introduced another issue. In fact, if CPU bringup f= ails =C2=A0=C2=A0=C2=A0=C2=A0during __cpu_up() (and, more precisely, after CPU_U= P_PREPARE, =C2=A0=C2=A0=C2=A0=C2=A0but before CPU_STARTING) the CPU_UP_CANCELED notifi= er =C2=A0=C2=A0=C2=A0=C2=A0would be executed, which calls the free_pdata hook. =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0Such hook does two things: (1) undo the initializat= ion =C2=A0=C2=A0=C2=A0=C2=A0done inside the init_pdata hook; (2) free the memor= y =C2=A0=C2=A0=C2=A0=C2=A0allocated by the alloc_pdata hook. =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0However, in the failure path just described, it is = possible =C2=A0=C2=A0=C2=A0=C2=A0that only alloc_pdata has really been called, which= is =C2=A0=C2=A0=C2=A0=C2=A0potentially and issue (depending on what actually h= appens =C2=A0=C2=A0=C2=A0=C2=A0inside the implementation of free_pdata). =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0In fact, for Credit1 (the only scheduler that actua= lly =C2=A0=C2=A0=C2=A0=C2=A0allocates per-pCPU data), this result in calling ki= ll_timer() =C2=A0=C2=A0=C2=A0=C2=A0on a timer that had not yet been initialized, which= causes =C2=A0=C2=A0=C2=A0=C2=A0the following: =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0(XEN) Xen call trace: =C2=A0=C2=A0=C2=A0=C2=A0(XEN)=C2=A0=C2=A0=C2=A0=C2=A0[<000000000022e304>] t= imer.c#active_timer+0x8/0x24 (PC) =C2=A0=C2=A0=C2=A0=C2=A0(XEN)=C2=A0=C2=A0=C2=A0=C2=A0[<000000000022f624>] k= ill_timer+0x108/0x2e0 (LR) =C2=A0=C2=A0=C2=A0=C2=A0(XEN)=C2=A0=C2=A0=C2=A0=C2=A0[<00000000002208c0>] s= ched_credit.c#csched_free_pdata+0xd8/0x114 =C2=A0=C2=A0=C2=A0=C2=A0(XEN)=C2=A0=C2=A0=C2=A0=C2=A0[<0000000000227a18>] s= chedule.c#cpu_schedule_callback+0xc0/0x12c =C2=A0=C2=A0=C2=A0=C2=A0(XEN)=C2=A0=C2=A0=C2=A0=C2=A0[<0000000000219944>] n= otifier_call_chain+0x78/0x9c =C2=A0=C2=A0=C2=A0=C2=A0(XEN)=C2=A0=C2=A0=C2=A0=C2=A0[<00000000002015fc>] c= pu_up+0x104/0x130 =C2=A0=C2=A0=C2=A0=C2=A0(XEN)=C2=A0=C2=A0=C2=A0=C2=A0[<000000000028f7c0>] s= tart_xen+0xaf8/0xce0 =C2=A0=C2=A0=C2=A0=C2=A0(XEN)=C2=A0=C2=A0=C2=A0=C2=A0[<00000000810021d8>] 0= 0000000810021d8 =C2=A0=C2=A0=C2=A0=C2=A0(XEN) =C2=A0=C2=A0=C2=A0=C2=A0(XEN) =C2=A0=C2=A0=C2=A0=C2=A0(XEN) **************************************** =C2=A0=C2=A0=C2=A0=C2=A0(XEN) Panic on CPU 0: =C2=A0=C2=A0=C2=A0=C2=A0(XEN) Assertion 'timer->status >=3D TIMER_STATUS_in= active' failed at timer.c:279 =C2=A0=C2=A0=C2=A0=C2=A0(XEN) **************************************** =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0Solve this by making the scheduler hooks API symmet= ric again, =C2=A0=C2=A0=C2=A0=C2=A0i.e., by adding an deinit_pdata hook and making it = responsible =C2=A0=C2=A0=C2=A0=C2=A0of undoing what init_pdata did, rather than asking = to free_pdata =C2=A0=C2=A0=C2=A0=C2=A0to do everything. =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0This is cleaner and, in the case at hand, makes it = possible to =C2=A0=C2=A0=C2=A0=C2=A0only call free_pdata, which is the right thing to d= o, as only =C2=A0=C2=A0=C2=A0=C2=A0allocation and no initialization was performed. =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0Reported-by: Julien Grall =C2=A0=C2=A0=C2=A0=C2=A0Signed-off-by: Dario Faggioli =C2=A0=C2=A0=C2=A0=C2=A0--- =C2=A0=C2=A0=C2=A0=C2=A0Cc: George Dunlap =C2=A0=C2=A0=C2=A0=C2=A0Cc: Konrad Rzeszutek Wilk =C2=A0=C2=A0=C2=A0=C2=A0Cc: Varun.Swara@arm.com =C2=A0=C2=A0=C2=A0=C2=A0Cc: Steve Capper diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c index bc36837..0a6a1b4 100644 --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -482,15 +482,25 @@ static inline void __runq_tickle(struct csched_vcpu *= new) =C2=A0} =C2=A0 =C2=A0static void -csched_free_pdata(const struct scheduler *ops, void *pcpu, int cpu) +csched_free_pdata(const struct scheduler *ops, void *pcpu) =C2=A0{ -=C2=A0=C2=A0=C2=A0=C2=A0struct csched_private *prv =3D CSCHED_PRIV(ops); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0struct csched_pcpu *spc =3D pcpu; -=C2=A0=C2=A0=C2=A0=C2=A0unsigned long flags; =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if ( spc =3D=3D NULL ) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return; =C2=A0 +=C2=A0=C2=A0=C2=A0=C2=A0xfree(spc); +} + +static void +csched_deinit_pdata(const struct scheduler *ops, void *pcpu, int cpu) +{ +=C2=A0=C2=A0=C2=A0=C2=A0struct csched_private *prv =3D CSCHED_PRIV(ops); +=C2=A0=C2=A0=C2=A0=C2=A0struct csched_pcpu *spc =3D pcpu; +=C2=A0=C2=A0=C2=A0=C2=A0unsigned long flags; + +=C2=A0=C2=A0=C2=A0=C2=A0ASSERT(spc !=3D NULL); + =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0spin_lock_irqsave(&prv->lock, flags); =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0prv->credit -=3D prv->credits_per_tslice; @@ -507,8 +517,6 @@ csched_free_pdata(const struct scheduler *ops, void *pc= pu, int cpu) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0kill_timer(&prv->mast= er_ticker); =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0spin_unlock_irqrestore(&prv->lock, flags); - -=C2=A0=C2=A0=C2=A0=C2=A0xfree(spc); =C2=A0} =C2=A0 =C2=A0static void * @@ -2091,6 +2099,7 @@ static const struct scheduler sched_credit_def =3D { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.free_vdata=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D = csched_free_vdata, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.alloc_pdata=C2=A0=C2=A0=C2=A0=C2=A0=3D csche= d_alloc_pdata, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.init_pdata=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D = csched_init_pdata, +=C2=A0=C2=A0=C2=A0=C2=A0.deinit_pdata=C2=A0=C2=A0=C2=A0=3D csched_deinit_p= data, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.free_pdata=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D = csched_free_pdata, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.switch_sched=C2=A0=C2=A0=C2=A0=3D csched_swi= tch_sched, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.alloc_domdata=C2=A0=C2=A0=3D csched_alloc_do= mdata, diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c index 46b9279..f4c37b4 100644 --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -2261,13 +2261,15 @@ csched2_switch_sched(struct scheduler *new_ops, uns= igned int cpu, =C2=A0} =C2=A0 =C2=A0static void -csched2_free_pdata(const struct scheduler *ops, void *pcpu, int cpu) +csched2_deinit_pdata(const struct scheduler *ops, void *pcpu, int cpu) =C2=A0{ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0unsigned long flags; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0struct csched2_private *prv =3D CSCHED2_PRIV(= ops); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0struct csched2_runqueue_data *rqd; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int rqi; =C2=A0 +=C2=A0=C2=A0=C2=A0=C2=A0ASSERT(pcpu =3D=3D NULL); + =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0spin_lock_irqsave(&prv->lock, flags); =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ASSERT(cpumask_test_cpu(cpu, &prv->initialize= d)); @@ -2387,7 +2389,7 @@ static const struct scheduler sched_credit2_def =3D { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.alloc_vdata=C2=A0=C2=A0=C2=A0=C2=A0=3D csche= d2_alloc_vdata, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.free_vdata=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D = csched2_free_vdata, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.init_pdata=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D = csched2_init_pdata, -=C2=A0=C2=A0=C2=A0=C2=A0.free_pdata=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D csche= d2_free_pdata, +=C2=A0=C2=A0=C2=A0=C2=A0.deinit_pdata=C2=A0=C2=A0=C2=A0=3D csched2_deinit_= pdata, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.switch_sched=C2=A0=C2=A0=C2=A0=3D csched2_sw= itch_sched, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.alloc_domdata=C2=A0=C2=A0=3D csched2_alloc_d= omdata, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0.free_domdata=C2=A0=C2=A0=C2=A0=3D csched2_fr= ee_domdata, diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 5546999..1a64521 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -1529,7 +1529,7 @@ static void cpu_schedule_down(unsigned int cpu) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0struct schedule_data *sd =3D &per_cpu(schedul= e_data, cpu); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0struct scheduler *sched =3D per_cpu(scheduler= , cpu); =C2=A0 -=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(sched, free_pdata, sd->sched_priv, cpu); +=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(sched, free_pdata, sd->sched_priv); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(sched, free_vdata, idle_vcpu[cpu]->s= ched_priv); =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0idle_vcpu[cpu]->sched_priv =3D NULL; @@ -1554,8 +1554,10 @@ static int cpu_schedule_callback( =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case CPU_UP_PREPARE: =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0rc =3D cpu_schedule_u= p(cpu); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; -=C2=A0=C2=A0=C2=A0=C2=A0case CPU_UP_CANCELED: =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case CPU_DEAD: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(sched, deinit_pda= ta, sd->sched_priv, cpu); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Fallthrough */ +=C2=A0=C2=A0=C2=A0=C2=A0case CPU_UP_CANCELED: =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cpu_schedule_down(cpu= ); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0default: @@ -1684,7 +1686,7 @@ int schedule_cpu_switch(unsigned int cpu, struct cpup= ool *c) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0vpriv =3D SCHED_OP(new_ops, alloc_vdata, idle= , idle->domain->sched_priv); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if ( vpriv =3D=3D NULL ) =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=A0SCHED_OP(new_ops, free_pda= ta, ppriv, cpu); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(new_ops, free_pda= ta, ppriv); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return -ENOMEM; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} =C2=A0 @@ -1714,7 +1716,8 @@ int schedule_cpu_switch(unsigned int cpu, struct cpup= ool *c) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(new_ops, tick_resume, cpu); =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(old_ops, free_vdata, vpriv_old); -=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(old_ops, free_pdata, ppriv_old, cpu); +=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(old_ops, deinit_pdata, ppriv_old, cpu); +=C2=A0=C2=A0=C2=A0=C2=A0SCHED_OP(old_ops, free_pdata, ppriv_old); =C2=A0 =C2=A0 out: =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0per_cpu(cpupool, cpu) =3D c; diff --git a/xen/include/xen/sched-if.h b/xen/include/xen/sched-if.h index 1db7c8d..240f66c 100644 --- a/xen/include/xen/sched-if.h +++ b/xen/include/xen/sched-if.h @@ -135,9 +135,10 @@ struct scheduler { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0void=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0(*free_vdata)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(const struct sch= eduler *, void *); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0void *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0(*alloc_vdata)=C2=A0=C2=A0=C2=A0=C2=A0(const struct scheduler *, struct = vcpu *, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0voi= d *); -=C2=A0=C2=A0=C2=A0=C2=A0void=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0(*free_pdata)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(const struct scheduler= *, void *, int); +=C2=A0=C2=A0=C2=A0=C2=A0void=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0(*free_pdata)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(const struct scheduler= *, void *); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0void *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0(*alloc_pdata)=C2=A0=C2=A0=C2=A0=C2=A0(const struct scheduler *, int); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0void=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0(*init_pdata)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(const struct sch= eduler *, void *, int); +=C2=A0=C2=A0=C2=A0=C2=A0void=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0(*deinit_pdata)=C2=A0=C2=A0=C2=A0(const struct scheduler *, void *= , int); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0void=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0(*free_domdata)=C2=A0=C2=A0=C2=A0(const struct scheduler *, = void *); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0void *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0(*alloc_domdata)=C2=A0=C2=A0(const struct scheduler *, struct domain *); =C2=A0 --=20 <> (Raistlin Majere) ----------------------------------------------------------------- Dario Faggioli, Ph.D, http://about.me/dario.faggioli Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK) --=-8GNV4+X+6ZeJU+tj8BJi Content-Disposition: attachment; filename="sched-for-julien.patch" Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name="sched-for-julien.patch"; charset="UTF-8" Y29tbWl0IGVjYTRkNjVmYjY3YTcxYzBmNjU2M2FhZmJmZGQ2OGU1NjZjNTNjMzIKQXV0aG9yOiBE YXJpbyBGYWdnaW9saSA8ZGFyaW8uZmFnZ2lvbGlAY2l0cml4LmNvbT4KRGF0ZTogICBUdWUgQXBy IDI2IDE3OjQyOjM2IDIwMTYgKzAyMDAKCiAgICB4ZW46IHNjaGVkOiBmaXgga2lsbGluZyBhbiB1 bmluaXRpYWxpemVkIHRpbWVyIGluIGZyZWVfcGRhdGEuCiAgICAKICAgIGNvbW1pdCA2NDI2OWQ5 MzY1ICJzY2hlZDogaW1wbGVtZW50IC5pbml0X3BkYXRhIGluIENyZWRpdCwKICAgIENyZWRpdDIg YW5kIFJURFMiIGhlbHBlZCBmaXhpbmcgQ3JlZGl0MiBydW5xdWV1ZXMsIGFuZAogICAgdGhlIHJh Y2VzIHdlIGhhZCBpbiBzd2l0Y2hpbmcgc2NoZWR1bGVyIGZvciBwQ1BVcywgYnV0CiAgICBpbnRy b2R1Y2VkIGFub3RoZXIgaXNzdWUuIEluIGZhY3QsIGlmIENQVSBicmluZ3VwIGZhaWxzCiAgICBk dXJpbmcgX19jcHVfdXAoKSAoYW5kLCBtb3JlIHByZWNpc2VseSwgYWZ0ZXIgQ1BVX1VQX1BSRVBB UkUsCiAgICBidXQgYmVmb3JlIENQVV9TVEFSVElORykgdGhlIENQVV9VUF9DQU5DRUxFRCBub3Rp ZmllcgogICAgd291bGQgYmUgZXhlY3V0ZWQsIHdoaWNoIGNhbGxzIHRoZSBmcmVlX3BkYXRhIGhv b2suCiAgICAKICAgIFN1Y2ggaG9vayBkb2VzIHR3byB0aGluZ3M6ICgxKSB1bmRvIHRoZSBpbml0 aWFsaXphdGlvbgogICAgZG9uZSBpbnNpZGUgdGhlIGluaXRfcGRhdGEgaG9vazsgKDIpIGZyZWUg dGhlIG1lbW9yeQogICAgYWxsb2NhdGVkIGJ5IHRoZSBhbGxvY19wZGF0YSBob29rLgogICAgCiAg ICBIb3dldmVyLCBpbiB0aGUgZmFpbHVyZSBwYXRoIGp1c3QgZGVzY3JpYmVkLCBpdCBpcyBwb3Nz aWJsZQogICAgdGhhdCBvbmx5IGFsbG9jX3BkYXRhIGhhcyByZWFsbHkgYmVlbiBjYWxsZWQsIHdo aWNoIGlzCiAgICBwb3RlbnRpYWxseSBhbmQgaXNzdWUgKGRlcGVuZGluZyBvbiB3aGF0IGFjdHVh bGx5IGhhcHBlbnMKICAgIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgZnJlZV9wZGF0YSku CiAgICAKICAgIEluIGZhY3QsIGZvciBDcmVkaXQxICh0aGUgb25seSBzY2hlZHVsZXIgdGhhdCBh Y3R1YWxseQogICAgYWxsb2NhdGVzIHBlci1wQ1BVIGRhdGEpLCB0aGlzIHJlc3VsdCBpbiBjYWxs aW5nIGtpbGxfdGltZXIoKQogICAgb24gYSB0aW1lciB0aGF0IGhhZCBub3QgeWV0IGJlZW4gaW5p dGlhbGl6ZWQsIHdoaWNoIGNhdXNlcwogICAgdGhlIGZvbGxvd2luZzoKICAgIAogICAgKFhFTikg WGVuIGNhbGwgdHJhY2U6CiAgICAoWEVOKSAgICBbPDAwMDAwMDAwMDAyMmUzMDQ+XSB0aW1lci5j I2FjdGl2ZV90aW1lcisweDgvMHgyNCAoUEMpCiAgICAoWEVOKSAgICBbPDAwMDAwMDAwMDAyMmY2 MjQ+XSBraWxsX3RpbWVyKzB4MTA4LzB4MmUwIChMUikKICAgIChYRU4pICAgIFs8MDAwMDAwMDAw MDIyMDhjMD5dIHNjaGVkX2NyZWRpdC5jI2NzY2hlZF9mcmVlX3BkYXRhKzB4ZDgvMHgxMTQKICAg IChYRU4pICAgIFs8MDAwMDAwMDAwMDIyN2ExOD5dIHNjaGVkdWxlLmMjY3B1X3NjaGVkdWxlX2Nh bGxiYWNrKzB4YzAvMHgxMmMKICAgIChYRU4pICAgIFs8MDAwMDAwMDAwMDIxOTk0ND5dIG5vdGlm aWVyX2NhbGxfY2hhaW4rMHg3OC8weDljCiAgICAoWEVOKSAgICBbPDAwMDAwMDAwMDAyMDE1ZmM+ XSBjcHVfdXArMHgxMDQvMHgxMzAKICAgIChYRU4pICAgIFs8MDAwMDAwMDAwMDI4ZjdjMD5dIHN0 YXJ0X3hlbisweGFmOC8weGNlMAogICAgKFhFTikgICAgWzwwMDAwMDAwMDgxMDAyMWQ4Pl0gMDAw MDAwMDA4MTAwMjFkOAogICAgKFhFTikKICAgIChYRU4pCiAgICAoWEVOKSAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAoWEVOKSBQYW5pYyBvbiBDUFUgMDoKICAg IChYRU4pIEFzc2VydGlvbiAndGltZXItPnN0YXR1cyA+PSBUSU1FUl9TVEFUVVNfaW5hY3RpdmUn IGZhaWxlZCBhdCB0aW1lci5jOjI3OQogICAgKFhFTikgKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgogICAgCiAgICBTb2x2ZSB0aGlzIGJ5IG1ha2luZyB0aGUgc2NoZWR1 bGVyIGhvb2tzIEFQSSBzeW1tZXRyaWMgYWdhaW4sCiAgICBpLmUuLCBieSBhZGRpbmcgYW4gZGVp bml0X3BkYXRhIGhvb2sgYW5kIG1ha2luZyBpdCByZXNwb25zaWJsZQogICAgb2YgdW5kb2luZyB3 aGF0IGluaXRfcGRhdGEgZGlkLCByYXRoZXIgdGhhbiBhc2tpbmcgdG8gZnJlZV9wZGF0YQogICAg dG8gZG8gZXZlcnl0aGluZy4KICAgIAogICAgVGhpcyBpcyBjbGVhbmVyIGFuZCwgaW4gdGhlIGNh c2UgYXQgaGFuZCwgbWFrZXMgaXQgcG9zc2libGUgdG8KICAgIG9ubHkgY2FsbCBmcmVlX3BkYXRh LCB3aGljaCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIGFzIG9ubHkKICAgIGFsbG9jYXRpb24g YW5kIG5vIGluaXRpYWxpemF0aW9uIHdhcyBwZXJmb3JtZWQuCiAgICAKICAgIFJlcG9ydGVkLWJ5 OiBKdWxpZW4gR3JhbGwgPGp1bGllbi5ncmFsbEBhcm0uY29tPgogICAgU2lnbmVkLW9mZi1ieTog RGFyaW8gRmFnZ2lvbGkgPGRhcmlvLmZhZ2dpb2xpQGNpdHJpeC5jb20+CiAgICAtLS0KICAgIENj OiBHZW9yZ2UgRHVubGFwIDxnZW9yZ2UuZHVubGFwQGNpdHJpeC5jb20+CiAgICBDYzogS29ucmFk IFJ6ZXN6dXRlayBXaWxrIDxrb25yYWQud2lsa0BvcmFjbGUuY29tPgogICAgQ2M6IFZhcnVuLlN3 YXJhQGFybS5jb20KICAgIENjOiBTdGV2ZSBDYXBwZXIgPFN0ZXZlLkNhcHBlckBhcm0uY29tPgoK ZGlmZiAtLWdpdCBhL3hlbi9jb21tb24vc2NoZWRfY3JlZGl0LmMgYi94ZW4vY29tbW9uL3NjaGVk X2NyZWRpdC5jCmluZGV4IGJjMzY4MzcuLjBhNmExYjQgMTAwNjQ0Ci0tLSBhL3hlbi9jb21tb24v c2NoZWRfY3JlZGl0LmMKKysrIGIveGVuL2NvbW1vbi9zY2hlZF9jcmVkaXQuYwpAQCAtNDgyLDE1 ICs0ODIsMjUgQEAgc3RhdGljIGlubGluZSB2b2lkIF9fcnVucV90aWNrbGUoc3RydWN0IGNzY2hl ZF92Y3B1ICpuZXcpCiB9CiAKIHN0YXRpYyB2b2lkCi1jc2NoZWRfZnJlZV9wZGF0YShjb25zdCBz dHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHZvaWQgKnBjcHUsIGludCBjcHUpCitjc2NoZWRfZnJlZV9w ZGF0YShjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHZvaWQgKnBjcHUpCiB7Ci0gICAgc3Ry dWN0IGNzY2hlZF9wcml2YXRlICpwcnYgPSBDU0NIRURfUFJJVihvcHMpOwogICAgIHN0cnVjdCBj c2NoZWRfcGNwdSAqc3BjID0gcGNwdTsKLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAgICAg aWYgKCBzcGMgPT0gTlVMTCApCiAgICAgICAgIHJldHVybjsKIAorICAgIHhmcmVlKHNwYyk7Cit9 CisKK3N0YXRpYyB2b2lkCitjc2NoZWRfZGVpbml0X3BkYXRhKGNvbnN0IHN0cnVjdCBzY2hlZHVs ZXIgKm9wcywgdm9pZCAqcGNwdSwgaW50IGNwdSkKK3sKKyAgICBzdHJ1Y3QgY3NjaGVkX3ByaXZh dGUgKnBydiA9IENTQ0hFRF9QUklWKG9wcyk7CisgICAgc3RydWN0IGNzY2hlZF9wY3B1ICpzcGMg PSBwY3B1OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBBU1NFUlQoc3BjICE9IE5V TEwpOworCiAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBydi0+bG9jaywgZmxhZ3MpOwogCiAgICAg cHJ2LT5jcmVkaXQgLT0gcHJ2LT5jcmVkaXRzX3Blcl90c2xpY2U7CkBAIC01MDcsOCArNTE3LDYg QEAgY3NjaGVkX2ZyZWVfcGRhdGEoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3BzLCB2b2lkICpw Y3B1LCBpbnQgY3B1KQogICAgICAgICBraWxsX3RpbWVyKCZwcnYtPm1hc3Rlcl90aWNrZXIpOwog CiAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ2LT5sb2NrLCBmbGFncyk7Ci0KLSAgICB4 ZnJlZShzcGMpOwogfQogCiBzdGF0aWMgdm9pZCAqCkBAIC0yMDkxLDYgKzIwOTksNyBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IHNjaGVkdWxlciBzY2hlZF9jcmVkaXRfZGVmID0gewogICAgIC5mcmVl X3ZkYXRhICAgICA9IGNzY2hlZF9mcmVlX3ZkYXRhLAogICAgIC5hbGxvY19wZGF0YSAgICA9IGNz Y2hlZF9hbGxvY19wZGF0YSwKICAgICAuaW5pdF9wZGF0YSAgICAgPSBjc2NoZWRfaW5pdF9wZGF0 YSwKKyAgICAuZGVpbml0X3BkYXRhICAgPSBjc2NoZWRfZGVpbml0X3BkYXRhLAogICAgIC5mcmVl X3BkYXRhICAgICA9IGNzY2hlZF9mcmVlX3BkYXRhLAogICAgIC5zd2l0Y2hfc2NoZWQgICA9IGNz Y2hlZF9zd2l0Y2hfc2NoZWQsCiAgICAgLmFsbG9jX2RvbWRhdGEgID0gY3NjaGVkX2FsbG9jX2Rv bWRhdGEsCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3NjaGVkX2NyZWRpdDIuYyBiL3hlbi9jb21t b24vc2NoZWRfY3JlZGl0Mi5jCmluZGV4IDQ2YjkyNzkuLmY0YzM3YjQgMTAwNjQ0Ci0tLSBhL3hl bi9jb21tb24vc2NoZWRfY3JlZGl0Mi5jCisrKyBiL3hlbi9jb21tb24vc2NoZWRfY3JlZGl0Mi5j CkBAIC0yMjYxLDEzICsyMjYxLDE1IEBAIGNzY2hlZDJfc3dpdGNoX3NjaGVkKHN0cnVjdCBzY2hl ZHVsZXIgKm5ld19vcHMsIHVuc2lnbmVkIGludCBjcHUsCiB9CiAKIHN0YXRpYyB2b2lkCi1jc2No ZWQyX2ZyZWVfcGRhdGEoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3BzLCB2b2lkICpwY3B1LCBp bnQgY3B1KQorY3NjaGVkMl9kZWluaXRfcGRhdGEoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3Bz LCB2b2lkICpwY3B1LCBpbnQgY3B1KQogewogICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAg c3RydWN0IGNzY2hlZDJfcHJpdmF0ZSAqcHJ2ID0gQ1NDSEVEMl9QUklWKG9wcyk7CiAgICAgc3Ry dWN0IGNzY2hlZDJfcnVucXVldWVfZGF0YSAqcnFkOwogICAgIGludCBycWk7CiAKKyAgICBBU1NF UlQocGNwdSA9PSBOVUxMKTsKKwogICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwcnYtPmxvY2ssIGZs YWdzKTsKIAogICAgIEFTU0VSVChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJnBydi0+aW5pdGlhbGl6 ZWQpKTsKQEAgLTIzODcsNyArMjM4OSw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVy IHNjaGVkX2NyZWRpdDJfZGVmID0gewogICAgIC5hbGxvY192ZGF0YSAgICA9IGNzY2hlZDJfYWxs b2NfdmRhdGEsCiAgICAgLmZyZWVfdmRhdGEgICAgID0gY3NjaGVkMl9mcmVlX3ZkYXRhLAogICAg IC5pbml0X3BkYXRhICAgICA9IGNzY2hlZDJfaW5pdF9wZGF0YSwKLSAgICAuZnJlZV9wZGF0YSAg ICAgPSBjc2NoZWQyX2ZyZWVfcGRhdGEsCisgICAgLmRlaW5pdF9wZGF0YSAgID0gY3NjaGVkMl9k ZWluaXRfcGRhdGEsCiAgICAgLnN3aXRjaF9zY2hlZCAgID0gY3NjaGVkMl9zd2l0Y2hfc2NoZWQs CiAgICAgLmFsbG9jX2RvbWRhdGEgID0gY3NjaGVkMl9hbGxvY19kb21kYXRhLAogICAgIC5mcmVl X2RvbWRhdGEgICA9IGNzY2hlZDJfZnJlZV9kb21kYXRhLApkaWZmIC0tZ2l0IGEveGVuL2NvbW1v bi9zY2hlZHVsZS5jIGIveGVuL2NvbW1vbi9zY2hlZHVsZS5jCmluZGV4IDU1NDY5OTkuLjFhNjQ1 MjEgMTAwNjQ0Ci0tLSBhL3hlbi9jb21tb24vc2NoZWR1bGUuYworKysgYi94ZW4vY29tbW9uL3Nj aGVkdWxlLmMKQEAgLTE1MjksNyArMTUyOSw3IEBAIHN0YXRpYyB2b2lkIGNwdV9zY2hlZHVsZV9k b3duKHVuc2lnbmVkIGludCBjcHUpCiAgICAgc3RydWN0IHNjaGVkdWxlX2RhdGEgKnNkID0gJnBl cl9jcHUoc2NoZWR1bGVfZGF0YSwgY3B1KTsKICAgICBzdHJ1Y3Qgc2NoZWR1bGVyICpzY2hlZCA9 IHBlcl9jcHUoc2NoZWR1bGVyLCBjcHUpOwogCi0gICAgU0NIRURfT1Aoc2NoZWQsIGZyZWVfcGRh dGEsIHNkLT5zY2hlZF9wcml2LCBjcHUpOworICAgIFNDSEVEX09QKHNjaGVkLCBmcmVlX3BkYXRh LCBzZC0+c2NoZWRfcHJpdik7CiAgICAgU0NIRURfT1Aoc2NoZWQsIGZyZWVfdmRhdGEsIGlkbGVf dmNwdVtjcHVdLT5zY2hlZF9wcml2KTsKIAogICAgIGlkbGVfdmNwdVtjcHVdLT5zY2hlZF9wcml2 ID0gTlVMTDsKQEAgLTE1NTQsOCArMTU1NCwxMCBAQCBzdGF0aWMgaW50IGNwdV9zY2hlZHVsZV9j YWxsYmFjaygKICAgICBjYXNlIENQVV9VUF9QUkVQQVJFOgogICAgICAgICByYyA9IGNwdV9zY2hl ZHVsZV91cChjcHUpOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIENQVV9VUF9DQU5DRUxFRDoK ICAgICBjYXNlIENQVV9ERUFEOgorICAgICAgICBTQ0hFRF9PUChzY2hlZCwgZGVpbml0X3BkYXRh LCBzZC0+c2NoZWRfcHJpdiwgY3B1KTsKKyAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KKyAgICBj YXNlIENQVV9VUF9DQU5DRUxFRDoKICAgICAgICAgY3B1X3NjaGVkdWxlX2Rvd24oY3B1KTsKICAg ICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTE2ODQsNyArMTY4Niw3IEBAIGludCBzY2hl ZHVsZV9jcHVfc3dpdGNoKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVwb29sICpjKQogICAg IHZwcml2ID0gU0NIRURfT1AobmV3X29wcywgYWxsb2NfdmRhdGEsIGlkbGUsIGlkbGUtPmRvbWFp bi0+c2NoZWRfcHJpdik7CiAgICAgaWYgKCB2cHJpdiA9PSBOVUxMICkKICAgICB7Ci0gICAgICAg IFNDSEVEX09QKG5ld19vcHMsIGZyZWVfcGRhdGEsIHBwcml2LCBjcHUpOworICAgICAgICBTQ0hF RF9PUChuZXdfb3BzLCBmcmVlX3BkYXRhLCBwcHJpdik7CiAgICAgICAgIHJldHVybiAtRU5PTUVN OwogICAgIH0KIApAQCAtMTcxNCw3ICsxNzE2LDggQEAgaW50IHNjaGVkdWxlX2NwdV9zd2l0Y2go dW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdXBvb2wgKmMpCiAgICAgU0NIRURfT1AobmV3X29w cywgdGlja19yZXN1bWUsIGNwdSk7CiAKICAgICBTQ0hFRF9PUChvbGRfb3BzLCBmcmVlX3ZkYXRh LCB2cHJpdl9vbGQpOwotICAgIFNDSEVEX09QKG9sZF9vcHMsIGZyZWVfcGRhdGEsIHBwcml2X29s ZCwgY3B1KTsKKyAgICBTQ0hFRF9PUChvbGRfb3BzLCBkZWluaXRfcGRhdGEsIHBwcml2X29sZCwg Y3B1KTsKKyAgICBTQ0hFRF9PUChvbGRfb3BzLCBmcmVlX3BkYXRhLCBwcHJpdl9vbGQpOwogCiAg b3V0OgogICAgIHBlcl9jcHUoY3B1cG9vbCwgY3B1KSA9IGM7CmRpZmYgLS1naXQgYS94ZW4vaW5j bHVkZS94ZW4vc2NoZWQtaWYuaCBiL3hlbi9pbmNsdWRlL3hlbi9zY2hlZC1pZi5oCmluZGV4IDFk YjdjOGQuLjI0MGY2NmMgMTAwNjQ0Ci0tLSBhL3hlbi9pbmNsdWRlL3hlbi9zY2hlZC1pZi5oCisr KyBiL3hlbi9pbmNsdWRlL3hlbi9zY2hlZC1pZi5oCkBAIC0xMzUsOSArMTM1LDEwIEBAIHN0cnVj dCBzY2hlZHVsZXIgewogICAgIHZvaWQgICAgICAgICAoKmZyZWVfdmRhdGEpICAgICAoY29uc3Qg c3RydWN0IHNjaGVkdWxlciAqLCB2b2lkICopOwogICAgIHZvaWQgKiAgICAgICAoKmFsbG9jX3Zk YXRhKSAgICAoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqLCBzdHJ1Y3QgdmNwdSAqLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKTsKLSAgICB2b2lkICAgICAgICAg KCpmcmVlX3BkYXRhKSAgICAgKGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIgKiwgdm9pZCAqLCBpbnQp OworICAgIHZvaWQgICAgICAgICAoKmZyZWVfcGRhdGEpICAgICAoY29uc3Qgc3RydWN0IHNjaGVk dWxlciAqLCB2b2lkICopOwogICAgIHZvaWQgKiAgICAgICAoKmFsbG9jX3BkYXRhKSAgICAoY29u c3Qgc3RydWN0IHNjaGVkdWxlciAqLCBpbnQpOwogICAgIHZvaWQgICAgICAgICAoKmluaXRfcGRh dGEpICAgICAoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqLCB2b2lkICosIGludCk7CisgICAgdm9p ZCAgICAgICAgICgqZGVpbml0X3BkYXRhKSAgIChjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICosIHZv aWQgKiwgaW50KTsKICAgICB2b2lkICAgICAgICAgKCpmcmVlX2RvbWRhdGEpICAgKGNvbnN0IHN0 cnVjdCBzY2hlZHVsZXIgKiwgdm9pZCAqKTsKICAgICB2b2lkICogICAgICAgKCphbGxvY19kb21k YXRhKSAgKGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIgKiwgc3RydWN0IGRvbWFpbiAqKTsKIAo= --=-8GNV4+X+6ZeJU+tj8BJi-- --=-G3zZ8vr8oLt4AIFzAF8A Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEABECAAYFAlcfqhYACgkQk4XaBE3IOsQJ4gCeJQN3ZvNsJ+QZO0STwTA5IKMm CQsAnjldgbVzkMl6eMCCWJcBaphbznSv =4ei4 -----END PGP SIGNATURE----- --=-G3zZ8vr8oLt4AIFzAF8A-- --===============1443857693962132866== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwOi8vbGlzdHMueGVuLm9y Zy94ZW4tZGV2ZWwK --===============1443857693962132866==--