From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D64B4C433E0 for ; Thu, 11 Feb 2021 18:53:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 71B1B64D99 for ; Thu, 11 Feb 2021 18:53:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230159AbhBKSir (ORCPT ); Thu, 11 Feb 2021 13:38:47 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:60157 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229813AbhBKShP (ORCPT ); Thu, 11 Feb 2021 13:37:15 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1613068544; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pPOg3Ohlq+RcRCbYcOoTEKFNyerStoZoZ0h1YxqgvsQ=; b=Ch4lelP9grAni2qmhsTAAWmrGxjtVvExKWqQ0Wf+absF1brFU0adEshI64a3lfxlW+Fcv0 jel41HRSULUvLUH+0xKR4nNDOvHHtbALiOydhwExDZ3FGZEvPcTyP90Bkvud0NVbm6NqEl 8ZcNI+at6ttyVNmSdmRlRJnK7uB0lt4= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-437-GXYYXgzlPNCWeLfR_8F6jw-1; Thu, 11 Feb 2021 13:35:38 -0500 X-MC-Unique: GXYYXgzlPNCWeLfR_8F6jw-1 Received: by mail-qv1-f69.google.com with SMTP id er16so136533qvb.22 for ; Thu, 11 Feb 2021 10:35:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:reply-to:to:cc:date :in-reply-to:references:organization:user-agent:mime-version :content-transfer-encoding; bh=pPOg3Ohlq+RcRCbYcOoTEKFNyerStoZoZ0h1YxqgvsQ=; b=t/7IiACN1gi4T9BHGvvs40Nqde929ikJkf3gARb86ji95EoHvtib+dYWe98RrNyr1o weM61CIMz8GhKeWQ++jR73vPsO970fMMVvaCq+pzoniuPGcI0edavNu3GqBCuknVyTav soYMwpciVgltw2IX+9unznOeT3Hv0+bokFA8lVQjaZKKrbseRBQMm9ave+sgYd1JxAPH 67yRgtGSUtTvI9BfbtC4ubs+oKep+Sfamz7ykN2Awq1OwzLTy8Y05DFvWXS+AqyZbJju kuXKlpjhysbrE/13jJAmE6LxECc6PzahZZp7QIzP8rgo4ulwYv+3cuxe3NfeW8vmUXjI mgPA== X-Gm-Message-State: AOAM530VcBW7np4pMIXpTCeVVk2FzhWBS3q98nvIkgOXipgvGjdHDADf M5J+ONlCIbGkUlt0n4ytn/3nIhF9gcVrlwZ3Badaku0PY0VV7ReIyiwsxdkbrtxd47CQBQ89r7/ cOswivx6g6gZnTJGr42UL6g15 X-Received: by 2002:a0c:ac43:: with SMTP id m3mr9044635qvb.37.1613068537974; Thu, 11 Feb 2021 10:35:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJwEZm08wF69ndhqlNhK75qjeAHsxMVSaVWhTwnItgrMqjIMG1ZuD8aJK5uVgaEUnx1XvdbvKA== X-Received: by 2002:a0c:ac43:: with SMTP id m3mr9044591qvb.37.1613068537593; Thu, 11 Feb 2021 10:35:37 -0800 (PST) Received: from Whitewolf.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id d1sm4367878qkj.123.2021.02.11.10.35.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Feb 2021 10:35:34 -0800 (PST) Message-ID: Subject: Re: [Intel-gfx] [RFC v4 10/11] drm/dp: Extract i915's eDP backlight code into DRM helpers From: Lyude Paul Reply-To: lyude@redhat.com To: Rodrigo Vivi Cc: dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, Lucas De Marchi , Jani Nikula , David Airlie , open list , Maxime Ripard , greg.depoire@gmail.com, Sean Paul , Thomas Zimmermann , Dave Airlie Date: Thu, 11 Feb 2021 13:35:33 -0500 In-Reply-To: <20210211041540.GI82362@intel.com> References: <20210208233902.1289693-1-lyude@redhat.com> <20210208233902.1289693-11-lyude@redhat.com> <20210211041540.GI82362@intel.com> Organization: Red Hat Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.3 (3.38.3-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 2021-02-10 at 23:15 -0500, Rodrigo Vivi wrote: > On Mon, Feb 08, 2021 at 06:39:00PM -0500, Lyude Paul wrote: > > Since we're about to implement eDP backlight support in nouveau using the > > standard protocol from VESA, we might as well just take the code that's > > already written for this and move it into a set of shared DRM helpers. > > > > Note that these helpers are intended to handle DPCD related backlight > > control bits such as setting the brightness level over AUX, probing the > > backlight's TCON, enabling/disabling the backlight over AUX if supported, > > etc. Any PWM-related portions of backlight control are explicitly left up > > to the driver, as these will vary from platform to platform. > > > > The only exception to this is the calculation of the PWM frequency > > pre-divider value. This is because the only platform-specific information > > required for this is the PWM frequency of the panel, which the driver is > > expected to provide if available. The actual algorithm for calculating this > > value is standard and is defined in the eDP specification from VESA. > > > > Note that these helpers do not yet implement the full range of features > > the VESA backlight interface provides, and only provide the following > > functionality (all of which was already present in i915's DPCD backlight > > support): > > > > * Basic control of brightness levels > > * Basic probing of backlight capabilities > > * Helpers for enabling and disabling the backlight > > > > v3: > > * Split out changes to i915's backlight code to separate patches to make it > >   easier to review > > v4: > > * Style/spelling changes from Thomas Zimmermann > > > > Signed-off-by: Lyude Paul > > Cc: Jani Nikula > > Cc: Dave Airlie > > Cc: greg.depoire@gmail.com > > --- > >  drivers/gpu/drm/drm_dp_helper.c               | 332 ++++++++++++++++++ > >  .../drm/i915/display/intel_display_types.h    |   5 +- > >  .../drm/i915/display/intel_dp_aux_backlight.c | 285 ++------------- > >  include/drm/drm_dp_helper.h                   |  48 +++ > >  4 files changed, 412 insertions(+), 258 deletions(-) > > > > diff --git a/drivers/gpu/drm/drm_dp_helper.c > > b/drivers/gpu/drm/drm_dp_helper.c > > index eedbb48815b7..1a3d4679d720 100644 > > --- a/drivers/gpu/drm/drm_dp_helper.c > > +++ b/drivers/gpu/drm/drm_dp_helper.c > > @@ -3082,3 +3082,335 @@ int drm_dp_pcon_convert_rgb_to_ycbcr(struct > > drm_dp_aux *aux, u8 color_spc) > >         return 0; > >  } > >  EXPORT_SYMBOL(drm_dp_pcon_convert_rgb_to_ycbcr); > > + > > +/** > > + * drm_edp_backlight_set_level() - Set the backlight level of an eDP panel > > via AUX > > + * @aux: The DP AUX channel to use > > + * @bl: Backlight capability info from drm_edp_backlight_init() > > + * @level: The brightness level to set > > + * > > + * Sets the brightness level of an eDP panel's backlight. Note that the > > panel's backlight must > > + * already have been enabled by the driver by calling > > drm_edp_backlight_enable(). > > + * > > + * Returns: %0 on success, negative error code on failure > > + */ > > +int drm_edp_backlight_set_level(struct drm_dp_aux *aux, const struct > > drm_edp_backlight_info *bl, > > +                               u16 level) > > +{ > > +       int ret; > > +       u8 buf[2] = { 0 }; > > + > > +       if (bl->lsb_reg_used) { > > +               buf[0] = (level & 0xff00) >> 8; > > +               buf[1] = (level & 0x00ff); > > +       } else { > > +               buf[0] = level; > > +       } > > + > > +       ret = drm_dp_dpcd_write(aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, buf, > > sizeof(buf)); > > +       if (ret != sizeof(buf)) { > > +               DRM_ERROR("%s: Failed to write aux backlight level: %d\n", > > aux->name, ret); > > +               return ret < 0 ? ret : -EIO; > > +       } > > + > > +       return 0; > > +} > > +EXPORT_SYMBOL(drm_edp_backlight_set_level); > > + > > +static int > > +drm_edp_backlight_set_enable(struct drm_dp_aux *aux, const struct > > drm_edp_backlight_info *bl, > > +                            bool enable) > > +{ > > +       int ret; > > +       u8 buf; > > + > > +       /* The panel uses something other then DPCD for enabling its > > backlight */ > > +       if (!bl->aux_enable) > > +               return 0; > > + > > +       ret = drm_dp_dpcd_readb(aux, DP_EDP_DISPLAY_CONTROL_REGISTER, &buf); > > +       if (ret != 1) { > > +               DRM_ERROR("%s: Failed to read eDP display control register: > > %d\n", aux->name, ret); > > +               return ret < 0 ? ret : -EIO; > > +       } > > +       if (enable) > > +               buf |= DP_EDP_BACKLIGHT_ENABLE; > > +       else > > +               buf &= ~DP_EDP_BACKLIGHT_ENABLE; > > + > > +       ret = drm_dp_dpcd_writeb(aux, DP_EDP_DISPLAY_CONTROL_REGISTER, buf); > > +       if (ret != 1) { > > +               DRM_ERROR("%s: Failed to write eDP display control register: > > %d\n", aux->name, ret); > > +               return ret < 0 ? ret : -EIO; > > +       } > > + > > +       return 0; > > +} > > + > > +/** > > + * drm_edp_backlight_enable() - Enable an eDP panel's backlight using DPCD > > + * @aux: The DP AUX channel to use > > + * @bl: Backlight capability info from drm_edp_backlight_init() > > + * @level: The initial backlight level to set via AUX, if there is one > > + * > > + * This function handles enabling DPCD backlight controls on a panel over > > DPCD, while additionally > > + * restoring any important backlight state such as the given backlight > > level, the brightness byte > > + * count, backlight frequency, etc. > > + * > > + * Note that certain panels, while supporting brightness level controls > > over DPCD, may not support > > + * having their backlights enabled via the standard > > %DP_EDP_DISPLAY_CONTROL_REGISTER. On such panels > > + * &drm_edp_backlight_info.aux_enable will be set to %false, this function > > will skip the step of > > + * programming the %DP_EDP_DISPLAY_CONTROL_REGISTER, and the driver must > > perform the required > > + * implementation specific step for enabling the backlight after calling > > this function. > > + * > > + * Returns: %0 on success, negative error code on failure. > > + */ > > +int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct > > drm_edp_backlight_info *bl, > > +                            const u16 level) > > +{ > > +       int ret; > > +       u8 dpcd_buf, new_dpcd_buf; > > + > > +       ret = drm_dp_dpcd_readb(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, > > &dpcd_buf); > > +       if (ret != 1) { > > +               DRM_DEBUG_KMS("%s: Failed to read backlight mode: %d\n", > > aux->name, ret); > > +               return ret < 0 ? ret : -EIO; > > +       } > > + > > +       new_dpcd_buf = dpcd_buf; > > + > > +       if ((dpcd_buf & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) != > > DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) { > > +               new_dpcd_buf &= ~DP_EDP_BACKLIGHT_CONTROL_MODE_MASK; > > +               new_dpcd_buf |= DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD; > > + > > +               ret = drm_dp_dpcd_writeb(aux, DP_EDP_PWMGEN_BIT_COUNT, bl- > > >pwmgen_bit_count); > > +               if (ret != 1) > > +                       DRM_DEBUG_KMS("%s: Failed to write aux pwmgen bit > > count: %d\n", > > +                                     aux->name, ret); > > +       } > > + > > +       if (bl->pwm_freq_pre_divider) { > > +               ret = drm_dp_dpcd_writeb(aux, DP_EDP_BACKLIGHT_FREQ_SET, bl- > > >pwm_freq_pre_divider); > > +               if (ret != 1) > > +                       DRM_DEBUG_KMS("%s: Failed to write aux backlight > > frequency: %d\n", > > +                                     aux->name, ret); > > +               else > > +                       new_dpcd_buf |= > > DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE; > > +       } > > + > > +       if (new_dpcd_buf != dpcd_buf) { > > +               ret = drm_dp_dpcd_writeb(aux, > > DP_EDP_BACKLIGHT_MODE_SET_REGISTER, new_dpcd_buf); > > +               if (ret != 1) { > > +                       DRM_DEBUG_KMS("%s: Failed to write aux backlight > > mode: %d\n", > > +                                     aux->name, ret); > > +                       return ret < 0 ? ret : -EIO; > > +               } > > +       } > > + > > +       ret = drm_edp_backlight_set_level(aux, bl, level); > > +       if (ret < 0) > > +               return ret; > > +       ret = drm_edp_backlight_set_enable(aux, bl, true); > > +       if (ret < 0) > > +               return ret; > > + > > +       return 0; > > +} > > +EXPORT_SYMBOL(drm_edp_backlight_enable); > > + > > +/** > > + * drm_edp_backlight_disable() - Disable an eDP backlight using DPCD, if > > supported > > + * @aux: The DP AUX channel to use > > + * @bl: Backlight capability info from drm_edp_backlight_init() > > + * > > + * This function handles disabling DPCD backlight controls on a panel over > > AUX. Note that some > > + * panels have backlights that are enabled/disabled by other means, despite > > having their brightness > > + * values controlled through DPCD. On such panels > > &drm_edp_backlight_info.aux_enable will be set to > > + * %false, this function will become a no-op (and we will skip updating > > + * %DP_EDP_DISPLAY_CONTROL_REGISTER), and the driver must take care to > > perform it's own > > + * implementation specific step for disabling the backlight. > > + * > > + * Returns: %0 on success or no-op, negative error code on failure. > > + */ > > +int drm_edp_backlight_disable(struct drm_dp_aux *aux, const struct > > drm_edp_backlight_info *bl) > > +{ > > +       int ret; > > + > > +       ret = drm_edp_backlight_set_enable(aux, bl, false); > > +       if (ret < 0) > > +               return ret; > > + > > +       return 0; > > +} > > +EXPORT_SYMBOL(drm_edp_backlight_disable); > > + > > +static inline int > > +drm_edp_backlight_probe_max(struct drm_dp_aux *aux, struct > > drm_edp_backlight_info *bl, > > +                           u16 driver_pwm_freq_hz, const u8 > > edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE]) > > +{ > > +       int fxp, fxp_min, fxp_max, fxp_actual, f = 1; > > +       int ret; > > +       u8 pn, pn_min, pn_max; > > + > > +       ret = drm_dp_dpcd_readb(aux, DP_EDP_PWMGEN_BIT_COUNT, &pn); > > +       if (ret != 1) { > > +               DRM_DEBUG_KMS("%s: Failed to read pwmgen bit count cap: > > %d\n", aux->name, ret); > > +               return -ENODEV; > > +       } > > + > > +       pn &= DP_EDP_PWMGEN_BIT_COUNT_MASK; > > +       bl->max = (1 << pn) - 1; > > +       if (!driver_pwm_freq_hz) > > +               return 0; > > + > > +       /* > > +        * Set PWM Frequency divider to match desired frequency provided by > > the driver. > > +        * The PWM Frequency is calculated as 27Mhz / (F x P). > > +        * - Where F = PWM Frequency Pre-Divider value programmed by field > > 7:0 of the > > +        *             EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h) > > +        * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 > > of the > > +        *             EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h) > > +        */ > > + > > +       /* Find desired value of (F x P) > > +        * Note that, if F x P is out of supported range, the maximum value > > or minimum value will > > +        * applied automatically. So no need to check that. > > +        */ > > +       fxp = DIV_ROUND_CLOSEST(1000 * DP_EDP_BACKLIGHT_FREQ_BASE_KHZ, > > driver_pwm_freq_hz); > > + > > +       /* Use highest possible value of Pn for more granularity of > > brightness adjustment while > > +        * satifying the conditions below. > > +        * - Pn is in the range of Pn_min and Pn_max > > +        * - F is in the range of 1 and 255 > > +        * - FxP is within 25% of desired value. > > +        *   Note: 25% is arbitrary value and may need some tweak. > > +        */ > > +       ret = drm_dp_dpcd_readb(aux, DP_EDP_PWMGEN_BIT_COUNT_CAP_MIN, > > &pn_min); > > +       if (ret != 1) { > > +               DRM_DEBUG_KMS("%s: Failed to read pwmgen bit count cap min: > > %d\n", aux->name, ret); > > +               return 0; > > +       } > > +       ret = drm_dp_dpcd_readb(aux, DP_EDP_PWMGEN_BIT_COUNT_CAP_MAX, > > &pn_max); > > +       if (ret != 1) { > > +               DRM_DEBUG_KMS("%s: Failed to read pwmgen bit count cap max: > > %d\n", aux->name, ret); > > +               return 0; > > +       } > > +       pn_min &= DP_EDP_PWMGEN_BIT_COUNT_MASK; > > +       pn_max &= DP_EDP_PWMGEN_BIT_COUNT_MASK; > > + > > +       /* Ensure frequency is within 25% of desired value */ > > +       fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4); > > +       fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4); > > +       if (fxp_min < (1 << pn_min) || (255 << pn_max) < fxp_max) { > > +               DRM_DEBUG_KMS("%s: Driver defined backlight frequency (%d) > > out of range\n", > > +                             aux->name, driver_pwm_freq_hz); > > +               return 0; > > +       } > > + > > +       for (pn = pn_max; pn >= pn_min; pn--) { > > +               f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255); > > +               fxp_actual = f << pn; > > +               if (fxp_min <= fxp_actual && fxp_actual <= fxp_max) > > +                       break; > > +       } > > + > > +       ret = drm_dp_dpcd_writeb(aux, DP_EDP_PWMGEN_BIT_COUNT, pn); > > +       if (ret != 1) { > > +               DRM_DEBUG_KMS("%s: Failed to write aux pwmgen bit count: > > %d\n", aux->name, ret); > > +               return 0; > > +       } > > +       bl->pwmgen_bit_count = pn; > > +       bl->max = (1 << pn) - 1; > > + > > +       if (edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP) { > > +               bl->pwm_freq_pre_divider = f; > > +               DRM_DEBUG_KMS("%s: Using backlight frequency from driver > > (%dHz)\n", > > +                             aux->name, driver_pwm_freq_hz); > > +       } > > + > > +       return 0; > > +} > > + > > thanks for the clean up... > up to this point it was easy to see the code added and code remove matches... > > > +static inline int > > +drm_edp_backlight_probe_level(struct drm_dp_aux *aux, struct > > drm_edp_backlight_info *bl, > > +                             u8 *current_mode) > > +{ > > +       int ret; > > +       u8 buf[2]; > > +       u8 mode_reg; > > + > > +       ret = drm_dp_dpcd_readb(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, > > &mode_reg); > > +       if (ret != 1) { > > +               DRM_DEBUG_KMS("%s: Failed to read backlight mode: %d\n", > > aux->name, ret); > > +               return ret < 0 ? ret : -EIO; > > +       } > > + > > +       *current_mode = (mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK); > > +       if (*current_mode == DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) { > > However I'm afraid that on this area here we have something that could be > improved further... > > > +               int size = 1 + bl->lsb_reg_used; > > + > > +               ret = drm_dp_dpcd_read(aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, > > buf, size); > > +               if (ret != size) { > > +                       DRM_DEBUG_KMS("%s: Failed to read backlight level: > > %d\n", aux->name, ret); > > But probably the biggest blocker is the "regression" of the debug logs. > Not just in this point, but I mean everywhere... > the use of the old DRM_DEBUG_KMS should be avoided here imho. > Although it is backlight, what it would mean integrated and only > one device available, this will at least change how we see the logs.. > > Any change of using drm_dbg_*(drm, ?! It'll take a tree-wide patch series, but I'll go ahead and do that today/tomorrow :) > > > +                       return ret < 0 ? ret : -EIO; > > +               } > > + > > +               if (bl->lsb_reg_used) > > +                       return (buf[0] << 8) | buf[1]; > > +               else > > +                       return buf[0]; > > +       } > > + > > +       /* > > +        * If we're not in DPCD control mode yet, the programmed brightness > > value is meaningless and > > +        * the driver should assume max brightness > > +        */ > > +       return bl->max; > > +} > > + > > +/** > > + * drm_edp_backlight_init() - Probe a display panel's TCON using the > > standard VESA eDP backlight > > + * interface. > > + * @aux: The DP aux device to use for probing > > + * @bl: The &drm_edp_backlight_info struct to fill out with information on > > the backlight > > + * @driver_pwm_freq_hz: Optional PWM frequency from the driver in hz > > + * @edp_dpcd: A cached copy of the eDP DPCD > > + * @current_level: Where to store the probed brightness level > > + * @current_mode: Where to store the currently set backlight control mode > > + * > > + * Initializes a &drm_edp_backlight_info struct by probing @aux for it's > > backlight capabilities, > > + * along with also probing the current and maximum supported brightness > > levels. > > + * > > + * If @driver_pwm_freq_hz is non-zero, this will be used as the backlight > > frequency. Otherwise, the > > + * default frequency from the panel is used. > > + * > > + * Returns: %0 on success, negative error code on failure. > > + */ > > +int > > +drm_edp_backlight_init(struct drm_dp_aux *aux, struct > > drm_edp_backlight_info *bl, > > +                      u16 driver_pwm_freq_hz, const u8 > > edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE], > > +                      u16 *current_level, u8 *current_mode) > > +{ > > +       int ret; > > + > > +       if (edp_dpcd[1] & DP_EDP_BACKLIGHT_AUX_ENABLE_CAP) > > +               bl->aux_enable = true; > > +       if (edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT) > > +               bl->lsb_reg_used = true; > > + > > +       ret = drm_edp_backlight_probe_max(aux, bl, driver_pwm_freq_hz, > > edp_dpcd); > > +       if (ret < 0) > > +               return ret; > > + > > +       ret = drm_edp_backlight_probe_level(aux, bl, current_mode); > > +       if (ret < 0) > > +               return ret; > > +       *current_level = ret; > > + > > +       DRM_DEBUG_KMS("%s: Found backlight level=%d/%d > > pwm_freq_pre_divider=%d mode=%x\n", > > +                     aux->name, *current_level, bl->max, bl- > > >pwm_freq_pre_divider, *current_mode); > > +       DRM_DEBUG_KMS("%s: Backlight caps: pwmgen_bit_count=%d > > lsb_reg_used=%d aux_enable=%d\n", > > +                     aux->name, bl->pwmgen_bit_count, bl->lsb_reg_used, bl- > > >aux_enable); > > +       return 0; > > +} > > +EXPORT_SYMBOL(drm_edp_backlight_init); > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h > > b/drivers/gpu/drm/i915/display/intel_display_types.h > > index 1d8984077e8a..9f43d0b14e11 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > > @@ -264,10 +264,7 @@ struct intel_panel { > >                 /* DPCD backlight */ > >                 union { > >                         struct { > > -                               u8 pwmgen_bit_count; > > -                               u8 pwm_freq_pre_divider; > > -                               bool lsb_reg_used; > > -                               bool aux_enable; > > +                               struct drm_edp_backlight_info info; > >                         } vesa; > >                         struct { > >                                 bool sdr_uses_aux; > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > index a98d9bd4b0ed..286eb337448e 100644 > > --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > @@ -270,114 +270,19 @@ intel_dp_aux_hdr_setup_backlight(struct > > intel_connector *connector, enum pipe pi > >  } > >   > >  /* VESA backlight callbacks */ > > -static bool intel_dp_aux_vesa_backlight_dpcd_mode(struct intel_connector > > *connector) > > -{ > > -       struct intel_dp *intel_dp = intel_attached_dp(connector); > > -       struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > -       int ret; > > -       u8 mode_reg; > > - > > -       ret = drm_dp_dpcd_readb(&intel_dp->aux, > > DP_EDP_BACKLIGHT_MODE_SET_REGISTER, &mode_reg); > > -       if (ret != 1) { > > -               drm_dbg_kms(&i915->drm, "Failed to read backlight mode: > > %d\n", ret); > > -               return false; > > -       } > > - > > -       return (mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) == > > -              DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD; > > -} > > - > > -/* > > - * Read the current backlight value from DPCD register(s) based > > - * on if 8-bit(MSB) or 16-bit(MSB and LSB) values are supported > > - */ > >  static u32 intel_dp_aux_vesa_get_backlight(struct intel_connector > > *connector, enum pipe unused) > >  { > > -       struct intel_dp *intel_dp = intel_attached_dp(connector); > > -       struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > -       int ret; > > -       u8 read_val[2] = { 0x0 }; > > -       u16 level = 0; > > - > > -       /* > > -        * If we're not in DPCD control mode yet, the programmed brightness > > -        * value is meaningless and we should assume max brightness > > -        */ > > -       if (!intel_dp_aux_vesa_backlight_dpcd_mode(connector)) > > -               return connector->panel.backlight.max; > > - > > -       ret = drm_dp_dpcd_read(&intel_dp->aux, > > DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, &read_val, > > -                              sizeof(read_val)); > > -       if (ret != sizeof(read_val)) { > > -               drm_dbg_kms(&i915->drm, "Failed to read brightness level: > > %d\n", ret); > > -               return 0; > > -       } > > - > > -       if (connector->panel.backlight.edp.vesa.lsb_reg_used) > > -               level = (read_val[0] << 8 | read_val[1]); > > -       else > > -               level = read_val[0]; > > - > > -       return level; > > +       return connector->panel.backlight.level; > >  } > >   > > -/* > > - * Sends the current backlight level over the aux channel, checking if its > > using > > - * 8-bit or 16 bit value (MSB and LSB) > > - */ > >  static void > > -intel_dp_aux_vesa_set_backlight(const struct drm_connector_state > > *conn_state, > > -                               u32 level) > > +intel_dp_aux_vesa_set_backlight(const struct drm_connector_state > > *conn_state, u32 level) > >  { > >         struct intel_connector *connector = to_intel_connector(conn_state- > > >connector); > > -       struct intel_dp *intel_dp = intel_attached_dp(connector); > > -       struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > -       int ret; > > -       u8 vals[2] = { 0x0 }; > > - > > -       /* Write the MSB and/or LSB */ > > -       if (connector->panel.backlight.edp.vesa.lsb_reg_used) { > > -               vals[0] = (level & 0xFF00) >> 8; > > -               vals[1] = (level & 0xFF); > > -       } else { > > -               vals[0] = level; > > -       } > > - > > -       ret = drm_dp_dpcd_write(&intel_dp->aux, > > DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, vals, > > -                               sizeof(vals)); > > -       if (ret != sizeof(vals)) { > > -               drm_dbg_kms(&i915->drm, "Failed to write aux backlight > > level: %d\n", ret); > > -               return; > > -       } > > -} > > - > > -static void set_vesa_backlight_enable(struct intel_connector *connector, > > bool enable) > > -{ > > -       struct intel_dp *intel_dp = intel_attached_dp(connector); > > -       struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > -       int ret; > > -       u8 reg_val = 0; > > - > > -       /* Early return when display use other mechanism to enable > > backlight. */ > > -       if (!connector->panel.backlight.edp.vesa.aux_enable) > > -               return; > > - > > -       ret = drm_dp_dpcd_readb(&intel_dp->aux, > > DP_EDP_DISPLAY_CONTROL_REGISTER, ®_val); > > -       if (ret != 1) { > > -               drm_dbg_kms(&i915->drm, "Failed to read eDP display control > > register: %d\n", ret); > > -               return; > > -       } > > - > > -       if (enable) > > -               reg_val |= DP_EDP_BACKLIGHT_ENABLE; > > -       else > > -               reg_val &= ~(DP_EDP_BACKLIGHT_ENABLE); > > +       struct intel_panel *panel = &connector->panel; > > +       struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); > >   > > -       ret = drm_dp_dpcd_writeb(&intel_dp->aux, > > DP_EDP_DISPLAY_CONTROL_REGISTER, reg_val); > > -       if (ret != 1) { > > -               drm_dbg_kms(&i915->drm, "Failed to %s aux backlight: %d\n", > > -                           enable ? "enable" : "disable", ret); > > -       } > > +       drm_edp_backlight_set_level(&intel_dp->aux, &panel- > > >backlight.edp.vesa.info, level); > >  } > >   > >  static void > > @@ -385,170 +290,46 @@ intel_dp_aux_vesa_enable_backlight(const struct > > intel_crtc_state *crtc_state, > >                                    const struct drm_connector_state > > *conn_state, u32 level) > >  { > >         struct intel_connector *connector = to_intel_connector(conn_state- > > >connector); > > -       struct intel_dp *intel_dp = intel_attached_dp(connector); > > -       struct drm_i915_private *i915 = dp_to_i915(intel_dp); > >         struct intel_panel *panel = &connector->panel; > > -       int ret; > > -       u8 dpcd_buf, new_dpcd_buf; > > -       u8 pwmgen_bit_count = panel->backlight.edp.vesa.pwmgen_bit_count; > > - > > -       ret = drm_dp_dpcd_readb(&intel_dp->aux, > > DP_EDP_BACKLIGHT_MODE_SET_REGISTER, &dpcd_buf); > > -       if (ret != 1) { > > -               drm_dbg_kms(&i915->drm, "Failed to read backlight mode: > > %d\n", ret); > > -               return; > > -       } > > - > > -       new_dpcd_buf = dpcd_buf; > > - > > -       if ((dpcd_buf & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) != > > DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) { > > -               new_dpcd_buf &= ~DP_EDP_BACKLIGHT_CONTROL_MODE_MASK; > > -               new_dpcd_buf |= DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD; > > - > > -               ret = drm_dp_dpcd_writeb(&intel_dp->aux, > > DP_EDP_PWMGEN_BIT_COUNT, pwmgen_bit_count); > > -               if (ret != 1) > > -                       drm_dbg_kms(&i915->drm, "Failed to write aux pwmgen > > bit count: %d\n", ret); > > -       } > > - > > -       if (panel->backlight.edp.vesa.pwm_freq_pre_divider) { > > -               ret = drm_dp_dpcd_writeb(&intel_dp->aux, > > DP_EDP_BACKLIGHT_FREQ_SET, > > -                                        panel- > > >backlight.edp.vesa.pwm_freq_pre_divider); > > -               if (ret == 1) > > -                       new_dpcd_buf |= > > DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE; > > -               else > > -                       drm_dbg_kms(&i915->drm, "Failed to write aux > > backlight frequency: %d\n", > > -                                   ret); > > -       } > > - > > -       if (new_dpcd_buf != dpcd_buf) { > > -               ret = drm_dp_dpcd_writeb(&intel_dp->aux, > > DP_EDP_BACKLIGHT_MODE_SET_REGISTER, > > -                                        new_dpcd_buf); > > -               if (ret != 1) > > -                       drm_dbg_kms(&i915->drm, "Failed to write aux > > backlight mode: %d\n", ret); > > -       } > > +       struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); > >   > > -       intel_dp_aux_vesa_set_backlight(conn_state, level); > > -       set_vesa_backlight_enable(connector, true); > > +       drm_edp_backlight_enable(&intel_dp->aux, &panel- > > >backlight.edp.vesa.info, level); > >  } > >   > >  static void intel_dp_aux_vesa_disable_backlight(const struct > > drm_connector_state *old_conn_state, > >                                                 u32 level) > >  { > > -       set_vesa_backlight_enable(to_intel_connector(old_conn_state- > > >connector), false); > > -} > > - > > -/* > > - * Compute PWM frequency divider value based off the frequency provided to > > us by the vbt. > > - * The PWM Frequency is calculated as 27Mhz / (F x P). > > - * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of > > the > > - *             EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h) > > - * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the > > - *             EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h) > > - */ > > -static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector > > *connector) > > -{ > > -       struct drm_i915_private *i915 = to_i915(connector->base.dev); > > -       struct intel_dp *intel_dp = intel_attached_dp(connector); > > +       struct intel_connector *connector = > > to_intel_connector(old_conn_state->connector); > >         struct intel_panel *panel = &connector->panel; > > -       u32 max_backlight = 0; > > -       int ret, freq, fxp, fxp_min, fxp_max, fxp_actual, f = 1; > > -       u8 pn, pn_min, pn_max; > > - > > -       ret = drm_dp_dpcd_readb(&intel_dp->aux, DP_EDP_PWMGEN_BIT_COUNT, > > &pn); > > -       if (ret != 1) { > > -               drm_dbg_kms(&i915->drm, "Failed to read pwmgen bit count > > cap: %d\n", ret); > > -               return 0; > > -       } > > - > > -       pn &= DP_EDP_PWMGEN_BIT_COUNT_MASK; > > -       max_backlight = (1 << pn) - 1; > > - > > -       /* Find desired value of (F x P) > > -        * Note that, if F x P is out of supported range, the maximum value > > or > > -        * minimum value will applied automatically. So no need to check > > that. > > -        */ > > -       freq = i915->vbt.backlight.pwm_freq_hz; > > -       drm_dbg_kms(&i915->drm, "VBT defined backlight frequency %u Hz\n", > > -                   freq); > > -       if (!freq) { > > -               drm_dbg_kms(&i915->drm, > > -                           "Use panel default backlight frequency\n"); > > -               return max_backlight; > > -       } > > - > > -       fxp = DIV_ROUND_CLOSEST(KHz(DP_EDP_BACKLIGHT_FREQ_BASE_KHZ), freq); > > - > > -       /* Use highest possible value of Pn for more granularity of > > brightness > > -        * adjustment while satifying the conditions below. > > -        * - Pn is in the range of Pn_min and Pn_max > > -        * - F is in the range of 1 and 255 > > -        * - FxP is within 25% of desired value. > > -        *   Note: 25% is arbitrary value and may need some tweak. > > -        */ > > -       ret = drm_dp_dpcd_readb(&intel_dp->aux, > > DP_EDP_PWMGEN_BIT_COUNT_CAP_MIN, &pn_min); > > -       if (ret != 1) { > > -               drm_dbg_kms(&i915->drm, "Failed to read pwmgen bit count cap > > min: %d\n", ret); > > -               return max_backlight; > > -       } > > -       ret = drm_dp_dpcd_readb(&intel_dp->aux, > > DP_EDP_PWMGEN_BIT_COUNT_CAP_MAX, &pn_max); > > -       if (ret != 1) { > > -               drm_dbg_kms(&i915->drm, "Failed to read pwmgen bit count cap > > max: %d\n", ret); > > -               return max_backlight; > > -       } > > -       pn_min &= DP_EDP_PWMGEN_BIT_COUNT_MASK; > > -       pn_max &= DP_EDP_PWMGEN_BIT_COUNT_MASK; > > - > > -       /* Ensure frequency is within 25% of desired value */ > > -       fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4); > > -       fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4); > > - > > -       if (fxp_min < (1 << pn_min) || (255 << pn_max) < fxp_max) { > > -               drm_dbg_kms(&i915->drm, > > -                           "VBT defined backlight frequency out of > > range\n"); > > -               return max_backlight; > > -       } > > - > > -       for (pn = pn_max; pn >= pn_min; pn--) { > > -               f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255); > > -               fxp_actual = f << pn; > > -               if (fxp_min <= fxp_actual && fxp_actual <= fxp_max) > > -                       break; > > -       } > > - > > -       drm_dbg_kms(&i915->drm, "Using eDP pwmgen bit count of %d\n", pn); > > -       ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_EDP_PWMGEN_BIT_COUNT, > > pn); > > -       if (ret != 1) { > > -               drm_dbg_kms(&i915->drm, "Failed to write aux pwmgen bit > > count: %d\n", ret); > > -               return max_backlight; > > -       } > > - > > -       panel->backlight.edp.vesa.pwmgen_bit_count = pn; > > -       if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP) > > -               panel->backlight.edp.vesa.pwm_freq_pre_divider = f; > > - > > -       max_backlight = (1 << pn) - 1; > > +       struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); > >   > > -       return max_backlight; > > +       drm_edp_backlight_disable(&intel_dp->aux, &panel- > > >backlight.edp.vesa.info); > >  } > >   > > -static int intel_dp_aux_vesa_setup_backlight(struct intel_connector > > *connector, > > -                                            enum pipe pipe) > > +static int intel_dp_aux_vesa_setup_backlight(struct intel_connector > > *connector, enum pipe pipe) > >  { > >         struct intel_dp *intel_dp = intel_attached_dp(connector); > >         struct intel_panel *panel = &connector->panel; > > +       struct drm_i915_private *i915 = dp_to_i915(intel_dp); > > +       u16 current_level; > > +       u8 current_mode; > > +       int ret; > >   > > -       if (intel_dp->edp_dpcd[1] & DP_EDP_BACKLIGHT_AUX_ENABLE_CAP) > > -               panel->backlight.edp.vesa.aux_enable = true; > > -       if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT) > > -               panel->backlight.edp.vesa.lsb_reg_used = true; > > - > > -       panel->backlight.max = > > intel_dp_aux_vesa_calc_max_backlight(connector); > > -       if (!panel->backlight.max) > > -               return -ENODEV; > > +       ret = drm_edp_backlight_init(&intel_dp->aux, &panel- > > >backlight.edp.vesa.info, > > +                                    i915->vbt.backlight.pwm_freq_hz, > > intel_dp->edp_dpcd, > > +                                    ¤t_level, ¤t_mode); > > +       if (ret < 0) > > +               return ret; > >   > > +       panel->backlight.max = panel->backlight.edp.vesa.info.max; > >         panel->backlight.min = 0; > > -       panel->backlight.level = intel_dp_aux_vesa_get_backlight(connector, > > pipe); > > -       panel->backlight.enabled = > > intel_dp_aux_vesa_backlight_dpcd_mode(connector) && > > -                                  panel->backlight.level != 0; > > +       if (current_mode == DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) { > > +               panel->backlight.level = current_level; > > +               panel->backlight.enabled = panel->backlight.level != 0; > > +       } else { > > +               panel->backlight.level = panel->backlight.max; > > +               panel->backlight.enabled = false; > > +       } > >   > >         return 0; > >  } > > @@ -559,16 +340,12 @@ intel_dp_aux_supports_vesa_backlight(struct > > intel_connector *connector) > >         struct intel_dp *intel_dp = intel_attached_dp(connector); > >         struct drm_i915_private *i915 = dp_to_i915(intel_dp); > >   > > -       /* Check the eDP Display control capabilities registers to determine > > if > > -        * the panel can support backlight control over the aux channel. > > -        * > > -        * TODO: We currently only support AUX only backlight > > configurations, not backlights which > > +       /* TODO: We currently only support AUX only backlight > > configurations, not backlights which > >          * require a mix of PWM and AUX controls to work. In the mean time, > > these machines typically > >          * work just fine using normal PWM controls anyway. > >          */ > > -       if (intel_dp->edp_dpcd[1] & DP_EDP_TCON_BACKLIGHT_ADJUSTMENT_CAP && > > -           (intel_dp->edp_dpcd[1] & DP_EDP_BACKLIGHT_AUX_ENABLE_CAP) && > > -           (intel_dp->edp_dpcd[2] & > > DP_EDP_BACKLIGHT_BRIGHTNESS_AUX_SET_CAP)) { > > +       if ((intel_dp->edp_dpcd[1] & DP_EDP_BACKLIGHT_AUX_ENABLE_CAP) && > > +           drm_edp_backlight_supported(intel_dp->edp_dpcd)) { > >                 drm_dbg_kms(&i915->drm, "AUX Backlight Control > > Supported!\n"); > >                 return true; > >         } > > diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h > > index edffd1dcca3e..1eca0b42fc45 100644 > > --- a/include/drm/drm_dp_helper.h > > +++ b/include/drm/drm_dp_helper.h > > @@ -1790,6 +1790,24 @@ drm_dp_sink_can_do_video_without_timing_msa(const u8 > > dpcd[DP_RECEIVER_CAP_SIZE]) > >                 DP_MSA_TIMING_PAR_IGNORED; > >  } > >   > > +/** > > + * drm_edp_backlight_supported() - Check an eDP DPCD for VESA backlight > > support > > + * @edp_dpcd: The DPCD to check > > + * > > + * Note that currently this function will return %false for panels which > > support various DPCD > > + * backlight features but which require the brightness be set through PWM, > > and don't support setting > > + * the brightness level via the DPCD. This is a TODO. > > + * > > + * Returns: %True if @edp_dpcd indicates that VESA backlight controls are > > supported, %false > > + * otherwise > > + */ > > +static inline bool > > +drm_edp_backlight_supported(const u8 edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE]) > > +{ > > +       return (edp_dpcd[1] & DP_EDP_TCON_BACKLIGHT_ADJUSTMENT_CAP) && > > +               (edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_AUX_SET_CAP); > > +} > > + > >  /* > >   * DisplayPort AUX channel > >   */ > > @@ -2089,6 +2107,36 @@ drm_dp_has_quirk(const struct drm_dp_desc *desc, enum > > drm_dp_quirk quirk) > >         return desc->quirks & BIT(quirk); > >  } > >   > > +/** > > + * struct drm_edp_backlight_info - Probed eDP backlight info struct > > + * @pwmgen_bit_count: The pwmgen bit count > > + * @pwm_freq_pre_divider: The PWM frequency pre-divider value being used > > for this backlight, if any > > + * @max: The maximum backlight level that may be set > > + * @lsb_reg_used: Do we also write values to the > > DP_EDP_BACKLIGHT_BRIGHTNESS_LSB register? > > + * @aux_enable: Does the panel support the AUX enable cap? > > + * > > + * This structure contains various data about an eDP backlight, which can > > be populated by using > > + * drm_edp_backlight_init(). > > + */ > > +struct drm_edp_backlight_info { > > +       u8 pwmgen_bit_count; > > +       u8 pwm_freq_pre_divider; > > +       u16 max; > > + > > +       bool lsb_reg_used : 1; > > +       bool aux_enable : 1; > > +}; > > + > > +int > > +drm_edp_backlight_init(struct drm_dp_aux *aux, struct > > drm_edp_backlight_info *bl, > > +                      u16 driver_pwm_freq_hz, const u8 > > edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE], > > +                      u16 *current_level, u8 *current_mode); > > +int drm_edp_backlight_set_level(struct drm_dp_aux *aux, const struct > > drm_edp_backlight_info *bl, > > +                               u16 level); > > +int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct > > drm_edp_backlight_info *bl, > > +                            u16 level); > > +int drm_edp_backlight_disable(struct drm_dp_aux *aux, const struct > > drm_edp_backlight_info *bl); > > + > >  #ifdef CONFIG_DRM_DP_CEC > >  void drm_dp_cec_irq(struct drm_dp_aux *aux); > >  void drm_dp_cec_register_connector(struct drm_dp_aux *aux, > > -- > > 2.29.2 > > > > _______________________________________________ > > Intel-gfx mailing list > > Intel-gfx@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/intel-gfx > -- Sincerely, Lyude Paul (she/her) Software Engineer at Red Hat Note: I deal with a lot of emails and have a lot of bugs on my plate. If you've asked me a question, are waiting for a review/merge on a patch, etc. and I haven't responded in a while, please feel free to send me another email to check on my status. I don't bite! From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4F5E8C433E0 for ; Thu, 11 Feb 2021 18:35:47 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 08EB564DCF for ; Thu, 11 Feb 2021 18:35:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 08EB564DCF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=nouveau-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 894DB6ECCC; Thu, 11 Feb 2021 18:35:46 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0A8A46EE0F for ; Thu, 11 Feb 2021 18:35:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1613068543; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pPOg3Ohlq+RcRCbYcOoTEKFNyerStoZoZ0h1YxqgvsQ=; b=AK1U/4HzotgCFbnuBnyU8a3/FGwuiJGthJt99Fo3ZLUQ44tlFZA/dFgBjM2gYes45ZVDc2 PQB/jy5w1YNPZzVoyNag9MIIlc9IjaBcqEqxvJ3z0R/avG7bH3XQO/khbw98sGwJo05c/7 aQFNmgPl4UXttEiRrZ84l+TJoAFyKl0= Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-437-hk6pOlWKOBGZqd_VYWGJAg-1; Thu, 11 Feb 2021 13:35:38 -0500 X-MC-Unique: hk6pOlWKOBGZqd_VYWGJAg-1 Received: by mail-qv1-f70.google.com with SMTP id p4so4542822qvn.23 for ; Thu, 11 Feb 2021 10:35:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:reply-to:to:cc:date :in-reply-to:references:organization:user-agent:mime-version :content-transfer-encoding; bh=pPOg3Ohlq+RcRCbYcOoTEKFNyerStoZoZ0h1YxqgvsQ=; b=Uywkdl++JUqudBTZsEqUutVctmOLje+5eLZYrO1J2sQ+c/mTFOur3NxyPjoDI8luyb XUVuW1Klj7cAGKk1uMdK4csw55H/tCDdG+B8C8OyPlUuS+UhFUQJyw3KyseIDGVUnvjh 6it+7WYHXB0e2/EszDcmaKAOv4icWp2oKViBPZbtctBLgsm7ydglmpOXm2LTcEY5kIq+ p8jUJgf9+t5l+h0xoRnGHL4mwwJVeiwNjdIZCo1n1ZyHUQEroFIrQKN7Hstg6Azq6k/k c/NtsxOUkoqZl0e9+I1Wj2xDiRCAMIVreenti0K7eGAXfbwDoZgad4u2pJStVJ1IfB0V jVjw== X-Gm-Message-State: AOAM532VwId0Rz/vGKRn7uoeBdgRkWNBI1mPDkcQxAV/qrotdIrsWJ80 mzDuLTZX4J/LjAQKSw8m27FroSfCwjkcCWn5jntUoHJ+GfjXcj83TnxKUBybBRK56MoiZ8Gvpc6 T14zCcR9r44wl+PPYaMr4VuMHYA== X-Received: by 2002:a0c:ac43:: with SMTP id m3mr9044626qvb.37.1613068537973; Thu, 11 Feb 2021 10:35:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJwEZm08wF69ndhqlNhK75qjeAHsxMVSaVWhTwnItgrMqjIMG1ZuD8aJK5uVgaEUnx1XvdbvKA== X-Received: by 2002:a0c:ac43:: with SMTP id m3mr9044591qvb.37.1613068537593; Thu, 11 Feb 2021 10:35:37 -0800 (PST) Received: from Whitewolf.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id d1sm4367878qkj.123.2021.02.11.10.35.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Feb 2021 10:35:34 -0800 (PST) Message-ID: From: Lyude Paul To: Rodrigo Vivi Date: Thu, 11 Feb 2021 13:35:33 -0500 In-Reply-To: <20210211041540.GI82362@intel.com> References: <20210208233902.1289693-1-lyude@redhat.com> <20210208233902.1289693-11-lyude@redhat.com> <20210211041540.GI82362@intel.com> Organization: Red Hat User-Agent: Evolution 3.38.3 (3.38.3-1.fc33) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: Re: [Nouveau] [Intel-gfx] [RFC v4 10/11] drm/dp: Extract i915's eDP backlight code into DRM helpers X-BeenThere: nouveau@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Nouveau development list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: lyude@redhat.com Cc: greg.depoire@gmail.com, Jani Nikula , nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, Lucas De Marchi , open list , dri-devel@lists.freedesktop.org, David Airlie , Sean Paul , Maxime Ripard , Dave Airlie Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: nouveau-bounces@lists.freedesktop.org Sender: "Nouveau" T24gV2VkLCAyMDIxLTAyLTEwIGF0IDIzOjE1IC0wNTAwLCBSb2RyaWdvIFZpdmkgd3JvdGU6Cj4g T24gTW9uLCBGZWIgMDgsIDIwMjEgYXQgMDY6Mzk6MDBQTSAtMDUwMCwgTHl1ZGUgUGF1bCB3cm90 ZToKPiA+IFNpbmNlIHdlJ3JlIGFib3V0IHRvIGltcGxlbWVudCBlRFAgYmFja2xpZ2h0IHN1cHBv cnQgaW4gbm91dmVhdSB1c2luZyB0aGUKPiA+IHN0YW5kYXJkIHByb3RvY29sIGZyb20gVkVTQSwg d2UgbWlnaHQgYXMgd2VsbCBqdXN0IHRha2UgdGhlIGNvZGUgdGhhdCdzCj4gPiBhbHJlYWR5IHdy aXR0ZW4gZm9yIHRoaXMgYW5kIG1vdmUgaXQgaW50byBhIHNldCBvZiBzaGFyZWQgRFJNIGhlbHBl cnMuCj4gPiAKPiA+IE5vdGUgdGhhdCB0aGVzZSBoZWxwZXJzIGFyZSBpbnRlbmRlZCB0byBoYW5k bGUgRFBDRCByZWxhdGVkIGJhY2tsaWdodAo+ID4gY29udHJvbCBiaXRzIHN1Y2ggYXMgc2V0dGlu ZyB0aGUgYnJpZ2h0bmVzcyBsZXZlbCBvdmVyIEFVWCwgcHJvYmluZyB0aGUKPiA+IGJhY2tsaWdo dCdzIFRDT04sIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgYmFja2xpZ2h0IG92ZXIgQVVYIGlmIHN1 cHBvcnRlZCwKPiA+IGV0Yy4gQW55IFBXTS1yZWxhdGVkIHBvcnRpb25zIG9mIGJhY2tsaWdodCBj b250cm9sIGFyZSBleHBsaWNpdGx5IGxlZnQgdXAKPiA+IHRvIHRoZSBkcml2ZXIsIGFzIHRoZXNl IHdpbGwgdmFyeSBmcm9tIHBsYXRmb3JtIHRvIHBsYXRmb3JtLgo+ID4gCj4gPiBUaGUgb25seSBl eGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIFBXTSBmcmVxdWVuY3kK PiA+IHByZS1kaXZpZGVyIHZhbHVlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIG9ubHkgcGxhdGZvcm0t c3BlY2lmaWMgaW5mb3JtYXRpb24KPiA+IHJlcXVpcmVkIGZvciB0aGlzIGlzIHRoZSBQV00gZnJl cXVlbmN5IG9mIHRoZSBwYW5lbCwgd2hpY2ggdGhlIGRyaXZlciBpcwo+ID4gZXhwZWN0ZWQgdG8g cHJvdmlkZSBpZiBhdmFpbGFibGUuIFRoZSBhY3R1YWwgYWxnb3JpdGhtIGZvciBjYWxjdWxhdGlu ZyB0aGlzCj4gPiB2YWx1ZSBpcyBzdGFuZGFyZCBhbmQgaXMgZGVmaW5lZCBpbiB0aGUgZURQIHNw ZWNpZmljYXRpb24gZnJvbSBWRVNBLgo+ID4gCj4gPiBOb3RlIHRoYXQgdGhlc2UgaGVscGVycyBk byBub3QgeWV0IGltcGxlbWVudCB0aGUgZnVsbCByYW5nZSBvZiBmZWF0dXJlcwo+ID4gdGhlIFZF U0EgYmFja2xpZ2h0IGludGVyZmFjZSBwcm92aWRlcywgYW5kIG9ubHkgcHJvdmlkZSB0aGUgZm9s bG93aW5nCj4gPiBmdW5jdGlvbmFsaXR5IChhbGwgb2Ygd2hpY2ggd2FzIGFscmVhZHkgcHJlc2Vu dCBpbiBpOTE1J3MgRFBDRCBiYWNrbGlnaHQKPiA+IHN1cHBvcnQpOgo+ID4gCj4gPiAqIEJhc2lj IGNvbnRyb2wgb2YgYnJpZ2h0bmVzcyBsZXZlbHMKPiA+ICogQmFzaWMgcHJvYmluZyBvZiBiYWNr bGlnaHQgY2FwYWJpbGl0aWVzCj4gPiAqIEhlbHBlcnMgZm9yIGVuYWJsaW5nIGFuZCBkaXNhYmxp bmcgdGhlIGJhY2tsaWdodAo+ID4gCj4gPiB2MzoKPiA+ICogU3BsaXQgb3V0IGNoYW5nZXMgdG8g aTkxNSdzIGJhY2tsaWdodCBjb2RlIHRvIHNlcGFyYXRlIHBhdGNoZXMgdG8gbWFrZSBpdAo+ID4g wqAgZWFzaWVyIHRvIHJldmlldwo+ID4gdjQ6Cj4gPiAqIFN0eWxlL3NwZWxsaW5nIGNoYW5nZXMg ZnJvbSBUaG9tYXMgWmltbWVybWFubgo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBMeXVkZSBQYXVs IDxseXVkZUByZWRoYXQuY29tPgo+ID4gQ2M6IEphbmkgTmlrdWxhIDxqYW5pLm5pa3VsYUBpbnRl bC5jb20+Cj4gPiBDYzogRGF2ZSBBaXJsaWUgPGFpcmxpZWRAZ21haWwuY29tPgo+ID4gQ2M6IGdy ZWcuZGVwb2lyZUBnbWFpbC5jb20KPiA+IC0tLQo+ID4gwqBkcml2ZXJzL2dwdS9kcm0vZHJtX2Rw X2hlbHBlci5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IDMzMiArKysrKysrKysrKysr KysrKysKPiA+IMKgLi4uL2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZGlzcGxheV90eXBlcy5owqDC oMKgIHzCoMKgIDUgKy0KPiA+IMKgLi4uL2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2Jh Y2tsaWdodC5jIHwgMjg1ICsrLS0tLS0tLS0tLS0tLQo+ID4gwqBpbmNsdWRlL2RybS9kcm1fZHBf aGVscGVyLmjCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgIDQ4ICsrKwo+ ID4gwqA0IGZpbGVzIGNoYW5nZWQsIDQxMiBpbnNlcnRpb25zKCspLCAyNTggZGVsZXRpb25zKC0p Cj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jCj4g PiBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaGVscGVyLmMKPiA+IGluZGV4IGVlZGJiNDg4MTVi Ny4uMWEzZDQ2NzlkNzIwIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9o ZWxwZXIuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxwZXIuYwo+ID4gQEAg LTMwODIsMyArMzA4MiwzMzUgQEAgaW50IGRybV9kcF9wY29uX2NvbnZlcnRfcmdiX3RvX3ljYmNy KHN0cnVjdAo+ID4gZHJtX2RwX2F1eCAqYXV4LCB1OCBjb2xvcl9zcGMpCj4gPiDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIDA7Cj4gPiDCoH0KPiA+IMKgRVhQT1JUX1NZTUJPTChkcm1fZHBfcGNvbl9j b252ZXJ0X3JnYl90b195Y2Jjcik7Cj4gPiArCj4gPiArLyoqCj4gPiArICogZHJtX2VkcF9iYWNr bGlnaHRfc2V0X2xldmVsKCkgLSBTZXQgdGhlIGJhY2tsaWdodCBsZXZlbCBvZiBhbiBlRFAgcGFu ZWwKPiA+IHZpYSBBVVgKPiA+ICsgKiBAYXV4OiBUaGUgRFAgQVVYIGNoYW5uZWwgdG8gdXNlCj4g PiArICogQGJsOiBCYWNrbGlnaHQgY2FwYWJpbGl0eSBpbmZvIGZyb20gZHJtX2VkcF9iYWNrbGln aHRfaW5pdCgpCj4gPiArICogQGxldmVsOiBUaGUgYnJpZ2h0bmVzcyBsZXZlbCB0byBzZXQKPiA+ ICsgKgo+ID4gKyAqIFNldHMgdGhlIGJyaWdodG5lc3MgbGV2ZWwgb2YgYW4gZURQIHBhbmVsJ3Mg YmFja2xpZ2h0LiBOb3RlIHRoYXQgdGhlCj4gPiBwYW5lbCdzIGJhY2tsaWdodCBtdXN0Cj4gPiAr ICogYWxyZWFkeSBoYXZlIGJlZW4gZW5hYmxlZCBieSB0aGUgZHJpdmVyIGJ5IGNhbGxpbmcKPiA+ IGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZSgpLgo+ID4gKyAqCj4gPiArICogUmV0dXJuczogJTAg b24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCj4gPiArICovCj4gPiAr aW50IGRybV9lZHBfYmFja2xpZ2h0X3NldF9sZXZlbChzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LCBj b25zdCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gKmJsLAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTE2 IGxldmVsKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiArwqDCoMKgwqDC oMKgwqB1OCBidWZbMl0gPSB7IDAgfTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChibC0+ bHNiX3JlZ191c2VkKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnVmWzBd ID0gKGxldmVsICYgMHhmZjAwKSA+PiA4Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGJ1ZlsxXSA9IChsZXZlbCAmIDB4MDBmZik7Cj4gPiArwqDCoMKgwqDCoMKgwqB9IGVsc2Ug ewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJ1ZlswXSA9IGxldmVsOwo+ID4g K8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2Rw Y2Rfd3JpdGUoYXV4LCBEUF9FRFBfQkFDS0xJR0hUX0JSSUdIVE5FU1NfTVNCLCBidWYsCj4gPiBz aXplb2YoYnVmKSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IHNpemVvZihidWYpKSB7 Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0VSUk9SKCIlczogRmFpbGVk IHRvIHdyaXRlIGF1eCBiYWNrbGlnaHQgbGV2ZWw6ICVkXG4iLAo+ID4gYXV4LT5uYW1lLCByZXQp Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0 IDogLUVJTzsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJl dHVybiAwOwo+ID4gK30KPiA+ICtFWFBPUlRfU1lNQk9MKGRybV9lZHBfYmFja2xpZ2h0X3NldF9s ZXZlbCk7Cj4gPiArCj4gPiArc3RhdGljIGludAo+ID4gK2RybV9lZHBfYmFja2xpZ2h0X3NldF9l bmFibGUoc3RydWN0IGRybV9kcF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2Jh Y2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYm9vbCBlbmFibGUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDC oMKgaW50IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IGJ1ZjsKPiA+ICsKPiA+ICvCoMKgwqDC oMKgwqDCoC8qIFRoZSBwYW5lbCB1c2VzIHNvbWV0aGluZyBvdGhlciB0aGVuIERQQ0QgZm9yIGVu YWJsaW5nIGl0cwo+ID4gYmFja2xpZ2h0ICovCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIWJsLT5h dXhfZW5hYmxlKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9F RFBfRElTUExBWV9DT05UUk9MX1JFR0lTVEVSLCAmYnVmKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlm IChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9FUlJP UigiJXM6IEZhaWxlZCB0byByZWFkIGVEUCBkaXNwbGF5IGNvbnRyb2wgcmVnaXN0ZXI6Cj4gPiAl ZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICvC oMKgwqDCoMKgwqDCoGlmIChlbmFibGUpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgYnVmIHw9IERQX0VEUF9CQUNLTElHSFRfRU5BQkxFOwo+ID4gK8KgwqDCoMKgwqDCoMKgZWxz ZQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJ1ZiAmPSB+RFBfRURQX0JBQ0tM SUdIVF9FTkFCTEU7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93 cml0ZWIoYXV4LCBEUF9FRFBfRElTUExBWV9DT05UUk9MX1JFR0lTVEVSLCBidWYpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKHJldCAhPSAxKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgRFJNX0VSUk9SKCIlczogRmFpbGVkIHRvIHdyaXRlIGVEUCBkaXNwbGF5IGNvbnRyb2wg cmVnaXN0ZXI6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ICvCoMKgwqDC oMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30KPiA+ICsK PiA+ICsvKioKPiA+ICsgKiBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoKSAtIEVuYWJsZSBhbiBl RFAgcGFuZWwncyBiYWNrbGlnaHQgdXNpbmcgRFBDRAo+ID4gKyAqIEBhdXg6IFRoZSBEUCBBVVgg Y2hhbm5lbCB0byB1c2UKPiA+ICsgKiBAYmw6IEJhY2tsaWdodCBjYXBhYmlsaXR5IGluZm8gZnJv bSBkcm1fZWRwX2JhY2tsaWdodF9pbml0KCkKPiA+ICsgKiBAbGV2ZWw6IFRoZSBpbml0aWFsIGJh Y2tsaWdodCBsZXZlbCB0byBzZXQgdmlhIEFVWCwgaWYgdGhlcmUgaXMgb25lCj4gPiArICoKPiA+ ICsgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZW5hYmxpbmcgRFBDRCBiYWNrbGlnaHQgY29udHJv bHMgb24gYSBwYW5lbCBvdmVyCj4gPiBEUENELCB3aGlsZSBhZGRpdGlvbmFsbHkKPiA+ICsgKiBy ZXN0b3JpbmcgYW55IGltcG9ydGFudCBiYWNrbGlnaHQgc3RhdGUgc3VjaCBhcyB0aGUgZ2l2ZW4g YmFja2xpZ2h0Cj4gPiBsZXZlbCwgdGhlIGJyaWdodG5lc3MgYnl0ZQo+ID4gKyAqIGNvdW50LCBi YWNrbGlnaHQgZnJlcXVlbmN5LCBldGMuCj4gPiArICoKPiA+ICsgKiBOb3RlIHRoYXQgY2VydGFp biBwYW5lbHMsIHdoaWxlIHN1cHBvcnRpbmcgYnJpZ2h0bmVzcyBsZXZlbCBjb250cm9scwo+ID4g b3ZlciBEUENELCBtYXkgbm90IHN1cHBvcnQKPiA+ICsgKiBoYXZpbmcgdGhlaXIgYmFja2xpZ2h0 cyBlbmFibGVkIHZpYSB0aGUgc3RhbmRhcmQKPiA+ICVEUF9FRFBfRElTUExBWV9DT05UUk9MX1JF R0lTVEVSLiBPbiBzdWNoIHBhbmVscwo+ID4gKyAqICZkcm1fZWRwX2JhY2tsaWdodF9pbmZvLmF1 eF9lbmFibGUgd2lsbCBiZSBzZXQgdG8gJWZhbHNlLCB0aGlzIGZ1bmN0aW9uCj4gPiB3aWxsIHNr aXAgdGhlIHN0ZXAgb2YKPiA+ICsgKiBwcm9ncmFtbWluZyB0aGUgJURQX0VEUF9ESVNQTEFZX0NP TlRST0xfUkVHSVNURVIsIGFuZCB0aGUgZHJpdmVyIG11c3QKPiA+IHBlcmZvcm0gdGhlIHJlcXVp cmVkCj4gPiArICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgc3RlcCBmb3IgZW5hYmxpbmcgdGhl IGJhY2tsaWdodCBhZnRlciBjYWxsaW5nCj4gPiB0aGlzIGZ1bmN0aW9uLgo+ID4gKyAqCj4gPiAr ICogUmV0dXJuczogJTAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJl Lgo+ID4gKyAqLwo+ID4gK2ludCBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoc3RydWN0IGRybV9k cF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgY29uc3QgdTE2IGxldmVsKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4g PiArwqDCoMKgwqDCoMKgwqB1OCBkcGNkX2J1ZiwgbmV3X2RwY2RfYnVmOwo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9FRFBfQkFDS0xJR0hU X01PREVfU0VUX1JFR0lTVEVSLAo+ID4gJmRwY2RfYnVmKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlm IChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9ERUJV R19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGlnaHQgbW9kZTogJWRcbiIsCj4gPiBhdXgt Pm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJl dCA8IDAgPyByZXQgOiAtRUlPOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgbmV3X2RwY2RfYnVmID0gZHBjZF9idWY7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqBpZiAoKGRwY2RfYnVmICYgRFBfRURQX0JBQ0tMSUdIVF9DT05UUk9MX01PREVfTUFTSykgIT0K PiA+IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0QpIHsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBuZXdfZHBjZF9idWYgJj0gfkRQX0VEUF9CQUNLTElHSFRfQ09O VFJPTF9NT0RFX01BU0s7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbmV3X2Rw Y2RfYnVmIHw9IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0Q7Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1 eCwgRFBfRURQX1BXTUdFTl9CSVRfQ09VTlQsIGJsLQo+ID4gPnB3bWdlbl9iaXRfY291bnQpOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RFQlVHX0tNUygi JXM6IEZhaWxlZCB0byB3cml0ZSBhdXggcHdtZ2VuIGJpdAo+ID4gY291bnQ6ICVkXG4iLAo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoYmwtPnB3bV9mcmVxX3ByZV9kaXZpZGVyKSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGVi KGF1eCwgRFBfRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCwgYmwtCj4gPiA+cHdtX2ZyZXFfcHJlX2Rp dmlkZXIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RF QlVHX0tNUygiJXM6IEZhaWxlZCB0byB3cml0ZSBhdXggYmFja2xpZ2h0Cj4gPiBmcmVxdWVuY3k6 ICVkXG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZXdfZHBjZF9idWYgfD0KPiA+IERQX0VEUF9CQUNLTElH SFRfRlJFUV9BVVhfU0VUX0VOQUJMRTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvC oMKgwqDCoMKgwqDCoGlmIChuZXdfZHBjZF9idWYgIT0gZHBjZF9idWYpIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoYXV4LAo+ID4g RFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwgbmV3X2RwY2RfYnVmKTsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RFQlVHX0tNUygiJXM6 IEZhaWxlZCB0byB3cml0ZSBhdXggYmFja2xpZ2h0Cj4gPiBtb2RlOiAlZFxuIiwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0IDwgMCA/IHJldCA6IC1FSU87Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4g Kwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfc2V0X2xldmVsKGF1 eCwgYmwsIGxldmVsKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgPCAwKQo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqBy ZXQgPSBkcm1fZWRwX2JhY2tsaWdodF9zZXRfZW5hYmxlKGF1eCwgYmwsIHRydWUpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKHJldCA8IDApCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30K PiA+ICtFWFBPUlRfU1lNQk9MKGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZSk7Cj4gPiArCj4gPiAr LyoqCj4gPiArICogZHJtX2VkcF9iYWNrbGlnaHRfZGlzYWJsZSgpIC0gRGlzYWJsZSBhbiBlRFAg YmFja2xpZ2h0IHVzaW5nIERQQ0QsIGlmCj4gPiBzdXBwb3J0ZWQKPiA+ICsgKiBAYXV4OiBUaGUg RFAgQVVYIGNoYW5uZWwgdG8gdXNlCj4gPiArICogQGJsOiBCYWNrbGlnaHQgY2FwYWJpbGl0eSBp bmZvIGZyb20gZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgpCj4gPiArICoKPiA+ICsgKiBUaGlzIGZ1 bmN0aW9uIGhhbmRsZXMgZGlzYWJsaW5nIERQQ0QgYmFja2xpZ2h0IGNvbnRyb2xzIG9uIGEgcGFu ZWwgb3Zlcgo+ID4gQVVYLiBOb3RlIHRoYXQgc29tZQo+ID4gKyAqIHBhbmVscyBoYXZlIGJhY2ts aWdodHMgdGhhdCBhcmUgZW5hYmxlZC9kaXNhYmxlZCBieSBvdGhlciBtZWFucywgZGVzcGl0ZQo+ ID4gaGF2aW5nIHRoZWlyIGJyaWdodG5lc3MKPiA+ICsgKiB2YWx1ZXMgY29udHJvbGxlZCB0aHJv dWdoIERQQ0QuIE9uIHN1Y2ggcGFuZWxzCj4gPiAmZHJtX2VkcF9iYWNrbGlnaHRfaW5mby5hdXhf ZW5hYmxlIHdpbGwgYmUgc2V0IHRvCj4gPiArICogJWZhbHNlLCB0aGlzIGZ1bmN0aW9uIHdpbGwg YmVjb21lIGEgbm8tb3AgKGFuZCB3ZSB3aWxsIHNraXAgdXBkYXRpbmcKPiA+ICsgKiAlRFBfRURQ X0RJU1BMQVlfQ09OVFJPTF9SRUdJU1RFUiksIGFuZCB0aGUgZHJpdmVyIG11c3QgdGFrZSBjYXJl IHRvCj4gPiBwZXJmb3JtIGl0J3Mgb3duCj4gPiArICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMg c3RlcCBmb3IgZGlzYWJsaW5nIHRoZSBiYWNrbGlnaHQuCj4gPiArICoKPiA+ICsgKiBSZXR1cm5z OiAlMCBvbiBzdWNjZXNzIG9yIG5vLW9wLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUu Cj4gPiArICovCj4gPiAraW50IGRybV9lZHBfYmFja2xpZ2h0X2Rpc2FibGUoc3RydWN0IGRybV9k cF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCkK PiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDC oMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfc2V0X2VuYWJsZShhdXgsIGJsLCBmYWxzZSk7Cj4g PiArwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4g PiArfQo+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2VkcF9iYWNrbGlnaHRfZGlzYWJsZSk7Cj4gPiAr Cj4gPiArc3RhdGljIGlubGluZSBpbnQKPiA+ICtkcm1fZWRwX2JhY2tsaWdodF9wcm9iZV9tYXgo c3RydWN0IGRybV9kcF9hdXggKmF1eCwgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZv ICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHUxNiBkcml2ZXJfcHdtX2ZyZXFfaHosIGNvbnN0IHU4Cj4gPiBlZHBfZHBjZFtFRFBf RElTUExBWV9DVExfQ0FQX1NJWkVdKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCBmeHAs IGZ4cF9taW4sIGZ4cF9tYXgsIGZ4cF9hY3R1YWwsIGYgPSAxOwo+ID4gK8KgwqDCoMKgwqDCoMKg aW50IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IHBuLCBwbl9taW4sIHBuX21heDsKPiA+ICsK PiA+ICvCoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKGF1eCwgRFBfRURQX1BX TUdFTl9CSVRfQ09VTlQsICZwbik7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdfS01TKCIlczogRmFp bGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXA6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCBy ZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PREVWOwo+ ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcG4gJj0gRFBfRURQ X1BXTUdFTl9CSVRfQ09VTlRfTUFTSzsKPiA+ICvCoMKgwqDCoMKgwqDCoGJsLT5tYXggPSAoMSA8 PCBwbikgLSAxOwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCFkcml2ZXJfcHdtX2ZyZXFfaHopCj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiArCj4gPiArwqDC oMKgwqDCoMKgwqAvKgo+ID4gK8KgwqDCoMKgwqDCoMKgICogU2V0IFBXTSBGcmVxdWVuY3kgZGl2 aWRlciB0byBtYXRjaCBkZXNpcmVkIGZyZXF1ZW5jeSBwcm92aWRlZCBieQo+ID4gdGhlIGRyaXZl ci4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFRoZSBQV00gRnJlcXVlbmN5IGlzIGNhbGN1bGF0ZWQg YXMgMjdNaHogLyAoRiB4IFApLgo+ID4gK8KgwqDCoMKgwqDCoMKgICogLSBXaGVyZSBGID0gUFdN IEZyZXF1ZW5jeSBQcmUtRGl2aWRlciB2YWx1ZSBwcm9ncmFtbWVkIGJ5IGZpZWxkCj4gPiA3OjAg b2YgdGhlCj4gPiArwqDCoMKgwqDCoMKgwqAgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBFRFBf QkFDS0xJR0hUX0ZSRVFfU0VUIHJlZ2lzdGVyIChEUENEIEFkZHJlc3MgMDA3MjhoKQo+ID4gK8Kg wqDCoMKgwqDCoMKgICogLSBXaGVyZSBQID0gMl5Qbiwgd2hlcmUgUG4gaXMgdGhlIHZhbHVlIHBy b2dyYW1tZWQgYnkgZmllbGQgNDowCj4gPiBvZiB0aGUKPiA+ICvCoMKgwqDCoMKgwqDCoCAqwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVEUF9QV01HRU5fQklUX0NPVU5UIHJlZ2lzdGVyIChEUENE IEFkZHJlc3MgMDA3MjRoKQo+ID4gK8KgwqDCoMKgwqDCoMKgICovCj4gPiArCj4gPiArwqDCoMKg wqDCoMKgwqAvKiBGaW5kIGRlc2lyZWQgdmFsdWUgb2YgKEYgeCBQKQo+ID4gK8KgwqDCoMKgwqDC oMKgICogTm90ZSB0aGF0LCBpZiBGIHggUCBpcyBvdXQgb2Ygc3VwcG9ydGVkIHJhbmdlLCB0aGUg bWF4aW11bSB2YWx1ZQo+ID4gb3IgbWluaW11bSB2YWx1ZSB3aWxsCj4gPiArwqDCoMKgwqDCoMKg wqAgKiBhcHBsaWVkIGF1dG9tYXRpY2FsbHkuIFNvIG5vIG5lZWQgdG8gY2hlY2sgdGhhdC4KPiA+ ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgZnhwID0gRElWX1JPVU5EX0NM T1NFU1QoMTAwMCAqIERQX0VEUF9CQUNLTElHSFRfRlJFUV9CQVNFX0tIWiwKPiA+IGRyaXZlcl9w d21fZnJlcV9oeik7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKiBVc2UgaGlnaGVzdCBwb3Nz aWJsZSB2YWx1ZSBvZiBQbiBmb3IgbW9yZSBncmFudWxhcml0eSBvZgo+ID4gYnJpZ2h0bmVzcyBh ZGp1c3RtZW50IHdoaWxlCj4gPiArwqDCoMKgwqDCoMKgwqAgKiBzYXRpZnlpbmcgdGhlIGNvbmRp dGlvbnMgYmVsb3cuCj4gPiArwqDCoMKgwqDCoMKgwqAgKiAtIFBuIGlzIGluIHRoZSByYW5nZSBv ZiBQbl9taW4gYW5kIFBuX21heAo+ID4gK8KgwqDCoMKgwqDCoMKgICogLSBGIGlzIGluIHRoZSBy YW5nZSBvZiAxIGFuZCAyNTUKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIC0gRnhQIGlzIHdpdGhpbiAy NSUgb2YgZGVzaXJlZCB2YWx1ZS4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqwqDCoCBOb3RlOiAyNSUg aXMgYXJiaXRyYXJ5IHZhbHVlIGFuZCBtYXkgbmVlZCBzb21lIHR3ZWFrLgo+ID4gK8KgwqDCoMKg wqDCoMKgICovCj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF9yZWFkYihhdXgs IERQX0VEUF9QV01HRU5fQklUX0NPVU5UX0NBUF9NSU4sCj4gPiAmcG5fbWluKTsKPiA+ICvCoMKg wqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBwd21nZW4gYml0IGNvdW50IGNh cCBtaW46Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKg wqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9FRFBfUFdNR0VOX0JJVF9DT1VO VF9DQVBfTUFYLAo+ID4gJnBuX21heCk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEp IHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdfS01TKCIlczog RmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXAgbWF4Ogo+ID4gJWRcbiIsIGF1eC0+ bmFtZSwgcmV0KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsK PiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKgwqDCoMKgwqDCoHBuX21pbiAmPSBEUF9FRFBf UFdNR0VOX0JJVF9DT1VOVF9NQVNLOwo+ID4gK8KgwqDCoMKgwqDCoMKgcG5fbWF4ICY9IERQX0VE UF9QV01HRU5fQklUX0NPVU5UX01BU0s7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKiBFbnN1 cmUgZnJlcXVlbmN5IGlzIHdpdGhpbiAyNSUgb2YgZGVzaXJlZCB2YWx1ZSAqLwo+ID4gK8KgwqDC oMKgwqDCoMKgZnhwX21pbiA9IERJVl9ST1VORF9DTE9TRVNUKGZ4cCAqIDMsIDQpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgZnhwX21heCA9IERJVl9ST1VORF9DTE9TRVNUKGZ4cCAqIDUsIDQpOwo+ID4g K8KgwqDCoMKgwqDCoMKgaWYgKGZ4cF9taW4gPCAoMSA8PCBwbl9taW4pIHx8ICgyNTUgPDwgcG5f bWF4KSA8IGZ4cF9tYXgpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1f REVCVUdfS01TKCIlczogRHJpdmVyIGRlZmluZWQgYmFja2xpZ2h0IGZyZXF1ZW5jeSAoJWQpCj4g PiBvdXQgb2YgcmFuZ2VcbiIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYXV4LT5uYW1lLCBkcml2ZXJfcHdtX2ZyZXFfaHopOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKg wqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgZm9yIChwbiA9IHBuX21heDsgcG4gPj0g cG5fbWluOyBwbi0tKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZiA9IGNs YW1wKERJVl9ST1VORF9DTE9TRVNUKGZ4cCwgMSA8PCBwbiksIDEsIDI1NSk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZnhwX2FjdHVhbCA9IGYgPDwgcG47Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGZ4cF9taW4gPD0gZnhwX2FjdHVhbCAmJiBmeHBf YWN0dWFsIDw9IGZ4cF9tYXgpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1eCwgRFBfRURQX1BXTUdFTl9CSVRf Q09VTlQsIHBuKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gd3Jp dGUgYXV4IHB3bWdlbiBiaXQgY291bnQ6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKgwqDC oMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgYmwtPnB3bWdlbl9iaXRfY291bnQgPSBwbjsKPiA+ICvC oMKgwqDCoMKgwqDCoGJsLT5tYXggPSAoMSA8PCBwbikgLSAxOwo+ID4gKwo+ID4gK8KgwqDCoMKg wqDCoMKgaWYgKGVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tMSUdIVF9GUkVRX0FVWF9TRVRfQ0FQ KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYmwtPnB3bV9mcmVxX3ByZV9k aXZpZGVyID0gZjsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdf S01TKCIlczogVXNpbmcgYmFja2xpZ2h0IGZyZXF1ZW5jeSBmcm9tIGRyaXZlcgo+ID4gKCVkSHop XG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGF1eC0+bmFtZSwgZHJpdmVyX3B3bV9mcmVxX2h6KTsKPiA+ICvCoMKgwqDCoMKg wqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiAK PiB0aGFua3MgZm9yIHRoZSBjbGVhbiB1cC4uLgo+IHVwIHRvIHRoaXMgcG9pbnQgaXQgd2FzIGVh c3kgdG8gc2VlIHRoZSBjb2RlIGFkZGVkIGFuZCBjb2RlIHJlbW92ZSBtYXRjaGVzLi4uCj4gCj4g PiArc3RhdGljIGlubGluZSBpbnQKPiA+ICtkcm1fZWRwX2JhY2tsaWdodF9wcm9iZV9sZXZlbChz dHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8g KmJsLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHU4ICpjdXJyZW50X21vZGUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgaW50 IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IGJ1ZlsyXTsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4 IG1vZGVfcmVnOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVh ZGIoYXV4LCBEUF9FRFBfQkFDS0xJR0hUX01PREVfU0VUX1JFR0lTVEVSLAo+ID4gJm1vZGVfcmVn KTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGln aHQgbW9kZTogJWRcbiIsCj4gPiBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUlPOwo+ID4gK8KgwqDCoMKg wqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgKmN1cnJlbnRfbW9kZSA9IChtb2RlX3Jl ZyAmIERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX01BU0spOwo+ID4gK8KgwqDCoMKgwqDC oMKgaWYgKCpjdXJyZW50X21vZGUgPT0gRFBfRURQX0JBQ0tMSUdIVF9DT05UUk9MX01PREVfRFBD RCkgewo+IAo+IEhvd2V2ZXIgSSdtIGFmcmFpZCB0aGF0IG9uIHRoaXMgYXJlYSBoZXJlIHdlIGhh dmUgc29tZXRoaW5nIHRoYXQgY291bGQgYmUKPiBpbXByb3ZlZCBmdXJ0aGVyLi4uCj4gCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50IHNpemUgPSAxICsgYmwtPmxzYl9yZWdf dXNlZDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1f ZHBfZHBjZF9yZWFkKGF1eCwgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX01TQiwKPiA+IGJ1 Ziwgc2l6ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSBz aXplKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGlnaHQgbGV2ZWw6Cj4gPiAl ZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+IAo+IEJ1dCBwcm9iYWJseSB0aGUgYmlnZ2VzdCBibG9j a2VyIGlzIHRoZSAicmVncmVzc2lvbiIgb2YgdGhlIGRlYnVnIGxvZ3MuCj4gTm90IGp1c3QgaW4g dGhpcyBwb2ludCwgYnV0IEkgbWVhbiBldmVyeXdoZXJlLi4uCj4gdGhlIHVzZSBvZiB0aGUgb2xk IERSTV9ERUJVR19LTVMgc2hvdWxkIGJlIGF2b2lkZWQgaGVyZSBpbWhvLgo+IEFsdGhvdWdoIGl0 IGlzIGJhY2tsaWdodCwgd2hhdCBpdCB3b3VsZCBtZWFuIGludGVncmF0ZWQgYW5kIG9ubHkKPiBv bmUgZGV2aWNlIGF2YWlsYWJsZSwgdGhpcyB3aWxsIGF0IGxlYXN0IGNoYW5nZSBob3cgd2Ugc2Vl IHRoZSBsb2dzLi4KPiAKPiBBbnkgY2hhbmdlIG9mIHVzaW5nIGRybV9kYmdfKihkcm0sID8hCgpJ dCdsbCB0YWtlIGEgdHJlZS13aWRlIHBhdGNoIHNlcmllcywgYnV0IEknbGwgZ28gYWhlYWQgYW5k IGRvIHRoYXQKdG9kYXkvdG9tb3Jyb3cgOikKCj4gCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgaWYgKGJsLT5sc2JfcmVnX3VzZWQpCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAoYnVmWzBdIDw8IDgpIHwg YnVmWzFdOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIGJ1ZlswXTsK PiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoC8qCj4gPiArwqDC oMKgwqDCoMKgwqAgKiBJZiB3ZSdyZSBub3QgaW4gRFBDRCBjb250cm9sIG1vZGUgeWV0LCB0aGUg cHJvZ3JhbW1lZCBicmlnaHRuZXNzCj4gPiB2YWx1ZSBpcyBtZWFuaW5nbGVzcyBhbmQKPiA+ICvC oMKgwqDCoMKgwqDCoCAqIHRoZSBkcml2ZXIgc2hvdWxkIGFzc3VtZSBtYXggYnJpZ2h0bmVzcwo+ ID4gK8KgwqDCoMKgwqDCoMKgICovCj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gYmwtPm1heDsK PiA+ICt9Cj4gPiArCj4gPiArLyoqCj4gPiArICogZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgpIC0g UHJvYmUgYSBkaXNwbGF5IHBhbmVsJ3MgVENPTiB1c2luZyB0aGUKPiA+IHN0YW5kYXJkIFZFU0Eg ZURQIGJhY2tsaWdodAo+ID4gKyAqIGludGVyZmFjZS4KPiA+ICsgKiBAYXV4OiBUaGUgRFAgYXV4 IGRldmljZSB0byB1c2UgZm9yIHByb2JpbmcKPiA+ICsgKiBAYmw6IFRoZSAmZHJtX2VkcF9iYWNr bGlnaHRfaW5mbyBzdHJ1Y3QgdG8gZmlsbCBvdXQgd2l0aCBpbmZvcm1hdGlvbiBvbgo+ID4gdGhl IGJhY2tsaWdodAo+ID4gKyAqIEBkcml2ZXJfcHdtX2ZyZXFfaHo6IE9wdGlvbmFsIFBXTSBmcmVx dWVuY3kgZnJvbSB0aGUgZHJpdmVyIGluIGh6Cj4gPiArICogQGVkcF9kcGNkOiBBIGNhY2hlZCBj b3B5IG9mIHRoZSBlRFAgRFBDRAo+ID4gKyAqIEBjdXJyZW50X2xldmVsOiBXaGVyZSB0byBzdG9y ZSB0aGUgcHJvYmVkIGJyaWdodG5lc3MgbGV2ZWwKPiA+ICsgKiBAY3VycmVudF9tb2RlOiBXaGVy ZSB0byBzdG9yZSB0aGUgY3VycmVudGx5IHNldCBiYWNrbGlnaHQgY29udHJvbCBtb2RlCj4gPiAr ICoKPiA+ICsgKiBJbml0aWFsaXplcyBhICZkcm1fZWRwX2JhY2tsaWdodF9pbmZvIHN0cnVjdCBi eSBwcm9iaW5nIEBhdXggZm9yIGl0J3MKPiA+IGJhY2tsaWdodCBjYXBhYmlsaXRpZXMsCj4gPiAr ICogYWxvbmcgd2l0aCBhbHNvIHByb2JpbmcgdGhlIGN1cnJlbnQgYW5kIG1heGltdW0gc3VwcG9y dGVkIGJyaWdodG5lc3MKPiA+IGxldmVscy4KPiA+ICsgKgo+ID4gKyAqIElmIEBkcml2ZXJfcHdt X2ZyZXFfaHogaXMgbm9uLXplcm8sIHRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSBiYWNrbGlnaHQK PiA+IGZyZXF1ZW5jeS4gT3RoZXJ3aXNlLCB0aGUKPiA+ICsgKiBkZWZhdWx0IGZyZXF1ZW5jeSBm cm9tIHRoZSBwYW5lbCBpcyB1c2VkLgo+ID4gKyAqCj4gPiArICogUmV0dXJuczogJTAgb24gc3Vj Y2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+ID4gKyAqLwo+ID4gK2ludAo+ ID4gK2RybV9lZHBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kcF9hdXggKmF1eCwgc3RydWN0 Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTE2IGRyaXZlcl9wd21fZnJlcV9oeiwgY29uc3QgdTgK PiA+IGVkcF9kcGNkW0VEUF9ESVNQTEFZX0NUTF9DQVBfU0laRV0sCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUxNiAqY3VycmVudF9sZXZlbCwgdTggKmN1 cnJlbnRfbW9kZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gKwo+ID4g K8KgwqDCoMKgwqDCoMKgaWYgKGVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9BVVhfRU5B QkxFX0NBUCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBibC0+YXV4X2VuYWJs ZSA9IHRydWU7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoZWRwX2RwY2RbMl0gJiBEUF9FRFBfQkFD S0xJR0hUX0JSSUdIVE5FU1NfQllURV9DT1VOVCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBibC0+bHNiX3JlZ191c2VkID0gdHJ1ZTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDC oHJldCA9IGRybV9lZHBfYmFja2xpZ2h0X3Byb2JlX21heChhdXgsIGJsLCBkcml2ZXJfcHdtX2Zy ZXFfaHosCj4gPiBlZHBfZHBjZCk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfcHJvYmVfbGV2ZWwoYXV4LCBibCwg Y3VycmVudF9tb2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgPCAwKQo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqAq Y3VycmVudF9sZXZlbCA9IHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19L TVMoIiVzOiBGb3VuZCBiYWNrbGlnaHQgbGV2ZWw9JWQvJWQKPiA+IHB3bV9mcmVxX3ByZV9kaXZp ZGVyPSVkIG1vZGU9JXhcbiIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBhdXgtPm5hbWUsICpjdXJyZW50X2xldmVsLCBibC0+bWF4LCBibC0KPiA+ID5wd21f ZnJlcV9wcmVfZGl2aWRlciwgKmN1cnJlbnRfbW9kZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBEUk1f REVCVUdfS01TKCIlczogQmFja2xpZ2h0IGNhcHM6IHB3bWdlbl9iaXRfY291bnQ9JWQKPiA+IGxz Yl9yZWdfdXNlZD0lZCBhdXhfZW5hYmxlPSVkXG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYXV4LT5uYW1lLCBibC0+cHdtZ2VuX2JpdF9jb3VudCwgYmwt PmxzYl9yZWdfdXNlZCwgYmwtCj4gPiA+YXV4X2VuYWJsZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBy ZXR1cm4gMDsKPiA+ICt9Cj4gPiArRVhQT1JUX1NZTUJPTChkcm1fZWRwX2JhY2tsaWdodF9pbml0 KTsKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rp c3BsYXlfdHlwZXMuaAo+ID4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rp c3BsYXlfdHlwZXMuaAo+ID4gaW5kZXggMWQ4OTg0MDc3ZThhLi45ZjQzZDBiMTRlMTEgMTAwNjQ0 Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rpc3BsYXlfdHlw ZXMuaAo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kaXNwbGF5 X3R5cGVzLmgKPiA+IEBAIC0yNjQsMTAgKzI2NCw3IEBAIHN0cnVjdCBpbnRlbF9wYW5lbCB7Cj4g PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIERQQ0QgYmFja2xpZ2h0ICovCj4g PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVuaW9uIHsKPiA+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB7Cj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1 OCBwd21nZW5fYml0X2NvdW50Owo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTggcHdtX2ZyZXFfcHJlX2RpdmlkZXI7Cj4g PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBib29sIGxzYl9yZWdfdXNlZDsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJvb2wgYXV4X2VuYWJsZTsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHN0cnVjdCBkcm1fZWRwX2JhY2tsaWdodF9pbmZvIGluZm87Cj4gPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9IHZlc2E7Cj4gPiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qgewo+ID4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGJvb2wgc2RyX3VzZXNfYXV4Owo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiBpbmRleCBhOThkOWJk NGIwZWQuLjI4NmViMzM3NDQ4ZSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQuYwo+ID4gQEAgLTI3MCwxMTQg KzI3MCwxOSBAQCBpbnRlbF9kcF9hdXhfaGRyX3NldHVwX2JhY2tsaWdodChzdHJ1Y3QKPiA+IGlu dGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBlbnVtIHBpcGUgcGkKPiA+IMKgfQo+ID4gwqAKPiA+ IMKgLyogVkVTQSBiYWNrbGlnaHQgY2FsbGJhY2tzICovCj4gPiAtc3RhdGljIGJvb2wgaW50ZWxf ZHBfYXV4X3Zlc2FfYmFja2xpZ2h0X2RwY2RfbW9kZShzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yCj4g PiAqY29ubmVjdG9yKQo+ID4gLXsKPiA+IC3CoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9kcCAq aW50ZWxfZHAgPSBpbnRlbF9hdHRhY2hlZF9kcChjb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKgwqDC oMKgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBkcF90b19pOTE1KGludGVsX2RwKTsK PiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDCoMKgwqDCoMKgwqB1OCBtb2RlX3Jl ZzsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKCZpbnRl bF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwgJm1vZGVf cmVnKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQgdG8gcmVh ZCBiYWNrbGlnaHQgbW9kZToKPiA+ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiBmYWxzZTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+ IC3CoMKgwqDCoMKgwqDCoHJldHVybiAobW9kZV9yZWcgJiBEUF9FRFBfQkFDS0xJR0hUX0NPTlRS T0xfTU9ERV9NQVNLKSA9PQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIERQX0VEUF9C QUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0Q7Cj4gPiAtfQo+ID4gLQo+ID4gLS8qCj4gPiAtICog UmVhZCB0aGUgY3VycmVudCBiYWNrbGlnaHQgdmFsdWUgZnJvbSBEUENEIHJlZ2lzdGVyKHMpIGJh c2VkCj4gPiAtICogb24gaWYgOC1iaXQoTVNCKSBvciAxNi1iaXQoTVNCIGFuZCBMU0IpIHZhbHVl cyBhcmUgc3VwcG9ydGVkCj4gPiAtICovCj4gPiDCoHN0YXRpYyB1MzIgaW50ZWxfZHBfYXV4X3Zl c2FfZ2V0X2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yCj4gPiAqY29ubmVjdG9yLCBl bnVtIHBpcGUgdW51c2VkKQo+ID4gwqB7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxf ZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+IC3CoMKgwqDC oMKgwqDCoHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZHBfdG9faTkxNShpbnRlbF9k cCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gLcKgwqDCoMKgwqDCoMKgdTggcmVh ZF92YWxbMl0gPSB7IDB4MCB9Owo+ID4gLcKgwqDCoMKgwqDCoMKgdTE2IGxldmVsID0gMDsKPiA+ IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qCj4gPiAtwqDCoMKgwqDCoMKgwqAgKiBJZiB3ZSdyZSBu b3QgaW4gRFBDRCBjb250cm9sIG1vZGUgeWV0LCB0aGUgcHJvZ3JhbW1lZCBicmlnaHRuZXNzCj4g PiAtwqDCoMKgwqDCoMKgwqAgKiB2YWx1ZSBpcyBtZWFuaW5nbGVzcyBhbmQgd2Ugc2hvdWxkIGFz c3VtZSBtYXggYnJpZ2h0bmVzcwo+ID4gLcKgwqDCoMKgwqDCoMKgICovCj4gPiAtwqDCoMKgwqDC oMKgwqBpZiAoIWludGVsX2RwX2F1eF92ZXNhX2JhY2tsaWdodF9kcGNkX21vZGUoY29ubmVjdG9y KSkKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gY29ubmVjdG9yLT5w YW5lbC5iYWNrbGlnaHQubWF4Owo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2Rw X2RwY2RfcmVhZCgmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVT U19NU0IsICZyZWFkX3ZhbCwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZihyZWFkX3ZhbCkpOwo+ID4gLcKgwqDCoMKg wqDCoMKgaWYgKHJldCAhPSBzaXplb2YocmVhZF92YWwpKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRybSwgIkZhaWxlZCB0byByZWFkIGJy aWdodG5lc3MgbGV2ZWw6Cj4gPiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKg wqDCoMKgwqDCoGlmIChjb25uZWN0b3ItPnBhbmVsLmJhY2tsaWdodC5lZHAudmVzYS5sc2JfcmVn X3VzZWQpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGV2ZWwgPSAocmVhZF92 YWxbMF0gPDwgOCB8IHJlYWRfdmFsWzFdKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGVsc2UKPiA+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsZXZlbCA9IHJlYWRfdmFsWzBdOwo+ID4gLQo+ ID4gLcKgwqDCoMKgwqDCoMKgcmV0dXJuIGxldmVsOwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJu IGNvbm5lY3Rvci0+cGFuZWwuYmFja2xpZ2h0LmxldmVsOwo+ID4gwqB9Cj4gPiDCoAo+ID4gLS8q Cj4gPiAtICogU2VuZHMgdGhlIGN1cnJlbnQgYmFja2xpZ2h0IGxldmVsIG92ZXIgdGhlIGF1eCBj aGFubmVsLCBjaGVja2luZyBpZiBpdHMKPiA+IHVzaW5nCj4gPiAtICogOC1iaXQgb3IgMTYgYml0 IHZhbHVlIChNU0IgYW5kIExTQikKPiA+IC0gKi8KPiA+IMKgc3RhdGljIHZvaWQKPiA+IC1pbnRl bF9kcF9hdXhfdmVzYV9zZXRfYmFja2xpZ2h0KGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0 YXRlCj4gPiAqY29ubl9zdGF0ZSwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUzMiBsZXZlbCkKPiA+ICtpbnRlbF9kcF9h dXhfdmVzYV9zZXRfYmFja2xpZ2h0KGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlCj4g PiAqY29ubl9zdGF0ZSwgdTMyIGxldmVsKQo+ID4gwqB7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgc3Ry dWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gdG9faW50ZWxfY29ubmVjdG9yKGNvbm5f c3RhdGUtCj4gPiA+Y29ubmVjdG9yKTsKPiA+IC3CoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9k cCAqaW50ZWxfZHAgPSBpbnRlbF9hdHRhY2hlZF9kcChjb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKg wqDCoMKgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBkcF90b19pOTE1KGludGVsX2Rw KTsKPiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDCoMKgwqDCoMKgwqB1OCB2YWxz WzJdID0geyAweDAgfTsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qIFdyaXRlIHRoZSBNU0Ig YW5kL29yIExTQiAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKGNvbm5lY3Rvci0+cGFuZWwuYmFj a2xpZ2h0LmVkcC52ZXNhLmxzYl9yZWdfdXNlZCkgewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHZhbHNbMF0gPSAobGV2ZWwgJiAweEZGMDApID4+IDg7Cj4gPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFsc1sxXSA9IChsZXZlbCAmIDB4RkYpOwo+ID4gLcKgwqDC oMKgwqDCoMKgfSBlbHNlIHsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YWxz WzBdID0gbGV2ZWw7Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtCj4gPiAtwqDCoMKgwqDCoMKg wqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZSgmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9CQUNL TElHSFRfQlJJR0hUTkVTU19NU0IsIHZhbHMsCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzaXplb2YodmFscykpOwo+ID4g LcKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSBzaXplb2YodmFscykpIHsKPiA+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiRmFpbGVkIHRvIHdy aXRlIGF1eCBiYWNrbGlnaHQKPiA+IGxldmVsOiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtfQo+ ID4gLQo+ID4gLXN0YXRpYyB2b2lkIHNldF92ZXNhX2JhY2tsaWdodF9lbmFibGUoc3RydWN0IGlu dGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gYm9vbCBlbmFibGUpCj4gPiAtewo+ID4gLcKg wqDCoMKgwqDCoMKgc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGludGVsX2F0dGFjaGVkX2Rw KGNvbm5lY3Rvcik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gLcKgwqDCoMKgwqDCoMKgaW50IHJldDsK PiA+IC3CoMKgwqDCoMKgwqDCoHU4IHJlZ192YWwgPSAwOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDC oMKgLyogRWFybHkgcmV0dXJuIHdoZW4gZGlzcGxheSB1c2Ugb3RoZXIgbWVjaGFuaXNtIHRvIGVu YWJsZQo+ID4gYmFja2xpZ2h0LiAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKCFjb25uZWN0b3It PnBhbmVsLmJhY2tsaWdodC5lZHAudmVzYS5hdXhfZW5hYmxlKQo+ID4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRy bV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0RJU1BMQVlfQ09OVFJP TF9SRUdJU1RFUiwgJnJlZ192YWwpOwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSAxKSB7 Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRy bSwgIkZhaWxlZCB0byByZWFkIGVEUCBkaXNwbGF5IGNvbnRyb2wKPiA+IHJlZ2lzdGVyOiAlZFxu IiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gPiAt wqDCoMKgwqDCoMKgwqB9Cj4gPiAtCj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoZW5hYmxlKQo+ID4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlZ192YWwgfD0gRFBfRURQX0JBQ0tMSUdI VF9FTkFCTEU7Cj4gPiAtwqDCoMKgwqDCoMKgwqBlbHNlCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmVnX3ZhbCAmPSB+KERQX0VEUF9CQUNLTElHSFRfRU5BQkxFKTsKPiA+ICvC oMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmY29ubmVjdG9yLT5wYW5l bDsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9f aW50ZWxfZHAoY29ubmVjdG9yLT5lbmNvZGVyKTsKPiA+IMKgCj4gPiAtwqDCoMKgwqDCoMKgwqBy ZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJmludGVsX2RwLT5hdXgsCj4gPiBEUF9FRFBfRElTUExB WV9DT05UUk9MX1JFR0lTVEVSLCByZWdfdmFsKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQg IT0gMSkgewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZp OTE1LT5kcm0sICJGYWlsZWQgdG8gJXMgYXV4IGJhY2tsaWdodDogJWRcbiIsCj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbmFibGUgPyAi ZW5hYmxlIiA6ICJkaXNhYmxlIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKg wqDCoMKgwqDCoGRybV9lZHBfYmFja2xpZ2h0X3NldF9sZXZlbCgmaW50ZWxfZHAtPmF1eCwgJnBh bmVsLQo+ID4gPmJhY2tsaWdodC5lZHAudmVzYS5pbmZvLCBsZXZlbCk7Cj4gPiDCoH0KPiA+IMKg Cj4gPiDCoHN0YXRpYyB2b2lkCj4gPiBAQCAtMzg1LDE3MCArMjkwLDQ2IEBAIGludGVsX2RwX2F1 eF92ZXNhX2VuYWJsZV9iYWNrbGlnaHQoY29uc3Qgc3RydWN0Cj4gPiBpbnRlbF9jcnRjX3N0YXRl ICpjcnRjX3N0YXRlLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3Jf c3RhdGUKPiA+ICpjb25uX3N0YXRlLCB1MzIgbGV2ZWwpCj4gPiDCoHsKPiA+IMKgwqDCoMKgwqDC oMKgwqBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IgPSB0b19pbnRlbF9jb25uZWN0 b3IoY29ubl9zdGF0ZS0KPiA+ID5jb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKgwqDCoMKgc3RydWN0 IGludGVsX2RwICppbnRlbF9kcCA9IGludGVsX2F0dGFjaGVkX2RwKGNvbm5lY3Rvcik7Cj4gPiAt wqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGRwX3RvX2k5MTUo aW50ZWxfZHApOwo+ID4gwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwg PSAmY29ubmVjdG9yLT5wYW5lbDsKPiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDC oMKgwqDCoMKgwqB1OCBkcGNkX2J1ZiwgbmV3X2RwY2RfYnVmOwo+ID4gLcKgwqDCoMKgwqDCoMKg dTggcHdtZ2VuX2JpdF9jb3VudCA9IHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EucHdtZ2VuX2Jp dF9jb3VudDsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRi KCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwg JmRwY2RfYnVmKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQg dG8gcmVhZCBiYWNrbGlnaHQgbW9kZToKPiA+ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+ IC3CoMKgwqDCoMKgwqDCoG5ld19kcGNkX2J1ZiA9IGRwY2RfYnVmOwo+ID4gLQo+ID4gLcKgwqDC oMKgwqDCoMKgaWYgKChkcGNkX2J1ZiAmIERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX01B U0spICE9Cj4gPiBEUF9FRFBfQkFDS0xJR0hUX0NPTlRST0xfTU9ERV9EUENEKSB7Cj4gPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbmV3X2RwY2RfYnVmICY9IH5EUF9FRFBfQkFDS0xJ R0hUX0NPTlRST0xfTU9ERV9NQVNLOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oG5ld19kcGNkX2J1ZiB8PSBEUF9FRFBfQkFDS0xJR0hUX0NPTlRST0xfTU9ERV9EUENEOwo+ID4g LQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3dy aXRlYigmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9QV01HRU5fQklUX0NPVU5ULCBwd21nZW5f Yml0X2NvdW50KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9 IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRy bV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQgdG8gd3JpdGUgYXV4IHB3bWdlbgo+ID4gYml0 IGNvdW50OiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKg wqDCoMKgwqDCoGlmIChwYW5lbC0+YmFja2xpZ2h0LmVkcC52ZXNhLnB3bV9mcmVxX3ByZV9kaXZp ZGVyKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2Rw Y2Rfd3JpdGViKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCwK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGFuZWwtCj4gPiA+YmFja2xpZ2h0LmVkcC52ZXNh LnB3bV9mcmVxX3ByZV9kaXZpZGVyKTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBpZiAocmV0ID09IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoG5ld19kcGNkX2J1ZiB8PQo+ID4gRFBfRURQX0JBQ0tMSUdIVF9GUkVRX0FVWF9T RVRfRU5BQkxFOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiA+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMo Jmk5MTUtPmRybSwgIkZhaWxlZCB0byB3cml0ZSBhdXgKPiA+IGJhY2tsaWdodCBmcmVxdWVuY3k6 ICVkXG4iLAo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAt Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAobmV3X2RwY2RfYnVmICE9IGRwY2RfYnVmKSB7Cj4gPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKCZp bnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwKPiA+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbmV3X2RwY2RfYnVmKTsKPiA+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQg dG8gd3JpdGUgYXV4Cj4gPiBiYWNrbGlnaHQgbW9kZTogJWRcbiIsIHJldCk7Cj4gPiAtwqDCoMKg wqDCoMKgwqB9Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0g ZW5jX3RvX2ludGVsX2RwKGNvbm5lY3Rvci0+ZW5jb2Rlcik7Cj4gPiDCoAo+ID4gLcKgwqDCoMKg wqDCoMKgaW50ZWxfZHBfYXV4X3Zlc2Ffc2V0X2JhY2tsaWdodChjb25uX3N0YXRlLCBsZXZlbCk7 Cj4gPiAtwqDCoMKgwqDCoMKgwqBzZXRfdmVzYV9iYWNrbGlnaHRfZW5hYmxlKGNvbm5lY3Rvciwg dHJ1ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoJmludGVs X2RwLT5hdXgsICZwYW5lbC0KPiA+ID5iYWNrbGlnaHQuZWRwLnZlc2EuaW5mbywgbGV2ZWwpOwo+ ID4gwqB9Cj4gPiDCoAo+ID4gwqBzdGF0aWMgdm9pZCBpbnRlbF9kcF9hdXhfdmVzYV9kaXNhYmxl X2JhY2tsaWdodChjb25zdCBzdHJ1Y3QKPiA+IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9jb25u X3N0YXRlLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTMyIGxl dmVsKQo+ID4gwqB7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzZXRfdmVzYV9iYWNrbGlnaHRfZW5hYmxl KHRvX2ludGVsX2Nvbm5lY3RvcihvbGRfY29ubl9zdGF0ZS0KPiA+ID5jb25uZWN0b3IpLCBmYWxz ZSk7Cj4gPiAtfQo+ID4gLQo+ID4gLS8qCj4gPiAtICogQ29tcHV0ZSBQV00gZnJlcXVlbmN5IGRp dmlkZXIgdmFsdWUgYmFzZWQgb2ZmIHRoZSBmcmVxdWVuY3kgcHJvdmlkZWQgdG8KPiA+IHVzIGJ5 IHRoZSB2YnQuCj4gPiAtICogVGhlIFBXTSBGcmVxdWVuY3kgaXMgY2FsY3VsYXRlZCBhcyAyN01o eiAvIChGIHggUCkuCj4gPiAtICogLSBXaGVyZSBGID0gUFdNIEZyZXF1ZW5jeSBQcmUtRGl2aWRl ciB2YWx1ZSBwcm9ncmFtbWVkIGJ5IGZpZWxkIDc6MCBvZgo+ID4gdGhlCj4gPiAtICrCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCByZWdpc3RlciAoRFBDRCBB ZGRyZXNzIDAwNzI4aCkKPiA+IC0gKiAtIFdoZXJlIFAgPSAyXlBuLCB3aGVyZSBQbiBpcyB0aGUg dmFsdWUgcHJvZ3JhbW1lZCBieSBmaWVsZCA0OjAgb2YgdGhlCj4gPiAtICrCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgRURQX1BXTUdFTl9CSVRfQ09VTlQgcmVnaXN0ZXIgKERQQ0QgQWRkcmVzcyAw MDcyNGgpCj4gPiAtICovCj4gPiAtc3RhdGljIHUzMiBpbnRlbF9kcF9hdXhfdmVzYV9jYWxjX21h eF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3Rvcgo+ID4gKmNvbm5lY3RvcikKPiA+IC17 Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5 MTUoY29ubmVjdG9yLT5iYXNlLmRldik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxf ZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+ICvCoMKgwqDC oMKgwqDCoHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciA9Cj4gPiB0b19pbnRlbF9j b25uZWN0b3Iob2xkX2Nvbm5fc3RhdGUtPmNvbm5lY3Rvcik7Cj4gPiDCoMKgwqDCoMKgwqDCoMKg c3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZjb25uZWN0b3ItPnBhbmVsOwo+ID4gLcKgwqDC oMKgwqDCoMKgdTMyIG1heF9iYWNrbGlnaHQgPSAwOwo+ID4gLcKgwqDCoMKgwqDCoMKgaW50IHJl dCwgZnJlcSwgZnhwLCBmeHBfbWluLCBmeHBfbWF4LCBmeHBfYWN0dWFsLCBmID0gMTsKPiA+IC3C oMKgwqDCoMKgwqDCoHU4IHBuLCBwbl9taW4sIHBuX21heDsKPiA+IC0KPiA+IC3CoMKgwqDCoMKg wqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LCBEUF9FRFBfUFdNR0VO X0JJVF9DT1VOVCwKPiA+ICZwbik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJt LCAiRmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudAo+ID4gY2FwOiAlZFxuIiwgcmV0KTsK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+IC3CoMKgwqDC oMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHBuICY9IERQX0VEUF9QV01HRU5fQklU X0NPVU5UX01BU0s7Cj4gPiAtwqDCoMKgwqDCoMKgwqBtYXhfYmFja2xpZ2h0ID0gKDEgPDwgcG4p IC0gMTsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qIEZpbmQgZGVzaXJlZCB2YWx1ZSBvZiAo RiB4IFApCj4gPiAtwqDCoMKgwqDCoMKgwqAgKiBOb3RlIHRoYXQsIGlmIEYgeCBQIGlzIG91dCBv ZiBzdXBwb3J0ZWQgcmFuZ2UsIHRoZSBtYXhpbXVtIHZhbHVlCj4gPiBvcgo+ID4gLcKgwqDCoMKg wqDCoMKgICogbWluaW11bSB2YWx1ZSB3aWxsIGFwcGxpZWQgYXV0b21hdGljYWxseS4gU28gbm8g bmVlZCB0byBjaGVjawo+ID4gdGhhdC4KPiA+IC3CoMKgwqDCoMKgwqDCoCAqLwo+ID4gLcKgwqDC oMKgwqDCoMKgZnJlcSA9IGk5MTUtPnZidC5iYWNrbGlnaHQucHdtX2ZyZXFfaHo7Cj4gPiAtwqDC oMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiVkJUIGRlZmluZWQgYmFja2xpZ2h0 IGZyZXF1ZW5jeSAldSBIelxuIiwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZnJlcSk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoIWZyZXEpIHsKPiA+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLAo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlVzZSBwYW5l bCBkZWZhdWx0IGJhY2tsaWdodCBmcmVxdWVuY3lcbiIpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgZnhwID0gRElWX1JPVU5EX0NMT1NFU1QoS0h6KERQX0VE UF9CQUNLTElHSFRfRlJFUV9CQVNFX0tIWiksIGZyZXEpOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDC oMKgLyogVXNlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUgb2YgUG4gZm9yIG1vcmUgZ3JhbnVsYXJp dHkgb2YKPiA+IGJyaWdodG5lc3MKPiA+IC3CoMKgwqDCoMKgwqDCoCAqIGFkanVzdG1lbnQgd2hp bGUgc2F0aWZ5aW5nIHRoZSBjb25kaXRpb25zIGJlbG93Lgo+ID4gLcKgwqDCoMKgwqDCoMKgICog LSBQbiBpcyBpbiB0aGUgcmFuZ2Ugb2YgUG5fbWluIGFuZCBQbl9tYXgKPiA+IC3CoMKgwqDCoMKg wqDCoCAqIC0gRiBpcyBpbiB0aGUgcmFuZ2Ugb2YgMSBhbmQgMjU1Cj4gPiAtwqDCoMKgwqDCoMKg wqAgKiAtIEZ4UCBpcyB3aXRoaW4gMjUlIG9mIGRlc2lyZWQgdmFsdWUuCj4gPiAtwqDCoMKgwqDC oMKgwqAgKsKgwqAgTm90ZTogMjUlIGlzIGFyYml0cmFyeSB2YWx1ZSBhbmQgbWF5IG5lZWQgc29t ZSB0d2Vhay4KPiA+IC3CoMKgwqDCoMKgwqDCoCAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0ID0g ZHJtX2RwX2RwY2RfcmVhZGIoJmludGVsX2RwLT5hdXgsCj4gPiBEUF9FRFBfUFdNR0VOX0JJVF9D T1VOVF9DQVBfTUlOLCAmcG5fbWluKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkg ewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5k cm0sICJGYWlsZWQgdG8gcmVhZCBwd21nZW4gYml0IGNvdW50IGNhcAo+ID4gbWluOiAlZFxuIiwg cmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gbWF4X2JhY2ts aWdodDsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9k cF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX1BXTUdFTl9CSVRfQ09VTlRf Q0FQX01BWCwgJnBuX21heCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsKPiA+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAi RmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXAKPiA+IG1heDogJWRcbiIsIHJldCk7 Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIG1heF9iYWNrbGlnaHQ7 Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtwqDCoMKgwqDCoMKgwqBwbl9taW4gJj0gRFBfRURQ X1BXTUdFTl9CSVRfQ09VTlRfTUFTSzsKPiA+IC3CoMKgwqDCoMKgwqDCoHBuX21heCAmPSBEUF9F RFBfUFdNR0VOX0JJVF9DT1VOVF9NQVNLOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgLyogRW5z dXJlIGZyZXF1ZW5jeSBpcyB3aXRoaW4gMjUlIG9mIGRlc2lyZWQgdmFsdWUgKi8KPiA+IC3CoMKg wqDCoMKgwqDCoGZ4cF9taW4gPSBESVZfUk9VTkRfQ0xPU0VTVChmeHAgKiAzLCA0KTsKPiA+IC3C oMKgwqDCoMKgwqDCoGZ4cF9tYXggPSBESVZfUk9VTkRfQ0xPU0VTVChmeHAgKiA1LCA0KTsKPiA+ IC0KPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChmeHBfbWluIDwgKDEgPDwgcG5fbWluKSB8fCAoMjU1 IDw8IHBuX21heCkgPCBmeHBfbWF4KSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRybSwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJWQlQgZGVmaW5lZCBiYWNrbGlnaHQgZnJlcXVl bmN5IG91dCBvZgo+ID4gcmFuZ2VcbiIpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4g LcKgwqDCoMKgwqDCoMKgZm9yIChwbiA9IHBuX21heDsgcG4gPj0gcG5fbWluOyBwbi0tKSB7Cj4g PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZiA9IGNsYW1wKERJVl9ST1VORF9DTE9T RVNUKGZ4cCwgMSA8PCBwbiksIDEsIDI1NSk7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZnhwX2FjdHVhbCA9IGYgPDwgcG47Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgKGZ4cF9taW4gPD0gZnhwX2FjdHVhbCAmJiBmeHBfYWN0dWFsIDw9IGZ4cF9tYXgp Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFr Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgZHJtX2RiZ19r bXMoJmk5MTUtPmRybSwgIlVzaW5nIGVEUCBwd21nZW4gYml0IGNvdW50IG9mICVkXG4iLCBwbik7 Cj4gPiAtwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJmludGVsX2RwLT5h dXgsIERQX0VEUF9QV01HRU5fQklUX0NPVU5ULAo+ID4gcG4pOwo+ID4gLcKgwqDCoMKgwqDCoMKg aWYgKHJldCAhPSAxKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2Ri Z19rbXMoJmk5MTUtPmRybSwgIkZhaWxlZCB0byB3cml0ZSBhdXggcHdtZ2VuIGJpdAo+ID4gY291 bnQ6ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVy biBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4gLcKgwqDCoMKg wqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lZHAudmVzYS5wd21nZW5fYml0X2NvdW50ID0gcG47Cj4g PiAtwqDCoMKgwqDCoMKgwqBpZiAoaW50ZWxfZHAtPmVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tM SUdIVF9GUkVRX0FVWF9TRVRfQ0FQKQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EucHdtX2ZyZXFfcHJlX2RpdmlkZXIgPSBmOwo+ID4g LQo+ID4gLcKgwqDCoMKgwqDCoMKgbWF4X2JhY2tsaWdodCA9ICgxIDw8IHBuKSAtIDE7Cj4gPiAr wqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2Rw KGNvbm5lY3Rvci0+ZW5jb2Rlcik7Cj4gPiDCoAo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0dXJuIG1h eF9iYWNrbGlnaHQ7Cj4gPiArwqDCoMKgwqDCoMKgwqBkcm1fZWRwX2JhY2tsaWdodF9kaXNhYmxl KCZpbnRlbF9kcC0+YXV4LCAmcGFuZWwtCj4gPiA+YmFja2xpZ2h0LmVkcC52ZXNhLmluZm8pOwo+ ID4gwqB9Cj4gPiDCoAo+ID4gLXN0YXRpYyBpbnQgaW50ZWxfZHBfYXV4X3Zlc2Ffc2V0dXBfYmFj a2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IKPiA+ICpjb25uZWN0b3IsCj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSBwaXBlIHBpcGUpCj4gPiArc3RhdGljIGludCBp bnRlbF9kcF9hdXhfdmVzYV9zZXR1cF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3Rvcgo+ ID4gKmNvbm5lY3RvciwgZW51bSBwaXBlIHBpcGUpCj4gPiDCoHsKPiA+IMKgwqDCoMKgwqDCoMKg wqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9y KTsKPiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5l Y3Rvci0+cGFuZWw7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gK8KgwqDCoMKgwqDCoMKgdTE2IGN1cnJl bnRfbGV2ZWw7Cj4gPiArwqDCoMKgwqDCoMKgwqB1OCBjdXJyZW50X21vZGU7Cj4gPiArwqDCoMKg wqDCoMKgwqBpbnQgcmV0Owo+ID4gwqAKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChpbnRlbF9kcC0+ ZWRwX2RwY2RbMV0gJiBEUF9FRFBfQkFDS0xJR0hUX0FVWF9FTkFCTEVfQ0FQKQo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EuYXV4X2Vu YWJsZSA9IHRydWU7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoaW50ZWxfZHAtPmVkcF9kcGNkWzJd ICYgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX0JZVEVfQ09VTlQpCj4gPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lZHAudmVzYS5sc2JfcmVnX3Vz ZWQgPSB0cnVlOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5tYXgg PQo+ID4gaW50ZWxfZHBfYXV4X3Zlc2FfY2FsY19tYXhfYmFja2xpZ2h0KGNvbm5lY3Rvcik7Cj4g PiAtwqDCoMKgwqDCoMKgwqBpZiAoIXBhbmVsLT5iYWNrbGlnaHQubWF4KQo+ID4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PREVWOwo+ID4gK8KgwqDCoMKgwqDCoMKg cmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgmaW50ZWxfZHAtPmF1eCwgJnBhbmVsLQo+ID4g PmJhY2tsaWdodC5lZHAudmVzYS5pbmZvLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaTkxNS0+dmJ0LmJh Y2tsaWdodC5wd21fZnJlcV9oeiwKPiA+IGludGVsX2RwLT5lZHBfZHBjZCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICZjdXJyZW50X2xldmVsLCAmY3VycmVudF9tb2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDC oGlmIChyZXQgPCAwKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBy ZXQ7Cj4gPiDCoAo+ID4gK8KgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5tYXggPSBwYW5l bC0+YmFja2xpZ2h0LmVkcC52ZXNhLmluZm8ubWF4Owo+ID4gwqDCoMKgwqDCoMKgwqDCoHBhbmVs LT5iYWNrbGlnaHQubWluID0gMDsKPiA+IC3CoMKgwqDCoMKgwqDCoHBhbmVsLT5iYWNrbGlnaHQu bGV2ZWwgPSBpbnRlbF9kcF9hdXhfdmVzYV9nZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwKPiA+IHBp cGUpOwo+ID4gLcKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lbmFibGVkID0KPiA+IGlu dGVsX2RwX2F1eF92ZXNhX2JhY2tsaWdodF9kcGNkX21vZGUoY29ubmVjdG9yKSAmJgo+ID4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwYW5lbC0+YmFja2xpZ2h0LmxldmVsICE9IDA7Cj4gPiArwqDCoMKgwqDCoMKgwqBp ZiAoY3VycmVudF9tb2RlID09IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0QpIHsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5lbC0+YmFja2xpZ2h0LmxldmVs ID0gY3VycmVudF9sZXZlbDsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5l bC0+YmFja2xpZ2h0LmVuYWJsZWQgPSBwYW5lbC0+YmFja2xpZ2h0LmxldmVsICE9IDA7Cj4gPiAr wqDCoMKgwqDCoMKgwqB9IGVsc2Ugewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgPSBwYW5lbC0+YmFja2xpZ2h0Lm1heDsKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5lbC0+YmFja2xpZ2h0LmVuYWJsZWQgPSBmYWxz ZTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+IMKgCj4gPiDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IDA7Cj4gPiDCoH0KPiA+IEBAIC01NTksMTYgKzM0MCwxMiBAQCBpbnRlbF9kcF9hdXhfc3VwcG9y dHNfdmVzYV9iYWNrbGlnaHQoc3RydWN0Cj4gPiBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikK PiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0 YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gwqAKPiA+IC3CoMKgwqDC oMKgwqDCoC8qIENoZWNrIHRoZSBlRFAgRGlzcGxheSBjb250cm9sIGNhcGFiaWxpdGllcyByZWdp c3RlcnMgdG8gZGV0ZXJtaW5lCj4gPiBpZgo+ID4gLcKgwqDCoMKgwqDCoMKgICogdGhlIHBhbmVs IGNhbiBzdXBwb3J0IGJhY2tsaWdodCBjb250cm9sIG92ZXIgdGhlIGF1eCBjaGFubmVsLgo+ID4g LcKgwqDCoMKgwqDCoMKgICoKPiA+IC3CoMKgwqDCoMKgwqDCoCAqIFRPRE86IFdlIGN1cnJlbnRs eSBvbmx5IHN1cHBvcnQgQVVYIG9ubHkgYmFja2xpZ2h0Cj4gPiBjb25maWd1cmF0aW9ucywgbm90 IGJhY2tsaWdodHMgd2hpY2gKPiA+ICvCoMKgwqDCoMKgwqDCoC8qIFRPRE86IFdlIGN1cnJlbnRs eSBvbmx5IHN1cHBvcnQgQVVYIG9ubHkgYmFja2xpZ2h0Cj4gPiBjb25maWd1cmF0aW9ucywgbm90 IGJhY2tsaWdodHMgd2hpY2gKPiA+IMKgwqDCoMKgwqDCoMKgwqAgKiByZXF1aXJlIGEgbWl4IG9m IFBXTSBhbmQgQVVYIGNvbnRyb2xzIHRvIHdvcmsuIEluIHRoZSBtZWFuIHRpbWUsCj4gPiB0aGVz ZSBtYWNoaW5lcyB0eXBpY2FsbHkKPiA+IMKgwqDCoMKgwqDCoMKgwqAgKiB3b3JrIGp1c3QgZmlu ZSB1c2luZyBub3JtYWwgUFdNIGNvbnRyb2xzIGFueXdheS4KPiA+IMKgwqDCoMKgwqDCoMKgwqAg Ki8KPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChpbnRlbF9kcC0+ZWRwX2RwY2RbMV0gJiBEUF9FRFBf VENPTl9CQUNLTElHSFRfQURKVVNUTUVOVF9DQVAgJiYKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oCAoaW50ZWxfZHAtPmVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9BVVhfRU5BQkxFX0NB UCkgJiYKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoCAoaW50ZWxfZHAtPmVkcF9kcGNkWzJdICYK PiA+IERQX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVTU19BVVhfU0VUX0NBUCkpIHsKPiA+ICvCoMKg wqDCoMKgwqDCoGlmICgoaW50ZWxfZHAtPmVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9B VVhfRU5BQkxFX0NBUCkgJiYKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCBkcm1fZWRwX2JhY2ts aWdodF9zdXBwb3J0ZWQoaW50ZWxfZHAtPmVkcF9kcGNkKSkgewo+ID4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiQVVYIEJhY2tsaWdodCBD b250cm9sCj4gPiBTdXBwb3J0ZWQhXG4iKTsKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIHRydWU7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gZGlmZiAtLWdpdCBh L2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaCBiL2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIu aAo+ID4gaW5kZXggZWRmZmQxZGNjYTNlLi4xZWNhMGI0MmZjNDUgMTAwNjQ0Cj4gPiAtLS0gYS9p bmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmgKPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9kcF9o ZWxwZXIuaAo+ID4gQEAgLTE3OTAsNiArMTc5MCwyNCBAQCBkcm1fZHBfc2lua19jYW5fZG9fdmlk ZW9fd2l0aG91dF90aW1pbmdfbXNhKGNvbnN0IHU4Cj4gPiBkcGNkW0RQX1JFQ0VJVkVSX0NBUF9T SVpFXSkKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFBfTVNBX1RJTUlOR19Q QVJfSUdOT1JFRDsKPiA+IMKgfQo+ID4gwqAKPiA+ICsvKioKPiA+ICsgKiBkcm1fZWRwX2JhY2ts aWdodF9zdXBwb3J0ZWQoKSAtIENoZWNrIGFuIGVEUCBEUENEIGZvciBWRVNBIGJhY2tsaWdodAo+ ID4gc3VwcG9ydAo+ID4gKyAqIEBlZHBfZHBjZDogVGhlIERQQ0QgdG8gY2hlY2sKPiA+ICsgKgo+ ID4gKyAqIE5vdGUgdGhhdCBjdXJyZW50bHkgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAlZmFs c2UgZm9yIHBhbmVscyB3aGljaAo+ID4gc3VwcG9ydCB2YXJpb3VzIERQQ0QKPiA+ICsgKiBiYWNr bGlnaHQgZmVhdHVyZXMgYnV0IHdoaWNoIHJlcXVpcmUgdGhlIGJyaWdodG5lc3MgYmUgc2V0IHRo cm91Z2ggUFdNLAo+ID4gYW5kIGRvbid0IHN1cHBvcnQgc2V0dGluZwo+ID4gKyAqIHRoZSBicmln aHRuZXNzIGxldmVsIHZpYSB0aGUgRFBDRC4gVGhpcyBpcyBhIFRPRE8uCj4gPiArICoKPiA+ICsg KiBSZXR1cm5zOiAlVHJ1ZSBpZiBAZWRwX2RwY2QgaW5kaWNhdGVzIHRoYXQgVkVTQSBiYWNrbGln aHQgY29udHJvbHMgYXJlCj4gPiBzdXBwb3J0ZWQsICVmYWxzZQo+ID4gKyAqIG90aGVyd2lzZQo+ ID4gKyAqLwo+ID4gK3N0YXRpYyBpbmxpbmUgYm9vbAo+ID4gK2RybV9lZHBfYmFja2xpZ2h0X3N1 cHBvcnRlZChjb25zdCB1OCBlZHBfZHBjZFtFRFBfRElTUExBWV9DVExfQ0FQX1NJWkVdKQo+ID4g K3sKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAoZWRwX2RwY2RbMV0gJiBEUF9FRFBfVENPTl9C QUNLTElHSFRfQURKVVNUTUVOVF9DQVApICYmCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgKGVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX0FVWF9TRVRf Q0FQKTsKPiA+ICt9Cj4gPiArCj4gPiDCoC8qCj4gPiDCoCAqIERpc3BsYXlQb3J0IEFVWCBjaGFu bmVsCj4gPiDCoCAqLwo+ID4gQEAgLTIwODksNiArMjEwNywzNiBAQCBkcm1fZHBfaGFzX3F1aXJr KGNvbnN0IHN0cnVjdCBkcm1fZHBfZGVzYyAqZGVzYywgZW51bQo+ID4gZHJtX2RwX3F1aXJrIHF1 aXJrKQo+ID4gwqDCoMKgwqDCoMKgwqDCoHJldHVybiBkZXNjLT5xdWlya3MgJiBCSVQocXVpcmsp Owo+ID4gwqB9Cj4gPiDCoAo+ID4gKy8qKgo+ID4gKyAqIHN0cnVjdCBkcm1fZWRwX2JhY2tsaWdo dF9pbmZvIC0gUHJvYmVkIGVEUCBiYWNrbGlnaHQgaW5mbyBzdHJ1Y3QKPiA+ICsgKiBAcHdtZ2Vu X2JpdF9jb3VudDogVGhlIHB3bWdlbiBiaXQgY291bnQKPiA+ICsgKiBAcHdtX2ZyZXFfcHJlX2Rp dmlkZXI6IFRoZSBQV00gZnJlcXVlbmN5IHByZS1kaXZpZGVyIHZhbHVlIGJlaW5nIHVzZWQKPiA+ IGZvciB0aGlzIGJhY2tsaWdodCwgaWYgYW55Cj4gPiArICogQG1heDogVGhlIG1heGltdW0gYmFj a2xpZ2h0IGxldmVsIHRoYXQgbWF5IGJlIHNldAo+ID4gKyAqIEBsc2JfcmVnX3VzZWQ6IERvIHdl IGFsc28gd3JpdGUgdmFsdWVzIHRvIHRoZQo+ID4gRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNT X0xTQiByZWdpc3Rlcj8KPiA+ICsgKiBAYXV4X2VuYWJsZTogRG9lcyB0aGUgcGFuZWwgc3VwcG9y dCB0aGUgQVVYIGVuYWJsZSBjYXA/Cj4gPiArICoKPiA+ICsgKiBUaGlzIHN0cnVjdHVyZSBjb250 YWlucyB2YXJpb3VzIGRhdGEgYWJvdXQgYW4gZURQIGJhY2tsaWdodCwgd2hpY2ggY2FuCj4gPiBi ZSBwb3B1bGF0ZWQgYnkgdXNpbmcKPiA+ICsgKiBkcm1fZWRwX2JhY2tsaWdodF9pbml0KCkuCj4g PiArICovCj4gPiArc3RydWN0IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gewo+ID4gK8KgwqDCoMKg wqDCoMKgdTggcHdtZ2VuX2JpdF9jb3VudDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IHB3bV9mcmVx X3ByZV9kaXZpZGVyOwo+ID4gK8KgwqDCoMKgwqDCoMKgdTE2IG1heDsKPiA+ICsKPiA+ICvCoMKg wqDCoMKgwqDCoGJvb2wgbHNiX3JlZ191c2VkIDogMTsKPiA+ICvCoMKgwqDCoMKgwqDCoGJvb2wg YXV4X2VuYWJsZSA6IDE7Cj4gPiArfTsKPiA+ICsKPiA+ICtpbnQKPiA+ICtkcm1fZWRwX2JhY2ts aWdodF9pbml0KHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIHN0cnVjdAo+ID4gZHJtX2VkcF9iYWNr bGlnaHRfaW5mbyAqYmwsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHUxNiBkcml2ZXJfcHdtX2ZyZXFfaHosIGNvbnN0IHU4Cj4gPiBlZHBfZHBjZFtFRFBf RElTUExBWV9DVExfQ0FQX1NJWkVdLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1MTYgKmN1cnJlbnRfbGV2ZWwsIHU4ICpjdXJyZW50X21vZGUpOwo+ID4g K2ludCBkcm1fZWRwX2JhY2tsaWdodF9zZXRfbGV2ZWwoc3RydWN0IGRybV9kcF9hdXggKmF1eCwg Y29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUx NiBsZXZlbCk7Cj4gPiAraW50IGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZShzdHJ1Y3QgZHJtX2Rw X2F1eCAqYXV4LCBjb25zdCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gKmJsLAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB1MTYgbGV2ZWwpOwo+ID4gK2ludCBkcm1fZWRwX2JhY2tsaWdodF9kaXNhYmxlKHN0cnVjdCBk cm1fZHBfYXV4ICphdXgsIGNvbnN0IHN0cnVjdAo+ID4gZHJtX2VkcF9iYWNrbGlnaHRfaW5mbyAq YmwpOwo+ID4gKwo+ID4gwqAjaWZkZWYgQ09ORklHX0RSTV9EUF9DRUMKPiA+IMKgdm9pZCBkcm1f ZHBfY2VjX2lycShzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KTsKPiA+IMKgdm9pZCBkcm1fZHBfY2Vj X3JlZ2lzdGVyX2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LAo+ID4gLS0gCj4gPiAy LjI5LjIKPiA+IAo+ID4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KPiA+IEludGVsLWdmeCBtYWlsaW5nIGxpc3QKPiA+IEludGVsLWdmeEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKPiA+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vaW50ZWwtZ2Z4Cj4gCgotLSAKU2luY2VyZWx5LAogICBMeXVkZSBQYXVsIChzaGUvaGVy KQogICBTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0CiAgIApOb3RlOiBJIGRlYWwgd2l0aCBh IGxvdCBvZiBlbWFpbHMgYW5kIGhhdmUgYSBsb3Qgb2YgYnVncyBvbiBteSBwbGF0ZS4gSWYgeW91 J3ZlCmFza2VkIG1lIGEgcXVlc3Rpb24sIGFyZSB3YWl0aW5nIGZvciBhIHJldmlldy9tZXJnZSBv biBhIHBhdGNoLCBldGMuIGFuZCBJCmhhdmVuJ3QgcmVzcG9uZGVkIGluIGEgd2hpbGUsIHBsZWFz ZSBmZWVsIGZyZWUgdG8gc2VuZCBtZSBhbm90aGVyIGVtYWlsIHRvIGNoZWNrCm9uIG15IHN0YXR1 cy4gSSBkb24ndCBiaXRlIQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KTm91dmVhdSBtYWlsaW5nIGxpc3QKTm91dmVhdUBsaXN0cy5mcmVlZGVza3RvcC5v cmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9ub3V2ZWF1 Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AD7E3C433E6 for ; Thu, 11 Feb 2021 18:35:52 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6248A64E15 for ; Thu, 11 Feb 2021 18:35:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6248A64E15 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8D0496EE62; Thu, 11 Feb 2021 18:35:47 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id EFC0A6ECCC for ; Thu, 11 Feb 2021 18:35:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1613068545; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pPOg3Ohlq+RcRCbYcOoTEKFNyerStoZoZ0h1YxqgvsQ=; b=e70z0xqvZh9jL/CFHSKP2gxySIyIuOHHKUZiOTyz1nU9PPPrewvz2GHfeHzvmoMdI3kyBf 39H1WpWH1jTCn5VGXFbKPIQWcRlFh3e0Ad1WBkqsdW6RSgCchM3AzJ1xQN2US6L+3DoFs2 CtBV639QgJtWfpQJRHQWNLNHvGL0VyQ= Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-513-5JaMGBw5OKaQD8k5a89UcA-1; Thu, 11 Feb 2021 13:35:38 -0500 X-MC-Unique: 5JaMGBw5OKaQD8k5a89UcA-1 Received: by mail-qt1-f200.google.com with SMTP id p20so4863754qtn.23 for ; Thu, 11 Feb 2021 10:35:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:reply-to:to:cc:date :in-reply-to:references:organization:user-agent:mime-version :content-transfer-encoding; bh=pPOg3Ohlq+RcRCbYcOoTEKFNyerStoZoZ0h1YxqgvsQ=; b=T8JrvC04jWLWAZmNJwfEVBwnqd00NpUefVIcQeL2N9YZDkpIoW2UWHW0ASPWr8N/hj oll69n4tt7azreUBknd+n0hdFg8NuIeZIH8bgGN/+zwdGZ9ZYKPBjYSjaSw4LwdDzJiI kB9VLqJca/IWDf9RxYGQeqlr6pOZo+vS9b/r1WThdRfK3JY3xM44K80nfeliN3rkg+Lv rEgYR3L35okGnwKzsZc6eNn6ObNPQWU2nUKEqQKkrp6UHJ0aG3U6tCM80sB7uHmVDoah ncCdqKmN9YNWGzTW6FCaqp5am46Zhls0JNPpoFABWj/qHho0yinhBFvZZPSU1pVHh1OE Gv2g== X-Gm-Message-State: AOAM531EoU1F4ypGsMuB9PJ9LxrKk8rJVG2WxChRpdkHLi9/AB65m1Ff 2RI7INDju9uxBidMmBsVQ6kZyMMaj57ZaALLVpwUr5LRqPmvyj4cMD0mEAIyBWTFTVd4DKGSbY5 yj8IydZlsI5E4Hut6a1F8Qd1KVm8i X-Received: by 2002:a0c:ac43:: with SMTP id m3mr9044628qvb.37.1613068537973; Thu, 11 Feb 2021 10:35:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJwEZm08wF69ndhqlNhK75qjeAHsxMVSaVWhTwnItgrMqjIMG1ZuD8aJK5uVgaEUnx1XvdbvKA== X-Received: by 2002:a0c:ac43:: with SMTP id m3mr9044591qvb.37.1613068537593; Thu, 11 Feb 2021 10:35:37 -0800 (PST) Received: from Whitewolf.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id d1sm4367878qkj.123.2021.02.11.10.35.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Feb 2021 10:35:34 -0800 (PST) Message-ID: Subject: Re: [Intel-gfx] [RFC v4 10/11] drm/dp: Extract i915's eDP backlight code into DRM helpers From: Lyude Paul To: Rodrigo Vivi Date: Thu, 11 Feb 2021 13:35:33 -0500 In-Reply-To: <20210211041540.GI82362@intel.com> References: <20210208233902.1289693-1-lyude@redhat.com> <20210208233902.1289693-11-lyude@redhat.com> <20210211041540.GI82362@intel.com> Organization: Red Hat User-Agent: Evolution 3.38.3 (3.38.3-1.fc33) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: lyude@redhat.com Cc: greg.depoire@gmail.com, Jani Nikula , nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, Lucas De Marchi , open list , dri-devel@lists.freedesktop.org, David Airlie , Sean Paul , Thomas Zimmermann , Dave Airlie Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gV2VkLCAyMDIxLTAyLTEwIGF0IDIzOjE1IC0wNTAwLCBSb2RyaWdvIFZpdmkgd3JvdGU6Cj4g T24gTW9uLCBGZWIgMDgsIDIwMjEgYXQgMDY6Mzk6MDBQTSAtMDUwMCwgTHl1ZGUgUGF1bCB3cm90 ZToKPiA+IFNpbmNlIHdlJ3JlIGFib3V0IHRvIGltcGxlbWVudCBlRFAgYmFja2xpZ2h0IHN1cHBv cnQgaW4gbm91dmVhdSB1c2luZyB0aGUKPiA+IHN0YW5kYXJkIHByb3RvY29sIGZyb20gVkVTQSwg d2UgbWlnaHQgYXMgd2VsbCBqdXN0IHRha2UgdGhlIGNvZGUgdGhhdCdzCj4gPiBhbHJlYWR5IHdy aXR0ZW4gZm9yIHRoaXMgYW5kIG1vdmUgaXQgaW50byBhIHNldCBvZiBzaGFyZWQgRFJNIGhlbHBl cnMuCj4gPiAKPiA+IE5vdGUgdGhhdCB0aGVzZSBoZWxwZXJzIGFyZSBpbnRlbmRlZCB0byBoYW5k bGUgRFBDRCByZWxhdGVkIGJhY2tsaWdodAo+ID4gY29udHJvbCBiaXRzIHN1Y2ggYXMgc2V0dGlu ZyB0aGUgYnJpZ2h0bmVzcyBsZXZlbCBvdmVyIEFVWCwgcHJvYmluZyB0aGUKPiA+IGJhY2tsaWdo dCdzIFRDT04sIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgYmFja2xpZ2h0IG92ZXIgQVVYIGlmIHN1 cHBvcnRlZCwKPiA+IGV0Yy4gQW55IFBXTS1yZWxhdGVkIHBvcnRpb25zIG9mIGJhY2tsaWdodCBj b250cm9sIGFyZSBleHBsaWNpdGx5IGxlZnQgdXAKPiA+IHRvIHRoZSBkcml2ZXIsIGFzIHRoZXNl IHdpbGwgdmFyeSBmcm9tIHBsYXRmb3JtIHRvIHBsYXRmb3JtLgo+ID4gCj4gPiBUaGUgb25seSBl eGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIFBXTSBmcmVxdWVuY3kK PiA+IHByZS1kaXZpZGVyIHZhbHVlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIG9ubHkgcGxhdGZvcm0t c3BlY2lmaWMgaW5mb3JtYXRpb24KPiA+IHJlcXVpcmVkIGZvciB0aGlzIGlzIHRoZSBQV00gZnJl cXVlbmN5IG9mIHRoZSBwYW5lbCwgd2hpY2ggdGhlIGRyaXZlciBpcwo+ID4gZXhwZWN0ZWQgdG8g cHJvdmlkZSBpZiBhdmFpbGFibGUuIFRoZSBhY3R1YWwgYWxnb3JpdGhtIGZvciBjYWxjdWxhdGlu ZyB0aGlzCj4gPiB2YWx1ZSBpcyBzdGFuZGFyZCBhbmQgaXMgZGVmaW5lZCBpbiB0aGUgZURQIHNw ZWNpZmljYXRpb24gZnJvbSBWRVNBLgo+ID4gCj4gPiBOb3RlIHRoYXQgdGhlc2UgaGVscGVycyBk byBub3QgeWV0IGltcGxlbWVudCB0aGUgZnVsbCByYW5nZSBvZiBmZWF0dXJlcwo+ID4gdGhlIFZF U0EgYmFja2xpZ2h0IGludGVyZmFjZSBwcm92aWRlcywgYW5kIG9ubHkgcHJvdmlkZSB0aGUgZm9s bG93aW5nCj4gPiBmdW5jdGlvbmFsaXR5IChhbGwgb2Ygd2hpY2ggd2FzIGFscmVhZHkgcHJlc2Vu dCBpbiBpOTE1J3MgRFBDRCBiYWNrbGlnaHQKPiA+IHN1cHBvcnQpOgo+ID4gCj4gPiAqIEJhc2lj IGNvbnRyb2wgb2YgYnJpZ2h0bmVzcyBsZXZlbHMKPiA+ICogQmFzaWMgcHJvYmluZyBvZiBiYWNr bGlnaHQgY2FwYWJpbGl0aWVzCj4gPiAqIEhlbHBlcnMgZm9yIGVuYWJsaW5nIGFuZCBkaXNhYmxp bmcgdGhlIGJhY2tsaWdodAo+ID4gCj4gPiB2MzoKPiA+ICogU3BsaXQgb3V0IGNoYW5nZXMgdG8g aTkxNSdzIGJhY2tsaWdodCBjb2RlIHRvIHNlcGFyYXRlIHBhdGNoZXMgdG8gbWFrZSBpdAo+ID4g wqAgZWFzaWVyIHRvIHJldmlldwo+ID4gdjQ6Cj4gPiAqIFN0eWxlL3NwZWxsaW5nIGNoYW5nZXMg ZnJvbSBUaG9tYXMgWmltbWVybWFubgo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBMeXVkZSBQYXVs IDxseXVkZUByZWRoYXQuY29tPgo+ID4gQ2M6IEphbmkgTmlrdWxhIDxqYW5pLm5pa3VsYUBpbnRl bC5jb20+Cj4gPiBDYzogRGF2ZSBBaXJsaWUgPGFpcmxpZWRAZ21haWwuY29tPgo+ID4gQ2M6IGdy ZWcuZGVwb2lyZUBnbWFpbC5jb20KPiA+IC0tLQo+ID4gwqBkcml2ZXJzL2dwdS9kcm0vZHJtX2Rw X2hlbHBlci5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IDMzMiArKysrKysrKysrKysr KysrKysKPiA+IMKgLi4uL2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZGlzcGxheV90eXBlcy5owqDC oMKgIHzCoMKgIDUgKy0KPiA+IMKgLi4uL2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2Jh Y2tsaWdodC5jIHwgMjg1ICsrLS0tLS0tLS0tLS0tLQo+ID4gwqBpbmNsdWRlL2RybS9kcm1fZHBf aGVscGVyLmjCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgIDQ4ICsrKwo+ ID4gwqA0IGZpbGVzIGNoYW5nZWQsIDQxMiBpbnNlcnRpb25zKCspLCAyNTggZGVsZXRpb25zKC0p Cj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jCj4g PiBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaGVscGVyLmMKPiA+IGluZGV4IGVlZGJiNDg4MTVi Ny4uMWEzZDQ2NzlkNzIwIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9o ZWxwZXIuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxwZXIuYwo+ID4gQEAg LTMwODIsMyArMzA4MiwzMzUgQEAgaW50IGRybV9kcF9wY29uX2NvbnZlcnRfcmdiX3RvX3ljYmNy KHN0cnVjdAo+ID4gZHJtX2RwX2F1eCAqYXV4LCB1OCBjb2xvcl9zcGMpCj4gPiDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIDA7Cj4gPiDCoH0KPiA+IMKgRVhQT1JUX1NZTUJPTChkcm1fZHBfcGNvbl9j b252ZXJ0X3JnYl90b195Y2Jjcik7Cj4gPiArCj4gPiArLyoqCj4gPiArICogZHJtX2VkcF9iYWNr bGlnaHRfc2V0X2xldmVsKCkgLSBTZXQgdGhlIGJhY2tsaWdodCBsZXZlbCBvZiBhbiBlRFAgcGFu ZWwKPiA+IHZpYSBBVVgKPiA+ICsgKiBAYXV4OiBUaGUgRFAgQVVYIGNoYW5uZWwgdG8gdXNlCj4g PiArICogQGJsOiBCYWNrbGlnaHQgY2FwYWJpbGl0eSBpbmZvIGZyb20gZHJtX2VkcF9iYWNrbGln aHRfaW5pdCgpCj4gPiArICogQGxldmVsOiBUaGUgYnJpZ2h0bmVzcyBsZXZlbCB0byBzZXQKPiA+ ICsgKgo+ID4gKyAqIFNldHMgdGhlIGJyaWdodG5lc3MgbGV2ZWwgb2YgYW4gZURQIHBhbmVsJ3Mg YmFja2xpZ2h0LiBOb3RlIHRoYXQgdGhlCj4gPiBwYW5lbCdzIGJhY2tsaWdodCBtdXN0Cj4gPiAr ICogYWxyZWFkeSBoYXZlIGJlZW4gZW5hYmxlZCBieSB0aGUgZHJpdmVyIGJ5IGNhbGxpbmcKPiA+ IGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZSgpLgo+ID4gKyAqCj4gPiArICogUmV0dXJuczogJTAg b24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCj4gPiArICovCj4gPiAr aW50IGRybV9lZHBfYmFja2xpZ2h0X3NldF9sZXZlbChzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LCBj b25zdCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gKmJsLAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTE2 IGxldmVsKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiArwqDCoMKgwqDC oMKgwqB1OCBidWZbMl0gPSB7IDAgfTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChibC0+ bHNiX3JlZ191c2VkKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnVmWzBd ID0gKGxldmVsICYgMHhmZjAwKSA+PiA4Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGJ1ZlsxXSA9IChsZXZlbCAmIDB4MDBmZik7Cj4gPiArwqDCoMKgwqDCoMKgwqB9IGVsc2Ug ewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJ1ZlswXSA9IGxldmVsOwo+ID4g K8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2Rw Y2Rfd3JpdGUoYXV4LCBEUF9FRFBfQkFDS0xJR0hUX0JSSUdIVE5FU1NfTVNCLCBidWYsCj4gPiBz aXplb2YoYnVmKSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IHNpemVvZihidWYpKSB7 Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0VSUk9SKCIlczogRmFpbGVk IHRvIHdyaXRlIGF1eCBiYWNrbGlnaHQgbGV2ZWw6ICVkXG4iLAo+ID4gYXV4LT5uYW1lLCByZXQp Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0 IDogLUVJTzsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJl dHVybiAwOwo+ID4gK30KPiA+ICtFWFBPUlRfU1lNQk9MKGRybV9lZHBfYmFja2xpZ2h0X3NldF9s ZXZlbCk7Cj4gPiArCj4gPiArc3RhdGljIGludAo+ID4gK2RybV9lZHBfYmFja2xpZ2h0X3NldF9l bmFibGUoc3RydWN0IGRybV9kcF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2Jh Y2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYm9vbCBlbmFibGUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDC oMKgaW50IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IGJ1ZjsKPiA+ICsKPiA+ICvCoMKgwqDC oMKgwqDCoC8qIFRoZSBwYW5lbCB1c2VzIHNvbWV0aGluZyBvdGhlciB0aGVuIERQQ0QgZm9yIGVu YWJsaW5nIGl0cwo+ID4gYmFja2xpZ2h0ICovCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIWJsLT5h dXhfZW5hYmxlKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9F RFBfRElTUExBWV9DT05UUk9MX1JFR0lTVEVSLCAmYnVmKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlm IChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9FUlJP UigiJXM6IEZhaWxlZCB0byByZWFkIGVEUCBkaXNwbGF5IGNvbnRyb2wgcmVnaXN0ZXI6Cj4gPiAl ZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICvC oMKgwqDCoMKgwqDCoGlmIChlbmFibGUpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgYnVmIHw9IERQX0VEUF9CQUNLTElHSFRfRU5BQkxFOwo+ID4gK8KgwqDCoMKgwqDCoMKgZWxz ZQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJ1ZiAmPSB+RFBfRURQX0JBQ0tM SUdIVF9FTkFCTEU7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93 cml0ZWIoYXV4LCBEUF9FRFBfRElTUExBWV9DT05UUk9MX1JFR0lTVEVSLCBidWYpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKHJldCAhPSAxKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgRFJNX0VSUk9SKCIlczogRmFpbGVkIHRvIHdyaXRlIGVEUCBkaXNwbGF5IGNvbnRyb2wg cmVnaXN0ZXI6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ICvCoMKgwqDC oMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30KPiA+ICsK PiA+ICsvKioKPiA+ICsgKiBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoKSAtIEVuYWJsZSBhbiBl RFAgcGFuZWwncyBiYWNrbGlnaHQgdXNpbmcgRFBDRAo+ID4gKyAqIEBhdXg6IFRoZSBEUCBBVVgg Y2hhbm5lbCB0byB1c2UKPiA+ICsgKiBAYmw6IEJhY2tsaWdodCBjYXBhYmlsaXR5IGluZm8gZnJv bSBkcm1fZWRwX2JhY2tsaWdodF9pbml0KCkKPiA+ICsgKiBAbGV2ZWw6IFRoZSBpbml0aWFsIGJh Y2tsaWdodCBsZXZlbCB0byBzZXQgdmlhIEFVWCwgaWYgdGhlcmUgaXMgb25lCj4gPiArICoKPiA+ ICsgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZW5hYmxpbmcgRFBDRCBiYWNrbGlnaHQgY29udHJv bHMgb24gYSBwYW5lbCBvdmVyCj4gPiBEUENELCB3aGlsZSBhZGRpdGlvbmFsbHkKPiA+ICsgKiBy ZXN0b3JpbmcgYW55IGltcG9ydGFudCBiYWNrbGlnaHQgc3RhdGUgc3VjaCBhcyB0aGUgZ2l2ZW4g YmFja2xpZ2h0Cj4gPiBsZXZlbCwgdGhlIGJyaWdodG5lc3MgYnl0ZQo+ID4gKyAqIGNvdW50LCBi YWNrbGlnaHQgZnJlcXVlbmN5LCBldGMuCj4gPiArICoKPiA+ICsgKiBOb3RlIHRoYXQgY2VydGFp biBwYW5lbHMsIHdoaWxlIHN1cHBvcnRpbmcgYnJpZ2h0bmVzcyBsZXZlbCBjb250cm9scwo+ID4g b3ZlciBEUENELCBtYXkgbm90IHN1cHBvcnQKPiA+ICsgKiBoYXZpbmcgdGhlaXIgYmFja2xpZ2h0 cyBlbmFibGVkIHZpYSB0aGUgc3RhbmRhcmQKPiA+ICVEUF9FRFBfRElTUExBWV9DT05UUk9MX1JF R0lTVEVSLiBPbiBzdWNoIHBhbmVscwo+ID4gKyAqICZkcm1fZWRwX2JhY2tsaWdodF9pbmZvLmF1 eF9lbmFibGUgd2lsbCBiZSBzZXQgdG8gJWZhbHNlLCB0aGlzIGZ1bmN0aW9uCj4gPiB3aWxsIHNr aXAgdGhlIHN0ZXAgb2YKPiA+ICsgKiBwcm9ncmFtbWluZyB0aGUgJURQX0VEUF9ESVNQTEFZX0NP TlRST0xfUkVHSVNURVIsIGFuZCB0aGUgZHJpdmVyIG11c3QKPiA+IHBlcmZvcm0gdGhlIHJlcXVp cmVkCj4gPiArICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgc3RlcCBmb3IgZW5hYmxpbmcgdGhl IGJhY2tsaWdodCBhZnRlciBjYWxsaW5nCj4gPiB0aGlzIGZ1bmN0aW9uLgo+ID4gKyAqCj4gPiAr ICogUmV0dXJuczogJTAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJl Lgo+ID4gKyAqLwo+ID4gK2ludCBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoc3RydWN0IGRybV9k cF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgY29uc3QgdTE2IGxldmVsKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4g PiArwqDCoMKgwqDCoMKgwqB1OCBkcGNkX2J1ZiwgbmV3X2RwY2RfYnVmOwo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9FRFBfQkFDS0xJR0hU X01PREVfU0VUX1JFR0lTVEVSLAo+ID4gJmRwY2RfYnVmKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlm IChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9ERUJV R19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGlnaHQgbW9kZTogJWRcbiIsCj4gPiBhdXgt Pm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJl dCA8IDAgPyByZXQgOiAtRUlPOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgbmV3X2RwY2RfYnVmID0gZHBjZF9idWY7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqBpZiAoKGRwY2RfYnVmICYgRFBfRURQX0JBQ0tMSUdIVF9DT05UUk9MX01PREVfTUFTSykgIT0K PiA+IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0QpIHsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBuZXdfZHBjZF9idWYgJj0gfkRQX0VEUF9CQUNLTElHSFRfQ09O VFJPTF9NT0RFX01BU0s7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbmV3X2Rw Y2RfYnVmIHw9IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0Q7Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1 eCwgRFBfRURQX1BXTUdFTl9CSVRfQ09VTlQsIGJsLQo+ID4gPnB3bWdlbl9iaXRfY291bnQpOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RFQlVHX0tNUygi JXM6IEZhaWxlZCB0byB3cml0ZSBhdXggcHdtZ2VuIGJpdAo+ID4gY291bnQ6ICVkXG4iLAo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoYmwtPnB3bV9mcmVxX3ByZV9kaXZpZGVyKSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGVi KGF1eCwgRFBfRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCwgYmwtCj4gPiA+cHdtX2ZyZXFfcHJlX2Rp dmlkZXIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RF QlVHX0tNUygiJXM6IEZhaWxlZCB0byB3cml0ZSBhdXggYmFja2xpZ2h0Cj4gPiBmcmVxdWVuY3k6 ICVkXG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZXdfZHBjZF9idWYgfD0KPiA+IERQX0VEUF9CQUNLTElH SFRfRlJFUV9BVVhfU0VUX0VOQUJMRTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvC oMKgwqDCoMKgwqDCoGlmIChuZXdfZHBjZF9idWYgIT0gZHBjZF9idWYpIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoYXV4LAo+ID4g RFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwgbmV3X2RwY2RfYnVmKTsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RFQlVHX0tNUygiJXM6 IEZhaWxlZCB0byB3cml0ZSBhdXggYmFja2xpZ2h0Cj4gPiBtb2RlOiAlZFxuIiwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0IDwgMCA/IHJldCA6IC1FSU87Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4g Kwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfc2V0X2xldmVsKGF1 eCwgYmwsIGxldmVsKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgPCAwKQo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqBy ZXQgPSBkcm1fZWRwX2JhY2tsaWdodF9zZXRfZW5hYmxlKGF1eCwgYmwsIHRydWUpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKHJldCA8IDApCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30K PiA+ICtFWFBPUlRfU1lNQk9MKGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZSk7Cj4gPiArCj4gPiAr LyoqCj4gPiArICogZHJtX2VkcF9iYWNrbGlnaHRfZGlzYWJsZSgpIC0gRGlzYWJsZSBhbiBlRFAg YmFja2xpZ2h0IHVzaW5nIERQQ0QsIGlmCj4gPiBzdXBwb3J0ZWQKPiA+ICsgKiBAYXV4OiBUaGUg RFAgQVVYIGNoYW5uZWwgdG8gdXNlCj4gPiArICogQGJsOiBCYWNrbGlnaHQgY2FwYWJpbGl0eSBp bmZvIGZyb20gZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgpCj4gPiArICoKPiA+ICsgKiBUaGlzIGZ1 bmN0aW9uIGhhbmRsZXMgZGlzYWJsaW5nIERQQ0QgYmFja2xpZ2h0IGNvbnRyb2xzIG9uIGEgcGFu ZWwgb3Zlcgo+ID4gQVVYLiBOb3RlIHRoYXQgc29tZQo+ID4gKyAqIHBhbmVscyBoYXZlIGJhY2ts aWdodHMgdGhhdCBhcmUgZW5hYmxlZC9kaXNhYmxlZCBieSBvdGhlciBtZWFucywgZGVzcGl0ZQo+ ID4gaGF2aW5nIHRoZWlyIGJyaWdodG5lc3MKPiA+ICsgKiB2YWx1ZXMgY29udHJvbGxlZCB0aHJv dWdoIERQQ0QuIE9uIHN1Y2ggcGFuZWxzCj4gPiAmZHJtX2VkcF9iYWNrbGlnaHRfaW5mby5hdXhf ZW5hYmxlIHdpbGwgYmUgc2V0IHRvCj4gPiArICogJWZhbHNlLCB0aGlzIGZ1bmN0aW9uIHdpbGwg YmVjb21lIGEgbm8tb3AgKGFuZCB3ZSB3aWxsIHNraXAgdXBkYXRpbmcKPiA+ICsgKiAlRFBfRURQ X0RJU1BMQVlfQ09OVFJPTF9SRUdJU1RFUiksIGFuZCB0aGUgZHJpdmVyIG11c3QgdGFrZSBjYXJl IHRvCj4gPiBwZXJmb3JtIGl0J3Mgb3duCj4gPiArICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMg c3RlcCBmb3IgZGlzYWJsaW5nIHRoZSBiYWNrbGlnaHQuCj4gPiArICoKPiA+ICsgKiBSZXR1cm5z OiAlMCBvbiBzdWNjZXNzIG9yIG5vLW9wLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUu Cj4gPiArICovCj4gPiAraW50IGRybV9lZHBfYmFja2xpZ2h0X2Rpc2FibGUoc3RydWN0IGRybV9k cF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCkK PiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDC oMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfc2V0X2VuYWJsZShhdXgsIGJsLCBmYWxzZSk7Cj4g PiArwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4g PiArfQo+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2VkcF9iYWNrbGlnaHRfZGlzYWJsZSk7Cj4gPiAr Cj4gPiArc3RhdGljIGlubGluZSBpbnQKPiA+ICtkcm1fZWRwX2JhY2tsaWdodF9wcm9iZV9tYXgo c3RydWN0IGRybV9kcF9hdXggKmF1eCwgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZv ICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHUxNiBkcml2ZXJfcHdtX2ZyZXFfaHosIGNvbnN0IHU4Cj4gPiBlZHBfZHBjZFtFRFBf RElTUExBWV9DVExfQ0FQX1NJWkVdKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCBmeHAs IGZ4cF9taW4sIGZ4cF9tYXgsIGZ4cF9hY3R1YWwsIGYgPSAxOwo+ID4gK8KgwqDCoMKgwqDCoMKg aW50IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IHBuLCBwbl9taW4sIHBuX21heDsKPiA+ICsK PiA+ICvCoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKGF1eCwgRFBfRURQX1BX TUdFTl9CSVRfQ09VTlQsICZwbik7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdfS01TKCIlczogRmFp bGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXA6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCBy ZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PREVWOwo+ ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcG4gJj0gRFBfRURQ X1BXTUdFTl9CSVRfQ09VTlRfTUFTSzsKPiA+ICvCoMKgwqDCoMKgwqDCoGJsLT5tYXggPSAoMSA8 PCBwbikgLSAxOwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCFkcml2ZXJfcHdtX2ZyZXFfaHopCj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiArCj4gPiArwqDC oMKgwqDCoMKgwqAvKgo+ID4gK8KgwqDCoMKgwqDCoMKgICogU2V0IFBXTSBGcmVxdWVuY3kgZGl2 aWRlciB0byBtYXRjaCBkZXNpcmVkIGZyZXF1ZW5jeSBwcm92aWRlZCBieQo+ID4gdGhlIGRyaXZl ci4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFRoZSBQV00gRnJlcXVlbmN5IGlzIGNhbGN1bGF0ZWQg YXMgMjdNaHogLyAoRiB4IFApLgo+ID4gK8KgwqDCoMKgwqDCoMKgICogLSBXaGVyZSBGID0gUFdN IEZyZXF1ZW5jeSBQcmUtRGl2aWRlciB2YWx1ZSBwcm9ncmFtbWVkIGJ5IGZpZWxkCj4gPiA3OjAg b2YgdGhlCj4gPiArwqDCoMKgwqDCoMKgwqAgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBFRFBf QkFDS0xJR0hUX0ZSRVFfU0VUIHJlZ2lzdGVyIChEUENEIEFkZHJlc3MgMDA3MjhoKQo+ID4gK8Kg wqDCoMKgwqDCoMKgICogLSBXaGVyZSBQID0gMl5Qbiwgd2hlcmUgUG4gaXMgdGhlIHZhbHVlIHBy b2dyYW1tZWQgYnkgZmllbGQgNDowCj4gPiBvZiB0aGUKPiA+ICvCoMKgwqDCoMKgwqDCoCAqwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVEUF9QV01HRU5fQklUX0NPVU5UIHJlZ2lzdGVyIChEUENE IEFkZHJlc3MgMDA3MjRoKQo+ID4gK8KgwqDCoMKgwqDCoMKgICovCj4gPiArCj4gPiArwqDCoMKg wqDCoMKgwqAvKiBGaW5kIGRlc2lyZWQgdmFsdWUgb2YgKEYgeCBQKQo+ID4gK8KgwqDCoMKgwqDC oMKgICogTm90ZSB0aGF0LCBpZiBGIHggUCBpcyBvdXQgb2Ygc3VwcG9ydGVkIHJhbmdlLCB0aGUg bWF4aW11bSB2YWx1ZQo+ID4gb3IgbWluaW11bSB2YWx1ZSB3aWxsCj4gPiArwqDCoMKgwqDCoMKg wqAgKiBhcHBsaWVkIGF1dG9tYXRpY2FsbHkuIFNvIG5vIG5lZWQgdG8gY2hlY2sgdGhhdC4KPiA+ ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgZnhwID0gRElWX1JPVU5EX0NM T1NFU1QoMTAwMCAqIERQX0VEUF9CQUNLTElHSFRfRlJFUV9CQVNFX0tIWiwKPiA+IGRyaXZlcl9w d21fZnJlcV9oeik7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKiBVc2UgaGlnaGVzdCBwb3Nz aWJsZSB2YWx1ZSBvZiBQbiBmb3IgbW9yZSBncmFudWxhcml0eSBvZgo+ID4gYnJpZ2h0bmVzcyBh ZGp1c3RtZW50IHdoaWxlCj4gPiArwqDCoMKgwqDCoMKgwqAgKiBzYXRpZnlpbmcgdGhlIGNvbmRp dGlvbnMgYmVsb3cuCj4gPiArwqDCoMKgwqDCoMKgwqAgKiAtIFBuIGlzIGluIHRoZSByYW5nZSBv ZiBQbl9taW4gYW5kIFBuX21heAo+ID4gK8KgwqDCoMKgwqDCoMKgICogLSBGIGlzIGluIHRoZSBy YW5nZSBvZiAxIGFuZCAyNTUKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIC0gRnhQIGlzIHdpdGhpbiAy NSUgb2YgZGVzaXJlZCB2YWx1ZS4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqwqDCoCBOb3RlOiAyNSUg aXMgYXJiaXRyYXJ5IHZhbHVlIGFuZCBtYXkgbmVlZCBzb21lIHR3ZWFrLgo+ID4gK8KgwqDCoMKg wqDCoMKgICovCj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF9yZWFkYihhdXgs IERQX0VEUF9QV01HRU5fQklUX0NPVU5UX0NBUF9NSU4sCj4gPiAmcG5fbWluKTsKPiA+ICvCoMKg wqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBwd21nZW4gYml0IGNvdW50IGNh cCBtaW46Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKg wqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9FRFBfUFdNR0VOX0JJVF9DT1VO VF9DQVBfTUFYLAo+ID4gJnBuX21heCk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEp IHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdfS01TKCIlczog RmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXAgbWF4Ogo+ID4gJWRcbiIsIGF1eC0+ bmFtZSwgcmV0KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsK PiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKgwqDCoMKgwqDCoHBuX21pbiAmPSBEUF9FRFBf UFdNR0VOX0JJVF9DT1VOVF9NQVNLOwo+ID4gK8KgwqDCoMKgwqDCoMKgcG5fbWF4ICY9IERQX0VE UF9QV01HRU5fQklUX0NPVU5UX01BU0s7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKiBFbnN1 cmUgZnJlcXVlbmN5IGlzIHdpdGhpbiAyNSUgb2YgZGVzaXJlZCB2YWx1ZSAqLwo+ID4gK8KgwqDC oMKgwqDCoMKgZnhwX21pbiA9IERJVl9ST1VORF9DTE9TRVNUKGZ4cCAqIDMsIDQpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgZnhwX21heCA9IERJVl9ST1VORF9DTE9TRVNUKGZ4cCAqIDUsIDQpOwo+ID4g K8KgwqDCoMKgwqDCoMKgaWYgKGZ4cF9taW4gPCAoMSA8PCBwbl9taW4pIHx8ICgyNTUgPDwgcG5f bWF4KSA8IGZ4cF9tYXgpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1f REVCVUdfS01TKCIlczogRHJpdmVyIGRlZmluZWQgYmFja2xpZ2h0IGZyZXF1ZW5jeSAoJWQpCj4g PiBvdXQgb2YgcmFuZ2VcbiIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYXV4LT5uYW1lLCBkcml2ZXJfcHdtX2ZyZXFfaHopOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKg wqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgZm9yIChwbiA9IHBuX21heDsgcG4gPj0g cG5fbWluOyBwbi0tKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZiA9IGNs YW1wKERJVl9ST1VORF9DTE9TRVNUKGZ4cCwgMSA8PCBwbiksIDEsIDI1NSk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZnhwX2FjdHVhbCA9IGYgPDwgcG47Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGZ4cF9taW4gPD0gZnhwX2FjdHVhbCAmJiBmeHBf YWN0dWFsIDw9IGZ4cF9tYXgpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1eCwgRFBfRURQX1BXTUdFTl9CSVRf Q09VTlQsIHBuKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gd3Jp dGUgYXV4IHB3bWdlbiBiaXQgY291bnQ6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKgwqDC oMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgYmwtPnB3bWdlbl9iaXRfY291bnQgPSBwbjsKPiA+ICvC oMKgwqDCoMKgwqDCoGJsLT5tYXggPSAoMSA8PCBwbikgLSAxOwo+ID4gKwo+ID4gK8KgwqDCoMKg wqDCoMKgaWYgKGVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tMSUdIVF9GUkVRX0FVWF9TRVRfQ0FQ KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYmwtPnB3bV9mcmVxX3ByZV9k aXZpZGVyID0gZjsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdf S01TKCIlczogVXNpbmcgYmFja2xpZ2h0IGZyZXF1ZW5jeSBmcm9tIGRyaXZlcgo+ID4gKCVkSHop XG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGF1eC0+bmFtZSwgZHJpdmVyX3B3bV9mcmVxX2h6KTsKPiA+ICvCoMKgwqDCoMKg wqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiAK PiB0aGFua3MgZm9yIHRoZSBjbGVhbiB1cC4uLgo+IHVwIHRvIHRoaXMgcG9pbnQgaXQgd2FzIGVh c3kgdG8gc2VlIHRoZSBjb2RlIGFkZGVkIGFuZCBjb2RlIHJlbW92ZSBtYXRjaGVzLi4uCj4gCj4g PiArc3RhdGljIGlubGluZSBpbnQKPiA+ICtkcm1fZWRwX2JhY2tsaWdodF9wcm9iZV9sZXZlbChz dHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8g KmJsLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHU4ICpjdXJyZW50X21vZGUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgaW50 IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IGJ1ZlsyXTsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4 IG1vZGVfcmVnOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVh ZGIoYXV4LCBEUF9FRFBfQkFDS0xJR0hUX01PREVfU0VUX1JFR0lTVEVSLAo+ID4gJm1vZGVfcmVn KTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGln aHQgbW9kZTogJWRcbiIsCj4gPiBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUlPOwo+ID4gK8KgwqDCoMKg wqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgKmN1cnJlbnRfbW9kZSA9IChtb2RlX3Jl ZyAmIERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX01BU0spOwo+ID4gK8KgwqDCoMKgwqDC oMKgaWYgKCpjdXJyZW50X21vZGUgPT0gRFBfRURQX0JBQ0tMSUdIVF9DT05UUk9MX01PREVfRFBD RCkgewo+IAo+IEhvd2V2ZXIgSSdtIGFmcmFpZCB0aGF0IG9uIHRoaXMgYXJlYSBoZXJlIHdlIGhh dmUgc29tZXRoaW5nIHRoYXQgY291bGQgYmUKPiBpbXByb3ZlZCBmdXJ0aGVyLi4uCj4gCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50IHNpemUgPSAxICsgYmwtPmxzYl9yZWdf dXNlZDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1f ZHBfZHBjZF9yZWFkKGF1eCwgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX01TQiwKPiA+IGJ1 Ziwgc2l6ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSBz aXplKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGlnaHQgbGV2ZWw6Cj4gPiAl ZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+IAo+IEJ1dCBwcm9iYWJseSB0aGUgYmlnZ2VzdCBibG9j a2VyIGlzIHRoZSAicmVncmVzc2lvbiIgb2YgdGhlIGRlYnVnIGxvZ3MuCj4gTm90IGp1c3QgaW4g dGhpcyBwb2ludCwgYnV0IEkgbWVhbiBldmVyeXdoZXJlLi4uCj4gdGhlIHVzZSBvZiB0aGUgb2xk IERSTV9ERUJVR19LTVMgc2hvdWxkIGJlIGF2b2lkZWQgaGVyZSBpbWhvLgo+IEFsdGhvdWdoIGl0 IGlzIGJhY2tsaWdodCwgd2hhdCBpdCB3b3VsZCBtZWFuIGludGVncmF0ZWQgYW5kIG9ubHkKPiBv bmUgZGV2aWNlIGF2YWlsYWJsZSwgdGhpcyB3aWxsIGF0IGxlYXN0IGNoYW5nZSBob3cgd2Ugc2Vl IHRoZSBsb2dzLi4KPiAKPiBBbnkgY2hhbmdlIG9mIHVzaW5nIGRybV9kYmdfKihkcm0sID8hCgpJ dCdsbCB0YWtlIGEgdHJlZS13aWRlIHBhdGNoIHNlcmllcywgYnV0IEknbGwgZ28gYWhlYWQgYW5k IGRvIHRoYXQKdG9kYXkvdG9tb3Jyb3cgOikKCj4gCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgaWYgKGJsLT5sc2JfcmVnX3VzZWQpCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAoYnVmWzBdIDw8IDgpIHwg YnVmWzFdOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIGJ1ZlswXTsK PiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoC8qCj4gPiArwqDC oMKgwqDCoMKgwqAgKiBJZiB3ZSdyZSBub3QgaW4gRFBDRCBjb250cm9sIG1vZGUgeWV0LCB0aGUg cHJvZ3JhbW1lZCBicmlnaHRuZXNzCj4gPiB2YWx1ZSBpcyBtZWFuaW5nbGVzcyBhbmQKPiA+ICvC oMKgwqDCoMKgwqDCoCAqIHRoZSBkcml2ZXIgc2hvdWxkIGFzc3VtZSBtYXggYnJpZ2h0bmVzcwo+ ID4gK8KgwqDCoMKgwqDCoMKgICovCj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gYmwtPm1heDsK PiA+ICt9Cj4gPiArCj4gPiArLyoqCj4gPiArICogZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgpIC0g UHJvYmUgYSBkaXNwbGF5IHBhbmVsJ3MgVENPTiB1c2luZyB0aGUKPiA+IHN0YW5kYXJkIFZFU0Eg ZURQIGJhY2tsaWdodAo+ID4gKyAqIGludGVyZmFjZS4KPiA+ICsgKiBAYXV4OiBUaGUgRFAgYXV4 IGRldmljZSB0byB1c2UgZm9yIHByb2JpbmcKPiA+ICsgKiBAYmw6IFRoZSAmZHJtX2VkcF9iYWNr bGlnaHRfaW5mbyBzdHJ1Y3QgdG8gZmlsbCBvdXQgd2l0aCBpbmZvcm1hdGlvbiBvbgo+ID4gdGhl IGJhY2tsaWdodAo+ID4gKyAqIEBkcml2ZXJfcHdtX2ZyZXFfaHo6IE9wdGlvbmFsIFBXTSBmcmVx dWVuY3kgZnJvbSB0aGUgZHJpdmVyIGluIGh6Cj4gPiArICogQGVkcF9kcGNkOiBBIGNhY2hlZCBj b3B5IG9mIHRoZSBlRFAgRFBDRAo+ID4gKyAqIEBjdXJyZW50X2xldmVsOiBXaGVyZSB0byBzdG9y ZSB0aGUgcHJvYmVkIGJyaWdodG5lc3MgbGV2ZWwKPiA+ICsgKiBAY3VycmVudF9tb2RlOiBXaGVy ZSB0byBzdG9yZSB0aGUgY3VycmVudGx5IHNldCBiYWNrbGlnaHQgY29udHJvbCBtb2RlCj4gPiAr ICoKPiA+ICsgKiBJbml0aWFsaXplcyBhICZkcm1fZWRwX2JhY2tsaWdodF9pbmZvIHN0cnVjdCBi eSBwcm9iaW5nIEBhdXggZm9yIGl0J3MKPiA+IGJhY2tsaWdodCBjYXBhYmlsaXRpZXMsCj4gPiAr ICogYWxvbmcgd2l0aCBhbHNvIHByb2JpbmcgdGhlIGN1cnJlbnQgYW5kIG1heGltdW0gc3VwcG9y dGVkIGJyaWdodG5lc3MKPiA+IGxldmVscy4KPiA+ICsgKgo+ID4gKyAqIElmIEBkcml2ZXJfcHdt X2ZyZXFfaHogaXMgbm9uLXplcm8sIHRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSBiYWNrbGlnaHQK PiA+IGZyZXF1ZW5jeS4gT3RoZXJ3aXNlLCB0aGUKPiA+ICsgKiBkZWZhdWx0IGZyZXF1ZW5jeSBm cm9tIHRoZSBwYW5lbCBpcyB1c2VkLgo+ID4gKyAqCj4gPiArICogUmV0dXJuczogJTAgb24gc3Vj Y2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+ID4gKyAqLwo+ID4gK2ludAo+ ID4gK2RybV9lZHBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kcF9hdXggKmF1eCwgc3RydWN0 Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTE2IGRyaXZlcl9wd21fZnJlcV9oeiwgY29uc3QgdTgK PiA+IGVkcF9kcGNkW0VEUF9ESVNQTEFZX0NUTF9DQVBfU0laRV0sCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUxNiAqY3VycmVudF9sZXZlbCwgdTggKmN1 cnJlbnRfbW9kZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gKwo+ID4g K8KgwqDCoMKgwqDCoMKgaWYgKGVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9BVVhfRU5B QkxFX0NBUCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBibC0+YXV4X2VuYWJs ZSA9IHRydWU7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoZWRwX2RwY2RbMl0gJiBEUF9FRFBfQkFD S0xJR0hUX0JSSUdIVE5FU1NfQllURV9DT1VOVCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBibC0+bHNiX3JlZ191c2VkID0gdHJ1ZTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDC oHJldCA9IGRybV9lZHBfYmFja2xpZ2h0X3Byb2JlX21heChhdXgsIGJsLCBkcml2ZXJfcHdtX2Zy ZXFfaHosCj4gPiBlZHBfZHBjZCk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfcHJvYmVfbGV2ZWwoYXV4LCBibCwg Y3VycmVudF9tb2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgPCAwKQo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqAq Y3VycmVudF9sZXZlbCA9IHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19L TVMoIiVzOiBGb3VuZCBiYWNrbGlnaHQgbGV2ZWw9JWQvJWQKPiA+IHB3bV9mcmVxX3ByZV9kaXZp ZGVyPSVkIG1vZGU9JXhcbiIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBhdXgtPm5hbWUsICpjdXJyZW50X2xldmVsLCBibC0+bWF4LCBibC0KPiA+ID5wd21f ZnJlcV9wcmVfZGl2aWRlciwgKmN1cnJlbnRfbW9kZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBEUk1f REVCVUdfS01TKCIlczogQmFja2xpZ2h0IGNhcHM6IHB3bWdlbl9iaXRfY291bnQ9JWQKPiA+IGxz Yl9yZWdfdXNlZD0lZCBhdXhfZW5hYmxlPSVkXG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYXV4LT5uYW1lLCBibC0+cHdtZ2VuX2JpdF9jb3VudCwgYmwt PmxzYl9yZWdfdXNlZCwgYmwtCj4gPiA+YXV4X2VuYWJsZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBy ZXR1cm4gMDsKPiA+ICt9Cj4gPiArRVhQT1JUX1NZTUJPTChkcm1fZWRwX2JhY2tsaWdodF9pbml0 KTsKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rp c3BsYXlfdHlwZXMuaAo+ID4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rp c3BsYXlfdHlwZXMuaAo+ID4gaW5kZXggMWQ4OTg0MDc3ZThhLi45ZjQzZDBiMTRlMTEgMTAwNjQ0 Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rpc3BsYXlfdHlw ZXMuaAo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kaXNwbGF5 X3R5cGVzLmgKPiA+IEBAIC0yNjQsMTAgKzI2NCw3IEBAIHN0cnVjdCBpbnRlbF9wYW5lbCB7Cj4g PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIERQQ0QgYmFja2xpZ2h0ICovCj4g PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVuaW9uIHsKPiA+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB7Cj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1 OCBwd21nZW5fYml0X2NvdW50Owo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTggcHdtX2ZyZXFfcHJlX2RpdmlkZXI7Cj4g PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBib29sIGxzYl9yZWdfdXNlZDsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJvb2wgYXV4X2VuYWJsZTsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHN0cnVjdCBkcm1fZWRwX2JhY2tsaWdodF9pbmZvIGluZm87Cj4gPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9IHZlc2E7Cj4gPiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qgewo+ID4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGJvb2wgc2RyX3VzZXNfYXV4Owo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiBpbmRleCBhOThkOWJk NGIwZWQuLjI4NmViMzM3NDQ4ZSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQuYwo+ID4gQEAgLTI3MCwxMTQg KzI3MCwxOSBAQCBpbnRlbF9kcF9hdXhfaGRyX3NldHVwX2JhY2tsaWdodChzdHJ1Y3QKPiA+IGlu dGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBlbnVtIHBpcGUgcGkKPiA+IMKgfQo+ID4gwqAKPiA+ IMKgLyogVkVTQSBiYWNrbGlnaHQgY2FsbGJhY2tzICovCj4gPiAtc3RhdGljIGJvb2wgaW50ZWxf ZHBfYXV4X3Zlc2FfYmFja2xpZ2h0X2RwY2RfbW9kZShzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yCj4g PiAqY29ubmVjdG9yKQo+ID4gLXsKPiA+IC3CoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9kcCAq aW50ZWxfZHAgPSBpbnRlbF9hdHRhY2hlZF9kcChjb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKgwqDC oMKgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBkcF90b19pOTE1KGludGVsX2RwKTsK PiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDCoMKgwqDCoMKgwqB1OCBtb2RlX3Jl ZzsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKCZpbnRl bF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwgJm1vZGVf cmVnKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQgdG8gcmVh ZCBiYWNrbGlnaHQgbW9kZToKPiA+ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiBmYWxzZTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+ IC3CoMKgwqDCoMKgwqDCoHJldHVybiAobW9kZV9yZWcgJiBEUF9FRFBfQkFDS0xJR0hUX0NPTlRS T0xfTU9ERV9NQVNLKSA9PQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIERQX0VEUF9C QUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0Q7Cj4gPiAtfQo+ID4gLQo+ID4gLS8qCj4gPiAtICog UmVhZCB0aGUgY3VycmVudCBiYWNrbGlnaHQgdmFsdWUgZnJvbSBEUENEIHJlZ2lzdGVyKHMpIGJh c2VkCj4gPiAtICogb24gaWYgOC1iaXQoTVNCKSBvciAxNi1iaXQoTVNCIGFuZCBMU0IpIHZhbHVl cyBhcmUgc3VwcG9ydGVkCj4gPiAtICovCj4gPiDCoHN0YXRpYyB1MzIgaW50ZWxfZHBfYXV4X3Zl c2FfZ2V0X2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yCj4gPiAqY29ubmVjdG9yLCBl bnVtIHBpcGUgdW51c2VkKQo+ID4gwqB7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxf ZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+IC3CoMKgwqDC oMKgwqDCoHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZHBfdG9faTkxNShpbnRlbF9k cCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gLcKgwqDCoMKgwqDCoMKgdTggcmVh ZF92YWxbMl0gPSB7IDB4MCB9Owo+ID4gLcKgwqDCoMKgwqDCoMKgdTE2IGxldmVsID0gMDsKPiA+ IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qCj4gPiAtwqDCoMKgwqDCoMKgwqAgKiBJZiB3ZSdyZSBu b3QgaW4gRFBDRCBjb250cm9sIG1vZGUgeWV0LCB0aGUgcHJvZ3JhbW1lZCBicmlnaHRuZXNzCj4g PiAtwqDCoMKgwqDCoMKgwqAgKiB2YWx1ZSBpcyBtZWFuaW5nbGVzcyBhbmQgd2Ugc2hvdWxkIGFz c3VtZSBtYXggYnJpZ2h0bmVzcwo+ID4gLcKgwqDCoMKgwqDCoMKgICovCj4gPiAtwqDCoMKgwqDC oMKgwqBpZiAoIWludGVsX2RwX2F1eF92ZXNhX2JhY2tsaWdodF9kcGNkX21vZGUoY29ubmVjdG9y KSkKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gY29ubmVjdG9yLT5w YW5lbC5iYWNrbGlnaHQubWF4Owo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2Rw X2RwY2RfcmVhZCgmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVT U19NU0IsICZyZWFkX3ZhbCwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZihyZWFkX3ZhbCkpOwo+ID4gLcKgwqDCoMKg wqDCoMKgaWYgKHJldCAhPSBzaXplb2YocmVhZF92YWwpKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRybSwgIkZhaWxlZCB0byByZWFkIGJy aWdodG5lc3MgbGV2ZWw6Cj4gPiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKg wqDCoMKgwqDCoGlmIChjb25uZWN0b3ItPnBhbmVsLmJhY2tsaWdodC5lZHAudmVzYS5sc2JfcmVn X3VzZWQpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGV2ZWwgPSAocmVhZF92 YWxbMF0gPDwgOCB8IHJlYWRfdmFsWzFdKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGVsc2UKPiA+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsZXZlbCA9IHJlYWRfdmFsWzBdOwo+ID4gLQo+ ID4gLcKgwqDCoMKgwqDCoMKgcmV0dXJuIGxldmVsOwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJu IGNvbm5lY3Rvci0+cGFuZWwuYmFja2xpZ2h0LmxldmVsOwo+ID4gwqB9Cj4gPiDCoAo+ID4gLS8q Cj4gPiAtICogU2VuZHMgdGhlIGN1cnJlbnQgYmFja2xpZ2h0IGxldmVsIG92ZXIgdGhlIGF1eCBj aGFubmVsLCBjaGVja2luZyBpZiBpdHMKPiA+IHVzaW5nCj4gPiAtICogOC1iaXQgb3IgMTYgYml0 IHZhbHVlIChNU0IgYW5kIExTQikKPiA+IC0gKi8KPiA+IMKgc3RhdGljIHZvaWQKPiA+IC1pbnRl bF9kcF9hdXhfdmVzYV9zZXRfYmFja2xpZ2h0KGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0 YXRlCj4gPiAqY29ubl9zdGF0ZSwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUzMiBsZXZlbCkKPiA+ICtpbnRlbF9kcF9h dXhfdmVzYV9zZXRfYmFja2xpZ2h0KGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlCj4g PiAqY29ubl9zdGF0ZSwgdTMyIGxldmVsKQo+ID4gwqB7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgc3Ry dWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gdG9faW50ZWxfY29ubmVjdG9yKGNvbm5f c3RhdGUtCj4gPiA+Y29ubmVjdG9yKTsKPiA+IC3CoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9k cCAqaW50ZWxfZHAgPSBpbnRlbF9hdHRhY2hlZF9kcChjb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKg wqDCoMKgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBkcF90b19pOTE1KGludGVsX2Rw KTsKPiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDCoMKgwqDCoMKgwqB1OCB2YWxz WzJdID0geyAweDAgfTsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qIFdyaXRlIHRoZSBNU0Ig YW5kL29yIExTQiAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKGNvbm5lY3Rvci0+cGFuZWwuYmFj a2xpZ2h0LmVkcC52ZXNhLmxzYl9yZWdfdXNlZCkgewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHZhbHNbMF0gPSAobGV2ZWwgJiAweEZGMDApID4+IDg7Cj4gPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFsc1sxXSA9IChsZXZlbCAmIDB4RkYpOwo+ID4gLcKgwqDC oMKgwqDCoMKgfSBlbHNlIHsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YWxz WzBdID0gbGV2ZWw7Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtCj4gPiAtwqDCoMKgwqDCoMKg wqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZSgmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9CQUNL TElHSFRfQlJJR0hUTkVTU19NU0IsIHZhbHMsCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzaXplb2YodmFscykpOwo+ID4g LcKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSBzaXplb2YodmFscykpIHsKPiA+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiRmFpbGVkIHRvIHdy aXRlIGF1eCBiYWNrbGlnaHQKPiA+IGxldmVsOiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtfQo+ ID4gLQo+ID4gLXN0YXRpYyB2b2lkIHNldF92ZXNhX2JhY2tsaWdodF9lbmFibGUoc3RydWN0IGlu dGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gYm9vbCBlbmFibGUpCj4gPiAtewo+ID4gLcKg wqDCoMKgwqDCoMKgc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGludGVsX2F0dGFjaGVkX2Rw KGNvbm5lY3Rvcik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gLcKgwqDCoMKgwqDCoMKgaW50IHJldDsK PiA+IC3CoMKgwqDCoMKgwqDCoHU4IHJlZ192YWwgPSAwOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDC oMKgLyogRWFybHkgcmV0dXJuIHdoZW4gZGlzcGxheSB1c2Ugb3RoZXIgbWVjaGFuaXNtIHRvIGVu YWJsZQo+ID4gYmFja2xpZ2h0LiAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKCFjb25uZWN0b3It PnBhbmVsLmJhY2tsaWdodC5lZHAudmVzYS5hdXhfZW5hYmxlKQo+ID4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRy bV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0RJU1BMQVlfQ09OVFJP TF9SRUdJU1RFUiwgJnJlZ192YWwpOwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSAxKSB7 Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRy bSwgIkZhaWxlZCB0byByZWFkIGVEUCBkaXNwbGF5IGNvbnRyb2wKPiA+IHJlZ2lzdGVyOiAlZFxu IiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gPiAt wqDCoMKgwqDCoMKgwqB9Cj4gPiAtCj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoZW5hYmxlKQo+ID4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlZ192YWwgfD0gRFBfRURQX0JBQ0tMSUdI VF9FTkFCTEU7Cj4gPiAtwqDCoMKgwqDCoMKgwqBlbHNlCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmVnX3ZhbCAmPSB+KERQX0VEUF9CQUNLTElHSFRfRU5BQkxFKTsKPiA+ICvC oMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmY29ubmVjdG9yLT5wYW5l bDsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9f aW50ZWxfZHAoY29ubmVjdG9yLT5lbmNvZGVyKTsKPiA+IMKgCj4gPiAtwqDCoMKgwqDCoMKgwqBy ZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJmludGVsX2RwLT5hdXgsCj4gPiBEUF9FRFBfRElTUExB WV9DT05UUk9MX1JFR0lTVEVSLCByZWdfdmFsKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQg IT0gMSkgewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZp OTE1LT5kcm0sICJGYWlsZWQgdG8gJXMgYXV4IGJhY2tsaWdodDogJWRcbiIsCj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbmFibGUgPyAi ZW5hYmxlIiA6ICJkaXNhYmxlIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKg wqDCoMKgwqDCoGRybV9lZHBfYmFja2xpZ2h0X3NldF9sZXZlbCgmaW50ZWxfZHAtPmF1eCwgJnBh bmVsLQo+ID4gPmJhY2tsaWdodC5lZHAudmVzYS5pbmZvLCBsZXZlbCk7Cj4gPiDCoH0KPiA+IMKg Cj4gPiDCoHN0YXRpYyB2b2lkCj4gPiBAQCAtMzg1LDE3MCArMjkwLDQ2IEBAIGludGVsX2RwX2F1 eF92ZXNhX2VuYWJsZV9iYWNrbGlnaHQoY29uc3Qgc3RydWN0Cj4gPiBpbnRlbF9jcnRjX3N0YXRl ICpjcnRjX3N0YXRlLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3Jf c3RhdGUKPiA+ICpjb25uX3N0YXRlLCB1MzIgbGV2ZWwpCj4gPiDCoHsKPiA+IMKgwqDCoMKgwqDC oMKgwqBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IgPSB0b19pbnRlbF9jb25uZWN0 b3IoY29ubl9zdGF0ZS0KPiA+ID5jb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKgwqDCoMKgc3RydWN0 IGludGVsX2RwICppbnRlbF9kcCA9IGludGVsX2F0dGFjaGVkX2RwKGNvbm5lY3Rvcik7Cj4gPiAt wqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGRwX3RvX2k5MTUo aW50ZWxfZHApOwo+ID4gwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwg PSAmY29ubmVjdG9yLT5wYW5lbDsKPiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDC oMKgwqDCoMKgwqB1OCBkcGNkX2J1ZiwgbmV3X2RwY2RfYnVmOwo+ID4gLcKgwqDCoMKgwqDCoMKg dTggcHdtZ2VuX2JpdF9jb3VudCA9IHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EucHdtZ2VuX2Jp dF9jb3VudDsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRi KCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwg JmRwY2RfYnVmKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQg dG8gcmVhZCBiYWNrbGlnaHQgbW9kZToKPiA+ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+ IC3CoMKgwqDCoMKgwqDCoG5ld19kcGNkX2J1ZiA9IGRwY2RfYnVmOwo+ID4gLQo+ID4gLcKgwqDC oMKgwqDCoMKgaWYgKChkcGNkX2J1ZiAmIERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX01B U0spICE9Cj4gPiBEUF9FRFBfQkFDS0xJR0hUX0NPTlRST0xfTU9ERV9EUENEKSB7Cj4gPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbmV3X2RwY2RfYnVmICY9IH5EUF9FRFBfQkFDS0xJ R0hUX0NPTlRST0xfTU9ERV9NQVNLOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oG5ld19kcGNkX2J1ZiB8PSBEUF9FRFBfQkFDS0xJR0hUX0NPTlRST0xfTU9ERV9EUENEOwo+ID4g LQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3dy aXRlYigmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9QV01HRU5fQklUX0NPVU5ULCBwd21nZW5f Yml0X2NvdW50KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9 IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRy bV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQgdG8gd3JpdGUgYXV4IHB3bWdlbgo+ID4gYml0 IGNvdW50OiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKg wqDCoMKgwqDCoGlmIChwYW5lbC0+YmFja2xpZ2h0LmVkcC52ZXNhLnB3bV9mcmVxX3ByZV9kaXZp ZGVyKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2Rw Y2Rfd3JpdGViKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCwK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGFuZWwtCj4gPiA+YmFja2xpZ2h0LmVkcC52ZXNh LnB3bV9mcmVxX3ByZV9kaXZpZGVyKTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBpZiAocmV0ID09IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoG5ld19kcGNkX2J1ZiB8PQo+ID4gRFBfRURQX0JBQ0tMSUdIVF9GUkVRX0FVWF9T RVRfRU5BQkxFOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiA+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMo Jmk5MTUtPmRybSwgIkZhaWxlZCB0byB3cml0ZSBhdXgKPiA+IGJhY2tsaWdodCBmcmVxdWVuY3k6 ICVkXG4iLAo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAt Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAobmV3X2RwY2RfYnVmICE9IGRwY2RfYnVmKSB7Cj4gPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKCZp bnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwKPiA+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbmV3X2RwY2RfYnVmKTsKPiA+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQg dG8gd3JpdGUgYXV4Cj4gPiBiYWNrbGlnaHQgbW9kZTogJWRcbiIsIHJldCk7Cj4gPiAtwqDCoMKg wqDCoMKgwqB9Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0g ZW5jX3RvX2ludGVsX2RwKGNvbm5lY3Rvci0+ZW5jb2Rlcik7Cj4gPiDCoAo+ID4gLcKgwqDCoMKg wqDCoMKgaW50ZWxfZHBfYXV4X3Zlc2Ffc2V0X2JhY2tsaWdodChjb25uX3N0YXRlLCBsZXZlbCk7 Cj4gPiAtwqDCoMKgwqDCoMKgwqBzZXRfdmVzYV9iYWNrbGlnaHRfZW5hYmxlKGNvbm5lY3Rvciwg dHJ1ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoJmludGVs X2RwLT5hdXgsICZwYW5lbC0KPiA+ID5iYWNrbGlnaHQuZWRwLnZlc2EuaW5mbywgbGV2ZWwpOwo+ ID4gwqB9Cj4gPiDCoAo+ID4gwqBzdGF0aWMgdm9pZCBpbnRlbF9kcF9hdXhfdmVzYV9kaXNhYmxl X2JhY2tsaWdodChjb25zdCBzdHJ1Y3QKPiA+IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9jb25u X3N0YXRlLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTMyIGxl dmVsKQo+ID4gwqB7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzZXRfdmVzYV9iYWNrbGlnaHRfZW5hYmxl KHRvX2ludGVsX2Nvbm5lY3RvcihvbGRfY29ubl9zdGF0ZS0KPiA+ID5jb25uZWN0b3IpLCBmYWxz ZSk7Cj4gPiAtfQo+ID4gLQo+ID4gLS8qCj4gPiAtICogQ29tcHV0ZSBQV00gZnJlcXVlbmN5IGRp dmlkZXIgdmFsdWUgYmFzZWQgb2ZmIHRoZSBmcmVxdWVuY3kgcHJvdmlkZWQgdG8KPiA+IHVzIGJ5 IHRoZSB2YnQuCj4gPiAtICogVGhlIFBXTSBGcmVxdWVuY3kgaXMgY2FsY3VsYXRlZCBhcyAyN01o eiAvIChGIHggUCkuCj4gPiAtICogLSBXaGVyZSBGID0gUFdNIEZyZXF1ZW5jeSBQcmUtRGl2aWRl ciB2YWx1ZSBwcm9ncmFtbWVkIGJ5IGZpZWxkIDc6MCBvZgo+ID4gdGhlCj4gPiAtICrCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCByZWdpc3RlciAoRFBDRCBB ZGRyZXNzIDAwNzI4aCkKPiA+IC0gKiAtIFdoZXJlIFAgPSAyXlBuLCB3aGVyZSBQbiBpcyB0aGUg dmFsdWUgcHJvZ3JhbW1lZCBieSBmaWVsZCA0OjAgb2YgdGhlCj4gPiAtICrCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgRURQX1BXTUdFTl9CSVRfQ09VTlQgcmVnaXN0ZXIgKERQQ0QgQWRkcmVzcyAw MDcyNGgpCj4gPiAtICovCj4gPiAtc3RhdGljIHUzMiBpbnRlbF9kcF9hdXhfdmVzYV9jYWxjX21h eF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3Rvcgo+ID4gKmNvbm5lY3RvcikKPiA+IC17 Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5 MTUoY29ubmVjdG9yLT5iYXNlLmRldik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxf ZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+ICvCoMKgwqDC oMKgwqDCoHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciA9Cj4gPiB0b19pbnRlbF9j b25uZWN0b3Iob2xkX2Nvbm5fc3RhdGUtPmNvbm5lY3Rvcik7Cj4gPiDCoMKgwqDCoMKgwqDCoMKg c3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZjb25uZWN0b3ItPnBhbmVsOwo+ID4gLcKgwqDC oMKgwqDCoMKgdTMyIG1heF9iYWNrbGlnaHQgPSAwOwo+ID4gLcKgwqDCoMKgwqDCoMKgaW50IHJl dCwgZnJlcSwgZnhwLCBmeHBfbWluLCBmeHBfbWF4LCBmeHBfYWN0dWFsLCBmID0gMTsKPiA+IC3C oMKgwqDCoMKgwqDCoHU4IHBuLCBwbl9taW4sIHBuX21heDsKPiA+IC0KPiA+IC3CoMKgwqDCoMKg wqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LCBEUF9FRFBfUFdNR0VO X0JJVF9DT1VOVCwKPiA+ICZwbik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJt LCAiRmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudAo+ID4gY2FwOiAlZFxuIiwgcmV0KTsK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+IC3CoMKgwqDC oMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHBuICY9IERQX0VEUF9QV01HRU5fQklU X0NPVU5UX01BU0s7Cj4gPiAtwqDCoMKgwqDCoMKgwqBtYXhfYmFja2xpZ2h0ID0gKDEgPDwgcG4p IC0gMTsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qIEZpbmQgZGVzaXJlZCB2YWx1ZSBvZiAo RiB4IFApCj4gPiAtwqDCoMKgwqDCoMKgwqAgKiBOb3RlIHRoYXQsIGlmIEYgeCBQIGlzIG91dCBv ZiBzdXBwb3J0ZWQgcmFuZ2UsIHRoZSBtYXhpbXVtIHZhbHVlCj4gPiBvcgo+ID4gLcKgwqDCoMKg wqDCoMKgICogbWluaW11bSB2YWx1ZSB3aWxsIGFwcGxpZWQgYXV0b21hdGljYWxseS4gU28gbm8g bmVlZCB0byBjaGVjawo+ID4gdGhhdC4KPiA+IC3CoMKgwqDCoMKgwqDCoCAqLwo+ID4gLcKgwqDC oMKgwqDCoMKgZnJlcSA9IGk5MTUtPnZidC5iYWNrbGlnaHQucHdtX2ZyZXFfaHo7Cj4gPiAtwqDC oMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiVkJUIGRlZmluZWQgYmFja2xpZ2h0 IGZyZXF1ZW5jeSAldSBIelxuIiwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZnJlcSk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoIWZyZXEpIHsKPiA+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLAo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlVzZSBwYW5l bCBkZWZhdWx0IGJhY2tsaWdodCBmcmVxdWVuY3lcbiIpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgZnhwID0gRElWX1JPVU5EX0NMT1NFU1QoS0h6KERQX0VE UF9CQUNLTElHSFRfRlJFUV9CQVNFX0tIWiksIGZyZXEpOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDC oMKgLyogVXNlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUgb2YgUG4gZm9yIG1vcmUgZ3JhbnVsYXJp dHkgb2YKPiA+IGJyaWdodG5lc3MKPiA+IC3CoMKgwqDCoMKgwqDCoCAqIGFkanVzdG1lbnQgd2hp bGUgc2F0aWZ5aW5nIHRoZSBjb25kaXRpb25zIGJlbG93Lgo+ID4gLcKgwqDCoMKgwqDCoMKgICog LSBQbiBpcyBpbiB0aGUgcmFuZ2Ugb2YgUG5fbWluIGFuZCBQbl9tYXgKPiA+IC3CoMKgwqDCoMKg wqDCoCAqIC0gRiBpcyBpbiB0aGUgcmFuZ2Ugb2YgMSBhbmQgMjU1Cj4gPiAtwqDCoMKgwqDCoMKg wqAgKiAtIEZ4UCBpcyB3aXRoaW4gMjUlIG9mIGRlc2lyZWQgdmFsdWUuCj4gPiAtwqDCoMKgwqDC oMKgwqAgKsKgwqAgTm90ZTogMjUlIGlzIGFyYml0cmFyeSB2YWx1ZSBhbmQgbWF5IG5lZWQgc29t ZSB0d2Vhay4KPiA+IC3CoMKgwqDCoMKgwqDCoCAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0ID0g ZHJtX2RwX2RwY2RfcmVhZGIoJmludGVsX2RwLT5hdXgsCj4gPiBEUF9FRFBfUFdNR0VOX0JJVF9D T1VOVF9DQVBfTUlOLCAmcG5fbWluKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkg ewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5k cm0sICJGYWlsZWQgdG8gcmVhZCBwd21nZW4gYml0IGNvdW50IGNhcAo+ID4gbWluOiAlZFxuIiwg cmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gbWF4X2JhY2ts aWdodDsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9k cF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX1BXTUdFTl9CSVRfQ09VTlRf Q0FQX01BWCwgJnBuX21heCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsKPiA+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAi RmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXAKPiA+IG1heDogJWRcbiIsIHJldCk7 Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIG1heF9iYWNrbGlnaHQ7 Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtwqDCoMKgwqDCoMKgwqBwbl9taW4gJj0gRFBfRURQ X1BXTUdFTl9CSVRfQ09VTlRfTUFTSzsKPiA+IC3CoMKgwqDCoMKgwqDCoHBuX21heCAmPSBEUF9F RFBfUFdNR0VOX0JJVF9DT1VOVF9NQVNLOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgLyogRW5z dXJlIGZyZXF1ZW5jeSBpcyB3aXRoaW4gMjUlIG9mIGRlc2lyZWQgdmFsdWUgKi8KPiA+IC3CoMKg wqDCoMKgwqDCoGZ4cF9taW4gPSBESVZfUk9VTkRfQ0xPU0VTVChmeHAgKiAzLCA0KTsKPiA+IC3C oMKgwqDCoMKgwqDCoGZ4cF9tYXggPSBESVZfUk9VTkRfQ0xPU0VTVChmeHAgKiA1LCA0KTsKPiA+ IC0KPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChmeHBfbWluIDwgKDEgPDwgcG5fbWluKSB8fCAoMjU1 IDw8IHBuX21heCkgPCBmeHBfbWF4KSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRybSwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJWQlQgZGVmaW5lZCBiYWNrbGlnaHQgZnJlcXVl bmN5IG91dCBvZgo+ID4gcmFuZ2VcbiIpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4g LcKgwqDCoMKgwqDCoMKgZm9yIChwbiA9IHBuX21heDsgcG4gPj0gcG5fbWluOyBwbi0tKSB7Cj4g PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZiA9IGNsYW1wKERJVl9ST1VORF9DTE9T RVNUKGZ4cCwgMSA8PCBwbiksIDEsIDI1NSk7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZnhwX2FjdHVhbCA9IGYgPDwgcG47Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgKGZ4cF9taW4gPD0gZnhwX2FjdHVhbCAmJiBmeHBfYWN0dWFsIDw9IGZ4cF9tYXgp Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFr Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgZHJtX2RiZ19r bXMoJmk5MTUtPmRybSwgIlVzaW5nIGVEUCBwd21nZW4gYml0IGNvdW50IG9mICVkXG4iLCBwbik7 Cj4gPiAtwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJmludGVsX2RwLT5h dXgsIERQX0VEUF9QV01HRU5fQklUX0NPVU5ULAo+ID4gcG4pOwo+ID4gLcKgwqDCoMKgwqDCoMKg aWYgKHJldCAhPSAxKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2Ri Z19rbXMoJmk5MTUtPmRybSwgIkZhaWxlZCB0byB3cml0ZSBhdXggcHdtZ2VuIGJpdAo+ID4gY291 bnQ6ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVy biBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4gLcKgwqDCoMKg wqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lZHAudmVzYS5wd21nZW5fYml0X2NvdW50ID0gcG47Cj4g PiAtwqDCoMKgwqDCoMKgwqBpZiAoaW50ZWxfZHAtPmVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tM SUdIVF9GUkVRX0FVWF9TRVRfQ0FQKQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EucHdtX2ZyZXFfcHJlX2RpdmlkZXIgPSBmOwo+ID4g LQo+ID4gLcKgwqDCoMKgwqDCoMKgbWF4X2JhY2tsaWdodCA9ICgxIDw8IHBuKSAtIDE7Cj4gPiAr wqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2Rw KGNvbm5lY3Rvci0+ZW5jb2Rlcik7Cj4gPiDCoAo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0dXJuIG1h eF9iYWNrbGlnaHQ7Cj4gPiArwqDCoMKgwqDCoMKgwqBkcm1fZWRwX2JhY2tsaWdodF9kaXNhYmxl KCZpbnRlbF9kcC0+YXV4LCAmcGFuZWwtCj4gPiA+YmFja2xpZ2h0LmVkcC52ZXNhLmluZm8pOwo+ ID4gwqB9Cj4gPiDCoAo+ID4gLXN0YXRpYyBpbnQgaW50ZWxfZHBfYXV4X3Zlc2Ffc2V0dXBfYmFj a2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IKPiA+ICpjb25uZWN0b3IsCj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSBwaXBlIHBpcGUpCj4gPiArc3RhdGljIGludCBp bnRlbF9kcF9hdXhfdmVzYV9zZXR1cF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3Rvcgo+ ID4gKmNvbm5lY3RvciwgZW51bSBwaXBlIHBpcGUpCj4gPiDCoHsKPiA+IMKgwqDCoMKgwqDCoMKg wqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9y KTsKPiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5l Y3Rvci0+cGFuZWw7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gK8KgwqDCoMKgwqDCoMKgdTE2IGN1cnJl bnRfbGV2ZWw7Cj4gPiArwqDCoMKgwqDCoMKgwqB1OCBjdXJyZW50X21vZGU7Cj4gPiArwqDCoMKg wqDCoMKgwqBpbnQgcmV0Owo+ID4gwqAKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChpbnRlbF9kcC0+ ZWRwX2RwY2RbMV0gJiBEUF9FRFBfQkFDS0xJR0hUX0FVWF9FTkFCTEVfQ0FQKQo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EuYXV4X2Vu YWJsZSA9IHRydWU7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoaW50ZWxfZHAtPmVkcF9kcGNkWzJd ICYgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX0JZVEVfQ09VTlQpCj4gPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lZHAudmVzYS5sc2JfcmVnX3Vz ZWQgPSB0cnVlOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5tYXgg PQo+ID4gaW50ZWxfZHBfYXV4X3Zlc2FfY2FsY19tYXhfYmFja2xpZ2h0KGNvbm5lY3Rvcik7Cj4g PiAtwqDCoMKgwqDCoMKgwqBpZiAoIXBhbmVsLT5iYWNrbGlnaHQubWF4KQo+ID4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PREVWOwo+ID4gK8KgwqDCoMKgwqDCoMKg cmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgmaW50ZWxfZHAtPmF1eCwgJnBhbmVsLQo+ID4g PmJhY2tsaWdodC5lZHAudmVzYS5pbmZvLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaTkxNS0+dmJ0LmJh Y2tsaWdodC5wd21fZnJlcV9oeiwKPiA+IGludGVsX2RwLT5lZHBfZHBjZCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICZjdXJyZW50X2xldmVsLCAmY3VycmVudF9tb2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDC oGlmIChyZXQgPCAwKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBy ZXQ7Cj4gPiDCoAo+ID4gK8KgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5tYXggPSBwYW5l bC0+YmFja2xpZ2h0LmVkcC52ZXNhLmluZm8ubWF4Owo+ID4gwqDCoMKgwqDCoMKgwqDCoHBhbmVs LT5iYWNrbGlnaHQubWluID0gMDsKPiA+IC3CoMKgwqDCoMKgwqDCoHBhbmVsLT5iYWNrbGlnaHQu bGV2ZWwgPSBpbnRlbF9kcF9hdXhfdmVzYV9nZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwKPiA+IHBp cGUpOwo+ID4gLcKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lbmFibGVkID0KPiA+IGlu dGVsX2RwX2F1eF92ZXNhX2JhY2tsaWdodF9kcGNkX21vZGUoY29ubmVjdG9yKSAmJgo+ID4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwYW5lbC0+YmFja2xpZ2h0LmxldmVsICE9IDA7Cj4gPiArwqDCoMKgwqDCoMKgwqBp ZiAoY3VycmVudF9tb2RlID09IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0QpIHsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5lbC0+YmFja2xpZ2h0LmxldmVs ID0gY3VycmVudF9sZXZlbDsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5l bC0+YmFja2xpZ2h0LmVuYWJsZWQgPSBwYW5lbC0+YmFja2xpZ2h0LmxldmVsICE9IDA7Cj4gPiAr wqDCoMKgwqDCoMKgwqB9IGVsc2Ugewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgPSBwYW5lbC0+YmFja2xpZ2h0Lm1heDsKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5lbC0+YmFja2xpZ2h0LmVuYWJsZWQgPSBmYWxz ZTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+IMKgCj4gPiDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IDA7Cj4gPiDCoH0KPiA+IEBAIC01NTksMTYgKzM0MCwxMiBAQCBpbnRlbF9kcF9hdXhfc3VwcG9y dHNfdmVzYV9iYWNrbGlnaHQoc3RydWN0Cj4gPiBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikK PiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0 YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gwqAKPiA+IC3CoMKgwqDC oMKgwqDCoC8qIENoZWNrIHRoZSBlRFAgRGlzcGxheSBjb250cm9sIGNhcGFiaWxpdGllcyByZWdp c3RlcnMgdG8gZGV0ZXJtaW5lCj4gPiBpZgo+ID4gLcKgwqDCoMKgwqDCoMKgICogdGhlIHBhbmVs IGNhbiBzdXBwb3J0IGJhY2tsaWdodCBjb250cm9sIG92ZXIgdGhlIGF1eCBjaGFubmVsLgo+ID4g LcKgwqDCoMKgwqDCoMKgICoKPiA+IC3CoMKgwqDCoMKgwqDCoCAqIFRPRE86IFdlIGN1cnJlbnRs eSBvbmx5IHN1cHBvcnQgQVVYIG9ubHkgYmFja2xpZ2h0Cj4gPiBjb25maWd1cmF0aW9ucywgbm90 IGJhY2tsaWdodHMgd2hpY2gKPiA+ICvCoMKgwqDCoMKgwqDCoC8qIFRPRE86IFdlIGN1cnJlbnRs eSBvbmx5IHN1cHBvcnQgQVVYIG9ubHkgYmFja2xpZ2h0Cj4gPiBjb25maWd1cmF0aW9ucywgbm90 IGJhY2tsaWdodHMgd2hpY2gKPiA+IMKgwqDCoMKgwqDCoMKgwqAgKiByZXF1aXJlIGEgbWl4IG9m IFBXTSBhbmQgQVVYIGNvbnRyb2xzIHRvIHdvcmsuIEluIHRoZSBtZWFuIHRpbWUsCj4gPiB0aGVz ZSBtYWNoaW5lcyB0eXBpY2FsbHkKPiA+IMKgwqDCoMKgwqDCoMKgwqAgKiB3b3JrIGp1c3QgZmlu ZSB1c2luZyBub3JtYWwgUFdNIGNvbnRyb2xzIGFueXdheS4KPiA+IMKgwqDCoMKgwqDCoMKgwqAg Ki8KPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChpbnRlbF9kcC0+ZWRwX2RwY2RbMV0gJiBEUF9FRFBf VENPTl9CQUNLTElHSFRfQURKVVNUTUVOVF9DQVAgJiYKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oCAoaW50ZWxfZHAtPmVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9BVVhfRU5BQkxFX0NB UCkgJiYKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoCAoaW50ZWxfZHAtPmVkcF9kcGNkWzJdICYK PiA+IERQX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVTU19BVVhfU0VUX0NBUCkpIHsKPiA+ICvCoMKg wqDCoMKgwqDCoGlmICgoaW50ZWxfZHAtPmVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9B VVhfRU5BQkxFX0NBUCkgJiYKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCBkcm1fZWRwX2JhY2ts aWdodF9zdXBwb3J0ZWQoaW50ZWxfZHAtPmVkcF9kcGNkKSkgewo+ID4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiQVVYIEJhY2tsaWdodCBD b250cm9sCj4gPiBTdXBwb3J0ZWQhXG4iKTsKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIHRydWU7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gZGlmZiAtLWdpdCBh L2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaCBiL2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIu aAo+ID4gaW5kZXggZWRmZmQxZGNjYTNlLi4xZWNhMGI0MmZjNDUgMTAwNjQ0Cj4gPiAtLS0gYS9p bmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmgKPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9kcF9o ZWxwZXIuaAo+ID4gQEAgLTE3OTAsNiArMTc5MCwyNCBAQCBkcm1fZHBfc2lua19jYW5fZG9fdmlk ZW9fd2l0aG91dF90aW1pbmdfbXNhKGNvbnN0IHU4Cj4gPiBkcGNkW0RQX1JFQ0VJVkVSX0NBUF9T SVpFXSkKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFBfTVNBX1RJTUlOR19Q QVJfSUdOT1JFRDsKPiA+IMKgfQo+ID4gwqAKPiA+ICsvKioKPiA+ICsgKiBkcm1fZWRwX2JhY2ts aWdodF9zdXBwb3J0ZWQoKSAtIENoZWNrIGFuIGVEUCBEUENEIGZvciBWRVNBIGJhY2tsaWdodAo+ ID4gc3VwcG9ydAo+ID4gKyAqIEBlZHBfZHBjZDogVGhlIERQQ0QgdG8gY2hlY2sKPiA+ICsgKgo+ ID4gKyAqIE5vdGUgdGhhdCBjdXJyZW50bHkgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAlZmFs c2UgZm9yIHBhbmVscyB3aGljaAo+ID4gc3VwcG9ydCB2YXJpb3VzIERQQ0QKPiA+ICsgKiBiYWNr bGlnaHQgZmVhdHVyZXMgYnV0IHdoaWNoIHJlcXVpcmUgdGhlIGJyaWdodG5lc3MgYmUgc2V0IHRo cm91Z2ggUFdNLAo+ID4gYW5kIGRvbid0IHN1cHBvcnQgc2V0dGluZwo+ID4gKyAqIHRoZSBicmln aHRuZXNzIGxldmVsIHZpYSB0aGUgRFBDRC4gVGhpcyBpcyBhIFRPRE8uCj4gPiArICoKPiA+ICsg KiBSZXR1cm5zOiAlVHJ1ZSBpZiBAZWRwX2RwY2QgaW5kaWNhdGVzIHRoYXQgVkVTQSBiYWNrbGln aHQgY29udHJvbHMgYXJlCj4gPiBzdXBwb3J0ZWQsICVmYWxzZQo+ID4gKyAqIG90aGVyd2lzZQo+ ID4gKyAqLwo+ID4gK3N0YXRpYyBpbmxpbmUgYm9vbAo+ID4gK2RybV9lZHBfYmFja2xpZ2h0X3N1 cHBvcnRlZChjb25zdCB1OCBlZHBfZHBjZFtFRFBfRElTUExBWV9DVExfQ0FQX1NJWkVdKQo+ID4g K3sKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAoZWRwX2RwY2RbMV0gJiBEUF9FRFBfVENPTl9C QUNLTElHSFRfQURKVVNUTUVOVF9DQVApICYmCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgKGVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX0FVWF9TRVRf Q0FQKTsKPiA+ICt9Cj4gPiArCj4gPiDCoC8qCj4gPiDCoCAqIERpc3BsYXlQb3J0IEFVWCBjaGFu bmVsCj4gPiDCoCAqLwo+ID4gQEAgLTIwODksNiArMjEwNywzNiBAQCBkcm1fZHBfaGFzX3F1aXJr KGNvbnN0IHN0cnVjdCBkcm1fZHBfZGVzYyAqZGVzYywgZW51bQo+ID4gZHJtX2RwX3F1aXJrIHF1 aXJrKQo+ID4gwqDCoMKgwqDCoMKgwqDCoHJldHVybiBkZXNjLT5xdWlya3MgJiBCSVQocXVpcmsp Owo+ID4gwqB9Cj4gPiDCoAo+ID4gKy8qKgo+ID4gKyAqIHN0cnVjdCBkcm1fZWRwX2JhY2tsaWdo dF9pbmZvIC0gUHJvYmVkIGVEUCBiYWNrbGlnaHQgaW5mbyBzdHJ1Y3QKPiA+ICsgKiBAcHdtZ2Vu X2JpdF9jb3VudDogVGhlIHB3bWdlbiBiaXQgY291bnQKPiA+ICsgKiBAcHdtX2ZyZXFfcHJlX2Rp dmlkZXI6IFRoZSBQV00gZnJlcXVlbmN5IHByZS1kaXZpZGVyIHZhbHVlIGJlaW5nIHVzZWQKPiA+ IGZvciB0aGlzIGJhY2tsaWdodCwgaWYgYW55Cj4gPiArICogQG1heDogVGhlIG1heGltdW0gYmFj a2xpZ2h0IGxldmVsIHRoYXQgbWF5IGJlIHNldAo+ID4gKyAqIEBsc2JfcmVnX3VzZWQ6IERvIHdl IGFsc28gd3JpdGUgdmFsdWVzIHRvIHRoZQo+ID4gRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNT X0xTQiByZWdpc3Rlcj8KPiA+ICsgKiBAYXV4X2VuYWJsZTogRG9lcyB0aGUgcGFuZWwgc3VwcG9y dCB0aGUgQVVYIGVuYWJsZSBjYXA/Cj4gPiArICoKPiA+ICsgKiBUaGlzIHN0cnVjdHVyZSBjb250 YWlucyB2YXJpb3VzIGRhdGEgYWJvdXQgYW4gZURQIGJhY2tsaWdodCwgd2hpY2ggY2FuCj4gPiBi ZSBwb3B1bGF0ZWQgYnkgdXNpbmcKPiA+ICsgKiBkcm1fZWRwX2JhY2tsaWdodF9pbml0KCkuCj4g PiArICovCj4gPiArc3RydWN0IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gewo+ID4gK8KgwqDCoMKg wqDCoMKgdTggcHdtZ2VuX2JpdF9jb3VudDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IHB3bV9mcmVx X3ByZV9kaXZpZGVyOwo+ID4gK8KgwqDCoMKgwqDCoMKgdTE2IG1heDsKPiA+ICsKPiA+ICvCoMKg wqDCoMKgwqDCoGJvb2wgbHNiX3JlZ191c2VkIDogMTsKPiA+ICvCoMKgwqDCoMKgwqDCoGJvb2wg YXV4X2VuYWJsZSA6IDE7Cj4gPiArfTsKPiA+ICsKPiA+ICtpbnQKPiA+ICtkcm1fZWRwX2JhY2ts aWdodF9pbml0KHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIHN0cnVjdAo+ID4gZHJtX2VkcF9iYWNr bGlnaHRfaW5mbyAqYmwsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHUxNiBkcml2ZXJfcHdtX2ZyZXFfaHosIGNvbnN0IHU4Cj4gPiBlZHBfZHBjZFtFRFBf RElTUExBWV9DVExfQ0FQX1NJWkVdLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1MTYgKmN1cnJlbnRfbGV2ZWwsIHU4ICpjdXJyZW50X21vZGUpOwo+ID4g K2ludCBkcm1fZWRwX2JhY2tsaWdodF9zZXRfbGV2ZWwoc3RydWN0IGRybV9kcF9hdXggKmF1eCwg Y29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUx NiBsZXZlbCk7Cj4gPiAraW50IGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZShzdHJ1Y3QgZHJtX2Rw X2F1eCAqYXV4LCBjb25zdCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gKmJsLAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB1MTYgbGV2ZWwpOwo+ID4gK2ludCBkcm1fZWRwX2JhY2tsaWdodF9kaXNhYmxlKHN0cnVjdCBk cm1fZHBfYXV4ICphdXgsIGNvbnN0IHN0cnVjdAo+ID4gZHJtX2VkcF9iYWNrbGlnaHRfaW5mbyAq YmwpOwo+ID4gKwo+ID4gwqAjaWZkZWYgQ09ORklHX0RSTV9EUF9DRUMKPiA+IMKgdm9pZCBkcm1f ZHBfY2VjX2lycShzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KTsKPiA+IMKgdm9pZCBkcm1fZHBfY2Vj X3JlZ2lzdGVyX2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LAo+ID4gLS0gCj4gPiAy LjI5LjIKPiA+IAo+ID4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KPiA+IEludGVsLWdmeCBtYWlsaW5nIGxpc3QKPiA+IEludGVsLWdmeEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKPiA+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vaW50ZWwtZ2Z4Cj4gCgotLSAKU2luY2VyZWx5LAogICBMeXVkZSBQYXVsIChzaGUvaGVy KQogICBTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0CiAgIApOb3RlOiBJIGRlYWwgd2l0aCBh IGxvdCBvZiBlbWFpbHMgYW5kIGhhdmUgYSBsb3Qgb2YgYnVncyBvbiBteSBwbGF0ZS4gSWYgeW91 J3ZlCmFza2VkIG1lIGEgcXVlc3Rpb24sIGFyZSB3YWl0aW5nIGZvciBhIHJldmlldy9tZXJnZSBv biBhIHBhdGNoLCBldGMuIGFuZCBJCmhhdmVuJ3QgcmVzcG9uZGVkIGluIGEgd2hpbGUsIHBsZWFz ZSBmZWVsIGZyZWUgdG8gc2VuZCBtZSBhbm90aGVyIGVtYWlsIHRvIGNoZWNrCm9uIG15IHN0YXR1 cy4gSSBkb24ndCBiaXRlIQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJp LWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A3CA6C433DB for ; Thu, 11 Feb 2021 18:35:50 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4C50D64E15 for ; Thu, 11 Feb 2021 18:35:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4C50D64E15 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AECC66EE0F; Thu, 11 Feb 2021 18:35:46 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 07D1E6ECCC for ; Thu, 11 Feb 2021 18:35:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1613068543; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pPOg3Ohlq+RcRCbYcOoTEKFNyerStoZoZ0h1YxqgvsQ=; b=AK1U/4HzotgCFbnuBnyU8a3/FGwuiJGthJt99Fo3ZLUQ44tlFZA/dFgBjM2gYes45ZVDc2 PQB/jy5w1YNPZzVoyNag9MIIlc9IjaBcqEqxvJ3z0R/avG7bH3XQO/khbw98sGwJo05c/7 aQFNmgPl4UXttEiRrZ84l+TJoAFyKl0= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-91-JZqaaLKYOXWr_wOFK-xBCg-1; Thu, 11 Feb 2021 13:35:38 -0500 X-MC-Unique: JZqaaLKYOXWr_wOFK-xBCg-1 Received: by mail-qv1-f69.google.com with SMTP id dh16so4548031qvb.11 for ; Thu, 11 Feb 2021 10:35:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:reply-to:to:cc:date :in-reply-to:references:organization:user-agent:mime-version :content-transfer-encoding; bh=pPOg3Ohlq+RcRCbYcOoTEKFNyerStoZoZ0h1YxqgvsQ=; b=hU+6VPUBxag6llnrJgzfS6hEFUXBbs6tU4LUg0gR0RQfUE6L+7UJP2k6goXu75GvKY PHfhxTCi62PkLJJJmK+l92CbnThCgf2EC3J2SK0AX0+zIWD3kA217YuzJEvoZd8mDFee TR/JG9LgVoPQ3xRaAeF3gbXTMXRzgLpOlhlUjM/Qfbqk4G6Xb90blgCrw29tdVkcNyGE gvdOVmVdsorswPtoq/GD+mj8lV738X4CSNCdqjOLULA1uRgj73bq2WDK5TvKTO7nwlyv T2bplCxuBF3xDv0ymkS1HIBDEgtik9fUE1XRiDWFsRCX6fkIg80OG+2rDv15CFZ/6jlg DKWA== X-Gm-Message-State: AOAM530bO++FWG4ifdBAg6xEFVfTjk4AjIofeuGoj2yILDvKZUWjd1ms ++4Pba3qhyp8G03RfmFjJPXguMqh74KYaNO51I561rHzoi+XCzX1/imE6/hJ4pLjthWK+2rPyyX 7iGI2M53yfPJWcI8vlEzkfQLHzrxX X-Received: by 2002:a0c:ac43:: with SMTP id m3mr9044636qvb.37.1613068537982; Thu, 11 Feb 2021 10:35:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJwEZm08wF69ndhqlNhK75qjeAHsxMVSaVWhTwnItgrMqjIMG1ZuD8aJK5uVgaEUnx1XvdbvKA== X-Received: by 2002:a0c:ac43:: with SMTP id m3mr9044591qvb.37.1613068537593; Thu, 11 Feb 2021 10:35:37 -0800 (PST) Received: from Whitewolf.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id d1sm4367878qkj.123.2021.02.11.10.35.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Feb 2021 10:35:34 -0800 (PST) Message-ID: From: Lyude Paul To: Rodrigo Vivi Date: Thu, 11 Feb 2021 13:35:33 -0500 In-Reply-To: <20210211041540.GI82362@intel.com> References: <20210208233902.1289693-1-lyude@redhat.com> <20210208233902.1289693-11-lyude@redhat.com> <20210211041540.GI82362@intel.com> Organization: Red Hat User-Agent: Evolution 3.38.3 (3.38.3-1.fc33) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: Re: [Intel-gfx] [RFC v4 10/11] drm/dp: Extract i915's eDP backlight code into DRM helpers X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: lyude@redhat.com Cc: greg.depoire@gmail.com, Jani Nikula , nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, Lucas De Marchi , open list , dri-devel@lists.freedesktop.org, David Airlie , Sean Paul , Maxime Ripard , Thomas Zimmermann , Dave Airlie Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gV2VkLCAyMDIxLTAyLTEwIGF0IDIzOjE1IC0wNTAwLCBSb2RyaWdvIFZpdmkgd3JvdGU6Cj4g T24gTW9uLCBGZWIgMDgsIDIwMjEgYXQgMDY6Mzk6MDBQTSAtMDUwMCwgTHl1ZGUgUGF1bCB3cm90 ZToKPiA+IFNpbmNlIHdlJ3JlIGFib3V0IHRvIGltcGxlbWVudCBlRFAgYmFja2xpZ2h0IHN1cHBv cnQgaW4gbm91dmVhdSB1c2luZyB0aGUKPiA+IHN0YW5kYXJkIHByb3RvY29sIGZyb20gVkVTQSwg d2UgbWlnaHQgYXMgd2VsbCBqdXN0IHRha2UgdGhlIGNvZGUgdGhhdCdzCj4gPiBhbHJlYWR5IHdy aXR0ZW4gZm9yIHRoaXMgYW5kIG1vdmUgaXQgaW50byBhIHNldCBvZiBzaGFyZWQgRFJNIGhlbHBl cnMuCj4gPiAKPiA+IE5vdGUgdGhhdCB0aGVzZSBoZWxwZXJzIGFyZSBpbnRlbmRlZCB0byBoYW5k bGUgRFBDRCByZWxhdGVkIGJhY2tsaWdodAo+ID4gY29udHJvbCBiaXRzIHN1Y2ggYXMgc2V0dGlu ZyB0aGUgYnJpZ2h0bmVzcyBsZXZlbCBvdmVyIEFVWCwgcHJvYmluZyB0aGUKPiA+IGJhY2tsaWdo dCdzIFRDT04sIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgYmFja2xpZ2h0IG92ZXIgQVVYIGlmIHN1 cHBvcnRlZCwKPiA+IGV0Yy4gQW55IFBXTS1yZWxhdGVkIHBvcnRpb25zIG9mIGJhY2tsaWdodCBj b250cm9sIGFyZSBleHBsaWNpdGx5IGxlZnQgdXAKPiA+IHRvIHRoZSBkcml2ZXIsIGFzIHRoZXNl IHdpbGwgdmFyeSBmcm9tIHBsYXRmb3JtIHRvIHBsYXRmb3JtLgo+ID4gCj4gPiBUaGUgb25seSBl eGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIFBXTSBmcmVxdWVuY3kK PiA+IHByZS1kaXZpZGVyIHZhbHVlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIG9ubHkgcGxhdGZvcm0t c3BlY2lmaWMgaW5mb3JtYXRpb24KPiA+IHJlcXVpcmVkIGZvciB0aGlzIGlzIHRoZSBQV00gZnJl cXVlbmN5IG9mIHRoZSBwYW5lbCwgd2hpY2ggdGhlIGRyaXZlciBpcwo+ID4gZXhwZWN0ZWQgdG8g cHJvdmlkZSBpZiBhdmFpbGFibGUuIFRoZSBhY3R1YWwgYWxnb3JpdGhtIGZvciBjYWxjdWxhdGlu ZyB0aGlzCj4gPiB2YWx1ZSBpcyBzdGFuZGFyZCBhbmQgaXMgZGVmaW5lZCBpbiB0aGUgZURQIHNw ZWNpZmljYXRpb24gZnJvbSBWRVNBLgo+ID4gCj4gPiBOb3RlIHRoYXQgdGhlc2UgaGVscGVycyBk byBub3QgeWV0IGltcGxlbWVudCB0aGUgZnVsbCByYW5nZSBvZiBmZWF0dXJlcwo+ID4gdGhlIFZF U0EgYmFja2xpZ2h0IGludGVyZmFjZSBwcm92aWRlcywgYW5kIG9ubHkgcHJvdmlkZSB0aGUgZm9s bG93aW5nCj4gPiBmdW5jdGlvbmFsaXR5IChhbGwgb2Ygd2hpY2ggd2FzIGFscmVhZHkgcHJlc2Vu dCBpbiBpOTE1J3MgRFBDRCBiYWNrbGlnaHQKPiA+IHN1cHBvcnQpOgo+ID4gCj4gPiAqIEJhc2lj IGNvbnRyb2wgb2YgYnJpZ2h0bmVzcyBsZXZlbHMKPiA+ICogQmFzaWMgcHJvYmluZyBvZiBiYWNr bGlnaHQgY2FwYWJpbGl0aWVzCj4gPiAqIEhlbHBlcnMgZm9yIGVuYWJsaW5nIGFuZCBkaXNhYmxp bmcgdGhlIGJhY2tsaWdodAo+ID4gCj4gPiB2MzoKPiA+ICogU3BsaXQgb3V0IGNoYW5nZXMgdG8g aTkxNSdzIGJhY2tsaWdodCBjb2RlIHRvIHNlcGFyYXRlIHBhdGNoZXMgdG8gbWFrZSBpdAo+ID4g wqAgZWFzaWVyIHRvIHJldmlldwo+ID4gdjQ6Cj4gPiAqIFN0eWxlL3NwZWxsaW5nIGNoYW5nZXMg ZnJvbSBUaG9tYXMgWmltbWVybWFubgo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBMeXVkZSBQYXVs IDxseXVkZUByZWRoYXQuY29tPgo+ID4gQ2M6IEphbmkgTmlrdWxhIDxqYW5pLm5pa3VsYUBpbnRl bC5jb20+Cj4gPiBDYzogRGF2ZSBBaXJsaWUgPGFpcmxpZWRAZ21haWwuY29tPgo+ID4gQ2M6IGdy ZWcuZGVwb2lyZUBnbWFpbC5jb20KPiA+IC0tLQo+ID4gwqBkcml2ZXJzL2dwdS9kcm0vZHJtX2Rw X2hlbHBlci5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IDMzMiArKysrKysrKysrKysr KysrKysKPiA+IMKgLi4uL2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZGlzcGxheV90eXBlcy5owqDC oMKgIHzCoMKgIDUgKy0KPiA+IMKgLi4uL2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2Jh Y2tsaWdodC5jIHwgMjg1ICsrLS0tLS0tLS0tLS0tLQo+ID4gwqBpbmNsdWRlL2RybS9kcm1fZHBf aGVscGVyLmjCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgIDQ4ICsrKwo+ ID4gwqA0IGZpbGVzIGNoYW5nZWQsIDQxMiBpbnNlcnRpb25zKCspLCAyNTggZGVsZXRpb25zKC0p Cj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jCj4g PiBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaGVscGVyLmMKPiA+IGluZGV4IGVlZGJiNDg4MTVi Ny4uMWEzZDQ2NzlkNzIwIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9o ZWxwZXIuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxwZXIuYwo+ID4gQEAg LTMwODIsMyArMzA4MiwzMzUgQEAgaW50IGRybV9kcF9wY29uX2NvbnZlcnRfcmdiX3RvX3ljYmNy KHN0cnVjdAo+ID4gZHJtX2RwX2F1eCAqYXV4LCB1OCBjb2xvcl9zcGMpCj4gPiDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIDA7Cj4gPiDCoH0KPiA+IMKgRVhQT1JUX1NZTUJPTChkcm1fZHBfcGNvbl9j b252ZXJ0X3JnYl90b195Y2Jjcik7Cj4gPiArCj4gPiArLyoqCj4gPiArICogZHJtX2VkcF9iYWNr bGlnaHRfc2V0X2xldmVsKCkgLSBTZXQgdGhlIGJhY2tsaWdodCBsZXZlbCBvZiBhbiBlRFAgcGFu ZWwKPiA+IHZpYSBBVVgKPiA+ICsgKiBAYXV4OiBUaGUgRFAgQVVYIGNoYW5uZWwgdG8gdXNlCj4g PiArICogQGJsOiBCYWNrbGlnaHQgY2FwYWJpbGl0eSBpbmZvIGZyb20gZHJtX2VkcF9iYWNrbGln aHRfaW5pdCgpCj4gPiArICogQGxldmVsOiBUaGUgYnJpZ2h0bmVzcyBsZXZlbCB0byBzZXQKPiA+ ICsgKgo+ID4gKyAqIFNldHMgdGhlIGJyaWdodG5lc3MgbGV2ZWwgb2YgYW4gZURQIHBhbmVsJ3Mg YmFja2xpZ2h0LiBOb3RlIHRoYXQgdGhlCj4gPiBwYW5lbCdzIGJhY2tsaWdodCBtdXN0Cj4gPiAr ICogYWxyZWFkeSBoYXZlIGJlZW4gZW5hYmxlZCBieSB0aGUgZHJpdmVyIGJ5IGNhbGxpbmcKPiA+ IGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZSgpLgo+ID4gKyAqCj4gPiArICogUmV0dXJuczogJTAg b24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCj4gPiArICovCj4gPiAr aW50IGRybV9lZHBfYmFja2xpZ2h0X3NldF9sZXZlbChzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LCBj b25zdCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gKmJsLAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTE2 IGxldmVsKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiArwqDCoMKgwqDC oMKgwqB1OCBidWZbMl0gPSB7IDAgfTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChibC0+ bHNiX3JlZ191c2VkKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnVmWzBd ID0gKGxldmVsICYgMHhmZjAwKSA+PiA4Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGJ1ZlsxXSA9IChsZXZlbCAmIDB4MDBmZik7Cj4gPiArwqDCoMKgwqDCoMKgwqB9IGVsc2Ug ewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJ1ZlswXSA9IGxldmVsOwo+ID4g K8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2Rw Y2Rfd3JpdGUoYXV4LCBEUF9FRFBfQkFDS0xJR0hUX0JSSUdIVE5FU1NfTVNCLCBidWYsCj4gPiBz aXplb2YoYnVmKSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IHNpemVvZihidWYpKSB7 Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0VSUk9SKCIlczogRmFpbGVk IHRvIHdyaXRlIGF1eCBiYWNrbGlnaHQgbGV2ZWw6ICVkXG4iLAo+ID4gYXV4LT5uYW1lLCByZXQp Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0 IDogLUVJTzsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJl dHVybiAwOwo+ID4gK30KPiA+ICtFWFBPUlRfU1lNQk9MKGRybV9lZHBfYmFja2xpZ2h0X3NldF9s ZXZlbCk7Cj4gPiArCj4gPiArc3RhdGljIGludAo+ID4gK2RybV9lZHBfYmFja2xpZ2h0X3NldF9l bmFibGUoc3RydWN0IGRybV9kcF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2Jh Y2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYm9vbCBlbmFibGUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDC oMKgaW50IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IGJ1ZjsKPiA+ICsKPiA+ICvCoMKgwqDC oMKgwqDCoC8qIFRoZSBwYW5lbCB1c2VzIHNvbWV0aGluZyBvdGhlciB0aGVuIERQQ0QgZm9yIGVu YWJsaW5nIGl0cwo+ID4gYmFja2xpZ2h0ICovCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIWJsLT5h dXhfZW5hYmxlKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9F RFBfRElTUExBWV9DT05UUk9MX1JFR0lTVEVSLCAmYnVmKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlm IChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9FUlJP UigiJXM6IEZhaWxlZCB0byByZWFkIGVEUCBkaXNwbGF5IGNvbnRyb2wgcmVnaXN0ZXI6Cj4gPiAl ZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICvC oMKgwqDCoMKgwqDCoGlmIChlbmFibGUpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgYnVmIHw9IERQX0VEUF9CQUNLTElHSFRfRU5BQkxFOwo+ID4gK8KgwqDCoMKgwqDCoMKgZWxz ZQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJ1ZiAmPSB+RFBfRURQX0JBQ0tM SUdIVF9FTkFCTEU7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93 cml0ZWIoYXV4LCBEUF9FRFBfRElTUExBWV9DT05UUk9MX1JFR0lTVEVSLCBidWYpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKHJldCAhPSAxKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgRFJNX0VSUk9SKCIlczogRmFpbGVkIHRvIHdyaXRlIGVEUCBkaXNwbGF5IGNvbnRyb2wg cmVnaXN0ZXI6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ICvCoMKgwqDC oMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30KPiA+ICsK PiA+ICsvKioKPiA+ICsgKiBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoKSAtIEVuYWJsZSBhbiBl RFAgcGFuZWwncyBiYWNrbGlnaHQgdXNpbmcgRFBDRAo+ID4gKyAqIEBhdXg6IFRoZSBEUCBBVVgg Y2hhbm5lbCB0byB1c2UKPiA+ICsgKiBAYmw6IEJhY2tsaWdodCBjYXBhYmlsaXR5IGluZm8gZnJv bSBkcm1fZWRwX2JhY2tsaWdodF9pbml0KCkKPiA+ICsgKiBAbGV2ZWw6IFRoZSBpbml0aWFsIGJh Y2tsaWdodCBsZXZlbCB0byBzZXQgdmlhIEFVWCwgaWYgdGhlcmUgaXMgb25lCj4gPiArICoKPiA+ ICsgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZW5hYmxpbmcgRFBDRCBiYWNrbGlnaHQgY29udHJv bHMgb24gYSBwYW5lbCBvdmVyCj4gPiBEUENELCB3aGlsZSBhZGRpdGlvbmFsbHkKPiA+ICsgKiBy ZXN0b3JpbmcgYW55IGltcG9ydGFudCBiYWNrbGlnaHQgc3RhdGUgc3VjaCBhcyB0aGUgZ2l2ZW4g YmFja2xpZ2h0Cj4gPiBsZXZlbCwgdGhlIGJyaWdodG5lc3MgYnl0ZQo+ID4gKyAqIGNvdW50LCBi YWNrbGlnaHQgZnJlcXVlbmN5LCBldGMuCj4gPiArICoKPiA+ICsgKiBOb3RlIHRoYXQgY2VydGFp biBwYW5lbHMsIHdoaWxlIHN1cHBvcnRpbmcgYnJpZ2h0bmVzcyBsZXZlbCBjb250cm9scwo+ID4g b3ZlciBEUENELCBtYXkgbm90IHN1cHBvcnQKPiA+ICsgKiBoYXZpbmcgdGhlaXIgYmFja2xpZ2h0 cyBlbmFibGVkIHZpYSB0aGUgc3RhbmRhcmQKPiA+ICVEUF9FRFBfRElTUExBWV9DT05UUk9MX1JF R0lTVEVSLiBPbiBzdWNoIHBhbmVscwo+ID4gKyAqICZkcm1fZWRwX2JhY2tsaWdodF9pbmZvLmF1 eF9lbmFibGUgd2lsbCBiZSBzZXQgdG8gJWZhbHNlLCB0aGlzIGZ1bmN0aW9uCj4gPiB3aWxsIHNr aXAgdGhlIHN0ZXAgb2YKPiA+ICsgKiBwcm9ncmFtbWluZyB0aGUgJURQX0VEUF9ESVNQTEFZX0NP TlRST0xfUkVHSVNURVIsIGFuZCB0aGUgZHJpdmVyIG11c3QKPiA+IHBlcmZvcm0gdGhlIHJlcXVp cmVkCj4gPiArICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgc3RlcCBmb3IgZW5hYmxpbmcgdGhl IGJhY2tsaWdodCBhZnRlciBjYWxsaW5nCj4gPiB0aGlzIGZ1bmN0aW9uLgo+ID4gKyAqCj4gPiAr ICogUmV0dXJuczogJTAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJl Lgo+ID4gKyAqLwo+ID4gK2ludCBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoc3RydWN0IGRybV9k cF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgY29uc3QgdTE2IGxldmVsKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4g PiArwqDCoMKgwqDCoMKgwqB1OCBkcGNkX2J1ZiwgbmV3X2RwY2RfYnVmOwo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9FRFBfQkFDS0xJR0hU X01PREVfU0VUX1JFR0lTVEVSLAo+ID4gJmRwY2RfYnVmKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlm IChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9ERUJV R19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGlnaHQgbW9kZTogJWRcbiIsCj4gPiBhdXgt Pm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJl dCA8IDAgPyByZXQgOiAtRUlPOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgbmV3X2RwY2RfYnVmID0gZHBjZF9idWY7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqBpZiAoKGRwY2RfYnVmICYgRFBfRURQX0JBQ0tMSUdIVF9DT05UUk9MX01PREVfTUFTSykgIT0K PiA+IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0QpIHsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBuZXdfZHBjZF9idWYgJj0gfkRQX0VEUF9CQUNLTElHSFRfQ09O VFJPTF9NT0RFX01BU0s7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbmV3X2Rw Y2RfYnVmIHw9IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0Q7Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1 eCwgRFBfRURQX1BXTUdFTl9CSVRfQ09VTlQsIGJsLQo+ID4gPnB3bWdlbl9iaXRfY291bnQpOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RFQlVHX0tNUygi JXM6IEZhaWxlZCB0byB3cml0ZSBhdXggcHdtZ2VuIGJpdAo+ID4gY291bnQ6ICVkXG4iLAo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoYmwtPnB3bV9mcmVxX3ByZV9kaXZpZGVyKSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGVi KGF1eCwgRFBfRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCwgYmwtCj4gPiA+cHdtX2ZyZXFfcHJlX2Rp dmlkZXIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RF QlVHX0tNUygiJXM6IEZhaWxlZCB0byB3cml0ZSBhdXggYmFja2xpZ2h0Cj4gPiBmcmVxdWVuY3k6 ICVkXG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZXdfZHBjZF9idWYgfD0KPiA+IERQX0VEUF9CQUNLTElH SFRfRlJFUV9BVVhfU0VUX0VOQUJMRTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvC oMKgwqDCoMKgwqDCoGlmIChuZXdfZHBjZF9idWYgIT0gZHBjZF9idWYpIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoYXV4LAo+ID4g RFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwgbmV3X2RwY2RfYnVmKTsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0RFQlVHX0tNUygiJXM6 IEZhaWxlZCB0byB3cml0ZSBhdXggYmFja2xpZ2h0Cj4gPiBtb2RlOiAlZFxuIiwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0IDwgMCA/IHJldCA6IC1FSU87Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4g Kwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfc2V0X2xldmVsKGF1 eCwgYmwsIGxldmVsKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgPCAwKQo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqBy ZXQgPSBkcm1fZWRwX2JhY2tsaWdodF9zZXRfZW5hYmxlKGF1eCwgYmwsIHRydWUpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKHJldCA8IDApCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30K PiA+ICtFWFBPUlRfU1lNQk9MKGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZSk7Cj4gPiArCj4gPiAr LyoqCj4gPiArICogZHJtX2VkcF9iYWNrbGlnaHRfZGlzYWJsZSgpIC0gRGlzYWJsZSBhbiBlRFAg YmFja2xpZ2h0IHVzaW5nIERQQ0QsIGlmCj4gPiBzdXBwb3J0ZWQKPiA+ICsgKiBAYXV4OiBUaGUg RFAgQVVYIGNoYW5uZWwgdG8gdXNlCj4gPiArICogQGJsOiBCYWNrbGlnaHQgY2FwYWJpbGl0eSBp bmZvIGZyb20gZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgpCj4gPiArICoKPiA+ICsgKiBUaGlzIGZ1 bmN0aW9uIGhhbmRsZXMgZGlzYWJsaW5nIERQQ0QgYmFja2xpZ2h0IGNvbnRyb2xzIG9uIGEgcGFu ZWwgb3Zlcgo+ID4gQVVYLiBOb3RlIHRoYXQgc29tZQo+ID4gKyAqIHBhbmVscyBoYXZlIGJhY2ts aWdodHMgdGhhdCBhcmUgZW5hYmxlZC9kaXNhYmxlZCBieSBvdGhlciBtZWFucywgZGVzcGl0ZQo+ ID4gaGF2aW5nIHRoZWlyIGJyaWdodG5lc3MKPiA+ICsgKiB2YWx1ZXMgY29udHJvbGxlZCB0aHJv dWdoIERQQ0QuIE9uIHN1Y2ggcGFuZWxzCj4gPiAmZHJtX2VkcF9iYWNrbGlnaHRfaW5mby5hdXhf ZW5hYmxlIHdpbGwgYmUgc2V0IHRvCj4gPiArICogJWZhbHNlLCB0aGlzIGZ1bmN0aW9uIHdpbGwg YmVjb21lIGEgbm8tb3AgKGFuZCB3ZSB3aWxsIHNraXAgdXBkYXRpbmcKPiA+ICsgKiAlRFBfRURQ X0RJU1BMQVlfQ09OVFJPTF9SRUdJU1RFUiksIGFuZCB0aGUgZHJpdmVyIG11c3QgdGFrZSBjYXJl IHRvCj4gPiBwZXJmb3JtIGl0J3Mgb3duCj4gPiArICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMg c3RlcCBmb3IgZGlzYWJsaW5nIHRoZSBiYWNrbGlnaHQuCj4gPiArICoKPiA+ICsgKiBSZXR1cm5z OiAlMCBvbiBzdWNjZXNzIG9yIG5vLW9wLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUu Cj4gPiArICovCj4gPiAraW50IGRybV9lZHBfYmFja2xpZ2h0X2Rpc2FibGUoc3RydWN0IGRybV9k cF9hdXggKmF1eCwgY29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCkK PiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDC oMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfc2V0X2VuYWJsZShhdXgsIGJsLCBmYWxzZSk7Cj4g PiArwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4g PiArfQo+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2VkcF9iYWNrbGlnaHRfZGlzYWJsZSk7Cj4gPiAr Cj4gPiArc3RhdGljIGlubGluZSBpbnQKPiA+ICtkcm1fZWRwX2JhY2tsaWdodF9wcm9iZV9tYXgo c3RydWN0IGRybV9kcF9hdXggKmF1eCwgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZv ICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHUxNiBkcml2ZXJfcHdtX2ZyZXFfaHosIGNvbnN0IHU4Cj4gPiBlZHBfZHBjZFtFRFBf RElTUExBWV9DVExfQ0FQX1NJWkVdKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCBmeHAs IGZ4cF9taW4sIGZ4cF9tYXgsIGZ4cF9hY3R1YWwsIGYgPSAxOwo+ID4gK8KgwqDCoMKgwqDCoMKg aW50IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IHBuLCBwbl9taW4sIHBuX21heDsKPiA+ICsK PiA+ICvCoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKGF1eCwgRFBfRURQX1BX TUdFTl9CSVRfQ09VTlQsICZwbik7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdfS01TKCIlczogRmFp bGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXA6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCBy ZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PREVWOwo+ ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcG4gJj0gRFBfRURQ X1BXTUdFTl9CSVRfQ09VTlRfTUFTSzsKPiA+ICvCoMKgwqDCoMKgwqDCoGJsLT5tYXggPSAoMSA8 PCBwbikgLSAxOwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCFkcml2ZXJfcHdtX2ZyZXFfaHopCj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiArCj4gPiArwqDC oMKgwqDCoMKgwqAvKgo+ID4gK8KgwqDCoMKgwqDCoMKgICogU2V0IFBXTSBGcmVxdWVuY3kgZGl2 aWRlciB0byBtYXRjaCBkZXNpcmVkIGZyZXF1ZW5jeSBwcm92aWRlZCBieQo+ID4gdGhlIGRyaXZl ci4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFRoZSBQV00gRnJlcXVlbmN5IGlzIGNhbGN1bGF0ZWQg YXMgMjdNaHogLyAoRiB4IFApLgo+ID4gK8KgwqDCoMKgwqDCoMKgICogLSBXaGVyZSBGID0gUFdN IEZyZXF1ZW5jeSBQcmUtRGl2aWRlciB2YWx1ZSBwcm9ncmFtbWVkIGJ5IGZpZWxkCj4gPiA3OjAg b2YgdGhlCj4gPiArwqDCoMKgwqDCoMKgwqAgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBFRFBf QkFDS0xJR0hUX0ZSRVFfU0VUIHJlZ2lzdGVyIChEUENEIEFkZHJlc3MgMDA3MjhoKQo+ID4gK8Kg wqDCoMKgwqDCoMKgICogLSBXaGVyZSBQID0gMl5Qbiwgd2hlcmUgUG4gaXMgdGhlIHZhbHVlIHBy b2dyYW1tZWQgYnkgZmllbGQgNDowCj4gPiBvZiB0aGUKPiA+ICvCoMKgwqDCoMKgwqDCoCAqwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVEUF9QV01HRU5fQklUX0NPVU5UIHJlZ2lzdGVyIChEUENE IEFkZHJlc3MgMDA3MjRoKQo+ID4gK8KgwqDCoMKgwqDCoMKgICovCj4gPiArCj4gPiArwqDCoMKg wqDCoMKgwqAvKiBGaW5kIGRlc2lyZWQgdmFsdWUgb2YgKEYgeCBQKQo+ID4gK8KgwqDCoMKgwqDC oMKgICogTm90ZSB0aGF0LCBpZiBGIHggUCBpcyBvdXQgb2Ygc3VwcG9ydGVkIHJhbmdlLCB0aGUg bWF4aW11bSB2YWx1ZQo+ID4gb3IgbWluaW11bSB2YWx1ZSB3aWxsCj4gPiArwqDCoMKgwqDCoMKg wqAgKiBhcHBsaWVkIGF1dG9tYXRpY2FsbHkuIFNvIG5vIG5lZWQgdG8gY2hlY2sgdGhhdC4KPiA+ ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgZnhwID0gRElWX1JPVU5EX0NM T1NFU1QoMTAwMCAqIERQX0VEUF9CQUNLTElHSFRfRlJFUV9CQVNFX0tIWiwKPiA+IGRyaXZlcl9w d21fZnJlcV9oeik7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKiBVc2UgaGlnaGVzdCBwb3Nz aWJsZSB2YWx1ZSBvZiBQbiBmb3IgbW9yZSBncmFudWxhcml0eSBvZgo+ID4gYnJpZ2h0bmVzcyBh ZGp1c3RtZW50IHdoaWxlCj4gPiArwqDCoMKgwqDCoMKgwqAgKiBzYXRpZnlpbmcgdGhlIGNvbmRp dGlvbnMgYmVsb3cuCj4gPiArwqDCoMKgwqDCoMKgwqAgKiAtIFBuIGlzIGluIHRoZSByYW5nZSBv ZiBQbl9taW4gYW5kIFBuX21heAo+ID4gK8KgwqDCoMKgwqDCoMKgICogLSBGIGlzIGluIHRoZSBy YW5nZSBvZiAxIGFuZCAyNTUKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIC0gRnhQIGlzIHdpdGhpbiAy NSUgb2YgZGVzaXJlZCB2YWx1ZS4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqwqDCoCBOb3RlOiAyNSUg aXMgYXJiaXRyYXJ5IHZhbHVlIGFuZCBtYXkgbmVlZCBzb21lIHR3ZWFrLgo+ID4gK8KgwqDCoMKg wqDCoMKgICovCj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF9yZWFkYihhdXgs IERQX0VEUF9QV01HRU5fQklUX0NPVU5UX0NBUF9NSU4sCj4gPiAmcG5fbWluKTsKPiA+ICvCoMKg wqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBwd21nZW4gYml0IGNvdW50IGNh cCBtaW46Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKg wqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9FRFBfUFdNR0VOX0JJVF9DT1VO VF9DQVBfTUFYLAo+ID4gJnBuX21heCk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEp IHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdfS01TKCIlczog RmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXAgbWF4Ogo+ID4gJWRcbiIsIGF1eC0+ bmFtZSwgcmV0KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsK PiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKgwqDCoMKgwqDCoHBuX21pbiAmPSBEUF9FRFBf UFdNR0VOX0JJVF9DT1VOVF9NQVNLOwo+ID4gK8KgwqDCoMKgwqDCoMKgcG5fbWF4ICY9IERQX0VE UF9QV01HRU5fQklUX0NPVU5UX01BU0s7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKiBFbnN1 cmUgZnJlcXVlbmN5IGlzIHdpdGhpbiAyNSUgb2YgZGVzaXJlZCB2YWx1ZSAqLwo+ID4gK8KgwqDC oMKgwqDCoMKgZnhwX21pbiA9IERJVl9ST1VORF9DTE9TRVNUKGZ4cCAqIDMsIDQpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgZnhwX21heCA9IERJVl9ST1VORF9DTE9TRVNUKGZ4cCAqIDUsIDQpOwo+ID4g K8KgwqDCoMKgwqDCoMKgaWYgKGZ4cF9taW4gPCAoMSA8PCBwbl9taW4pIHx8ICgyNTUgPDwgcG5f bWF4KSA8IGZ4cF9tYXgpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1f REVCVUdfS01TKCIlczogRHJpdmVyIGRlZmluZWQgYmFja2xpZ2h0IGZyZXF1ZW5jeSAoJWQpCj4g PiBvdXQgb2YgcmFuZ2VcbiIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYXV4LT5uYW1lLCBkcml2ZXJfcHdtX2ZyZXFfaHopOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKg wqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgZm9yIChwbiA9IHBuX21heDsgcG4gPj0g cG5fbWluOyBwbi0tKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZiA9IGNs YW1wKERJVl9ST1VORF9DTE9TRVNUKGZ4cCwgMSA8PCBwbiksIDEsIDI1NSk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZnhwX2FjdHVhbCA9IGYgPDwgcG47Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGZ4cF9taW4gPD0gZnhwX2FjdHVhbCAmJiBmeHBf YWN0dWFsIDw9IGZ4cF9tYXgpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1eCwgRFBfRURQX1BXTUdFTl9CSVRf Q09VTlQsIHBuKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gd3Jp dGUgYXV4IHB3bWdlbiBiaXQgY291bnQ6Cj4gPiAlZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK8KgwqDCoMKgwqDC oMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgYmwtPnB3bWdlbl9iaXRfY291bnQgPSBwbjsKPiA+ICvC oMKgwqDCoMKgwqDCoGJsLT5tYXggPSAoMSA8PCBwbikgLSAxOwo+ID4gKwo+ID4gK8KgwqDCoMKg wqDCoMKgaWYgKGVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tMSUdIVF9GUkVRX0FVWF9TRVRfQ0FQ KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYmwtPnB3bV9mcmVxX3ByZV9k aXZpZGVyID0gZjsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fREVCVUdf S01TKCIlczogVXNpbmcgYmFja2xpZ2h0IGZyZXF1ZW5jeSBmcm9tIGRyaXZlcgo+ID4gKCVkSHop XG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGF1eC0+bmFtZSwgZHJpdmVyX3B3bV9mcmVxX2h6KTsKPiA+ICvCoMKgwqDCoMKg wqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiAK PiB0aGFua3MgZm9yIHRoZSBjbGVhbiB1cC4uLgo+IHVwIHRvIHRoaXMgcG9pbnQgaXQgd2FzIGVh c3kgdG8gc2VlIHRoZSBjb2RlIGFkZGVkIGFuZCBjb2RlIHJlbW92ZSBtYXRjaGVzLi4uCj4gCj4g PiArc3RhdGljIGlubGluZSBpbnQKPiA+ICtkcm1fZWRwX2JhY2tsaWdodF9wcm9iZV9sZXZlbChz dHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8g KmJsLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHU4ICpjdXJyZW50X21vZGUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgaW50 IHJldDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IGJ1ZlsyXTsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4 IG1vZGVfcmVnOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2RfcmVh ZGIoYXV4LCBEUF9FRFBfQkFDS0xJR0hUX01PREVfU0VUX1JFR0lTVEVSLAo+ID4gJm1vZGVfcmVn KTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGln aHQgbW9kZTogJWRcbiIsCj4gPiBhdXgtPm5hbWUsIHJldCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUlPOwo+ID4gK8KgwqDCoMKg wqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgKmN1cnJlbnRfbW9kZSA9IChtb2RlX3Jl ZyAmIERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX01BU0spOwo+ID4gK8KgwqDCoMKgwqDC oMKgaWYgKCpjdXJyZW50X21vZGUgPT0gRFBfRURQX0JBQ0tMSUdIVF9DT05UUk9MX01PREVfRFBD RCkgewo+IAo+IEhvd2V2ZXIgSSdtIGFmcmFpZCB0aGF0IG9uIHRoaXMgYXJlYSBoZXJlIHdlIGhh dmUgc29tZXRoaW5nIHRoYXQgY291bGQgYmUKPiBpbXByb3ZlZCBmdXJ0aGVyLi4uCj4gCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50IHNpemUgPSAxICsgYmwtPmxzYl9yZWdf dXNlZDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1f ZHBfZHBjZF9yZWFkKGF1eCwgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX01TQiwKPiA+IGJ1 Ziwgc2l6ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSBz aXplKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oERSTV9ERUJVR19LTVMoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYWNrbGlnaHQgbGV2ZWw6Cj4gPiAl ZFxuIiwgYXV4LT5uYW1lLCByZXQpOwo+IAo+IEJ1dCBwcm9iYWJseSB0aGUgYmlnZ2VzdCBibG9j a2VyIGlzIHRoZSAicmVncmVzc2lvbiIgb2YgdGhlIGRlYnVnIGxvZ3MuCj4gTm90IGp1c3QgaW4g dGhpcyBwb2ludCwgYnV0IEkgbWVhbiBldmVyeXdoZXJlLi4uCj4gdGhlIHVzZSBvZiB0aGUgb2xk IERSTV9ERUJVR19LTVMgc2hvdWxkIGJlIGF2b2lkZWQgaGVyZSBpbWhvLgo+IEFsdGhvdWdoIGl0 IGlzIGJhY2tsaWdodCwgd2hhdCBpdCB3b3VsZCBtZWFuIGludGVncmF0ZWQgYW5kIG9ubHkKPiBv bmUgZGV2aWNlIGF2YWlsYWJsZSwgdGhpcyB3aWxsIGF0IGxlYXN0IGNoYW5nZSBob3cgd2Ugc2Vl IHRoZSBsb2dzLi4KPiAKPiBBbnkgY2hhbmdlIG9mIHVzaW5nIGRybV9kYmdfKihkcm0sID8hCgpJ dCdsbCB0YWtlIGEgdHJlZS13aWRlIHBhdGNoIHNlcmllcywgYnV0IEknbGwgZ28gYWhlYWQgYW5k IGRvIHRoYXQKdG9kYXkvdG9tb3Jyb3cgOikKCj4gCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgaWYgKGJsLT5sc2JfcmVnX3VzZWQpCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAoYnVmWzBdIDw8IDgpIHwg YnVmWzFdOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIGJ1ZlswXTsK PiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoC8qCj4gPiArwqDC oMKgwqDCoMKgwqAgKiBJZiB3ZSdyZSBub3QgaW4gRFBDRCBjb250cm9sIG1vZGUgeWV0LCB0aGUg cHJvZ3JhbW1lZCBicmlnaHRuZXNzCj4gPiB2YWx1ZSBpcyBtZWFuaW5nbGVzcyBhbmQKPiA+ICvC oMKgwqDCoMKgwqDCoCAqIHRoZSBkcml2ZXIgc2hvdWxkIGFzc3VtZSBtYXggYnJpZ2h0bmVzcwo+ ID4gK8KgwqDCoMKgwqDCoMKgICovCj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gYmwtPm1heDsK PiA+ICt9Cj4gPiArCj4gPiArLyoqCj4gPiArICogZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgpIC0g UHJvYmUgYSBkaXNwbGF5IHBhbmVsJ3MgVENPTiB1c2luZyB0aGUKPiA+IHN0YW5kYXJkIFZFU0Eg ZURQIGJhY2tsaWdodAo+ID4gKyAqIGludGVyZmFjZS4KPiA+ICsgKiBAYXV4OiBUaGUgRFAgYXV4 IGRldmljZSB0byB1c2UgZm9yIHByb2JpbmcKPiA+ICsgKiBAYmw6IFRoZSAmZHJtX2VkcF9iYWNr bGlnaHRfaW5mbyBzdHJ1Y3QgdG8gZmlsbCBvdXQgd2l0aCBpbmZvcm1hdGlvbiBvbgo+ID4gdGhl IGJhY2tsaWdodAo+ID4gKyAqIEBkcml2ZXJfcHdtX2ZyZXFfaHo6IE9wdGlvbmFsIFBXTSBmcmVx dWVuY3kgZnJvbSB0aGUgZHJpdmVyIGluIGh6Cj4gPiArICogQGVkcF9kcGNkOiBBIGNhY2hlZCBj b3B5IG9mIHRoZSBlRFAgRFBDRAo+ID4gKyAqIEBjdXJyZW50X2xldmVsOiBXaGVyZSB0byBzdG9y ZSB0aGUgcHJvYmVkIGJyaWdodG5lc3MgbGV2ZWwKPiA+ICsgKiBAY3VycmVudF9tb2RlOiBXaGVy ZSB0byBzdG9yZSB0aGUgY3VycmVudGx5IHNldCBiYWNrbGlnaHQgY29udHJvbCBtb2RlCj4gPiAr ICoKPiA+ICsgKiBJbml0aWFsaXplcyBhICZkcm1fZWRwX2JhY2tsaWdodF9pbmZvIHN0cnVjdCBi eSBwcm9iaW5nIEBhdXggZm9yIGl0J3MKPiA+IGJhY2tsaWdodCBjYXBhYmlsaXRpZXMsCj4gPiAr ICogYWxvbmcgd2l0aCBhbHNvIHByb2JpbmcgdGhlIGN1cnJlbnQgYW5kIG1heGltdW0gc3VwcG9y dGVkIGJyaWdodG5lc3MKPiA+IGxldmVscy4KPiA+ICsgKgo+ID4gKyAqIElmIEBkcml2ZXJfcHdt X2ZyZXFfaHogaXMgbm9uLXplcm8sIHRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSBiYWNrbGlnaHQK PiA+IGZyZXF1ZW5jeS4gT3RoZXJ3aXNlLCB0aGUKPiA+ICsgKiBkZWZhdWx0IGZyZXF1ZW5jeSBm cm9tIHRoZSBwYW5lbCBpcyB1c2VkLgo+ID4gKyAqCj4gPiArICogUmV0dXJuczogJTAgb24gc3Vj Y2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+ID4gKyAqLwo+ID4gK2ludAo+ ID4gK2RybV9lZHBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kcF9hdXggKmF1eCwgc3RydWN0 Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTE2IGRyaXZlcl9wd21fZnJlcV9oeiwgY29uc3QgdTgK PiA+IGVkcF9kcGNkW0VEUF9ESVNQTEFZX0NUTF9DQVBfU0laRV0sCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUxNiAqY3VycmVudF9sZXZlbCwgdTggKmN1 cnJlbnRfbW9kZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gKwo+ID4g K8KgwqDCoMKgwqDCoMKgaWYgKGVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9BVVhfRU5B QkxFX0NBUCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBibC0+YXV4X2VuYWJs ZSA9IHRydWU7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoZWRwX2RwY2RbMl0gJiBEUF9FRFBfQkFD S0xJR0hUX0JSSUdIVE5FU1NfQllURV9DT1VOVCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBibC0+bHNiX3JlZ191c2VkID0gdHJ1ZTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDC oHJldCA9IGRybV9lZHBfYmFja2xpZ2h0X3Byb2JlX21heChhdXgsIGJsLCBkcml2ZXJfcHdtX2Zy ZXFfaHosCj4gPiBlZHBfZHBjZCk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgcmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfcHJvYmVfbGV2ZWwoYXV4LCBibCwg Y3VycmVudF9tb2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQgPCAwKQo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqAq Y3VycmVudF9sZXZlbCA9IHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoERSTV9ERUJVR19L TVMoIiVzOiBGb3VuZCBiYWNrbGlnaHQgbGV2ZWw9JWQvJWQKPiA+IHB3bV9mcmVxX3ByZV9kaXZp ZGVyPSVkIG1vZGU9JXhcbiIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBhdXgtPm5hbWUsICpjdXJyZW50X2xldmVsLCBibC0+bWF4LCBibC0KPiA+ID5wd21f ZnJlcV9wcmVfZGl2aWRlciwgKmN1cnJlbnRfbW9kZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBEUk1f REVCVUdfS01TKCIlczogQmFja2xpZ2h0IGNhcHM6IHB3bWdlbl9iaXRfY291bnQ9JWQKPiA+IGxz Yl9yZWdfdXNlZD0lZCBhdXhfZW5hYmxlPSVkXG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYXV4LT5uYW1lLCBibC0+cHdtZ2VuX2JpdF9jb3VudCwgYmwt PmxzYl9yZWdfdXNlZCwgYmwtCj4gPiA+YXV4X2VuYWJsZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBy ZXR1cm4gMDsKPiA+ICt9Cj4gPiArRVhQT1JUX1NZTUJPTChkcm1fZWRwX2JhY2tsaWdodF9pbml0 KTsKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rp c3BsYXlfdHlwZXMuaAo+ID4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rp c3BsYXlfdHlwZXMuaAo+ID4gaW5kZXggMWQ4OTg0MDc3ZThhLi45ZjQzZDBiMTRlMTEgMTAwNjQ0 Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rpc3BsYXlfdHlw ZXMuaAo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kaXNwbGF5 X3R5cGVzLmgKPiA+IEBAIC0yNjQsMTAgKzI2NCw3IEBAIHN0cnVjdCBpbnRlbF9wYW5lbCB7Cj4g PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIERQQ0QgYmFja2xpZ2h0ICovCj4g PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVuaW9uIHsKPiA+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB7Cj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1 OCBwd21nZW5fYml0X2NvdW50Owo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTggcHdtX2ZyZXFfcHJlX2RpdmlkZXI7Cj4g PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBib29sIGxzYl9yZWdfdXNlZDsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJvb2wgYXV4X2VuYWJsZTsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHN0cnVjdCBkcm1fZWRwX2JhY2tsaWdodF9pbmZvIGluZm87Cj4gPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9IHZlc2E7Cj4gPiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qgewo+ID4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGJvb2wgc2RyX3VzZXNfYXV4Owo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiBpbmRleCBhOThkOWJk NGIwZWQuLjI4NmViMzM3NDQ4ZSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQuYwo+ID4gQEAgLTI3MCwxMTQg KzI3MCwxOSBAQCBpbnRlbF9kcF9hdXhfaGRyX3NldHVwX2JhY2tsaWdodChzdHJ1Y3QKPiA+IGlu dGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBlbnVtIHBpcGUgcGkKPiA+IMKgfQo+ID4gwqAKPiA+ IMKgLyogVkVTQSBiYWNrbGlnaHQgY2FsbGJhY2tzICovCj4gPiAtc3RhdGljIGJvb2wgaW50ZWxf ZHBfYXV4X3Zlc2FfYmFja2xpZ2h0X2RwY2RfbW9kZShzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yCj4g PiAqY29ubmVjdG9yKQo+ID4gLXsKPiA+IC3CoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9kcCAq aW50ZWxfZHAgPSBpbnRlbF9hdHRhY2hlZF9kcChjb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKgwqDC oMKgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBkcF90b19pOTE1KGludGVsX2RwKTsK PiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDCoMKgwqDCoMKgwqB1OCBtb2RlX3Jl ZzsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKCZpbnRl bF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwgJm1vZGVf cmVnKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQgdG8gcmVh ZCBiYWNrbGlnaHQgbW9kZToKPiA+ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiBmYWxzZTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+ IC3CoMKgwqDCoMKgwqDCoHJldHVybiAobW9kZV9yZWcgJiBEUF9FRFBfQkFDS0xJR0hUX0NPTlRS T0xfTU9ERV9NQVNLKSA9PQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIERQX0VEUF9C QUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0Q7Cj4gPiAtfQo+ID4gLQo+ID4gLS8qCj4gPiAtICog UmVhZCB0aGUgY3VycmVudCBiYWNrbGlnaHQgdmFsdWUgZnJvbSBEUENEIHJlZ2lzdGVyKHMpIGJh c2VkCj4gPiAtICogb24gaWYgOC1iaXQoTVNCKSBvciAxNi1iaXQoTVNCIGFuZCBMU0IpIHZhbHVl cyBhcmUgc3VwcG9ydGVkCj4gPiAtICovCj4gPiDCoHN0YXRpYyB1MzIgaW50ZWxfZHBfYXV4X3Zl c2FfZ2V0X2JhY2tsaWdodChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yCj4gPiAqY29ubmVjdG9yLCBl bnVtIHBpcGUgdW51c2VkKQo+ID4gwqB7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxf ZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+IC3CoMKgwqDC oMKgwqDCoHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZHBfdG9faTkxNShpbnRlbF9k cCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gLcKgwqDCoMKgwqDCoMKgdTggcmVh ZF92YWxbMl0gPSB7IDB4MCB9Owo+ID4gLcKgwqDCoMKgwqDCoMKgdTE2IGxldmVsID0gMDsKPiA+ IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qCj4gPiAtwqDCoMKgwqDCoMKgwqAgKiBJZiB3ZSdyZSBu b3QgaW4gRFBDRCBjb250cm9sIG1vZGUgeWV0LCB0aGUgcHJvZ3JhbW1lZCBicmlnaHRuZXNzCj4g PiAtwqDCoMKgwqDCoMKgwqAgKiB2YWx1ZSBpcyBtZWFuaW5nbGVzcyBhbmQgd2Ugc2hvdWxkIGFz c3VtZSBtYXggYnJpZ2h0bmVzcwo+ID4gLcKgwqDCoMKgwqDCoMKgICovCj4gPiAtwqDCoMKgwqDC oMKgwqBpZiAoIWludGVsX2RwX2F1eF92ZXNhX2JhY2tsaWdodF9kcGNkX21vZGUoY29ubmVjdG9y KSkKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gY29ubmVjdG9yLT5w YW5lbC5iYWNrbGlnaHQubWF4Owo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2Rw X2RwY2RfcmVhZCgmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVT U19NU0IsICZyZWFkX3ZhbCwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZihyZWFkX3ZhbCkpOwo+ID4gLcKgwqDCoMKg wqDCoMKgaWYgKHJldCAhPSBzaXplb2YocmVhZF92YWwpKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRybSwgIkZhaWxlZCB0byByZWFkIGJy aWdodG5lc3MgbGV2ZWw6Cj4gPiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKg wqDCoMKgwqDCoGlmIChjb25uZWN0b3ItPnBhbmVsLmJhY2tsaWdodC5lZHAudmVzYS5sc2JfcmVn X3VzZWQpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGV2ZWwgPSAocmVhZF92 YWxbMF0gPDwgOCB8IHJlYWRfdmFsWzFdKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGVsc2UKPiA+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsZXZlbCA9IHJlYWRfdmFsWzBdOwo+ID4gLQo+ ID4gLcKgwqDCoMKgwqDCoMKgcmV0dXJuIGxldmVsOwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJu IGNvbm5lY3Rvci0+cGFuZWwuYmFja2xpZ2h0LmxldmVsOwo+ID4gwqB9Cj4gPiDCoAo+ID4gLS8q Cj4gPiAtICogU2VuZHMgdGhlIGN1cnJlbnQgYmFja2xpZ2h0IGxldmVsIG92ZXIgdGhlIGF1eCBj aGFubmVsLCBjaGVja2luZyBpZiBpdHMKPiA+IHVzaW5nCj4gPiAtICogOC1iaXQgb3IgMTYgYml0 IHZhbHVlIChNU0IgYW5kIExTQikKPiA+IC0gKi8KPiA+IMKgc3RhdGljIHZvaWQKPiA+IC1pbnRl bF9kcF9hdXhfdmVzYV9zZXRfYmFja2xpZ2h0KGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0 YXRlCj4gPiAqY29ubl9zdGF0ZSwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUzMiBsZXZlbCkKPiA+ICtpbnRlbF9kcF9h dXhfdmVzYV9zZXRfYmFja2xpZ2h0KGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlCj4g PiAqY29ubl9zdGF0ZSwgdTMyIGxldmVsKQo+ID4gwqB7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgc3Ry dWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gdG9faW50ZWxfY29ubmVjdG9yKGNvbm5f c3RhdGUtCj4gPiA+Y29ubmVjdG9yKTsKPiA+IC3CoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9k cCAqaW50ZWxfZHAgPSBpbnRlbF9hdHRhY2hlZF9kcChjb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKg wqDCoMKgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBkcF90b19pOTE1KGludGVsX2Rw KTsKPiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDCoMKgwqDCoMKgwqB1OCB2YWxz WzJdID0geyAweDAgfTsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qIFdyaXRlIHRoZSBNU0Ig YW5kL29yIExTQiAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKGNvbm5lY3Rvci0+cGFuZWwuYmFj a2xpZ2h0LmVkcC52ZXNhLmxzYl9yZWdfdXNlZCkgewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHZhbHNbMF0gPSAobGV2ZWwgJiAweEZGMDApID4+IDg7Cj4gPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFsc1sxXSA9IChsZXZlbCAmIDB4RkYpOwo+ID4gLcKgwqDC oMKgwqDCoMKgfSBlbHNlIHsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2YWxz WzBdID0gbGV2ZWw7Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtCj4gPiAtwqDCoMKgwqDCoMKg wqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZSgmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9CQUNL TElHSFRfQlJJR0hUTkVTU19NU0IsIHZhbHMsCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzaXplb2YodmFscykpOwo+ID4g LcKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSBzaXplb2YodmFscykpIHsKPiA+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiRmFpbGVkIHRvIHdy aXRlIGF1eCBiYWNrbGlnaHQKPiA+IGxldmVsOiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtfQo+ ID4gLQo+ID4gLXN0YXRpYyB2b2lkIHNldF92ZXNhX2JhY2tsaWdodF9lbmFibGUoc3RydWN0IGlu dGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gYm9vbCBlbmFibGUpCj4gPiAtewo+ID4gLcKg wqDCoMKgwqDCoMKgc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGludGVsX2F0dGFjaGVkX2Rw KGNvbm5lY3Rvcik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gLcKgwqDCoMKgwqDCoMKgaW50IHJldDsK PiA+IC3CoMKgwqDCoMKgwqDCoHU4IHJlZ192YWwgPSAwOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDC oMKgLyogRWFybHkgcmV0dXJuIHdoZW4gZGlzcGxheSB1c2Ugb3RoZXIgbWVjaGFuaXNtIHRvIGVu YWJsZQo+ID4gYmFja2xpZ2h0LiAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKCFjb25uZWN0b3It PnBhbmVsLmJhY2tsaWdodC5lZHAudmVzYS5hdXhfZW5hYmxlKQo+ID4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRy bV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0RJU1BMQVlfQ09OVFJP TF9SRUdJU1RFUiwgJnJlZ192YWwpOwo+ID4gLcKgwqDCoMKgwqDCoMKgaWYgKHJldCAhPSAxKSB7 Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRy bSwgIkZhaWxlZCB0byByZWFkIGVEUCBkaXNwbGF5IGNvbnRyb2wKPiA+IHJlZ2lzdGVyOiAlZFxu IiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gPiAt wqDCoMKgwqDCoMKgwqB9Cj4gPiAtCj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoZW5hYmxlKQo+ID4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlZ192YWwgfD0gRFBfRURQX0JBQ0tMSUdI VF9FTkFCTEU7Cj4gPiAtwqDCoMKgwqDCoMKgwqBlbHNlCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmVnX3ZhbCAmPSB+KERQX0VEUF9CQUNLTElHSFRfRU5BQkxFKTsKPiA+ICvC oMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwgPSAmY29ubmVjdG9yLT5wYW5l bDsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9f aW50ZWxfZHAoY29ubmVjdG9yLT5lbmNvZGVyKTsKPiA+IMKgCj4gPiAtwqDCoMKgwqDCoMKgwqBy ZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJmludGVsX2RwLT5hdXgsCj4gPiBEUF9FRFBfRElTUExB WV9DT05UUk9MX1JFR0lTVEVSLCByZWdfdmFsKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQg IT0gMSkgewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZp OTE1LT5kcm0sICJGYWlsZWQgdG8gJXMgYXV4IGJhY2tsaWdodDogJWRcbiIsCj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbmFibGUgPyAi ZW5hYmxlIiA6ICJkaXNhYmxlIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKg wqDCoMKgwqDCoGRybV9lZHBfYmFja2xpZ2h0X3NldF9sZXZlbCgmaW50ZWxfZHAtPmF1eCwgJnBh bmVsLQo+ID4gPmJhY2tsaWdodC5lZHAudmVzYS5pbmZvLCBsZXZlbCk7Cj4gPiDCoH0KPiA+IMKg Cj4gPiDCoHN0YXRpYyB2b2lkCj4gPiBAQCAtMzg1LDE3MCArMjkwLDQ2IEBAIGludGVsX2RwX2F1 eF92ZXNhX2VuYWJsZV9iYWNrbGlnaHQoY29uc3Qgc3RydWN0Cj4gPiBpbnRlbF9jcnRjX3N0YXRl ICpjcnRjX3N0YXRlLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3Jf c3RhdGUKPiA+ICpjb25uX3N0YXRlLCB1MzIgbGV2ZWwpCj4gPiDCoHsKPiA+IMKgwqDCoMKgwqDC oMKgwqBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IgPSB0b19pbnRlbF9jb25uZWN0 b3IoY29ubl9zdGF0ZS0KPiA+ID5jb25uZWN0b3IpOwo+ID4gLcKgwqDCoMKgwqDCoMKgc3RydWN0 IGludGVsX2RwICppbnRlbF9kcCA9IGludGVsX2F0dGFjaGVkX2RwKGNvbm5lY3Rvcik7Cj4gPiAt wqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGRwX3RvX2k5MTUo aW50ZWxfZHApOwo+ID4gwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBpbnRlbF9wYW5lbCAqcGFuZWwg PSAmY29ubmVjdG9yLT5wYW5lbDsKPiA+IC3CoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiAtwqDC oMKgwqDCoMKgwqB1OCBkcGNkX2J1ZiwgbmV3X2RwY2RfYnVmOwo+ID4gLcKgwqDCoMKgwqDCoMKg dTggcHdtZ2VuX2JpdF9jb3VudCA9IHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EucHdtZ2VuX2Jp dF9jb3VudDsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRi KCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwg JmRwY2RfYnVmKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkgewo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQg dG8gcmVhZCBiYWNrbGlnaHQgbW9kZToKPiA+ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+ IC3CoMKgwqDCoMKgwqDCoG5ld19kcGNkX2J1ZiA9IGRwY2RfYnVmOwo+ID4gLQo+ID4gLcKgwqDC oMKgwqDCoMKgaWYgKChkcGNkX2J1ZiAmIERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX01B U0spICE9Cj4gPiBEUF9FRFBfQkFDS0xJR0hUX0NPTlRST0xfTU9ERV9EUENEKSB7Cj4gPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbmV3X2RwY2RfYnVmICY9IH5EUF9FRFBfQkFDS0xJ R0hUX0NPTlRST0xfTU9ERV9NQVNLOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oG5ld19kcGNkX2J1ZiB8PSBEUF9FRFBfQkFDS0xJR0hUX0NPTlRST0xfTU9ERV9EUENEOwo+ID4g LQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IGRybV9kcF9kcGNkX3dy aXRlYigmaW50ZWxfZHAtPmF1eCwKPiA+IERQX0VEUF9QV01HRU5fQklUX0NPVU5ULCBwd21nZW5f Yml0X2NvdW50KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9 IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRy bV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQgdG8gd3JpdGUgYXV4IHB3bWdlbgo+ID4gYml0 IGNvdW50OiAlZFxuIiwgcmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKg wqDCoMKgwqDCoGlmIChwYW5lbC0+YmFja2xpZ2h0LmVkcC52ZXNhLnB3bV9mcmVxX3ByZV9kaXZp ZGVyKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2Rw Y2Rfd3JpdGViKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCwK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGFuZWwtCj4gPiA+YmFja2xpZ2h0LmVkcC52ZXNh LnB3bV9mcmVxX3ByZV9kaXZpZGVyKTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBpZiAocmV0ID09IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoG5ld19kcGNkX2J1ZiB8PQo+ID4gRFBfRURQX0JBQ0tMSUdIVF9GUkVRX0FVWF9T RVRfRU5BQkxFOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVsc2UKPiA+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2RiZ19rbXMo Jmk5MTUtPmRybSwgIkZhaWxlZCB0byB3cml0ZSBhdXgKPiA+IGJhY2tsaWdodCBmcmVxdWVuY3k6 ICVkXG4iLAo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAt Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAobmV3X2RwY2RfYnVmICE9IGRwY2RfYnVmKSB7Cj4gPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKCZp bnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX0JBQ0tMSUdIVF9NT0RFX1NFVF9SRUdJU1RFUiwKPiA+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbmV3X2RwY2RfYnVmKTsKPiA+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5kcm0sICJGYWlsZWQg dG8gd3JpdGUgYXV4Cj4gPiBiYWNrbGlnaHQgbW9kZTogJWRcbiIsIHJldCk7Cj4gPiAtwqDCoMKg wqDCoMKgwqB9Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0g ZW5jX3RvX2ludGVsX2RwKGNvbm5lY3Rvci0+ZW5jb2Rlcik7Cj4gPiDCoAo+ID4gLcKgwqDCoMKg wqDCoMKgaW50ZWxfZHBfYXV4X3Zlc2Ffc2V0X2JhY2tsaWdodChjb25uX3N0YXRlLCBsZXZlbCk7 Cj4gPiAtwqDCoMKgwqDCoMKgwqBzZXRfdmVzYV9iYWNrbGlnaHRfZW5hYmxlKGNvbm5lY3Rvciwg dHJ1ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBkcm1fZWRwX2JhY2tsaWdodF9lbmFibGUoJmludGVs X2RwLT5hdXgsICZwYW5lbC0KPiA+ID5iYWNrbGlnaHQuZWRwLnZlc2EuaW5mbywgbGV2ZWwpOwo+ ID4gwqB9Cj4gPiDCoAo+ID4gwqBzdGF0aWMgdm9pZCBpbnRlbF9kcF9hdXhfdmVzYV9kaXNhYmxl X2JhY2tsaWdodChjb25zdCBzdHJ1Y3QKPiA+IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9jb25u X3N0YXRlLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTMyIGxl dmVsKQo+ID4gwqB7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzZXRfdmVzYV9iYWNrbGlnaHRfZW5hYmxl KHRvX2ludGVsX2Nvbm5lY3RvcihvbGRfY29ubl9zdGF0ZS0KPiA+ID5jb25uZWN0b3IpLCBmYWxz ZSk7Cj4gPiAtfQo+ID4gLQo+ID4gLS8qCj4gPiAtICogQ29tcHV0ZSBQV00gZnJlcXVlbmN5IGRp dmlkZXIgdmFsdWUgYmFzZWQgb2ZmIHRoZSBmcmVxdWVuY3kgcHJvdmlkZWQgdG8KPiA+IHVzIGJ5 IHRoZSB2YnQuCj4gPiAtICogVGhlIFBXTSBGcmVxdWVuY3kgaXMgY2FsY3VsYXRlZCBhcyAyN01o eiAvIChGIHggUCkuCj4gPiAtICogLSBXaGVyZSBGID0gUFdNIEZyZXF1ZW5jeSBQcmUtRGl2aWRl ciB2YWx1ZSBwcm9ncmFtbWVkIGJ5IGZpZWxkIDc6MCBvZgo+ID4gdGhlCj4gPiAtICrCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgRURQX0JBQ0tMSUdIVF9GUkVRX1NFVCByZWdpc3RlciAoRFBDRCBB ZGRyZXNzIDAwNzI4aCkKPiA+IC0gKiAtIFdoZXJlIFAgPSAyXlBuLCB3aGVyZSBQbiBpcyB0aGUg dmFsdWUgcHJvZ3JhbW1lZCBieSBmaWVsZCA0OjAgb2YgdGhlCj4gPiAtICrCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgRURQX1BXTUdFTl9CSVRfQ09VTlQgcmVnaXN0ZXIgKERQQ0QgQWRkcmVzcyAw MDcyNGgpCj4gPiAtICovCj4gPiAtc3RhdGljIHUzMiBpbnRlbF9kcF9hdXhfdmVzYV9jYWxjX21h eF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3Rvcgo+ID4gKmNvbm5lY3RvcikKPiA+IC17 Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5 MTUoY29ubmVjdG9yLT5iYXNlLmRldik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxf ZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+ICvCoMKgwqDC oMKgwqDCoHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciA9Cj4gPiB0b19pbnRlbF9j b25uZWN0b3Iob2xkX2Nvbm5fc3RhdGUtPmNvbm5lY3Rvcik7Cj4gPiDCoMKgwqDCoMKgwqDCoMKg c3RydWN0IGludGVsX3BhbmVsICpwYW5lbCA9ICZjb25uZWN0b3ItPnBhbmVsOwo+ID4gLcKgwqDC oMKgwqDCoMKgdTMyIG1heF9iYWNrbGlnaHQgPSAwOwo+ID4gLcKgwqDCoMKgwqDCoMKgaW50IHJl dCwgZnJlcSwgZnhwLCBmeHBfbWluLCBmeHBfbWF4LCBmeHBfYWN0dWFsLCBmID0gMTsKPiA+IC3C oMKgwqDCoMKgwqDCoHU4IHBuLCBwbl9taW4sIHBuX21heDsKPiA+IC0KPiA+IC3CoMKgwqDCoMKg wqDCoHJldCA9IGRybV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LCBEUF9FRFBfUFdNR0VO X0JJVF9DT1VOVCwKPiA+ICZwbik7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJt LCAiRmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudAo+ID4gY2FwOiAlZFxuIiwgcmV0KTsK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+IC3CoMKgwqDC oMKgwqDCoH0KPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoHBuICY9IERQX0VEUF9QV01HRU5fQklU X0NPVU5UX01BU0s7Cj4gPiAtwqDCoMKgwqDCoMKgwqBtYXhfYmFja2xpZ2h0ID0gKDEgPDwgcG4p IC0gMTsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqDCoC8qIEZpbmQgZGVzaXJlZCB2YWx1ZSBvZiAo RiB4IFApCj4gPiAtwqDCoMKgwqDCoMKgwqAgKiBOb3RlIHRoYXQsIGlmIEYgeCBQIGlzIG91dCBv ZiBzdXBwb3J0ZWQgcmFuZ2UsIHRoZSBtYXhpbXVtIHZhbHVlCj4gPiBvcgo+ID4gLcKgwqDCoMKg wqDCoMKgICogbWluaW11bSB2YWx1ZSB3aWxsIGFwcGxpZWQgYXV0b21hdGljYWxseS4gU28gbm8g bmVlZCB0byBjaGVjawo+ID4gdGhhdC4KPiA+IC3CoMKgwqDCoMKgwqDCoCAqLwo+ID4gLcKgwqDC oMKgwqDCoMKgZnJlcSA9IGk5MTUtPnZidC5iYWNrbGlnaHQucHdtX2ZyZXFfaHo7Cj4gPiAtwqDC oMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiVkJUIGRlZmluZWQgYmFja2xpZ2h0 IGZyZXF1ZW5jeSAldSBIelxuIiwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZnJlcSk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoIWZyZXEpIHsKPiA+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLAo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIlVzZSBwYW5l bCBkZWZhdWx0IGJhY2tsaWdodCBmcmVxdWVuY3lcbiIpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgZnhwID0gRElWX1JPVU5EX0NMT1NFU1QoS0h6KERQX0VE UF9CQUNLTElHSFRfRlJFUV9CQVNFX0tIWiksIGZyZXEpOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDC oMKgLyogVXNlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUgb2YgUG4gZm9yIG1vcmUgZ3JhbnVsYXJp dHkgb2YKPiA+IGJyaWdodG5lc3MKPiA+IC3CoMKgwqDCoMKgwqDCoCAqIGFkanVzdG1lbnQgd2hp bGUgc2F0aWZ5aW5nIHRoZSBjb25kaXRpb25zIGJlbG93Lgo+ID4gLcKgwqDCoMKgwqDCoMKgICog LSBQbiBpcyBpbiB0aGUgcmFuZ2Ugb2YgUG5fbWluIGFuZCBQbl9tYXgKPiA+IC3CoMKgwqDCoMKg wqDCoCAqIC0gRiBpcyBpbiB0aGUgcmFuZ2Ugb2YgMSBhbmQgMjU1Cj4gPiAtwqDCoMKgwqDCoMKg wqAgKiAtIEZ4UCBpcyB3aXRoaW4gMjUlIG9mIGRlc2lyZWQgdmFsdWUuCj4gPiAtwqDCoMKgwqDC oMKgwqAgKsKgwqAgTm90ZTogMjUlIGlzIGFyYml0cmFyeSB2YWx1ZSBhbmQgbWF5IG5lZWQgc29t ZSB0d2Vhay4KPiA+IC3CoMKgwqDCoMKgwqDCoCAqLwo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0ID0g ZHJtX2RwX2RwY2RfcmVhZGIoJmludGVsX2RwLT5hdXgsCj4gPiBEUF9FRFBfUFdNR0VOX0JJVF9D T1VOVF9DQVBfTUlOLCAmcG5fbWluKTsKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChyZXQgIT0gMSkg ewo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9kYmdfa21zKCZpOTE1LT5k cm0sICJGYWlsZWQgdG8gcmVhZCBwd21nZW4gYml0IGNvdW50IGNhcAo+ID4gbWluOiAlZFxuIiwg cmV0KTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gbWF4X2JhY2ts aWdodDsKPiA+IC3CoMKgwqDCoMKgwqDCoH0KPiA+IC3CoMKgwqDCoMKgwqDCoHJldCA9IGRybV9k cF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gRFBfRURQX1BXTUdFTl9CSVRfQ09VTlRf Q0FQX01BWCwgJnBuX21heCk7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAocmV0ICE9IDEpIHsKPiA+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAi RmFpbGVkIHRvIHJlYWQgcHdtZ2VuIGJpdCBjb3VudCBjYXAKPiA+IG1heDogJWRcbiIsIHJldCk7 Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIG1heF9iYWNrbGlnaHQ7 Cj4gPiAtwqDCoMKgwqDCoMKgwqB9Cj4gPiAtwqDCoMKgwqDCoMKgwqBwbl9taW4gJj0gRFBfRURQ X1BXTUdFTl9CSVRfQ09VTlRfTUFTSzsKPiA+IC3CoMKgwqDCoMKgwqDCoHBuX21heCAmPSBEUF9F RFBfUFdNR0VOX0JJVF9DT1VOVF9NQVNLOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgLyogRW5z dXJlIGZyZXF1ZW5jeSBpcyB3aXRoaW4gMjUlIG9mIGRlc2lyZWQgdmFsdWUgKi8KPiA+IC3CoMKg wqDCoMKgwqDCoGZ4cF9taW4gPSBESVZfUk9VTkRfQ0xPU0VTVChmeHAgKiAzLCA0KTsKPiA+IC3C oMKgwqDCoMKgwqDCoGZ4cF9tYXggPSBESVZfUk9VTkRfQ0xPU0VTVChmeHAgKiA1LCA0KTsKPiA+ IC0KPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChmeHBfbWluIDwgKDEgPDwgcG5fbWluKSB8fCAoMjU1 IDw8IHBuX21heCkgPCBmeHBfbWF4KSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZHJtX2RiZ19rbXMoJmk5MTUtPmRybSwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJWQlQgZGVmaW5lZCBiYWNrbGlnaHQgZnJlcXVl bmN5IG91dCBvZgo+ID4gcmFuZ2VcbiIpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4g LcKgwqDCoMKgwqDCoMKgZm9yIChwbiA9IHBuX21heDsgcG4gPj0gcG5fbWluOyBwbi0tKSB7Cj4g PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZiA9IGNsYW1wKERJVl9ST1VORF9DTE9T RVNUKGZ4cCwgMSA8PCBwbiksIDEsIDI1NSk7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZnhwX2FjdHVhbCA9IGYgPDwgcG47Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaWYgKGZ4cF9taW4gPD0gZnhwX2FjdHVhbCAmJiBmeHBfYWN0dWFsIDw9IGZ4cF9tYXgp Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFr Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgZHJtX2RiZ19r bXMoJmk5MTUtPmRybSwgIlVzaW5nIGVEUCBwd21nZW4gYml0IGNvdW50IG9mICVkXG4iLCBwbik7 Cj4gPiAtwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJmludGVsX2RwLT5h dXgsIERQX0VEUF9QV01HRU5fQklUX0NPVU5ULAo+ID4gcG4pOwo+ID4gLcKgwqDCoMKgwqDCoMKg aWYgKHJldCAhPSAxKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2Ri Z19rbXMoJmk5MTUtPmRybSwgIkZhaWxlZCB0byB3cml0ZSBhdXggcHdtZ2VuIGJpdAo+ID4gY291 bnQ6ICVkXG4iLCByZXQpOwo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVy biBtYXhfYmFja2xpZ2h0Owo+ID4gLcKgwqDCoMKgwqDCoMKgfQo+ID4gLQo+ID4gLcKgwqDCoMKg wqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lZHAudmVzYS5wd21nZW5fYml0X2NvdW50ID0gcG47Cj4g PiAtwqDCoMKgwqDCoMKgwqBpZiAoaW50ZWxfZHAtPmVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tM SUdIVF9GUkVRX0FVWF9TRVRfQ0FQKQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EucHdtX2ZyZXFfcHJlX2RpdmlkZXIgPSBmOwo+ID4g LQo+ID4gLcKgwqDCoMKgwqDCoMKgbWF4X2JhY2tsaWdodCA9ICgxIDw8IHBuKSAtIDE7Cj4gPiAr wqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2Rw KGNvbm5lY3Rvci0+ZW5jb2Rlcik7Cj4gPiDCoAo+ID4gLcKgwqDCoMKgwqDCoMKgcmV0dXJuIG1h eF9iYWNrbGlnaHQ7Cj4gPiArwqDCoMKgwqDCoMKgwqBkcm1fZWRwX2JhY2tsaWdodF9kaXNhYmxl KCZpbnRlbF9kcC0+YXV4LCAmcGFuZWwtCj4gPiA+YmFja2xpZ2h0LmVkcC52ZXNhLmluZm8pOwo+ ID4gwqB9Cj4gPiDCoAo+ID4gLXN0YXRpYyBpbnQgaW50ZWxfZHBfYXV4X3Zlc2Ffc2V0dXBfYmFj a2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IKPiA+ICpjb25uZWN0b3IsCj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSBwaXBlIHBpcGUpCj4gPiArc3RhdGljIGludCBp bnRlbF9kcF9hdXhfdmVzYV9zZXR1cF9iYWNrbGlnaHQoc3RydWN0IGludGVsX2Nvbm5lY3Rvcgo+ ID4gKmNvbm5lY3RvciwgZW51bSBwaXBlIHBpcGUpCj4gPiDCoHsKPiA+IMKgwqDCoMKgwqDCoMKg wqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9y KTsKPiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsID0gJmNvbm5l Y3Rvci0+cGFuZWw7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gK8KgwqDCoMKgwqDCoMKgdTE2IGN1cnJl bnRfbGV2ZWw7Cj4gPiArwqDCoMKgwqDCoMKgwqB1OCBjdXJyZW50X21vZGU7Cj4gPiArwqDCoMKg wqDCoMKgwqBpbnQgcmV0Owo+ID4gwqAKPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChpbnRlbF9kcC0+ ZWRwX2RwY2RbMV0gJiBEUF9FRFBfQkFDS0xJR0hUX0FVWF9FTkFCTEVfQ0FQKQo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBhbmVsLT5iYWNrbGlnaHQuZWRwLnZlc2EuYXV4X2Vu YWJsZSA9IHRydWU7Cj4gPiAtwqDCoMKgwqDCoMKgwqBpZiAoaW50ZWxfZHAtPmVkcF9kcGNkWzJd ICYgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX0JZVEVfQ09VTlQpCj4gPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lZHAudmVzYS5sc2JfcmVnX3Vz ZWQgPSB0cnVlOwo+ID4gLQo+ID4gLcKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5tYXgg PQo+ID4gaW50ZWxfZHBfYXV4X3Zlc2FfY2FsY19tYXhfYmFja2xpZ2h0KGNvbm5lY3Rvcik7Cj4g PiAtwqDCoMKgwqDCoMKgwqBpZiAoIXBhbmVsLT5iYWNrbGlnaHQubWF4KQo+ID4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PREVWOwo+ID4gK8KgwqDCoMKgwqDCoMKg cmV0ID0gZHJtX2VkcF9iYWNrbGlnaHRfaW5pdCgmaW50ZWxfZHAtPmF1eCwgJnBhbmVsLQo+ID4g PmJhY2tsaWdodC5lZHAudmVzYS5pbmZvLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaTkxNS0+dmJ0LmJh Y2tsaWdodC5wd21fZnJlcV9oeiwKPiA+IGludGVsX2RwLT5lZHBfZHBjZCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICZjdXJyZW50X2xldmVsLCAmY3VycmVudF9tb2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDC oGlmIChyZXQgPCAwKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBy ZXQ7Cj4gPiDCoAo+ID4gK8KgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5tYXggPSBwYW5l bC0+YmFja2xpZ2h0LmVkcC52ZXNhLmluZm8ubWF4Owo+ID4gwqDCoMKgwqDCoMKgwqDCoHBhbmVs LT5iYWNrbGlnaHQubWluID0gMDsKPiA+IC3CoMKgwqDCoMKgwqDCoHBhbmVsLT5iYWNrbGlnaHQu bGV2ZWwgPSBpbnRlbF9kcF9hdXhfdmVzYV9nZXRfYmFja2xpZ2h0KGNvbm5lY3RvciwKPiA+IHBp cGUpOwo+ID4gLcKgwqDCoMKgwqDCoMKgcGFuZWwtPmJhY2tsaWdodC5lbmFibGVkID0KPiA+IGlu dGVsX2RwX2F1eF92ZXNhX2JhY2tsaWdodF9kcGNkX21vZGUoY29ubmVjdG9yKSAmJgo+ID4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwYW5lbC0+YmFja2xpZ2h0LmxldmVsICE9IDA7Cj4gPiArwqDCoMKgwqDCoMKgwqBp ZiAoY3VycmVudF9tb2RlID09IERQX0VEUF9CQUNLTElHSFRfQ09OVFJPTF9NT0RFX0RQQ0QpIHsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5lbC0+YmFja2xpZ2h0LmxldmVs ID0gY3VycmVudF9sZXZlbDsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5l bC0+YmFja2xpZ2h0LmVuYWJsZWQgPSBwYW5lbC0+YmFja2xpZ2h0LmxldmVsICE9IDA7Cj4gPiAr wqDCoMKgwqDCoMKgwqB9IGVsc2Ugewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgPSBwYW5lbC0+YmFja2xpZ2h0Lm1heDsKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwYW5lbC0+YmFja2xpZ2h0LmVuYWJsZWQgPSBmYWxz ZTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+IMKgCj4gPiDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IDA7Cj4gPiDCoH0KPiA+IEBAIC01NTksMTYgKzM0MCwxMiBAQCBpbnRlbF9kcF9hdXhfc3VwcG9y dHNfdmVzYV9iYWNrbGlnaHQoc3RydWN0Cj4gPiBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikK PiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0 YWNoZWRfZHAoY29ubmVjdG9yKTsKPiA+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSA9IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gwqAKPiA+IC3CoMKgwqDC oMKgwqDCoC8qIENoZWNrIHRoZSBlRFAgRGlzcGxheSBjb250cm9sIGNhcGFiaWxpdGllcyByZWdp c3RlcnMgdG8gZGV0ZXJtaW5lCj4gPiBpZgo+ID4gLcKgwqDCoMKgwqDCoMKgICogdGhlIHBhbmVs IGNhbiBzdXBwb3J0IGJhY2tsaWdodCBjb250cm9sIG92ZXIgdGhlIGF1eCBjaGFubmVsLgo+ID4g LcKgwqDCoMKgwqDCoMKgICoKPiA+IC3CoMKgwqDCoMKgwqDCoCAqIFRPRE86IFdlIGN1cnJlbnRs eSBvbmx5IHN1cHBvcnQgQVVYIG9ubHkgYmFja2xpZ2h0Cj4gPiBjb25maWd1cmF0aW9ucywgbm90 IGJhY2tsaWdodHMgd2hpY2gKPiA+ICvCoMKgwqDCoMKgwqDCoC8qIFRPRE86IFdlIGN1cnJlbnRs eSBvbmx5IHN1cHBvcnQgQVVYIG9ubHkgYmFja2xpZ2h0Cj4gPiBjb25maWd1cmF0aW9ucywgbm90 IGJhY2tsaWdodHMgd2hpY2gKPiA+IMKgwqDCoMKgwqDCoMKgwqAgKiByZXF1aXJlIGEgbWl4IG9m IFBXTSBhbmQgQVVYIGNvbnRyb2xzIHRvIHdvcmsuIEluIHRoZSBtZWFuIHRpbWUsCj4gPiB0aGVz ZSBtYWNoaW5lcyB0eXBpY2FsbHkKPiA+IMKgwqDCoMKgwqDCoMKgwqAgKiB3b3JrIGp1c3QgZmlu ZSB1c2luZyBub3JtYWwgUFdNIGNvbnRyb2xzIGFueXdheS4KPiA+IMKgwqDCoMKgwqDCoMKgwqAg Ki8KPiA+IC3CoMKgwqDCoMKgwqDCoGlmIChpbnRlbF9kcC0+ZWRwX2RwY2RbMV0gJiBEUF9FRFBf VENPTl9CQUNLTElHSFRfQURKVVNUTUVOVF9DQVAgJiYKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oCAoaW50ZWxfZHAtPmVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9BVVhfRU5BQkxFX0NB UCkgJiYKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoCAoaW50ZWxfZHAtPmVkcF9kcGNkWzJdICYK PiA+IERQX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVTU19BVVhfU0VUX0NBUCkpIHsKPiA+ICvCoMKg wqDCoMKgwqDCoGlmICgoaW50ZWxfZHAtPmVkcF9kcGNkWzFdICYgRFBfRURQX0JBQ0tMSUdIVF9B VVhfRU5BQkxFX0NBUCkgJiYKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCBkcm1fZWRwX2JhY2ts aWdodF9zdXBwb3J0ZWQoaW50ZWxfZHAtPmVkcF9kcGNkKSkgewo+ID4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBkcm1fZGJnX2ttcygmaTkxNS0+ZHJtLCAiQVVYIEJhY2tsaWdodCBD b250cm9sCj4gPiBTdXBwb3J0ZWQhXG4iKTsKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIHRydWU7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gZGlmZiAtLWdpdCBh L2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaCBiL2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIu aAo+ID4gaW5kZXggZWRmZmQxZGNjYTNlLi4xZWNhMGI0MmZjNDUgMTAwNjQ0Cj4gPiAtLS0gYS9p bmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmgKPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9kcF9o ZWxwZXIuaAo+ID4gQEAgLTE3OTAsNiArMTc5MCwyNCBAQCBkcm1fZHBfc2lua19jYW5fZG9fdmlk ZW9fd2l0aG91dF90aW1pbmdfbXNhKGNvbnN0IHU4Cj4gPiBkcGNkW0RQX1JFQ0VJVkVSX0NBUF9T SVpFXSkKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFBfTVNBX1RJTUlOR19Q QVJfSUdOT1JFRDsKPiA+IMKgfQo+ID4gwqAKPiA+ICsvKioKPiA+ICsgKiBkcm1fZWRwX2JhY2ts aWdodF9zdXBwb3J0ZWQoKSAtIENoZWNrIGFuIGVEUCBEUENEIGZvciBWRVNBIGJhY2tsaWdodAo+ ID4gc3VwcG9ydAo+ID4gKyAqIEBlZHBfZHBjZDogVGhlIERQQ0QgdG8gY2hlY2sKPiA+ICsgKgo+ ID4gKyAqIE5vdGUgdGhhdCBjdXJyZW50bHkgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAlZmFs c2UgZm9yIHBhbmVscyB3aGljaAo+ID4gc3VwcG9ydCB2YXJpb3VzIERQQ0QKPiA+ICsgKiBiYWNr bGlnaHQgZmVhdHVyZXMgYnV0IHdoaWNoIHJlcXVpcmUgdGhlIGJyaWdodG5lc3MgYmUgc2V0IHRo cm91Z2ggUFdNLAo+ID4gYW5kIGRvbid0IHN1cHBvcnQgc2V0dGluZwo+ID4gKyAqIHRoZSBicmln aHRuZXNzIGxldmVsIHZpYSB0aGUgRFBDRC4gVGhpcyBpcyBhIFRPRE8uCj4gPiArICoKPiA+ICsg KiBSZXR1cm5zOiAlVHJ1ZSBpZiBAZWRwX2RwY2QgaW5kaWNhdGVzIHRoYXQgVkVTQSBiYWNrbGln aHQgY29udHJvbHMgYXJlCj4gPiBzdXBwb3J0ZWQsICVmYWxzZQo+ID4gKyAqIG90aGVyd2lzZQo+ ID4gKyAqLwo+ID4gK3N0YXRpYyBpbmxpbmUgYm9vbAo+ID4gK2RybV9lZHBfYmFja2xpZ2h0X3N1 cHBvcnRlZChjb25zdCB1OCBlZHBfZHBjZFtFRFBfRElTUExBWV9DVExfQ0FQX1NJWkVdKQo+ID4g K3sKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAoZWRwX2RwY2RbMV0gJiBEUF9FRFBfVENPTl9C QUNLTElHSFRfQURKVVNUTUVOVF9DQVApICYmCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgKGVkcF9kcGNkWzJdICYgRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTX0FVWF9TRVRf Q0FQKTsKPiA+ICt9Cj4gPiArCj4gPiDCoC8qCj4gPiDCoCAqIERpc3BsYXlQb3J0IEFVWCBjaGFu bmVsCj4gPiDCoCAqLwo+ID4gQEAgLTIwODksNiArMjEwNywzNiBAQCBkcm1fZHBfaGFzX3F1aXJr KGNvbnN0IHN0cnVjdCBkcm1fZHBfZGVzYyAqZGVzYywgZW51bQo+ID4gZHJtX2RwX3F1aXJrIHF1 aXJrKQo+ID4gwqDCoMKgwqDCoMKgwqDCoHJldHVybiBkZXNjLT5xdWlya3MgJiBCSVQocXVpcmsp Owo+ID4gwqB9Cj4gPiDCoAo+ID4gKy8qKgo+ID4gKyAqIHN0cnVjdCBkcm1fZWRwX2JhY2tsaWdo dF9pbmZvIC0gUHJvYmVkIGVEUCBiYWNrbGlnaHQgaW5mbyBzdHJ1Y3QKPiA+ICsgKiBAcHdtZ2Vu X2JpdF9jb3VudDogVGhlIHB3bWdlbiBiaXQgY291bnQKPiA+ICsgKiBAcHdtX2ZyZXFfcHJlX2Rp dmlkZXI6IFRoZSBQV00gZnJlcXVlbmN5IHByZS1kaXZpZGVyIHZhbHVlIGJlaW5nIHVzZWQKPiA+ IGZvciB0aGlzIGJhY2tsaWdodCwgaWYgYW55Cj4gPiArICogQG1heDogVGhlIG1heGltdW0gYmFj a2xpZ2h0IGxldmVsIHRoYXQgbWF5IGJlIHNldAo+ID4gKyAqIEBsc2JfcmVnX3VzZWQ6IERvIHdl IGFsc28gd3JpdGUgdmFsdWVzIHRvIHRoZQo+ID4gRFBfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNT X0xTQiByZWdpc3Rlcj8KPiA+ICsgKiBAYXV4X2VuYWJsZTogRG9lcyB0aGUgcGFuZWwgc3VwcG9y dCB0aGUgQVVYIGVuYWJsZSBjYXA/Cj4gPiArICoKPiA+ICsgKiBUaGlzIHN0cnVjdHVyZSBjb250 YWlucyB2YXJpb3VzIGRhdGEgYWJvdXQgYW4gZURQIGJhY2tsaWdodCwgd2hpY2ggY2FuCj4gPiBi ZSBwb3B1bGF0ZWQgYnkgdXNpbmcKPiA+ICsgKiBkcm1fZWRwX2JhY2tsaWdodF9pbml0KCkuCj4g PiArICovCj4gPiArc3RydWN0IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gewo+ID4gK8KgwqDCoMKg wqDCoMKgdTggcHdtZ2VuX2JpdF9jb3VudDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU4IHB3bV9mcmVx X3ByZV9kaXZpZGVyOwo+ID4gK8KgwqDCoMKgwqDCoMKgdTE2IG1heDsKPiA+ICsKPiA+ICvCoMKg wqDCoMKgwqDCoGJvb2wgbHNiX3JlZ191c2VkIDogMTsKPiA+ICvCoMKgwqDCoMKgwqDCoGJvb2wg YXV4X2VuYWJsZSA6IDE7Cj4gPiArfTsKPiA+ICsKPiA+ICtpbnQKPiA+ICtkcm1fZWRwX2JhY2ts aWdodF9pbml0KHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIHN0cnVjdAo+ID4gZHJtX2VkcF9iYWNr bGlnaHRfaW5mbyAqYmwsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHUxNiBkcml2ZXJfcHdtX2ZyZXFfaHosIGNvbnN0IHU4Cj4gPiBlZHBfZHBjZFtFRFBf RElTUExBWV9DVExfQ0FQX1NJWkVdLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1MTYgKmN1cnJlbnRfbGV2ZWwsIHU4ICpjdXJyZW50X21vZGUpOwo+ID4g K2ludCBkcm1fZWRwX2JhY2tsaWdodF9zZXRfbGV2ZWwoc3RydWN0IGRybV9kcF9hdXggKmF1eCwg Y29uc3Qgc3RydWN0Cj4gPiBkcm1fZWRwX2JhY2tsaWdodF9pbmZvICpibCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUx NiBsZXZlbCk7Cj4gPiAraW50IGRybV9lZHBfYmFja2xpZ2h0X2VuYWJsZShzdHJ1Y3QgZHJtX2Rw X2F1eCAqYXV4LCBjb25zdCBzdHJ1Y3QKPiA+IGRybV9lZHBfYmFja2xpZ2h0X2luZm8gKmJsLAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB1MTYgbGV2ZWwpOwo+ID4gK2ludCBkcm1fZWRwX2JhY2tsaWdodF9kaXNhYmxlKHN0cnVjdCBk cm1fZHBfYXV4ICphdXgsIGNvbnN0IHN0cnVjdAo+ID4gZHJtX2VkcF9iYWNrbGlnaHRfaW5mbyAq YmwpOwo+ID4gKwo+ID4gwqAjaWZkZWYgQ09ORklHX0RSTV9EUF9DRUMKPiA+IMKgdm9pZCBkcm1f ZHBfY2VjX2lycShzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KTsKPiA+IMKgdm9pZCBkcm1fZHBfY2Vj X3JlZ2lzdGVyX2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LAo+ID4gLS0gCj4gPiAy LjI5LjIKPiA+IAo+ID4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KPiA+IEludGVsLWdmeCBtYWlsaW5nIGxpc3QKPiA+IEludGVsLWdmeEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKPiA+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vaW50ZWwtZ2Z4Cj4gCgotLSAKU2luY2VyZWx5LAogICBMeXVkZSBQYXVsIChzaGUvaGVy KQogICBTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0CiAgIApOb3RlOiBJIGRlYWwgd2l0aCBh IGxvdCBvZiBlbWFpbHMgYW5kIGhhdmUgYSBsb3Qgb2YgYnVncyBvbiBteSBwbGF0ZS4gSWYgeW91 J3ZlCmFza2VkIG1lIGEgcXVlc3Rpb24sIGFyZSB3YWl0aW5nIGZvciBhIHJldmlldy9tZXJnZSBv biBhIHBhdGNoLCBldGMuIGFuZCBJCmhhdmVuJ3QgcmVzcG9uZGVkIGluIGEgd2hpbGUsIHBsZWFz ZSBmZWVsIGZyZWUgdG8gc2VuZCBtZSBhbm90aGVyIGVtYWlsIHRvIGNoZWNrCm9uIG15IHN0YXR1 cy4gSSBkb24ndCBiaXRlIQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50 ZWwtZ2Z4Cg==