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.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,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 7E019C433E9 for ; Tue, 16 Mar 2021 20:36:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 500E864F9B for ; Tue, 16 Mar 2021 20:36:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231371AbhCPUfv (ORCPT ); Tue, 16 Mar 2021 16:35:51 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:45332 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231322AbhCPUfS (ORCPT ); Tue, 16 Mar 2021 16:35:18 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id 279821F44E31 Message-ID: <165cf812e228517c9e746691d887445dd1b732ba.camel@collabora.com> Subject: Re: [PATCH v4 07/11] media: hantro: Introduce G2/HEVC decoder From: Ezequiel Garcia To: Benjamin Gaignard , p.zabel@pengutronix.de, mchehab@kernel.org, robh+dt@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, gregkh@linuxfoundation.org, mripard@kernel.org, paul.kocialkowski@bootlin.com, wens@csie.org, jernej.skrabec@siol.net, peng.fan@nxp.com, hverkuil-cisco@xs4all.nl, dan.carpenter@oracle.com Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel@collabora.com Date: Tue, 16 Mar 2021 17:35:03 -0300 In-Reply-To: References: <20210303113952.178519-1-benjamin.gaignard@collabora.com> <20210303113952.178519-8-benjamin.gaignard@collabora.com> <0306499f9c5bb55fe5da521feaa19bd1ad8e860f.camel@collabora.com> Organization: Collabora Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.2-1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 2021-03-16 at 21:19 +0100, Benjamin Gaignard wrote: > > Le 16/03/2021 à 19:46, Ezequiel Garcia a écrit : > > Hi Benjamin, > > > > The series is looking really good. Some comments below. > > > > On Wed, 2021-03-03 at 12:39 +0100, Benjamin Gaignard wrote: > > > Implement all the logic to get G2 hardware decoding HEVC frames. > > > It support up level 5.1 HEVC stream. > > > It doesn't support yet 10 bits formats or scaling feature. > > > > > > Add HANTRO HEVC dedicated control to skip some bits at the beginning > > > of the slice header. That is very specific to this hardware so can't > > > go into uapi structures. Compute the needed value is complex and require > > > information from the stream that only the userland knows so let it > > > provide the correct value to the driver. > > > > > > Signed-off-by: Benjamin Gaignard > > > --- > > > version 4: > > > - fix Ezequiel comments > > > - use dedicated control as an integer > > > - change hantro_g2_hevc_dec_run prototype to return errors > > > > > > version 2: > > > - squash multiple commits in this one. > > > - fix the comments done by Ezequiel about dma_alloc_coherent usage > > > - fix Dan's comments about control copy, reverse the test logic > > > in tile_buffer_reallocate, rework some goto and return cases. > > > > > >   drivers/staging/media/hantro/Makefile         |   2 + > > >   drivers/staging/media/hantro/hantro.h         |  18 + > > >   drivers/staging/media/hantro/hantro_drv.c     |  53 ++ > > >   .../staging/media/hantro/hantro_g2_hevc_dec.c | 587 ++++++++++++++++++ > > >   drivers/staging/media/hantro/hantro_g2_regs.h | 198 ++++++ > > >   drivers/staging/media/hantro/hantro_hevc.c    | 321 ++++++++++ > > >   drivers/staging/media/hantro/hantro_hw.h      |  49 ++ > > >   7 files changed, 1228 insertions(+) > > >   create mode 100644 drivers/staging/media/hantro/hantro_g2_hevc_dec.c > > >   create mode 100644 drivers/staging/media/hantro/hantro_g2_regs.h > > >   create mode 100644 drivers/staging/media/hantro/hantro_hevc.c > > > > > > diff --git a/drivers/staging/media/hantro/Makefile b/drivers/staging/media/hantro/Makefile > > > index 743ce08eb184..0357f1772267 100644 > > > --- a/drivers/staging/media/hantro/Makefile > > > +++ b/drivers/staging/media/hantro/Makefile > > > @@ -9,12 +9,14 @@ hantro-vpu-y += \ > > >                  hantro_h1_jpeg_enc.o \ > > >                  hantro_g1_h264_dec.o \ > > >                  hantro_g1_mpeg2_dec.o \ > > > +               hantro_g2_hevc_dec.o \ > > >                  hantro_g1_vp8_dec.o \ > > >                  rk3399_vpu_hw_jpeg_enc.o \ > > >                  rk3399_vpu_hw_mpeg2_dec.o \ > > >                  rk3399_vpu_hw_vp8_dec.o \ > > >                  hantro_jpeg.o \ > > >                  hantro_h264.o \ > > > +               hantro_hevc.o \ > > >                  hantro_mpeg2.o \ > > >                  hantro_vp8.o > > >   > > > diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h > > > index 05876e426419..a9b80b2c9124 100644 > > > --- a/drivers/staging/media/hantro/hantro.h > > > +++ b/drivers/staging/media/hantro/hantro.h > > > @@ -225,6 +225,7 @@ struct hantro_dev { > > >    * @jpeg_enc:          JPEG-encoding context. > > >    * @mpeg2_dec:         MPEG-2-decoding context. > > >    * @vp8_dec:           VP8-decoding context. > > > + * @hevc_dec:          HEVC-decoding context. > > >    */ > > >   struct hantro_ctx { > > >          struct hantro_dev *dev; > > > @@ -251,6 +252,7 @@ struct hantro_ctx { > > >                  struct hantro_jpeg_enc_hw_ctx jpeg_enc; > > >                  struct hantro_mpeg2_dec_hw_ctx mpeg2_dec; > > >                  struct hantro_vp8_dec_hw_ctx vp8_dec; > > > +               struct hantro_hevc_dec_hw_ctx hevc_dec; > > >          }; > > >   }; > > >   > > > @@ -428,6 +430,22 @@ hantro_get_dec_buf_addr(struct hantro_ctx *ctx, struct vb2_buffer *vb) > > >          return vb2_dma_contig_plane_dma_addr(vb, 0); > > >   } > > >   > > > +static inline size_t > > > +hantro_get_dec_buf_size(struct hantro_ctx *ctx, struct vb2_buffer *vb) > > > +{ > > > +       if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt)) > > > +               return ctx->postproc.dec_q[vb->index].size; > > > +       return vb2_plane_size(vb, 0); > > > +} > > > + > > > +static inline void * > > > +hantro_get_dec_buf(struct hantro_ctx *ctx, struct vb2_buffer *vb) > > > +{ > > > +       if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt)) > > > +               return ctx->postproc.dec_q[vb->index].cpu; > > > +       return vb2_plane_vaddr(vb, 0); > > > +} > > > + > > Seems hantro_get_dec_buf_size and hantro_get_dec_buf are not used? > > You are right I will remove them > > > > > >   void hantro_postproc_disable(struct hantro_ctx *ctx); > > >   void hantro_postproc_enable(struct hantro_ctx *ctx); > > >   void hantro_postproc_free(struct hantro_ctx *ctx); > > > diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c > > > index e3e6df28f470..bc90a52f4d3d 100644 > > > --- a/drivers/staging/media/hantro/hantro_drv.c > > > +++ b/drivers/staging/media/hantro/hantro_drv.c > > > @@ -30,6 +30,13 @@ > > >   > > >   #define DRIVER_NAME "hantro-vpu" > > >   > > > +/* > > > + * V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP - > > > + * the number of data (in bits) to skip in the > > > + * slice segment header syntax after 'slice type' token > > > + */ > > I think we need to document this better, so applications can > > correctly use the control. From i.MX reference code, it seems > > this needs to be used as follows: > > > > If non-IDR, the bits to be skipped go from syntax element "pic_output_flag" > > to before syntax element "slice_temporal_mvp_enabled_flag". > > > > If IDR, the skipped bits are just "pic_output_flag" > > (separate_colour_plane_flag is not supported). > > > > And it seems this needs to be passed parsing only the first slice, > > given this syntax remains invariant across all the slices. > > Ok I will add your description in the next version. > > > > > > +#define V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP (V4L2_CID_USER_HANTRO_BASE + 0) > > > + > > >   int hantro_debug; > > >   module_param_named(debug, hantro_debug, int, 0644); > > >   MODULE_PARM_DESC(debug, > > > @@ -281,6 +288,26 @@ static int hantro_jpeg_s_ctrl(struct v4l2_ctrl *ctrl) > > >          return 0; > > >   } > > >   > > > +static int hantro_hevc_s_ctrl(struct v4l2_ctrl *ctrl) > > > +{ > > > +       struct hantro_ctx *ctx; > > > + > > > +       ctx = container_of(ctrl->handler, > > > +                          struct hantro_ctx, ctrl_handler); > > > + > > > +       vpu_debug(1, "s_ctrl: id = %d, val = %d\n", ctrl->id, ctrl->val); > > > + > > > +       switch (ctrl->id) { > > > +       case V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP: > > > +               ctx->hevc_dec.ctrls.hevc_hdr_skip_length = ctrl->val; > > > +               break; > > > +       default: > > > +               return -EINVAL; > > > +       } > > > + > > > +       return 0; > > > +} > > > + > > >   static const struct v4l2_ctrl_ops hantro_ctrl_ops = { > > >          .try_ctrl = hantro_try_ctrl, > > >   }; > > > @@ -289,6 +316,10 @@ static const struct v4l2_ctrl_ops hantro_jpeg_ctrl_ops = { > > >          .s_ctrl = hantro_jpeg_s_ctrl, > > >   }; > > >   > > > +static const struct v4l2_ctrl_ops hantro_hevc_ctrl_ops = { > > > +       .s_ctrl = hantro_hevc_s_ctrl, > > > +}; > > > + > > >   static const struct hantro_ctrl controls[] = { > > >          { > > >                  .codec = HANTRO_JPEG_ENCODER, > > > @@ -409,6 +440,28 @@ static const struct hantro_ctrl controls[] = { > > >                  .cfg = { > > >                          .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS, > > >                  }, > > > +       }, { > > > +               .codec = HANTRO_HEVC_DECODER, > > > +               .cfg = { > > > +                       .id = V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP, > > > +                       .name = "Hantro HEVC slice header skip bytes", > > > +                       .type = V4L2_CTRL_TYPE_INTEGER, > > > +                       .min = 0, > > > +                       .def = 0, > > > +                       .max = 0x7fffffff, > > > +                       .step = 1, > > > +                       .ops = &hantro_hevc_ctrl_ops, > > > +               }, > > > +       }, { > > > +               .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER | > > > +                        HANTRO_VP8_DECODER | HANTRO_H264_DECODER | > > > +                        HANTRO_HEVC_DECODER, > > > +               .cfg = { > > > +                       .id = V4L2_CID_USER_CLASS, > > This shouldn't be here, is this V4L2_CID_USER_CLASS required by v4l2-compliance > > or by the spec? > > It is required by v4l2-compliance. > Unless Hans says otherwise, I'd say drop this V4L2_CID_USER_CLASS control, and we can figure out what's wrong with v4l2-compliance later. > > > > > +                       .name = "HANTRO controls", > > > +                       .type = V4L2_CTRL_TYPE_CTRL_CLASS, > > > +                       .flags = V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_WRITE_ONLY, > > > +               }, > > >          }, > > >   }; > > >   > > > diff --git a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c > > > new file mode 100644 > > > index 000000000000..5d75b36bc40c > > > --- /dev/null > > > +++ b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c > > > @@ -0,0 +1,587 @@ > > > +// SPDX-License-Identifier: GPL-2.0 > > > +/* > > > + * Hantro VPU HEVC codec driver > > > + * > > > + * Copyright (C) 2020 Safran Passenger Innovations LLC > > > + */ > > > + > > > +#include "hantro_hw.h" > > > +#include "hantro_g2_regs.h" > > > + > > > +#define HEVC_DEC_MODE  0xC > > > + > > > +#define BUS_WIDTH_32           0 > > > +#define BUS_WIDTH_64           1 > > > +#define BUS_WIDTH_128          2 > > > +#define BUS_WIDTH_256          3 > > > + > > > +static inline void hantro_write_addr(struct hantro_dev *vpu, > > > +                                    unsigned long offset, > > > +                                    dma_addr_t addr) > > > +{ > > > +       vdpu_write(vpu, addr & 0xffffffff, offset); > > > +} > > > + > > > +static void prepare_tile_info_buffer(struct hantro_ctx *ctx) > > > +{ > > > +       struct hantro_dev *vpu = ctx->dev; > > > +       const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; > > > +       const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps; > > > +       const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; > > > +       u16 *p = (u16 *)((u8 *)ctx->hevc_dec.tile_sizes.cpu); > > > +       unsigned int num_tile_rows = pps->num_tile_rows_minus1 + 1; > > > +       unsigned int num_tile_cols = pps->num_tile_columns_minus1 + 1; > > > +       unsigned int pic_width_in_ctbs, pic_height_in_ctbs; > > > +       unsigned int max_log2_ctb_size, ctb_size; > > > +       bool tiles_enabled, uniform_spacing; > > > +       u32 no_chroma = 0; > > > + > > > +       tiles_enabled = !!(pps->flags & V4L2_HEVC_PPS_FLAG_TILES_ENABLED); > > > +       uniform_spacing = !!(pps->flags & V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING); > > > + > > > +       hantro_reg_write(vpu, hevc_tile_e, tiles_enabled); > > > + > > > +       max_log2_ctb_size = sps->log2_min_luma_coding_block_size_minus3 + 3 + > > > +                           sps->log2_diff_max_min_luma_coding_block_size; > > > +       pic_width_in_ctbs = (sps->pic_width_in_luma_samples + > > > +                           (1 << max_log2_ctb_size) - 1) >> max_log2_ctb_size; > > > +       pic_height_in_ctbs = (sps->pic_height_in_luma_samples + (1 << max_log2_ctb_size) - 1) > > > +                            >> max_log2_ctb_size; > > > +       ctb_size = 1 << max_log2_ctb_size; > > > + > > > +       vpu_debug(1, "Preparing tile sizes buffer for %dx%d CTBs (CTB size %d)\n", > > > +                 pic_width_in_ctbs, pic_height_in_ctbs, ctb_size); > > > + > > > +       if (tiles_enabled) { > > > +               unsigned int i, j, h; > > > + > > > +               vpu_debug(1, "Tiles enabled! %dx%d\n", num_tile_cols, num_tile_rows); > > > + > > > +               hantro_reg_write(vpu, hevc_num_tile_rows, num_tile_rows); > > > +               hantro_reg_write(vpu, hevc_num_tile_cols, num_tile_cols); > > > + > > > +               /* write width + height for each tile in pic */ > > > +               if (!uniform_spacing) { > > > +                       u32 tmp_w = 0, tmp_h = 0; > > > + > > > +                       for (i = 0; i < num_tile_rows; i++) { > > > +                               if (i == num_tile_rows - 1) > > > +                                       h = pic_height_in_ctbs - tmp_h; > > > +                               else > > > +                                       h = pps->row_height_minus1[i] + 1; > > > +                               tmp_h += h; > > > +                               if (i == 0 && h == 1 && ctb_size == 16) > > > +                                       no_chroma = 1; > > > +                               for (j = 0, tmp_w = 0; j < num_tile_cols - 1; j++) { > > > +                                       tmp_w += pps->column_width_minus1[j] + 1; > > > +                                       *p++ = pps->column_width_minus1[j + 1]; > > > +                                       *p++ = h; > > > +                                       if (i == 0 && h == 1 && ctb_size == 16) > > > +                                               no_chroma = 1; > > > +                               } > > > +                               /* last column */ > > > +                               *p++ = pic_width_in_ctbs - tmp_w; > > > +                               *p++ = h; > > > +                       } > > > +               } else { /* uniform spacing */ > > > +                       u32 tmp, prev_h, prev_w; > > > + > > > +                       for (i = 0, prev_h = 0; i < num_tile_rows; i++) { > > > +                               tmp = (i + 1) * pic_height_in_ctbs / num_tile_rows; > > > +                               h = tmp - prev_h; > > > +                               prev_h = tmp; > > > +                               if (i == 0 && h == 1 && ctb_size == 16) > > > +                                       no_chroma = 1; > > > +                               for (j = 0, prev_w = 0; j < num_tile_cols; j++) { > > > +                                       tmp = (j + 1) * pic_width_in_ctbs / num_tile_cols; > > > +                                       *p++ = tmp - prev_w; > > > +                                       *p++ = h; > > > +                                       if (j == 0 && > > > +                                           (pps->column_width_minus1[0] + 1) == 1 && > > > +                                           ctb_size == 16) > > > +                                               no_chroma = 1; > > > +                                       prev_w = tmp; > > > +                               } > > > +                       } > > > +               } > > > +       } else { > > > +               hantro_reg_write(vpu, hevc_num_tile_rows, 1); > > > +               hantro_reg_write(vpu, hevc_num_tile_cols, 1); > > > + > > > +               /* There's one tile, with dimensions equal to pic size. */ > > > +               p[0] = pic_width_in_ctbs; > > > +               p[1] = pic_height_in_ctbs; > > > +       } > > > + > > > +       if (no_chroma) > > > +               vpu_debug(1, "%s: no chroma!\n", __func__); > > > +} > > > + > > > +static void set_params(struct hantro_ctx *ctx) > > > +{ > > > +       const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; > > > +       const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; > > > +       const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps; > > > +       const struct v4l2_ctrl_hevc_decode_params *decode_params = ctrls->decode_params; > > > +       struct hantro_dev *vpu = ctx->dev; > > > +       u32 min_log2_cb_size, max_log2_ctb_size, min_cb_size, max_ctb_size; > > > +       u32 pic_width_in_min_cbs, pic_height_in_min_cbs; > > > +       u32 pic_width_aligned, pic_height_aligned; > > > +       u32 partial_ctb_x, partial_ctb_y; > > > + > > > +       hantro_reg_write(vpu, hevc_bit_depth_y_minus8, sps->bit_depth_luma_minus8); > > > +       hantro_reg_write(vpu, hevc_bit_depth_c_minus8, sps->bit_depth_chroma_minus8); > > > + > > > +       hantro_reg_write(vpu, hevc_output_8_bits, 0); > > > + > > > +       hantro_reg_write(vpu, hevc_hdr_skip_length, ctrls->hevc_hdr_skip_length); > > > + > > > +       min_log2_cb_size = sps->log2_min_luma_coding_block_size_minus3 + 3; > > > +       max_log2_ctb_size = min_log2_cb_size + sps->log2_diff_max_min_luma_coding_block_size; > > > + > > > +       hantro_reg_write(vpu, hevc_min_cb_size, min_log2_cb_size); > > > +       hantro_reg_write(vpu, hevc_max_cb_size, max_log2_ctb_size); > > > + > > > +       min_cb_size = 1 << min_log2_cb_size; > > > +       max_ctb_size = 1 << max_log2_ctb_size; > > > + > > > +       pic_width_in_min_cbs = sps->pic_width_in_luma_samples / min_cb_size; > > > +       pic_height_in_min_cbs = sps->pic_height_in_luma_samples / min_cb_size; > > > +       pic_width_aligned = ALIGN(sps->pic_width_in_luma_samples, max_ctb_size); > > > +       pic_height_aligned = ALIGN(sps->pic_height_in_luma_samples, max_ctb_size); > > > + > > > +       partial_ctb_x = !!(sps->pic_width_in_luma_samples != pic_width_aligned); > > > +       partial_ctb_y = !!(sps->pic_height_in_luma_samples != pic_height_aligned); > > > + > > > +       hantro_reg_write(vpu, hevc_partial_ctb_x, partial_ctb_x); > > > +       hantro_reg_write(vpu, hevc_partial_ctb_y, partial_ctb_y); > > > + > > > +       hantro_reg_write(vpu, hevc_pic_width_in_cbs, pic_width_in_min_cbs); > > > +       hantro_reg_write(vpu, hevc_pic_height_in_cbs, pic_height_in_min_cbs); > > > + > > > +       hantro_reg_write(vpu, hevc_pic_width_4x4, > > > +                        (pic_width_in_min_cbs * min_cb_size) / 4); > > > +       hantro_reg_write(vpu, hevc_pic_height_4x4, > > > +                        (pic_height_in_min_cbs * min_cb_size) / 4); > > > + > > > +       hantro_reg_write(vpu, hevc_max_inter_hierdepth, > > > +                        sps->max_transform_hierarchy_depth_inter); > > > +       hantro_reg_write(vpu, hevc_max_intra_hierdepth, > > > +                        sps->max_transform_hierarchy_depth_intra); > > > +       hantro_reg_write(vpu, hevc_min_trb_size, > > > +                        sps->log2_min_luma_transform_block_size_minus2 + 2); > > > +       hantro_reg_write(vpu, hevc_max_trb_size, > > > +                        sps->log2_min_luma_transform_block_size_minus2 + 2 + > > > +                        sps->log2_diff_max_min_luma_transform_block_size); > > > + > > > +       hantro_reg_write(vpu, hevc_tempor_mvp_e, > > > +                        !!(sps->flags & V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED) && > > > +                        !(decode_params->flags & V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC)); > > > +       hantro_reg_write(vpu, hevc_strong_smooth_e, > > > +                        !!(sps->flags & V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED)); > > > +       hantro_reg_write(vpu, hevc_asym_pred_e, > > > +                        !!(sps->flags & V4L2_HEVC_SPS_FLAG_AMP_ENABLED)); > > > +       hantro_reg_write(vpu, hevc_sao_e, > > > +                        !!(sps->flags & V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET)); > > > +       hantro_reg_write(vpu, hevc_sign_data_hide, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED)); > > > + > > > +       if (pps->flags & V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED) { > > > +               hantro_reg_write(vpu, hevc_cu_qpd_e, 1); > > > +               hantro_reg_write(vpu, hevc_max_cu_qpd_depth, pps->diff_cu_qp_delta_depth); > > > +       } else { > > > +               hantro_reg_write(vpu, hevc_cu_qpd_e, 0); > > > +               hantro_reg_write(vpu, hevc_max_cu_qpd_depth, 0); > > > +       } > > > + > > > +       if (pps->flags & V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT) { > > > +               hantro_reg_write(vpu, hevc_cb_qp_offset, pps->pps_cb_qp_offset); > > > +               hantro_reg_write(vpu, hevc_cr_qp_offset, pps->pps_cr_qp_offset); > > > +       } else { > > > +               hantro_reg_write(vpu, hevc_cb_qp_offset, 0); > > > +               hantro_reg_write(vpu, hevc_cr_qp_offset, 0); > > > +       } > > > + > > > +       hantro_reg_write(vpu, hevc_filt_offset_beta, pps->pps_beta_offset_div2); > > > +       hantro_reg_write(vpu, hevc_filt_offset_tc, pps->pps_tc_offset_div2); > > > +       hantro_reg_write(vpu, hevc_slice_hdr_ext_e, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT)); > > > +       hantro_reg_write(vpu, hevc_slice_hdr_ext_bits, pps->num_extra_slice_header_bits); > > > +       hantro_reg_write(vpu, hevc_slice_chqp_present, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT)); > > > +       hantro_reg_write(vpu, hevc_weight_bipr_idc, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED)); > > > +       hantro_reg_write(vpu, hevc_transq_bypass, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED)); > > > +       hantro_reg_write(vpu, hevc_list_mod_e, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT)); > > > +       hantro_reg_write(vpu, hevc_entropy_sync_e, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED)); > > > +       hantro_reg_write(vpu, hevc_cabac_init_present, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT)); > > > +       hantro_reg_write(vpu, hevc_idr_pic_e, > > > +                        !!(decode_params->flags & V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC)); > > > +       hantro_reg_write(vpu, hevc_parallel_merge, > > > +                        pps->log2_parallel_merge_level_minus2 + 2); > > > +       hantro_reg_write(vpu, hevc_pcm_filt_d, > > > +                        !!(sps->flags & V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED)); > > > +       hantro_reg_write(vpu, hevc_pcm_e, > > > +                        !!(sps->flags & V4L2_HEVC_SPS_FLAG_PCM_ENABLED)); > > > +       if (sps->flags & V4L2_HEVC_SPS_FLAG_PCM_ENABLED) { > > > +               hantro_reg_write(vpu, hevc_max_pcm_size, > > > +                                sps->log2_diff_max_min_pcm_luma_coding_block_size + > > > +                                sps->log2_min_pcm_luma_coding_block_size_minus3 + 3); > > > +               hantro_reg_write(vpu, hevc_min_pcm_size, > > > +                                sps->log2_min_pcm_luma_coding_block_size_minus3 + 3); > > > +               hantro_reg_write(vpu, hevc_bit_depth_pcm_y, > > > +                                sps->pcm_sample_bit_depth_luma_minus1 + 1); > > > +               hantro_reg_write(vpu, hevc_bit_depth_pcm_c, > > > +                                sps->pcm_sample_bit_depth_chroma_minus1 + 1); > > > +       } else { > > > +               hantro_reg_write(vpu, hevc_max_pcm_size, 0); > > > +               hantro_reg_write(vpu, hevc_min_pcm_size, 0); > > > +               hantro_reg_write(vpu, hevc_bit_depth_pcm_y, 0); > > > +               hantro_reg_write(vpu, hevc_bit_depth_pcm_c, 0); > > > +       } > > > + > > > +       hantro_reg_write(vpu, hevc_start_code_e, 1); > > > +       hantro_reg_write(vpu, hevc_init_qp, pps->init_qp_minus26 + 26); > > > +       hantro_reg_write(vpu, hevc_weight_pred_e, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED)); > > > +       hantro_reg_write(vpu, hevc_cabac_init_present, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT)); > > > +       hantro_reg_write(vpu, hevc_const_intra_e, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED)); > > > +       hantro_reg_write(vpu, hevc_transform_skip, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED)); > > > +       hantro_reg_write(vpu, hevc_out_filtering_dis, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER)); > > > +       hantro_reg_write(vpu, hevc_filt_ctrl_pres, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT)); > > > +       hantro_reg_write(vpu, hevc_dependent_slice, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT)); > > > +       hantro_reg_write(vpu, hevc_filter_override, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED)); > > > +       hantro_reg_write(vpu, hevc_refidx0_active, > > > +                        pps->num_ref_idx_l0_default_active_minus1 + 1); > > > +       hantro_reg_write(vpu, hevc_refidx1_active, > > > +                        pps->num_ref_idx_l1_default_active_minus1 + 1); > > > +       hantro_reg_write(vpu, hevc_apf_threshold, 8); > > > +} > > > + > > > +static int find_ref_pic_index(const struct v4l2_hevc_dpb_entry *dpb, int pic_order_cnt) > > > +{ > > > +       int i; > > > + > > > +       for (i = 0; i < V4L2_HEVC_DPB_ENTRIES_NUM_MAX; i++) { > > > +               if (dpb[i].pic_order_cnt[0] == pic_order_cnt) > > > +                       return i; > > > +       } > > > + > > > +       return 0x0; > > > +} > > > + > > > +static void set_ref_pic_list(struct hantro_ctx *ctx) > > > +{ > > > +       const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; > > > +       struct hantro_dev *vpu = ctx->dev; > > > +       const struct v4l2_ctrl_hevc_decode_params *decode_params = ctrls->decode_params; > > > +       const struct v4l2_hevc_dpb_entry *dpb = decode_params->dpb; > > > +       u32 list0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX] = {0}; > > > +       u32 list1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX] = {0}; > > > +       const struct hantro_reg *ref_pic_regs0[] = { > > > +               hevc_rlist_f0, > > > +               hevc_rlist_f1, > > > +               hevc_rlist_f2, > > > +               hevc_rlist_f3, > > > +               hevc_rlist_f4, > > > +               hevc_rlist_f5, > > > +               hevc_rlist_f6, > > > +               hevc_rlist_f7, > > > +               hevc_rlist_f8, > > > +               hevc_rlist_f9, > > > +               hevc_rlist_f10, > > > +               hevc_rlist_f11, > > > +               hevc_rlist_f12, > > > +               hevc_rlist_f13, > > > +               hevc_rlist_f14, > > > +               hevc_rlist_f15, > > > +       }; > > > +       const struct hantro_reg *ref_pic_regs1[] = { > > > +               hevc_rlist_b0, > > > +               hevc_rlist_b1, > > > +               hevc_rlist_b2, > > > +               hevc_rlist_b3, > > > +               hevc_rlist_b4, > > > +               hevc_rlist_b5, > > > +               hevc_rlist_b6, > > > +               hevc_rlist_b7, > > > +               hevc_rlist_b8, > > > +               hevc_rlist_b9, > > > +               hevc_rlist_b10, > > > +               hevc_rlist_b11, > > > +               hevc_rlist_b12, > > > +               hevc_rlist_b13, > > > +               hevc_rlist_b14, > > > +               hevc_rlist_b15, > > > +       }; > > > +       unsigned int i, j; > > > + > > > +       /* List 0 contains: short term before, short term after and long term */ > > > +       j = 0; > > > +       for (i = 0; i < decode_params->num_poc_st_curr_before && j < ARRAY_SIZE(list0); i++) > > > +               list0[j++] = find_ref_pic_index(dpb, decode_params->poc_st_curr_before[i]); > > > +       for (i = 0; i < decode_params->num_poc_st_curr_after && j < ARRAY_SIZE(list0); i++) > > > +               list0[j++] = find_ref_pic_index(dpb, decode_params->poc_st_curr_after[i]); > > > +       for (i = 0; i < decode_params->num_poc_lt_curr && j < ARRAY_SIZE(list0); i++) > > > +               list0[j++] = find_ref_pic_index(dpb, decode_params->poc_lt_curr[i]); > > > + > > > +       /* Fill the list, copying over and over */ > > > +       i = 0; > > > +       while (j < ARRAY_SIZE(list0)) > > > +               list0[j++] = list0[i++]; > > > + > > > +       j = 0; > > > +       for (i = 0; i < decode_params->num_poc_st_curr_after && j < ARRAY_SIZE(list1); i++) > > > +               list1[j++] = find_ref_pic_index(dpb, decode_params->poc_st_curr_after[i]); > > > +       for (i = 0; i < decode_params->num_poc_st_curr_before && j < ARRAY_SIZE(list1); i++) > > > +               list1[j++] = find_ref_pic_index(dpb, decode_params->poc_st_curr_before[i]); > > > +       for (i = 0; i < decode_params->num_poc_lt_curr && j < ARRAY_SIZE(list1); i++) > > > +               list1[j++] = find_ref_pic_index(dpb, decode_params->poc_lt_curr[i]); > > > + > > > +       i = 0; > > > +       while (j < ARRAY_SIZE(list1)) > > > +               list1[j++] = list1[i++]; > > > + > > > +       for (i = 0; i < V4L2_HEVC_DPB_ENTRIES_NUM_MAX; i++) { > > > +               hantro_reg_write(vpu, ref_pic_regs0[i], list0[i]); > > > +               hantro_reg_write(vpu, ref_pic_regs1[i], list1[i]); > > > +       } > > > +} > > > + > > > +static int set_ref(struct hantro_ctx *ctx) > > > +{ > > > +       const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; > > > +       const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; > > > +       const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps; > > > +       const struct v4l2_ctrl_hevc_decode_params *decode_params = ctrls->decode_params; > > > +       const struct v4l2_hevc_dpb_entry *dpb = decode_params->dpb; > > > +       dma_addr_t luma_addr, chroma_addr, mv_addr = 0; > > > +       struct hantro_dev *vpu = ctx->dev; > > > +       size_t cr_offset = hantro_hevc_chroma_offset(sps); > > > +       size_t mv_offset = hantro_hevc_motion_vectors_offset(sps); > > > +       u32 max_ref_frames; > > > +       u16 dpb_longterm_e; > > > + > > > +       const struct hantro_reg *cur_poc[] = { > > > +               hevc_cur_poc_00, > > > +               hevc_cur_poc_01, > > > +               hevc_cur_poc_02, > > > +               hevc_cur_poc_03, > > > +               hevc_cur_poc_04, > > > +               hevc_cur_poc_05, > > > +               hevc_cur_poc_06, > > > +               hevc_cur_poc_07, > > > +               hevc_cur_poc_08, > > > +               hevc_cur_poc_09, > > > +               hevc_cur_poc_10, > > > +               hevc_cur_poc_11, > > > +               hevc_cur_poc_12, > > > +               hevc_cur_poc_13, > > > +               hevc_cur_poc_14, > > > +               hevc_cur_poc_15, > > > +       }; > > > +       unsigned int i; > > > + > > > +       max_ref_frames = decode_params->num_poc_lt_curr + > > > +               decode_params->num_poc_st_curr_before + > > > +               decode_params->num_poc_st_curr_after; > > > +       /* > > > +        * Set max_ref_frames to non-zero to avoid HW hang when decoding > > > +        * badly marked I-frames. > > > +        */ > > > +       max_ref_frames = max_ref_frames ? max_ref_frames : 1; > > > +       hantro_reg_write(vpu, hevc_num_ref_frames, max_ref_frames); > > > +       hantro_reg_write(vpu, hevc_filter_over_slices, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED)); > > > +       hantro_reg_write(vpu, hevc_filter_over_tiles, > > > +                        !!(pps->flags & V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED)); > > > + > > > +       /* > > > +        * Write POC count diff from current pic. For frame decoding only compute > > > +        * pic_order_cnt[0] and ignore pic_order_cnt[1] used in field-coding. > > > +        */ > > > +       for (i = 0; i < decode_params->num_active_dpb_entries && i < ARRAY_SIZE(cur_poc); i++) { > > > +               char poc_diff = decode_params->pic_order_cnt_val - dpb[i].pic_order_cnt[0]; > > > + > > > +               hantro_reg_write(vpu, cur_poc[i], poc_diff); > > > +       } > > > + > > > +       if (i < ARRAY_SIZE(cur_poc)) { > > > +               /* > > > +                * After the references, fill one entry pointing to itself, > > > +                * i.e. difference is zero. > > > +                */ > > > +               hantro_reg_write(vpu, cur_poc[i], 0); > > > +               i++; > > > +       } > > > + > > > +       /* Fill the rest with the current picture */ > > > +       for (; i < ARRAY_SIZE(cur_poc); i++) > > > +               hantro_reg_write(vpu, cur_poc[i], decode_params->pic_order_cnt_val); > > > + > > > +       set_ref_pic_list(ctx); > > > + > > > +       /* We will only keep the references picture that are still used */ > > > +       ctx->hevc_dec.ref_bufs_used = 0; > > > + > > > +       /* Set up addresses of DPB buffers */ > > > +       dpb_longterm_e = 0; > > > +       for (i = 0; i < decode_params->num_active_dpb_entries && > > > +            i < (V4L2_HEVC_DPB_ENTRIES_NUM_MAX - 1); i++) { > > > +               luma_addr = hantro_hevc_get_ref_buf(ctx, dpb[i].pic_order_cnt[0]); > > > +               if (!luma_addr) > > > +                       return -ENOMEM; > > > + > > > +               chroma_addr = luma_addr + cr_offset; > > > +               mv_addr = luma_addr + mv_offset; > > > + > > > +               if (dpb[i].rps == V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR) > > > +                       dpb_longterm_e |= BIT(V4L2_HEVC_DPB_ENTRIES_NUM_MAX - 1 - i); > > > + > > > +               hantro_write_addr(vpu, HEVC_REG_ADDR_REF(i), luma_addr); > > > +               hantro_write_addr(vpu, HEVC_REG_CHR_REF(i), chroma_addr); > > > +               hantro_write_addr(vpu, HEVC_REG_DMV_REF(i), mv_addr); > > > +       } > > > + > > > +       luma_addr = hantro_hevc_get_ref_buf(ctx, decode_params->pic_order_cnt_val); > > > +       if (!luma_addr) > > > +               return -ENOMEM; > > > + > > > +       chroma_addr = luma_addr + cr_offset; > > > +       mv_addr = luma_addr + mv_offset; > > > + > > > +       hantro_write_addr(vpu, HEVC_REG_ADDR_REF(i), luma_addr); > > > +       hantro_write_addr(vpu, HEVC_REG_CHR_REF(i), chroma_addr); > > > +       hantro_write_addr(vpu, HEVC_REG_DMV_REF(i++), mv_addr); > > > + > > > +       hantro_write_addr(vpu, HEVC_ADDR_DST, luma_addr); > > > +       hantro_write_addr(vpu, HEVC_ADDR_DST_CHR, chroma_addr); > > > +       hantro_write_addr(vpu, HEVC_ADDR_DST_MV, mv_addr); > > > + > > > +       hantro_hevc_ref_remove_unused(ctx); > > > + > > > +       for (; i < V4L2_HEVC_DPB_ENTRIES_NUM_MAX; i++) { > > > +               hantro_write_addr(vpu, HEVC_REG_ADDR_REF(i), 0); > > > +               hantro_write_addr(vpu, HEVC_REG_CHR_REF(i), 0); > > > +               hantro_write_addr(vpu, HEVC_REG_DMV_REF(i), 0); > > > +       } > > > + > > > +       hantro_reg_write(vpu, hevc_refer_lterm_e, dpb_longterm_e); > > > + > > > +       return 0; > > > +} > > > + > > > +static void set_buffers(struct hantro_ctx *ctx) > > > +{ > > > +       struct vb2_v4l2_buffer *src_buf, *dst_buf; > > > +       struct hantro_dev *vpu = ctx->dev; > > > +       const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; > > > +       const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; > > > +       size_t cr_offset = hantro_hevc_chroma_offset(sps); > > > +       dma_addr_t src_dma, dst_dma; > > > +       u32 src_len, src_buf_len; > > > + > > > +       src_buf = hantro_get_src_buf(ctx); > > > +       dst_buf = hantro_get_dst_buf(ctx); > > > + > > > +       /* Source (stream) buffer. */ > > > +       src_dma = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); > > > +       src_len = vb2_get_plane_payload(&src_buf->vb2_buf, 0); > > > +       src_buf_len = vb2_plane_size(&src_buf->vb2_buf, 0); > > > + > > > +       hantro_write_addr(vpu, HEVC_ADDR_STR, src_dma); > > > +       hantro_reg_write(vpu, hevc_stream_len, src_len); > > > +       hantro_reg_write(vpu, hevc_strm_buffer_len, src_buf_len); > > > +       hantro_reg_write(vpu, hevc_strm_start_offset, 0); > > > +       hantro_reg_write(vpu, hevc_write_mvs_e, 1); > > > + > > > +       /* Destination (decoded frame) buffer. */ > > > +       dst_dma = hantro_get_dec_buf_addr(ctx, &dst_buf->vb2_buf); > > > + > > > +       hantro_write_addr(vpu, HEVC_RASTER_SCAN, dst_dma); > > > +       hantro_write_addr(vpu, HEVC_RASTER_SCAN_CHR, dst_dma + cr_offset); > > > +       hantro_write_addr(vpu, HEVC_ADDR_TILE_SIZE, ctx->hevc_dec.tile_sizes.dma); > > > +       hantro_write_addr(vpu, HEVC_TILE_FILTER, ctx->hevc_dec.tile_filter.dma); > > > +       hantro_write_addr(vpu, HEVC_TILE_SAO, ctx->hevc_dec.tile_sao.dma); > > > +       hantro_write_addr(vpu, HEVC_TILE_BSD, ctx->hevc_dec.tile_bsd.dma); > > > +} > > > + > > > +void hantro_g2_check_idle(struct hantro_dev *vpu) > > > +{ > > > +       int i; > > > + > > > +       for (i = 0; i < 3; i++) { > > > +               u32 status; > > > + > > > +               /* Make sure the VPU is idle */ > > > +               status = vdpu_read(vpu, HEVC_REG_INTERRUPT); > > > +               if (status & HEVC_REG_INTERRUPT_DEC_E) { > > > +                       pr_warn("%s: still enabled!!! resetting.\n", __func__); > > How about we clean this pr_warn: use either v4l2_warn or dev_warn and make > > the warning "device still running, aborting" (I personally dislike the abort > > metaphor, but guess it's OK here). > > Ok > > > > > > +                       status |= HEVC_REG_INTERRUPT_DEC_ABORT_E | HEVC_REG_INTERRUPT_DEC_IRQ_DIS; > > > +                       vdpu_write(vpu, status, HEVC_REG_INTERRUPT); > > > +               } > > > +       } > > > +} > > > + > > > +int hantro_g2_hevc_dec_run(struct hantro_ctx *ctx) > > > +{ > > > +       struct hantro_dev *vpu = ctx->dev; > > > +       int ret; > > > + > > > +       hantro_g2_check_idle(vpu); > > > + > > > +       /* Prepare HEVC decoder context. */ > > > +       ret = hantro_hevc_dec_prepare_run(ctx); > > > +       if (ret) > > > +               return ret; > > > + > > > +       /* Configure hardware registers. */ > > > +       set_params(ctx); > > > + > > > +       /* set reference pictures */ > > > +       ret = set_ref(ctx); > > > +       if (ret) > > > +               return ret; > > > + > > > +       set_buffers(ctx); > > > +       prepare_tile_info_buffer(ctx); > > > + > > > +       hantro_end_prepare_run(ctx); > > > + > > > +       hantro_reg_write(vpu, hevc_mode, HEVC_DEC_MODE); > > > +       hantro_reg_write(vpu, hevc_clk_gate_e, 1); > > > + > > > +       /* Don't disable output */ > > > +       hantro_reg_write(vpu, hevc_out_dis, 0); > > > + > > > +       /* Don't compress buffers */ > > > +       hantro_reg_write(vpu, hevc_ref_compress_bypass, 1); > > > + > > > +       /* use NV12 as output format */ > > > +       hantro_reg_write(vpu, hevc_out_rs_e, 1); > > > + > > > +       /* Bus width and max burst */ > > > +       hantro_reg_write(vpu, hevc_buswidth, BUS_WIDTH_128); > > > +       hantro_reg_write(vpu, hevc_max_burst, 16); > > > + > > > +       /* Swap */ > > > +       hantro_reg_write(vpu, hevc_strm_swap, 0xf); > > > +       hantro_reg_write(vpu, hevc_dirmv_swap, 0xf); > > > +       hantro_reg_write(vpu, hevc_compress_swap, 0xf); > > > + > > > +       /* Start decoding! */ > > > +       vdpu_write(vpu, HEVC_REG_INTERRUPT_DEC_E, HEVC_REG_INTERRUPT); > > > + > > > +       return 0; > > > +} > > > diff --git a/drivers/staging/media/hantro/hantro_g2_regs.h b/drivers/staging/media/hantro/hantro_g2_regs.h > > > new file mode 100644 > > > index 000000000000..a361c9ba911d > > > --- /dev/null > > > +++ b/drivers/staging/media/hantro/hantro_g2_regs.h > > > @@ -0,0 +1,198 @@ > > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > > +/* > > > + * Copyright (c) 2021, Collabora > > > + * > > > + * Author: Benjamin Gaignard > > > + */ > > > + > > > +#ifndef HANTRO_G2_REGS_H_ > > > +#define HANTRO_G2_REGS_H_ > > > + > > > +#include "hantro.h" > > > + > > > +#define G2_SWREG(nr)   ((nr) * 4) > > > + > > > +#define HEVC_DEC_REG(name, base, shift, mask) \ > > > +       static const struct hantro_reg _hevc_##name[] = { \ > > > +               { G2_SWREG(base), (shift), (mask) } \ > > > +       }; \ > > > +       static const struct hantro_reg __maybe_unused *hevc_##name = &_hevc_##name[0]; > > > + > > > +#define HEVC_REG_VERSION               G2_SWREG(0) > > > + > > > +#define HEVC_REG_INTERRUPT             G2_SWREG(1) > > > +#define HEVC_REG_INTERRUPT_DEC_RDY_INT BIT(12) > > > +#define HEVC_REG_INTERRUPT_DEC_ABORT_E BIT(5) > > > +#define HEVC_REG_INTERRUPT_DEC_IRQ_DIS BIT(4) > > > +#define HEVC_REG_INTERRUPT_DEC_E       BIT(0) > > > + > > > +HEVC_DEC_REG(strm_swap,                2, 28,  0xf) > > > +HEVC_DEC_REG(dirmv_swap,       2, 20,  0xf) > > > + > > > +HEVC_DEC_REG(mode,               3, 27, 0x1f) > > > +HEVC_DEC_REG(compress_swap,      3, 20, 0xf) > > > +HEVC_DEC_REG(ref_compress_bypass, 3, 17, 0x1) > > > +HEVC_DEC_REG(out_rs_e,           3, 16, 0x1) > > > +HEVC_DEC_REG(out_dis,            3, 15, 0x1) > > > +HEVC_DEC_REG(out_filtering_dis,   3, 14, 0x1) > > > +HEVC_DEC_REG(write_mvs_e,        3, 12, 0x1) > > > + > > > +HEVC_DEC_REG(pic_width_in_cbs, 4, 19,  0x1ff) > > > +HEVC_DEC_REG(pic_height_in_cbs,        4, 6,   0x1ff) > > > +HEVC_DEC_REG(num_ref_frames,   4, 0,   0x1f) > > > + > > > +HEVC_DEC_REG(scaling_list_e,   5, 24,  0x1) > > > +HEVC_DEC_REG(cb_qp_offset,     5, 19,  0x1f) > > > +HEVC_DEC_REG(cr_qp_offset,     5, 14,  0x1f) > > > +HEVC_DEC_REG(sign_data_hide,   5, 12,  0x1) > > > +HEVC_DEC_REG(tempor_mvp_e,     5, 11,  0x1) > > > +HEVC_DEC_REG(max_cu_qpd_depth, 5, 5,   0x3f) > > > +HEVC_DEC_REG(cu_qpd_e,         5, 4,   0x1) > > > + > > > +HEVC_DEC_REG(stream_len,       6, 0,   0xffffffff) > > > + > > > +HEVC_DEC_REG(cabac_init_present, 7, 31, 0x1) > > > +HEVC_DEC_REG(weight_pred_e,     7, 28, 0x1) > > > +HEVC_DEC_REG(weight_bipr_idc,   7, 26, 0x3) > > > +HEVC_DEC_REG(filter_over_slices, 7, 25, 0x1) > > > +HEVC_DEC_REG(filter_over_tiles,  7, 24, 0x1) > > > +HEVC_DEC_REG(asym_pred_e,       7, 23, 0x1) > > > +HEVC_DEC_REG(sao_e,             7, 22, 0x1) > > > +HEVC_DEC_REG(pcm_filt_d,        7, 21, 0x1) > > > +HEVC_DEC_REG(slice_chqp_present, 7, 20, 0x1) > > > +HEVC_DEC_REG(dependent_slice,   7, 19, 0x1) > > > +HEVC_DEC_REG(filter_override,   7, 18, 0x1) > > > +HEVC_DEC_REG(strong_smooth_e,   7, 17, 0x1) > > > +HEVC_DEC_REG(filt_offset_beta,  7, 12, 0x1f) > > > +HEVC_DEC_REG(filt_offset_tc,    7, 7,  0x1f) > > > +HEVC_DEC_REG(slice_hdr_ext_e,   7, 6,  0x1) > > > +HEVC_DEC_REG(slice_hdr_ext_bits, 7, 3, 0x7) > > > + > > > +HEVC_DEC_REG(const_intra_e,     8, 31, 0x1) > > > +HEVC_DEC_REG(filt_ctrl_pres,    8, 30, 0x1) > > > +HEVC_DEC_REG(idr_pic_e,                 8, 16, 0x1) > > > +HEVC_DEC_REG(bit_depth_pcm_y,   8, 12, 0xf) > > > +HEVC_DEC_REG(bit_depth_pcm_c,   8, 8,  0xf) > > > +HEVC_DEC_REG(bit_depth_y_minus8, 8, 6,  0x3) > > > +HEVC_DEC_REG(bit_depth_c_minus8, 8, 4,  0x3) > > > +HEVC_DEC_REG(output_8_bits,     8, 3,  0x1) > > > + > > > +HEVC_DEC_REG(refidx1_active,   9, 19,  0x1f) > > > +HEVC_DEC_REG(refidx0_active,   9, 14,  0x1f) > > > +HEVC_DEC_REG(hdr_skip_length,  9, 0,   0x3fff) > > > + > > > +HEVC_DEC_REG(start_code_e,     10, 31, 0x1) > > > +HEVC_DEC_REG(init_qp,          10, 24, 0x3f) > > > +HEVC_DEC_REG(num_tile_cols,    10, 19, 0x1f) > > > +HEVC_DEC_REG(num_tile_rows,    10, 14, 0x1f) > > > +HEVC_DEC_REG(tile_e,           10, 1,  0x1) > > > +HEVC_DEC_REG(entropy_sync_e,   10, 0,  0x1) > > > + > > > +HEVC_DEC_REG(refer_lterm_e,    12, 16, 0xffff) > > > +HEVC_DEC_REG(min_cb_size,      12, 13, 0x7) > > > +HEVC_DEC_REG(max_cb_size,      12, 10, 0x7) > > > +HEVC_DEC_REG(min_pcm_size,     12, 7,  0x7) > > > +HEVC_DEC_REG(max_pcm_size,     12, 4,  0x7) > > > +HEVC_DEC_REG(pcm_e,            12, 3,  0x1) > > > +HEVC_DEC_REG(transform_skip,   12, 2,  0x1) > > > +HEVC_DEC_REG(transq_bypass,    12, 1,  0x1) > > > +HEVC_DEC_REG(list_mod_e,       12, 0,  0x1) > > > + > > > +HEVC_DEC_REG(min_trb_size,       13, 13, 0x7) > > > +HEVC_DEC_REG(max_trb_size,       13, 10, 0x7) > > > +HEVC_DEC_REG(max_intra_hierdepth, 13, 7,  0x7) > > > +HEVC_DEC_REG(max_inter_hierdepth, 13, 4,  0x7) > > > +HEVC_DEC_REG(parallel_merge,     13, 0,  0xf) > > > + > > > +HEVC_DEC_REG(rlist_f0,         14, 0,  0x1f) > > > +HEVC_DEC_REG(rlist_f1,         14, 10, 0x1f) > > > +HEVC_DEC_REG(rlist_f2,         14, 20, 0x1f) > > > +HEVC_DEC_REG(rlist_b0,         14, 5,  0x1f) > > > +HEVC_DEC_REG(rlist_b1,         14, 15, 0x1f) > > > +HEVC_DEC_REG(rlist_b2,         14, 25, 0x1f) > > > + > > > +HEVC_DEC_REG(rlist_f3,         15, 0,  0x1f) > > > +HEVC_DEC_REG(rlist_f4,         15, 10, 0x1f) > > > +HEVC_DEC_REG(rlist_f5,         15, 20, 0x1f) > > > +HEVC_DEC_REG(rlist_b3,         15, 5,  0x1f) > > > +HEVC_DEC_REG(rlist_b4,         15, 15, 0x1f) > > > +HEVC_DEC_REG(rlist_b5,         15, 25, 0x1f) > > > + > > > +HEVC_DEC_REG(rlist_f6,         16, 0,  0x1f) > > > +HEVC_DEC_REG(rlist_f7,         16, 10, 0x1f) > > > +HEVC_DEC_REG(rlist_f8,         16, 20, 0x1f) > > > +HEVC_DEC_REG(rlist_b6,         16, 5,  0x1f) > > > +HEVC_DEC_REG(rlist_b7,         16, 15, 0x1f) > > > +HEVC_DEC_REG(rlist_b8,         16, 25, 0x1f) > > > + > > > +HEVC_DEC_REG(rlist_f9,         17, 0,  0x1f) > > > +HEVC_DEC_REG(rlist_f10,                17, 10, 0x1f) > > > +HEVC_DEC_REG(rlist_f11,                17, 20, 0x1f) > > > +HEVC_DEC_REG(rlist_b9,         17, 5,  0x1f) > > > +HEVC_DEC_REG(rlist_b10,                17, 15, 0x1f) > > > +HEVC_DEC_REG(rlist_b11,                17, 25, 0x1f) > > > + > > > +HEVC_DEC_REG(rlist_f12,                18, 0,  0x1f) > > > +HEVC_DEC_REG(rlist_f13,                18, 10, 0x1f) > > > +HEVC_DEC_REG(rlist_f14,                18, 20, 0x1f) > > > +HEVC_DEC_REG(rlist_b12,                18, 5,  0x1f) > > > +HEVC_DEC_REG(rlist_b13,                18, 15, 0x1f) > > > +HEVC_DEC_REG(rlist_b14,                18, 25, 0x1f) > > > + > > > +HEVC_DEC_REG(rlist_f15,                19, 0,  0x1f) > > > +HEVC_DEC_REG(rlist_b15,                19, 5,  0x1f) > > > + > > > +HEVC_DEC_REG(partial_ctb_x,    20, 31, 0x1) > > > +HEVC_DEC_REG(partial_ctb_y,    20, 30, 0x1) > > > +HEVC_DEC_REG(pic_width_4x4,    20, 16, 0xfff) > > > +HEVC_DEC_REG(pic_height_4x4,   20, 0,  0xfff) > > > + > > > +HEVC_DEC_REG(cur_poc_00,       46, 24, 0xff) > > > +HEVC_DEC_REG(cur_poc_01,       46, 16, 0xff) > > > +HEVC_DEC_REG(cur_poc_02,       46, 8,  0xff) > > > +HEVC_DEC_REG(cur_poc_03,       46, 0,  0xff) > > > + > > > +HEVC_DEC_REG(cur_poc_04,       47, 24, 0xff) > > > +HEVC_DEC_REG(cur_poc_05,       47, 16, 0xff) > > > +HEVC_DEC_REG(cur_poc_06,       47, 8,  0xff) > > > +HEVC_DEC_REG(cur_poc_07,       47, 0,  0xff) > > > + > > > +HEVC_DEC_REG(cur_poc_08,       48, 24, 0xff) > > > +HEVC_DEC_REG(cur_poc_09,       48, 16, 0xff) > > > +HEVC_DEC_REG(cur_poc_10,       48, 8,  0xff) > > > +HEVC_DEC_REG(cur_poc_11,       48, 0,  0xff) > > > + > > > +HEVC_DEC_REG(cur_poc_12,       49, 24, 0xff) > > > +HEVC_DEC_REG(cur_poc_13,       49, 16, 0xff) > > > +HEVC_DEC_REG(cur_poc_14,       49, 8,  0xff) > > > +HEVC_DEC_REG(cur_poc_15,       49, 0,  0xff) > > > + > > > +HEVC_DEC_REG(apf_threshold,    55, 0,  0xffff) > > > + > > > +HEVC_DEC_REG(clk_gate_e,       58, 16, 0x1) > > > +HEVC_DEC_REG(buswidth,         58, 8,  0x7) > > > +HEVC_DEC_REG(max_burst,                58, 0,  0xff) > > > + > > > +#define HEVC_REG_CONFIG                                G2_SWREG(58) > > > +#define HEVC_REG_CONFIG_DEC_CLK_GATE_E         BIT(16) > > > +#define HEVC_REG_CONFIG_DEC_CLK_GATE_IDLE_E    BIT(17) > > > + > > > +#define HEVC_ADDR_DST          (G2_SWREG(65)) > > > +#define HEVC_REG_ADDR_REF(i)   (G2_SWREG(67)  + ((i) * 0x8)) > > > +#define HEVC_ADDR_DST_CHR      (G2_SWREG(99)) > > > +#define HEVC_REG_CHR_REF(i)    (G2_SWREG(101) + ((i) * 0x8)) > > > +#define HEVC_ADDR_DST_MV       (G2_SWREG(133)) > > > +#define HEVC_REG_DMV_REF(i)    (G2_SWREG(135) + ((i) * 0x8)) > > > +#define HEVC_ADDR_TILE_SIZE    (G2_SWREG(167)) > > > +#define HEVC_ADDR_STR          (G2_SWREG(169)) > > > +#define HEVC_SCALING_LIST      (G2_SWREG(171)) > > > +#define HEVC_RASTER_SCAN       (G2_SWREG(175)) > > > +#define HEVC_RASTER_SCAN_CHR   (G2_SWREG(177)) > > > +#define HEVC_TILE_FILTER       (G2_SWREG(179)) > > > +#define HEVC_TILE_SAO          (G2_SWREG(181)) > > > +#define HEVC_TILE_BSD          (G2_SWREG(183)) > > > + > > > +HEVC_DEC_REG(strm_buffer_len,  258, 0, 0xffffffff) > > > +HEVC_DEC_REG(strm_start_offset,        259, 0, 0xffffffff) > > > + > > > +#endif > > > diff --git a/drivers/staging/media/hantro/hantro_hevc.c b/drivers/staging/media/hantro/hantro_hevc.c > > > new file mode 100644 > > > index 000000000000..8e319a837ff3 > > > --- /dev/null > > > +++ b/drivers/staging/media/hantro/hantro_hevc.c > > > @@ -0,0 +1,321 @@ > > > +// SPDX-License-Identifier: GPL-2.0 > > > +/* > > > + * Hantro VPU HEVC codec driver > > > + * > > > + * Copyright (C) 2020 Safran Passenger Innovations LLC > > > + */ > > > + > > > +#include > > > +#include > > > + > > > +#include "hantro.h" > > > +#include "hantro_hw.h" > > > + > > > +#define VERT_FILTER_RAM_SIZE 8 /* bytes per pixel row */ > > > +/* > > > + * BSD control data of current picture at tile border > > > + * 128 bits per 4x4 tile = 128/(8*4) bytes per row > > > + */ > > > +#define BSD_CTRL_RAM_SIZE 4 /* bytes per pixel row */ > > > +/* tile border coefficients of filter */ > > > +#define VERT_SAO_RAM_SIZE 48 /* bytes per pixel */ > > > + > > > +#define MAX_TILE_COLS 20 > > > +#define MAX_TILE_ROWS 22 > > > + > > > +#define UNUSED_REF     -1 > > > + > > > +#define G2_ALIGN               16 > > > +#define MC_WORD_SIZE           32 > > > + > > > +size_t hantro_hevc_chroma_offset(const struct v4l2_ctrl_hevc_sps *sps) > > > +{ > > > +       int bytes_per_pixel = sps->bit_depth_luma_minus8 == 0 ? 1 : 2; > > > + > > > +       return sps->pic_width_in_luma_samples * > > > +               sps->pic_height_in_luma_samples * bytes_per_pixel; > > > +} > > > + > > > +size_t hantro_hevc_motion_vectors_offset(const struct v4l2_ctrl_hevc_sps *sps) > > > +{ > > > +       size_t cr_offset = hantro_hevc_chroma_offset(sps); > > > + > > > +       return ALIGN((cr_offset * 3) / 2, G2_ALIGN) + MC_WORD_SIZE; > > > +} > > > + > > > +static size_t hantro_hevc_mv_size(const struct v4l2_ctrl_hevc_sps *sps) > > > +{ > > > +       u32 pic_width_in_ctb64 = (sps->pic_width_in_luma_samples + (1 << 8) - 1) >> 8; > > > +       u32 pic_height_in_ctb64 = (sps->pic_height_in_luma_samples  + (1 << 8) - 1) >> 8; > > > +       size_t mv_size; > > > + > > > +       mv_size = (pic_width_in_ctb64 * pic_height_in_ctb64 * > > > +                 (1 << (2 * (8 - 4))) * 16) + 32; > > > + > > > +       vpu_debug(4, "%dx%d (CTBs) %lu MV bytes\n", > > > +                 pic_width_in_ctb64, pic_height_in_ctb64, mv_size); > > > + > > > +       return mv_size; > > > +} > > > + > > > +static size_t hantro_hevc_ref_size(struct hantro_ctx *ctx) > > > +{ > > > +       const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; > > > +       const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; > > > + > > > +       return hantro_hevc_motion_vectors_offset(sps) + hantro_hevc_mv_size(sps); > > > +} > > > + > > > +static void hantro_hevc_ref_free(struct hantro_ctx *ctx) > > > +{ > > > +       struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; > > > +       struct hantro_dev *vpu = ctx->dev; > > > +       int i; > > > + > > > +       /* Just tag buffer as unused, do not free them */ > > This comment seems wrong. > > You are right I will remove it. > > > > > > +       for (i = 0;  i < NUM_REF_PICTURES; i++) { > > > +               if (hevc_dec->ref_bufs[i].cpu) { > > > +                       memset(hevc_dec->ref_bufs[i].cpu, 0, hantro_hevc_ref_size(ctx)); > > Is this memset clearing the buffer required? If we're getting artifacts > > from previous decodes, then that would be more of a bug somewhere. > > Clear is done after allocating/reused the buffer I can remove this one. > > > > > > +                       dma_free_coherent(vpu->dev, hevc_dec->ref_bufs[i].size, > > > +                                         hevc_dec->ref_bufs[i].cpu, > > > +                                         hevc_dec->ref_bufs[i].dma); > > > +               } > > > +       } > > > +} > > > + > > > +static void hantro_hevc_ref_init(struct hantro_ctx *ctx) > > > +{ > > > +       struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; > > > +       int i; > > > + > > > +       for (i = 0;  i < NUM_REF_PICTURES; i++) > > > +               hevc_dec->ref_bufs_poc[i] = UNUSED_REF; > > > +} > > > + > > > +dma_addr_t hantro_hevc_get_ref_buf(struct hantro_ctx *ctx, > > > +                                  int poc) > > > +{ > > > +       struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; > > > +       int i; > > > + > > > +       /* Find the reference buffer in already know ones */ > > > +       for (i = 0;  i < NUM_REF_PICTURES; i++) { > > > +               if (hevc_dec->ref_bufs_poc[i] == poc) { > > > +                       hevc_dec->ref_bufs_used |= 1 << i; > > > +                       return hevc_dec->ref_bufs[i].dma; > > > +               } > > > +       } > > > + > > > +       /* Allocate a new reference buffer */ > > > +       for (i = 0; i < NUM_REF_PICTURES; i++) { > > > +               if (hevc_dec->ref_bufs_poc[i] == UNUSED_REF) { > > > +                       if (!hevc_dec->ref_bufs[i].cpu) { > > > +                               struct hantro_dev *vpu = ctx->dev; > > > + > > > +                               hevc_dec->ref_bufs[i].cpu = > > > +                                       dma_alloc_coherent(vpu->dev, > > > +                                                          hantro_hevc_ref_size(ctx), > > > +                                                          &hevc_dec->ref_bufs[i].dma, > > > +                                                          GFP_KERNEL); > > Is there any reason why we need to allocate reference buffers and MV contiguously? > > It is done like that in IMX reference code and makes the management of reference frame > and MV more simple. > > > > > > +                               if (!hevc_dec->ref_bufs[i].cpu) > > > +                                       return 0; > > > + > > > +                               hevc_dec->ref_bufs[i].size = hantro_hevc_ref_size(ctx); > > > +                       } > > > +                       hevc_dec->ref_bufs_used |= 1 << i; > > > +                       memset(hevc_dec->ref_bufs[i].cpu, 0, hantro_hevc_ref_size(ctx)); > > > > I believe the coherent allocation is to be able to clear each reference, but is this > > really needed? I recall maybe only the MV buffer needs clearing, maybe you can try that? > > > > Also, if that's the case, then allocating the MV buffer separatedly will allow > > to not allocate the reference buffers coherently (note that we use NO_MAPPING > > in the vb2_queue, so the vb2_buffers shouldn't be coherent). > > That sound like good possible optimizations but I'm not at this stage. > I would rather keep it in this fairly functional state and improve it later. > I think the patches are already enough larges and complexes like that. > Fair enough. I think it's great to have a first working version :) Could you add a comment for this, specially at the memset's and the dma_alloc_coherent, (or optionally at the header of this .c file), in case someone wants to revisit this topic? Thanks a lot! Ezequiel 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=-14.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, 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 63B3BC433E0 for ; Tue, 16 Mar 2021 20:35:37 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 B69BF64F80 for ; Tue, 16 Mar 2021 20:35:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B69BF64F80 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:Cc:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=hDvls7KpTi1IxEjWpCNJDVMh/qZk1/nI+ZDAiLa9fPc=; b=jRzFfWeOW0CcTJ+A7y92zLRVd yhqQean3A+9lAk2Ehl6NEYhf6VMNzIAi68NwqLXAv4IAZT/wRd4Vy0X8XFuUqAkMHoF5qZyyckCM1 Q/Hhzh1NocMgQNFlUdTFsEElGRtblg2UE80SFHcyBsnWFEXD5e3SgCz7aCUJvrNzyHI4AO2GW1uiq f4WurPblRhL9X8u+hiosuue4HAdzVZ76Z8u1FFI0J9dY30wBZ/Dtxs9eraCTMiABMdulil+L+6zE5 a6FsD/Mmo8WCuzLex3iP+X3IrIQZWTANqPifJxLOiVc8WDq9CrkaOJkWKOSgkmdxEFP4QNXZhHyih qJ6ev5kyg==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lMGPb-001owB-UX; Tue, 16 Mar 2021 20:35:32 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lMGPL-001ota-Hj; Tue, 16 Mar 2021 20:35:20 +0000 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id 279821F44E31 Message-ID: <165cf812e228517c9e746691d887445dd1b732ba.camel@collabora.com> Subject: Re: [PATCH v4 07/11] media: hantro: Introduce G2/HEVC decoder From: Ezequiel Garcia To: Benjamin Gaignard , p.zabel@pengutronix.de, mchehab@kernel.org, robh+dt@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, gregkh@linuxfoundation.org, mripard@kernel.org, paul.kocialkowski@bootlin.com, wens@csie.org, jernej.skrabec@siol.net, peng.fan@nxp.com, hverkuil-cisco@xs4all.nl, dan.carpenter@oracle.com Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel@collabora.com Date: Tue, 16 Mar 2021 17:35:03 -0300 In-Reply-To: References: <20210303113952.178519-1-benjamin.gaignard@collabora.com> <20210303113952.178519-8-benjamin.gaignard@collabora.com> <0306499f9c5bb55fe5da521feaa19bd1ad8e860f.camel@collabora.com> Organization: Collabora User-Agent: Evolution 3.38.2-1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210316_203516_254300_BAA5ACCD X-CRM114-Status: GOOD ( 51.10 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org T24gVHVlLCAyMDIxLTAzLTE2IGF0IDIxOjE5ICswMTAwLCBCZW5qYW1pbiBHYWlnbmFyZCB3cm90 ZToKPiAKPiBMZSAxNi8wMy8yMDIxIMOgIDE5OjQ2LCBFemVxdWllbCBHYXJjaWEgYSDDqWNyaXTC oDoKPiA+IEhpIEJlbmphbWluLAo+ID4gCj4gPiBUaGUgc2VyaWVzIGlzIGxvb2tpbmcgcmVhbGx5 IGdvb2QuIFNvbWUgY29tbWVudHMgYmVsb3cuCj4gPiAKPiA+IE9uIFdlZCwgMjAyMS0wMy0wMyBh dCAxMjozOSArMDEwMCwgQmVuamFtaW4gR2FpZ25hcmQgd3JvdGU6Cj4gPiA+IEltcGxlbWVudCBh bGwgdGhlIGxvZ2ljIHRvIGdldCBHMiBoYXJkd2FyZSBkZWNvZGluZyBIRVZDIGZyYW1lcy4KPiA+ ID4gSXQgc3VwcG9ydCB1cCBsZXZlbCA1LjEgSEVWQyBzdHJlYW0uCj4gPiA+IEl0IGRvZXNuJ3Qg c3VwcG9ydCB5ZXQgMTAgYml0cyBmb3JtYXRzIG9yIHNjYWxpbmcgZmVhdHVyZS4KPiA+ID4gCj4g PiA+IEFkZCBIQU5UUk8gSEVWQyBkZWRpY2F0ZWQgY29udHJvbCB0byBza2lwIHNvbWUgYml0cyBh dCB0aGUgYmVnaW5uaW5nCj4gPiA+IG9mIHRoZSBzbGljZSBoZWFkZXIuIFRoYXQgaXMgdmVyeSBz cGVjaWZpYyB0byB0aGlzIGhhcmR3YXJlIHNvIGNhbid0Cj4gPiA+IGdvIGludG8gdWFwaSBzdHJ1 Y3R1cmVzLiBDb21wdXRlIHRoZSBuZWVkZWQgdmFsdWUgaXMgY29tcGxleCBhbmQgcmVxdWlyZQo+ ID4gPiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJlYW0gdGhhdCBvbmx5IHRoZSB1c2VybGFuZCBr bm93cyBzbyBsZXQgaXQKPiA+ID4gcHJvdmlkZSB0aGUgY29ycmVjdCB2YWx1ZSB0byB0aGUgZHJp dmVyLgo+ID4gPiAKPiA+ID4gU2lnbmVkLW9mZi1ieTogQmVuamFtaW4gR2FpZ25hcmQgPGJlbmph bWluLmdhaWduYXJkQGNvbGxhYm9yYS5jb20+Cj4gPiA+IC0tLQo+ID4gPiB2ZXJzaW9uIDQ6Cj4g PiA+IC0gZml4IEV6ZXF1aWVsIGNvbW1lbnRzCj4gPiA+IC0gdXNlIGRlZGljYXRlZCBjb250cm9s IGFzIGFuIGludGVnZXIKPiA+ID4gLSBjaGFuZ2UgaGFudHJvX2cyX2hldmNfZGVjX3J1biBwcm90 b3R5cGUgdG8gcmV0dXJuIGVycm9ycwo+ID4gPiAKPiA+ID4gdmVyc2lvbiAyOgo+ID4gPiAtIHNx dWFzaCBtdWx0aXBsZSBjb21taXRzIGluIHRoaXMgb25lLgo+ID4gPiAtIGZpeCB0aGUgY29tbWVu dHMgZG9uZSBieSBFemVxdWllbCBhYm91dCBkbWFfYWxsb2NfY29oZXJlbnQgdXNhZ2UKPiA+ID4g LSBmaXggRGFuJ3MgY29tbWVudHMgYWJvdXQgY29udHJvbCBjb3B5LCByZXZlcnNlIHRoZSB0ZXN0 IGxvZ2ljCj4gPiA+IGluIHRpbGVfYnVmZmVyX3JlYWxsb2NhdGUsIHJld29yayBzb21lIGdvdG8g YW5kIHJldHVybiBjYXNlcy4KPiA+ID4gCj4gPiA+IMKgwqBkcml2ZXJzL3N0YWdpbmcvbWVkaWEv aGFudHJvL01ha2VmaWxlwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCAyICsKPiA+ID4gwqDCoGRyaXZl cnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvLmjCoMKgwqDCoMKgwqDCoMKgIHzCoCAxOCAr Cj4gPiA+IMKgwqBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19kcnYuY8KgwqDC oMKgIHzCoCA1MyArKwo+ID4gPiDCoMKgLi4uL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19n Ml9oZXZjX2RlYy5jIHwgNTg3ICsrKysrKysrKysrKysrKysrKwo+ID4gPiDCoMKgZHJpdmVycy9z dGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfcmVncy5oIHwgMTk4ICsrKysrKwo+ID4gPiDC oMKgZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9faGV2Yy5jwqDCoMKgIHwgMzIx ICsrKysrKysrKysKPiA+ID4gwqDCoGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJv X2h3LmjCoMKgwqDCoMKgIHzCoCA0OSArKwo+ID4gPiDCoMKgNyBmaWxlcyBjaGFuZ2VkLCAxMjI4 IGluc2VydGlvbnMoKykKPiA+ID4gwqDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdp bmcvbWVkaWEvaGFudHJvL2hhbnRyb19nMl9oZXZjX2RlYy5jCj4gPiA+IMKgwqBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfcmVncy5oCj4g PiA+IMKgwqBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9o YW50cm9faGV2Yy5jCj4gPiA+IAo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21l ZGlhL2hhbnRyby9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vTWFrZWZp bGUKPiA+ID4gaW5kZXggNzQzY2UwOGViMTg0Li4wMzU3ZjE3NzIyNjcgMTAwNjQ0Cj4gPiA+IC0t LSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vTWFrZWZpbGUKPiA+ID4gKysrIGIvZHJp dmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9NYWtlZmlsZQo+ID4gPiBAQCAtOSwxMiArOSwxNCBA QCBoYW50cm8tdnB1LXkgKz0gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaGFudHJvX2gxX2pwZWdfZW5jLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaGFudHJvX2cxX2gyNjRfZGVjLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaGFudHJvX2cxX21wZWcyX2RlYy5vIFwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19nMl9oZXZjX2RlYy5vIFwKPiA+ID4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19nMV92cDhfZGVjLm8gXAo+ID4gPiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmszMzk5X3ZwdV9od19qcGVnX2VuYy5vIFwK PiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJrMzM5OV92cHVfaHdfbXBl ZzJfZGVjLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmszMzk5 X3ZwdV9od192cDhfZGVjLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaGFudHJvX2pwZWcubyBcCj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBoYW50cm9faDI2NC5vIFwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhh bnRyb19oZXZjLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFu dHJvX21wZWcyLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFu dHJvX3ZwOC5vCj4gPiA+IMKgIAo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21l ZGlhL2hhbnRyby9oYW50cm8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJv LmgKPiA+ID4gaW5kZXggMDU4NzZlNDI2NDE5Li5hOWI4MGIyYzkxMjQgMTAwNjQ0Cj4gPiA+IC0t LSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvLmgKPiA+ID4gKysrIGIvZHJp dmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm8uaAo+ID4gPiBAQCAtMjI1LDYgKzIyNSw3 IEBAIHN0cnVjdCBoYW50cm9fZGV2IHsKPiA+ID4gwqDCoCAqIEBqcGVnX2VuYzrCoMKgwqDCoMKg wqDCoMKgwqDCoEpQRUctZW5jb2RpbmcgY29udGV4dC4KPiA+ID4gwqDCoCAqIEBtcGVnMl9kZWM6 wqDCoMKgwqDCoMKgwqDCoMKgTVBFRy0yLWRlY29kaW5nIGNvbnRleHQuCj4gPiA+IMKgwqAgKiBA dnA4X2RlYzrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgVlA4LWRlY29kaW5nIGNvbnRleHQuCj4gPiA+ ICsgKiBAaGV2Y19kZWM6wqDCoMKgwqDCoMKgwqDCoMKgwqBIRVZDLWRlY29kaW5nIGNvbnRleHQu Cj4gPiA+IMKgwqAgKi8KPiA+ID4gwqDCoHN0cnVjdCBoYW50cm9fY3R4IHsKPiA+ID4gwqDCoMKg wqDCoMKgwqDCoMKgc3RydWN0IGhhbnRyb19kZXYgKmRldjsKPiA+ID4gQEAgLTI1MSw2ICsyNTIs NyBAQCBzdHJ1Y3QgaGFudHJvX2N0eCB7Cj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzdHJ1Y3QgaGFudHJvX2pwZWdfZW5jX2h3X2N0eCBqcGVnX2VuYzsKPiA+ID4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9fbXBlZzJfZGVjX2h3 X2N0eCBtcGVnMl9kZWM7Cj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBz dHJ1Y3QgaGFudHJvX3ZwOF9kZWNfaHdfY3R4IHZwOF9kZWM7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaGFudHJvX2hldmNfZGVjX2h3X2N0eCBoZXZjX2RlYzsK PiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgfTsKPiA+ID4gwqDCoH07Cj4gPiA+IMKgIAo+ID4gPiBA QCAtNDI4LDYgKzQzMCwyMiBAQCBoYW50cm9fZ2V0X2RlY19idWZfYWRkcihzdHJ1Y3QgaGFudHJv X2N0eCAqY3R4LCBzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7Cj4gPiA+IMKgwqB9 Cj4gPiA+IMKgIAo+ID4gPiArc3RhdGljIGlubGluZSBzaXplX3QKPiA+ID4gK2hhbnRyb19nZXRf ZGVjX2J1Zl9zaXplKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIHN0cnVjdCB2YjJfYnVmZmVyICp2 YikKPiA+ID4gK3sKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGhhbnRyb19uZWVkc19wb3N0cHJv YyhjdHgsIGN0eC0+dnB1X2RzdF9mbXQpKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIGN0eC0+cG9zdHByb2MuZGVjX3FbdmItPmluZGV4XS5zaXplOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqByZXR1cm4gdmIyX3BsYW5lX3NpemUodmIsIDApOwo+ID4gPiArfQo+ID4g PiArCj4gPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgKgo+ID4gPiAraGFudHJvX2dldF9kZWNfYnVm KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIHN0cnVjdCB2YjJfYnVmZmVyICp2YikKPiA+ID4gK3sK PiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGhhbnRyb19uZWVkc19wb3N0cHJvYyhjdHgsIGN0eC0+ dnB1X2RzdF9mbXQpKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IGN0eC0+cG9zdHByb2MuZGVjX3FbdmItPmluZGV4XS5jcHU7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oHJldHVybiB2YjJfcGxhbmVfdmFkZHIodmIsIDApOwo+ID4gPiArfQo+ID4gPiArCj4gPiBTZWVt cyBoYW50cm9fZ2V0X2RlY19idWZfc2l6ZSBhbmQgaGFudHJvX2dldF9kZWNfYnVmIGFyZSBub3Qg dXNlZD8KPiAKPiBZb3UgYXJlIHJpZ2h0IEkgd2lsbCByZW1vdmUgdGhlbQo+IAo+ID4gCj4gPiA+ IMKgwqB2b2lkIGhhbnRyb19wb3N0cHJvY19kaXNhYmxlKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgp Owo+ID4gPiDCoMKgdm9pZCBoYW50cm9fcG9zdHByb2NfZW5hYmxlKHN0cnVjdCBoYW50cm9fY3R4 ICpjdHgpOwo+ID4gPiDCoMKgdm9pZCBoYW50cm9fcG9zdHByb2NfZnJlZShzdHJ1Y3QgaGFudHJv X2N0eCAqY3R4KTsKPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50 cm8vaGFudHJvX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZHJ2 LmMKPiA+ID4gaW5kZXggZTNlNmRmMjhmNDcwLi5iYzkwYTUyZjRkM2QgMTAwNjQ0Cj4gPiA+IC0t LSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX2Rydi5jCj4gPiA+ICsrKyBi L2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX2Rydi5jCj4gPiA+IEBAIC0zMCw2 ICszMCwxMyBAQAo+ID4gPiDCoCAKPiA+ID4gwqDCoCNkZWZpbmUgRFJJVkVSX05BTUUgImhhbnRy by12cHUiCj4gPiA+IMKgIAo+ID4gPiArLyoKPiA+ID4gKyAqIFY0TDJfQ0lEX0hBTlRST19IRVZD X1NMSUNFX0hFQURFUl9TS0lQIC0KPiA+ID4gKyAqIHRoZSBudW1iZXIgb2YgZGF0YSAoaW4gYml0 cykgdG8gc2tpcCBpbiB0aGUKPiA+ID4gKyAqIHNsaWNlIHNlZ21lbnQgaGVhZGVyIHN5bnRheCBh ZnRlciAnc2xpY2UgdHlwZScgdG9rZW4KPiA+ID4gKyAqLwo+ID4gSSB0aGluayB3ZSBuZWVkIHRv IGRvY3VtZW50IHRoaXMgYmV0dGVyLCBzbyBhcHBsaWNhdGlvbnMgY2FuCj4gPiBjb3JyZWN0bHkg dXNlIHRoZSBjb250cm9sLiBGcm9tIGkuTVggcmVmZXJlbmNlIGNvZGUsIGl0IHNlZW1zCj4gPiB0 aGlzIG5lZWRzIHRvIGJlIHVzZWQgYXMgZm9sbG93czoKPiA+IAo+ID4gSWYgbm9uLUlEUiwgdGhl IGJpdHMgdG8gYmUgc2tpcHBlZCBnbyBmcm9tIHN5bnRheCBlbGVtZW50ICJwaWNfb3V0cHV0X2Zs YWciCj4gPiB0byBiZWZvcmUgc3ludGF4IGVsZW1lbnQgInNsaWNlX3RlbXBvcmFsX212cF9lbmFi bGVkX2ZsYWciLgo+ID4gCj4gPiBJZiBJRFIsIHRoZSBza2lwcGVkIGJpdHMgYXJlIGp1c3QgInBp Y19vdXRwdXRfZmxhZyIKPiA+IChzZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZyBpcyBub3Qgc3Vw cG9ydGVkKS4KPiA+IAo+ID4gQW5kIGl0IHNlZW1zIHRoaXMgbmVlZHMgdG8gYmUgcGFzc2VkIHBh cnNpbmcgb25seSB0aGUgZmlyc3Qgc2xpY2UsCj4gPiBnaXZlbiB0aGlzIHN5bnRheCByZW1haW5z IGludmFyaWFudCBhY3Jvc3MgYWxsIHRoZSBzbGljZXMuCj4gCj4gT2sgSSB3aWxsIGFkZCB5b3Vy IGRlc2NyaXB0aW9uIGluIHRoZSBuZXh0IHZlcnNpb24uCj4gCj4gPiAKPiA+ID4gKyNkZWZpbmUg VjRMMl9DSURfSEFOVFJPX0hFVkNfU0xJQ0VfSEVBREVSX1NLSVDCoChWNEwyX0NJRF9VU0VSX0hB TlRST19CQVNFICsgMCkKPiA+ID4gKwo+ID4gPiDCoMKgaW50IGhhbnRyb19kZWJ1ZzsKPiA+ID4g wqDCoG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaGFudHJvX2RlYnVnLCBpbnQsIDA2NDQpOwo+ ID4gPiDCoMKgTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKPiA+ID4gQEAgLTI4MSw2ICsyODgsMjYg QEAgc3RhdGljIGludCBoYW50cm9fanBlZ19zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkK PiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiA+IMKgwqB9Cj4gPiA+IMKgIAo+ ID4gPiArc3RhdGljIGludCBoYW50cm9faGV2Y19zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3Ry bCkKPiA+ID4gK3sKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGhhbnRyb19jdHggKmN0eDsK PiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBjdHggPSBjb250YWluZXJfb2YoY3RybC0+aGFu ZGxlciwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCBoYW50cm9fY3R4LCBjdHJsX2hhbmRsZXIpOwo+ID4gPiArCj4gPiA+ICvC oMKgwqDCoMKgwqDCoHZwdV9kZWJ1ZygxLCAic19jdHJsOiBpZCA9ICVkLCB2YWwgPSAlZFxuIiwg Y3RybC0+aWQsIGN0cmwtPnZhbCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3dpdGNo IChjdHJsLT5pZCkgewo+ID4gPiArwqDCoMKgwqDCoMKgwqBjYXNlIFY0TDJfQ0lEX0hBTlRST19I RVZDX1NMSUNFX0hFQURFUl9TS0lQOgo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgY3R4LT5oZXZjX2RlYy5jdHJscy5oZXZjX2hkcl9za2lwX2xlbmd0aCA9IGN0cmwtPnZhbDsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gPiArwqDCoMKg wqDCoMKgwqBkZWZhdWx0Ogo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 dXJuIC1FSU5WQUw7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ID4gKwo+ID4gPiArwqDCoMKg wqDCoMKgwqByZXR1cm4gMDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiDCoMKgc3RhdGljIGNvbnN0 IHN0cnVjdCB2NGwyX2N0cmxfb3BzIGhhbnRyb19jdHJsX29wcyA9IHsKPiA+ID4gwqDCoMKgwqDC oMKgwqDCoMKgLnRyeV9jdHJsID0gaGFudHJvX3RyeV9jdHJsLAo+ID4gPiDCoMKgfTsKPiA+ID4g QEAgLTI4OSw2ICszMTYsMTAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIGhh bnRyb19qcGVnX2N0cmxfb3BzID0gewo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqAuc19jdHJsID0g aGFudHJvX2pwZWdfc19jdHJsLAo+ID4gPiDCoMKgfTsKPiA+ID4gwqAgCj4gPiA+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgaGFudHJvX2hldmNfY3RybF9vcHMgPSB7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoC5zX2N0cmwgPSBoYW50cm9faGV2Y19zX2N0cmwsCj4gPiA+ICt9Owo+ ID4gPiArCj4gPiA+IMKgwqBzdGF0aWMgY29uc3Qgc3RydWN0IGhhbnRyb19jdHJsIGNvbnRyb2xz W10gPSB7Cj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoHsKPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoC5jb2RlYyA9IEhBTlRST19KUEVHX0VOQ09ERVIsCj4gPiA+IEBAIC00 MDksNiArNDQwLDI4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGFudHJvX2N0cmwgY29udHJvbHNb XSA9IHsKPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5jZmcgPSB7Cj4g PiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmlk ID0gVjRMMl9DSURfTVBFR19WSURFT19IRVZDX0RFQ09ERV9QQVJBTVMsCj4gPiA+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9LAo+ID4gPiArwqDCoMKgwqDCoMKgwqB9LCB7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAuY29kZWMgPSBIQU5UUk9fSEVWQ19E RUNPREVSLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmNmZyA9IHsKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAuaWQgPSBW NEwyX0NJRF9IQU5UUk9fSEVWQ19TTElDRV9IRUFERVJfU0tJUCwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAubmFtZSA9ICJIYW50cm8gSEVWQyBz bGljZSBoZWFkZXIgc2tpcCBieXRlcyIsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5taW4gPSAw LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5k ZWYgPSAwLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoC5tYXggPSAweDdmZmZmZmZmLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoC5zdGVwID0gMSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAub3BzID0gJmhhbnRyb19oZXZjX2N0cmxfb3BzLAo+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfSwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgfSwgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmNvZGVjID0gSEFO VFJPX0pQRUdfRU5DT0RFUiB8IEhBTlRST19NUEVHMl9ERUNPREVSIHwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgSEFOVFJPX1ZQOF9ERUNPREVS IHwgSEFOVFJPX0gyNjRfREVDT0RFUiB8Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIEhBTlRST19IRVZDX0RFQ09ERVIsCj4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAuY2ZnID0gewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5pZCA9IFY0TDJfQ0lEX1VTRVJfQ0xBU1MsCj4g PiBUaGlzIHNob3VsZG4ndCBiZSBoZXJlLCBpcyB0aGlzIFY0TDJfQ0lEX1VTRVJfQ0xBU1MgcmVx dWlyZWQgYnkgdjRsMi1jb21wbGlhbmNlCj4gPiBvciBieSB0aGUgc3BlYz8KPiAKPiBJdCBpcyBy ZXF1aXJlZCBieSB2NGwyLWNvbXBsaWFuY2UuCj4gCgpVbmxlc3MgSGFucyBzYXlzIG90aGVyd2lz ZSwgSSdkIHNheSBkcm9wIHRoaXMgVjRMMl9DSURfVVNFUl9DTEFTUyBjb250cm9sLAphbmQgd2Ug Y2FuIGZpZ3VyZSBvdXQgd2hhdCdzIHdyb25nIHdpdGggdjRsMi1jb21wbGlhbmNlIGxhdGVyLgoK PiA+IAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oC5uYW1lID0gIkhBTlRSTyBjb250cm9scyIsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNT LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5m bGFncyA9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSB8IFY0TDJfQ1RSTF9GTEFHX1dSSVRFX09O TFksCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9LAo+ID4gPiDCoMKgwqDC oMKgwqDCoMKgwqB9LAo+ID4gPiDCoMKgfTsKPiA+ID4gwqAgCj4gPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19nMl9oZXZjX2RlYy5jIGIvZHJpdmVy cy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfaGV2Y19kZWMuYwo+ID4gPiBuZXcgZmls ZSBtb2RlIDEwMDY0NAo+ID4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjVkNzViMzZiYzQwYwo+ID4g PiAtLS0gL2Rldi9udWxsCj4gPiA+ICsrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8v aGFudHJvX2cyX2hldmNfZGVjLmMKPiA+ID4gQEAgLTAsMCArMSw1ODcgQEAKPiA+ID4gKy8vIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gPiA+ICsvKgo+ID4gPiArICogSGFudHJv IFZQVSBIRVZDIGNvZGVjIGRyaXZlcgo+ID4gPiArICoKPiA+ID4gKyAqIENvcHlyaWdodCAoQykg MjAyMCBTYWZyYW4gUGFzc2VuZ2VyIElubm92YXRpb25zIExMQwo+ID4gPiArICovCj4gPiA+ICsK PiA+ID4gKyNpbmNsdWRlICJoYW50cm9faHcuaCIKPiA+ID4gKyNpbmNsdWRlICJoYW50cm9fZzJf cmVncy5oIgo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIEhFVkNfREVDX01PREXCoMKgMHhDCj4gPiA+ ICsKPiA+ID4gKyNkZWZpbmUgQlVTX1dJRFRIXzMywqDCoMKgwqDCoMKgwqDCoMKgwqDCoDAKPiA+ ID4gKyNkZWZpbmUgQlVTX1dJRFRIXzY0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoDEKPiA+ID4gKyNk ZWZpbmUgQlVTX1dJRFRIXzEyOMKgwqDCoMKgwqDCoMKgwqDCoMKgMgo+ID4gPiArI2RlZmluZSBC VVNfV0lEVEhfMjU2wqDCoMKgwqDCoMKgwqDCoMKgwqAzCj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBp bmxpbmUgdm9pZCBoYW50cm9fd3JpdGVfYWRkcihzdHJ1Y3QgaGFudHJvX2RldiAqdnB1LAo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIG9mZnNldCwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZG1hX2FkZHJfdCBhZGRyKQo+ID4gPiArewo+ID4gPiArwqDCoMKgwqDCoMKgwqB2ZHB1X3dy aXRlKHZwdSwgYWRkciAmIDB4ZmZmZmZmZmYsIG9mZnNldCk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ ID4gK3N0YXRpYyB2b2lkIHByZXBhcmVfdGlsZV9pbmZvX2J1ZmZlcihzdHJ1Y3QgaGFudHJvX2N0 eCAqY3R4KQo+ID4gPiArewo+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaGFudHJvX2RldiAq dnB1ID0gY3R4LT5kZXY7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGNvbnN0IHN0cnVjdCBoYW50cm9f aGV2Y19kZWNfY3RybHMgKmN0cmxzID0gJmN0eC0+aGV2Y19kZWMuY3RybHM7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19wcHMgKnBwcyA9IGN0cmxzLT5w cHM7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMg KnNwcyA9IGN0cmxzLT5zcHM7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHUxNiAqcCA9ICh1MTYgKiko KHU4ICopY3R4LT5oZXZjX2RlYy50aWxlX3NpemVzLmNwdSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oHVuc2lnbmVkIGludCBudW1fdGlsZV9yb3dzID0gcHBzLT5udW1fdGlsZV9yb3dzX21pbnVzMSAr IDE7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGludCBudW1fdGlsZV9jb2xzID0gcHBz LT5udW1fdGlsZV9jb2x1bW5zX21pbnVzMSArIDE7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHVuc2ln bmVkIGludCBwaWNfd2lkdGhfaW5fY3RicywgcGljX2hlaWdodF9pbl9jdGJzOwo+ID4gPiArwqDC oMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgbWF4X2xvZzJfY3RiX3NpemUsIGN0Yl9zaXplOwo+ID4g PiArwqDCoMKgwqDCoMKgwqBib29sIHRpbGVzX2VuYWJsZWQsIHVuaWZvcm1fc3BhY2luZzsKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgdTMyIG5vX2Nocm9tYSA9IDA7Cj4gPiA+ICsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgdGlsZXNfZW5hYmxlZCA9ICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZM QUdfVElMRVNfRU5BQkxFRCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHVuaWZvcm1fc3BhY2luZyA9 ICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfVU5JRk9STV9TUEFDSU5HKTsKPiA+ ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y190aWxl X2UsIHRpbGVzX2VuYWJsZWQpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoG1heF9sb2cy X2N0Yl9zaXplID0gc3BzLT5sb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyAr IDMgKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemU7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoHBpY193aWR0aF9pbl9jdGJzID0gKHNwcy0+cGljX3dpZHRoX2lu X2x1bWFfc2FtcGxlcyArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICgxIDw8IG1heF9sb2cyX2N0Yl9zaXplKSAtIDEpID4+IG1heF9s b2cyX2N0Yl9zaXplOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBwaWNfaGVpZ2h0X2luX2N0YnMgPSAo c3BzLT5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcyArICgxIDw8IG1heF9sb2cyX2N0Yl9zaXpl KSAtIDEpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgPj4gbWF4X2xvZzJfY3RiX3NpemU7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGN0 Yl9zaXplID0gMSA8PCBtYXhfbG9nMl9jdGJfc2l6ZTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDC oMKgwqB2cHVfZGVidWcoMSwgIlByZXBhcmluZyB0aWxlIHNpemVzIGJ1ZmZlciBmb3IgJWR4JWQg Q1RCcyAoQ1RCIHNpemUgJWQpXG4iLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGljX3dpZHRoX2luX2N0YnMsIHBpY19oZWlnaHRfaW5fY3RicywgY3RiX3NpemUpOwo+ ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmICh0aWxlc19lbmFibGVkKSB7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgaSwgaiwgaDsKPiA+ID4g Kwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdnB1X2RlYnVnKDEsICJUaWxl cyBlbmFibGVkISAlZHglZFxuIiwgbnVtX3RpbGVfY29scywgbnVtX3RpbGVfcm93cyk7Cj4gPiA+ ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUo dnB1LCBoZXZjX251bV90aWxlX3Jvd3MsIG51bV90aWxlX3Jvd3MpOwo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbnVtX3RpbGVf Y29scywgbnVtX3RpbGVfY29scyk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoC8qIHdyaXRlIHdpZHRoICsgaGVpZ2h0IGZvciBlYWNoIHRpbGUgaW4gcGljICov Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIXVuaWZvcm1fc3BhY2lu Zykgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHUzMiB0bXBfdyA9IDAsIHRtcF9oID0gMDsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBudW1fdGlsZV9y b3dzOyBpKyspIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGkgPT0gbnVtX3RpbGVfcm93cyAtIDEpCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoID0gcGljX2hlaWdodF9pbl9jdGJzIC0gdG1wX2g7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGVsc2UKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGggPSBwcHMtPnJvd19o ZWlnaHRfbWludXMxW2ldICsgMTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdG1wX2ggKz0gaDsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgKGkgPT0gMCAmJiBoID09IDEgJiYgY3RiX3NpemUgPT0gMTYpCj4gPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBub19jaHJvbWEgPSAxOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmb3IgKGogPSAwLCB0bXBfdyA9 IDA7IGogPCBudW1fdGlsZV9jb2xzIC0gMTsgaisrKSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB0bXBfdyArPSBwcHMtPmNvbHVtbl93aWR0aF9taW51czFbal0gKyAxOwo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgKnArKyA9IHBwcy0+Y29sdW1uX3dpZHRoX21pbnVzMVtqICsgMV07 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAqcCsrID0gaDsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIChpID09IDAgJiYgaCA9PSAxICYmIGN0Yl9zaXplID09IDE2KQo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG5vX2Nocm9tYSA9IDE7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoH0KPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogbGFzdCBjb2x1bW4gKi8KPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKnArKyA9 IHBpY193aWR0aF9pbl9jdGJzIC0gdG1wX3c7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCpwKysgPSBoOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0gZWxzZSB7IC8qIHVuaWZvcm0gc3BhY2luZyAq Lwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUz MiB0bXAsIHByZXZfaCwgcHJldl93Owo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIChpID0gMCwgcHJldl9oID0gMDsgaSA8IG51 bV90aWxlX3Jvd3M7IGkrKykgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0bXAgPSAoaSArIDEpICogcGljX2hlaWdo dF9pbl9jdGJzIC8gbnVtX3RpbGVfcm93czsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaCA9IHRtcCAtIHByZXZfaDsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcHJldl9oID0gdG1wOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoaSA9PSAwICYmIGggPT0g MSAmJiBjdGJfc2l6ZSA9PSAxNikKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG5vX2Nocm9t YSA9IDE7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGZvciAoaiA9IDAsIHByZXZfdyA9IDA7IGogPCBudW1fdGlsZV9j b2xzOyBqKyspIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRtcCA9IChqICsgMSkgKiBw aWNfd2lkdGhfaW5fY3RicyAvIG51bV90aWxlX2NvbHM7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAqcCsrID0gdG1wIC0gcHJldl93Owo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKnAr KyA9IGg7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoaiA9PSAwICYmCj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHBwcy0+Y29sdW1uX3dpZHRoX21pbnVzMVswXSAr IDEpID09IDEgJiYKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjdGJfc2l6ZSA9 PSAxNikKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBub19jaHJv bWEgPSAxOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJldl93ID0gdG1wOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB9Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgfQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gPiArwqDCoMKg wqDCoMKgwqB9IGVsc2Ugewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFu dHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbnVtX3RpbGVfcm93cywgMSk7Cj4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19udW1fdGls ZV9jb2xzLCAxKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg LyogVGhlcmUncyBvbmUgdGlsZSwgd2l0aCBkaW1lbnNpb25zIGVxdWFsIHRvIHBpYyBzaXplLiAq Lwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcFswXSA9IHBpY193aWR0aF9p bl9jdGJzOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcFsxXSA9IHBpY19o ZWlnaHRfaW5fY3RiczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiArCj4gPiA+ICvCoMKg wqDCoMKgwqDCoGlmIChub19jaHJvbWEpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB2cHVfZGVidWcoMSwgIiVzOiBubyBjaHJvbWEhXG4iLCBfX2Z1bmNfXyk7Cj4gPiA+ICt9 Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyB2b2lkIHNldF9wYXJhbXMoc3RydWN0IGhhbnRyb19jdHgg KmN0eCkKPiA+ID4gK3sKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IGhhbnRyb19o ZXZjX2RlY19jdHJscyAqY3RybHMgPSAmY3R4LT5oZXZjX2RlYy5jdHJsczsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3NwcyAqc3BzID0gY3RybHMtPnNw czsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3BwcyAq cHBzID0gY3RybHMtPnBwczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJf Y3RybF9oZXZjX2RlY29kZV9wYXJhbXMgKmRlY29kZV9wYXJhbXMgPSBjdHJscy0+ZGVjb2RlX3Bh cmFtczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGhhbnRyb19kZXYgKnZwdSA9IGN0eC0+ ZGV2Owo+ID4gPiArwqDCoMKgwqDCoMKgwqB1MzIgbWluX2xvZzJfY2Jfc2l6ZSwgbWF4X2xvZzJf Y3RiX3NpemUsIG1pbl9jYl9zaXplLCBtYXhfY3RiX3NpemU7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oHUzMiBwaWNfd2lkdGhfaW5fbWluX2NicywgcGljX2hlaWdodF9pbl9taW5fY2JzOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqB1MzIgcGljX3dpZHRoX2FsaWduZWQsIHBpY19oZWlnaHRfYWxpZ25lZDsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgdTMyIHBhcnRpYWxfY3RiX3gsIHBhcnRpYWxfY3RiX3k7Cj4g PiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfYml0 X2RlcHRoX3lfbWludXM4LCBzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCk7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2JpdF9kZXB0aF9jX21pbnVzOCwg c3BzLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfb3V0cHV0XzhfYml0cywgMCk7Cj4gPiA+ICsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfaGRyX3NraXBf bGVuZ3RoLCBjdHJscy0+aGV2Y19oZHJfc2tpcF9sZW5ndGgpOwo+ID4gPiArCj4gPiA+ICvCoMKg wqDCoMKgwqDCoG1pbl9sb2cyX2NiX3NpemUgPSBzcHMtPmxvZzJfbWluX2x1bWFfY29kaW5nX2Js b2NrX3NpemVfbWludXMzICsgMzsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgbWF4X2xvZzJfY3RiX3Np emUgPSBtaW5fbG9nMl9jYl9zaXplICsgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGlu Z19ibG9ja19zaXplOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3Jp dGUodnB1LCBoZXZjX21pbl9jYl9zaXplLCBtaW5fbG9nMl9jYl9zaXplKTsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbWF4X2NiX3NpemUsIG1heF9sb2cy X2N0Yl9zaXplKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBtaW5fY2Jfc2l6ZSA9IDEg PDwgbWluX2xvZzJfY2Jfc2l6ZTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgbWF4X2N0Yl9zaXplID0g MSA8PCBtYXhfbG9nMl9jdGJfc2l6ZTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBwaWNf d2lkdGhfaW5fbWluX2NicyA9IHNwcy0+cGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcyAvIG1pbl9j Yl9zaXplOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBwaWNfaGVpZ2h0X2luX21pbl9jYnMgPSBzcHMt PnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzIC8gbWluX2NiX3NpemU7Cj4gPiA+ICvCoMKgwqDC oMKgwqDCoHBpY193aWR0aF9hbGlnbmVkID0gQUxJR04oc3BzLT5waWNfd2lkdGhfaW5fbHVtYV9z YW1wbGVzLCBtYXhfY3RiX3NpemUpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBwaWNfaGVpZ2h0X2Fs aWduZWQgPSBBTElHTihzcHMtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzLCBtYXhfY3RiX3Np emUpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoHBhcnRpYWxfY3RiX3ggPSAhIShzcHMt PnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXMgIT0gcGljX3dpZHRoX2FsaWduZWQpOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqBwYXJ0aWFsX2N0Yl95ID0gISEoc3BzLT5waWNfaGVpZ2h0X2luX2x1bWFf c2FtcGxlcyAhPSBwaWNfaGVpZ2h0X2FsaWduZWQpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3BhcnRpYWxfY3RiX3gsIHBhcnRpYWxfY3Ri X3gpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19wYXJ0 aWFsX2N0Yl95LCBwYXJ0aWFsX2N0Yl95KTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBo YW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19waWNfd2lkdGhfaW5fY2JzLCBwaWNfd2lkdGhfaW5f bWluX2Nicyk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZj X3BpY19oZWlnaHRfaW5fY2JzLCBwaWNfaGVpZ2h0X2luX21pbl9jYnMpOwo+ID4gPiArCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3BpY193aWR0aF80eDQs Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChw aWNfd2lkdGhfaW5fbWluX2NicyAqIG1pbl9jYl9zaXplKSAvIDQpOwo+ID4gPiArwqDCoMKgwqDC oMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19waWNfaGVpZ2h0XzR4NCwKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHBpY19oZWlnaHRf aW5fbWluX2NicyAqIG1pbl9jYl9zaXplKSAvIDQpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX21heF9pbnRlcl9oaWVyZGVwdGgsCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNwcy0+bWF4 X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBo YW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19tYXhfaW50cmFfaGllcmRlcHRoLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcHMtPm1heF90cmFu c2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJv X3JlZ193cml0ZSh2cHUsIGhldmNfbWluX3RyYl9zaXplLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcHMtPmxvZzJfbWluX2x1bWFfdHJhbnNm b3JtX2Jsb2NrX3NpemVfbWludXMyICsgMik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19y ZWdfd3JpdGUodnB1LCBoZXZjX21heF90cmJfc2l6ZSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3BzLT5sb2cyX21pbl9sdW1hX3RyYW5zZm9y bV9ibG9ja19zaXplX21pbnVzMiArIDIgKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2x1bWFfdHJhbnNm b3JtX2Jsb2NrX3NpemUpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdf d3JpdGUodnB1LCBoZXZjX3RlbXBvcl9tdnBfZSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgISEoc3BzLT5mbGFncyAmIFY0TDJfSEVWQ19TUFNf RkxBR19TUFNfVEVNUE9SQUxfTVZQX0VOQUJMRUQpICYmCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICEoZGVjb2RlX3BhcmFtcy0+ZmxhZ3MgJiBW NEwyX0hFVkNfREVDT0RFX1BBUkFNX0ZMQUdfSURSX1BJQykpOwo+ID4gPiArwqDCoMKgwqDCoMKg wqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19zdHJvbmdfc21vb3RoX2UsCj4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICEhKHNwcy0+ZmxhZ3Mg JiBWNEwyX0hFVkNfU1BTX0ZMQUdfU1RST05HX0lOVFJBX1NNT09USElOR19FTkFCTEVEKSk7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2FzeW1fcHJlZF9l LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAh IShzcHMtPmZsYWdzICYgVjRMMl9IRVZDX1NQU19GTEFHX0FNUF9FTkFCTEVEKSk7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3Nhb19lLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShzcHMtPmZsYWdz ICYgVjRMMl9IRVZDX1NQU19GTEFHX1NBTVBMRV9BREFQVElWRV9PRkZTRVQpKTsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfc2lnbl9kYXRhX2hpZGUsCj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICEhKHBw cy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfU0lHTl9EQVRBX0hJRElOR19FTkFCTEVEKSk7 Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNf UFBTX0ZMQUdfQ1VfUVBfREVMVEFfRU5BQkxFRCkgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfY3VfcXBkX2UsIDEpOwo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhl dmNfbWF4X2N1X3FwZF9kZXB0aCwgcHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoKTsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgfSBlbHNlIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2N1X3FwZF9lLCAwKTsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX21heF9j dV9xcGRfZGVwdGgsIDApOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfUFBTX1NMSUNF X0NIUk9NQV9RUF9PRkZTRVRTX1BSRVNFTlQpIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2NiX3FwX29mZnNldCwgcHBzLT5w cHNfY2JfcXBfb2Zmc2V0KTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhh bnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2NyX3FwX29mZnNldCwgcHBzLT5wcHNfY3JfcXBfb2Zm c2V0KTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfSBlbHNlIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2NiX3FwX29mZnNldCwg MCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRl KHZwdSwgaGV2Y19jcl9xcF9vZmZzZXQsIDApOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfZmlsdF9v ZmZzZXRfYmV0YSwgcHBzLT5wcHNfYmV0YV9vZmZzZXRfZGl2Mik7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2ZpbHRfb2Zmc2V0X3RjLCBwcHMtPnBwc190 Y19vZmZzZXRfZGl2Mik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1 LCBoZXZjX3NsaWNlX2hkcl9leHRfZSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19T TElDRV9TRUdNRU5UX0hFQURFUl9FWFRFTlNJT05fUFJFU0VOVCkpOwo+ID4gPiArwqDCoMKgwqDC oMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19zbGljZV9oZHJfZXh0X2JpdHMsIHBwcy0+ bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJv X3JlZ193cml0ZSh2cHUsIGhldmNfc2xpY2VfY2hxcF9wcmVzZW50LAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRM Ml9IRVZDX1BQU19GTEFHX1BQU19TTElDRV9DSFJPTUFfUVBfT0ZGU0VUU19QUkVTRU5UKSk7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3dlaWdodF9iaXBy X2lkYywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19XRUlHSFRFRF9CSVBSRUQpKTsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfdHJhbnNxX2J5 cGFzcywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19UUkFOU1FVQU5UX0JZUEFTU19F TkFCTEVEKSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZj X2xpc3RfbW9kX2UsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfTElTVFNfTU9ESUZJ Q0FUSU9OX1BSRVNFTlQpKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2 cHUsIGhldmNfZW50cm9weV9zeW5jX2UsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdf RU5UUk9QWV9DT0RJTkdfU1lOQ19FTkFCTEVEKSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRy b19yZWdfd3JpdGUodnB1LCBoZXZjX2NhYmFjX2luaXRfcHJlc2VudCwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgISEocHBzLT5mbGFncyAmIFY0 TDJfSEVWQ19QUFNfRkxBR19DQUJBQ19JTklUX1BSRVNFTlQpKTsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfaWRyX3BpY19lLAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShkZWNvZGVfcGFyYW1zLT5m bGFncyAmIFY0TDJfSEVWQ19ERUNPREVfUEFSQU1fRkxBR19JUkFQX1BJQykpOwo+ID4gPiArwqDC oMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19wYXJhbGxlbF9tZXJnZSwKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHBzLT5s b2cyX3BhcmFsbGVsX21lcmdlX2xldmVsX21pbnVzMiArIDIpOwo+ID4gPiArwqDCoMKgwqDCoMKg wqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19wY21fZmlsdF9kLAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShzcHMtPmZsYWdzICYgVjRM Ml9IRVZDX1NQU19GTEFHX1BDTV9MT09QX0ZJTFRFUl9ESVNBQkxFRCkpOwo+ID4gPiArwqDCoMKg wqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19wY21fZSwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgISEoc3BzLT5mbGFncyAmIFY0 TDJfSEVWQ19TUFNfRkxBR19QQ01fRU5BQkxFRCkpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBpZiAo c3BzLT5mbGFncyAmIFY0TDJfSEVWQ19TUFNfRkxBR19QQ01fRU5BQkxFRCkgewo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbWF4 X3BjbV9zaXplLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9wY21fbHVtYV9j b2RpbmdfYmxvY2tfc2l6ZSArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcHMtPmxvZzJfbWluX3BjbV9sdW1hX2Nv ZGluZ19ibG9ja19zaXplX21pbnVzMyArIDMpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbWluX3BjbV9zaXplLAo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc3BzLT5sb2cyX21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgKyAz KTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUo dnB1LCBoZXZjX2JpdF9kZXB0aF9wY21feSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNwcy0+cGNtX3NhbXBsZV9i aXRfZGVwdGhfbHVtYV9taW51czEgKyAxKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2JpdF9kZXB0aF9wY21fYywKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHNwcy0+cGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hX21pbnVzMSArIDEpOwo+ID4g PiArwqDCoMKgwqDCoMKgwqB9IGVsc2Ugewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbWF4X3BjbV9zaXplLCAwKTsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZj X21pbl9wY21fc2l6ZSwgMCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBo YW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19iaXRfZGVwdGhfcGNtX3ksIDApOwo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfYml0 X2RlcHRoX3BjbV9jLCAwKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiArCj4gPiA+ICvC oMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3N0YXJ0X2NvZGVfZSwgMSk7 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2luaXRfcXAs IHBwcy0+aW5pdF9xcF9taW51czI2ICsgMjYpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9f cmVnX3dyaXRlKHZwdSwgaGV2Y193ZWlnaHRfcHJlZF9lLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRMMl9IRVZD X1BQU19GTEFHX1dFSUdIVEVEX1BSRUQpKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3Jl Z193cml0ZSh2cHUsIGhldmNfY2FiYWNfaW5pdF9wcmVzZW50LAo+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRMMl9I RVZDX1BQU19GTEFHX0NBQkFDX0lOSVRfUFJFU0VOVCkpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBo YW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19jb25zdF9pbnRyYV9lLAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRM Ml9IRVZDX1BQU19GTEFHX0NPTlNUUkFJTkVEX0lOVFJBX1BSRUQpKTsKPiA+ID4gK8KgwqDCoMKg wqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfdHJhbnNmb3JtX3NraXAsCj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICEhKHBwcy0+Zmxh Z3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfVFJBTlNGT1JNX1NLSVBfRU5BQkxFRCkpOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19vdXRfZmlsdGVyaW5nX2Rp cywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19QUFNfRElTQUJMRV9ERUJMT0NLSU5H X0ZJTFRFUikpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2 Y19maWx0X2N0cmxfcHJlcywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19ERUJMT0NL SU5HX0ZJTFRFUl9DT05UUk9MX1BSRVNFTlQpKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJv X3JlZ193cml0ZSh2cHUsIGhldmNfZGVwZW5kZW50X3NsaWNlLAo+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRMMl9I RVZDX1BQU19GTEFHX0RFUEVOREVOVF9TTElDRV9TRUdNRU5UKSk7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2ZpbHRlcl9vdmVycmlkZSwKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgISEocHBzLT5mbGFn cyAmIFY0TDJfSEVWQ19QUFNfRkxBR19ERUJMT0NLSU5HX0ZJTFRFUl9PVkVSUklERV9FTkFCTEVE KSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3JlZmlk eDBfYWN0aXZlLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwcHMtPm51bV9yZWZfaWR4X2wwX2RlZmF1bHRfYWN0aXZlX21pbnVzMSArIDEpOwo+ ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19yZWZpZHgxX2Fj dGl2ZSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcHBzLT5udW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZV9taW51czEgKyAxKTsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfYXBmX3RocmVzaG9sZCwg OCk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBpbnQgZmluZF9yZWZfcGljX2luZGV4 KGNvbnN0IHN0cnVjdCB2NGwyX2hldmNfZHBiX2VudHJ5ICpkcGIsIGludCBwaWNfb3JkZXJfY250 KQo+ID4gPiArewo+ID4gPiArwqDCoMKgwqDCoMKgwqBpbnQgaTsKPiA+ID4gKwo+ID4gPiArwqDC oMKgwqDCoMKgwqBmb3IgKGkgPSAwOyBpIDwgVjRMMl9IRVZDX0RQQl9FTlRSSUVTX05VTV9NQVg7 IGkrKykgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGRwYltpXS5w aWNfb3JkZXJfY250WzBdID09IHBpY19vcmRlcl9jbnQpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIGk7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoH0KPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gMHgwOwo+ID4gPiArfQo+ ID4gPiArCj4gPiA+ICtzdGF0aWMgdm9pZCBzZXRfcmVmX3BpY19saXN0KHN0cnVjdCBoYW50cm9f Y3R4ICpjdHgpCj4gPiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGNvbnN0IHN0cnVjdCBoYW50 cm9faGV2Y19kZWNfY3RybHMgKmN0cmxzID0gJmN0eC0+aGV2Y19kZWMuY3RybHM7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBjdHgtPmRldjsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX2RlY29kZV9wYXJhbXMgKmRl Y29kZV9wYXJhbXMgPSBjdHJscy0+ZGVjb2RlX3BhcmFtczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg Y29uc3Qgc3RydWN0IHY0bDJfaGV2Y19kcGJfZW50cnkgKmRwYiA9IGRlY29kZV9wYXJhbXMtPmRw YjsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgdTMyIGxpc3QwW1Y0TDJfSEVWQ19EUEJfRU5UUklFU19O VU1fTUFYXSA9IHswfTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgdTMyIGxpc3QxW1Y0TDJfSEVWQ19E UEJfRU5UUklFU19OVU1fTUFYXSA9IHswfTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3Ry dWN0IGhhbnRyb19yZWcgKnJlZl9waWNfcmVnczBbXSA9IHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfZjAsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBoZXZjX3JsaXN0X2YxLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaGV2Y19ybGlzdF9mMiwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGhldmNfcmxpc3RfZjMsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZj X3JsaXN0X2Y0LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlz dF9mNSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfZjYs Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2Y3LAo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9mOCwKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfZjksCj4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2YxMCwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfZjExLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9mMTIsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBoZXZjX3JsaXN0X2YxMywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGhldmNfcmxpc3RfZjE0LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaGV2Y19ybGlzdF9mMTUsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoH07Cj4gPiA+ICvCoMKgwqDC oMKgwqDCoGNvbnN0IHN0cnVjdCBoYW50cm9fcmVnICpyZWZfcGljX3JlZ3MxW10gPSB7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2IwLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9iMSwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfYjIsCj4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2IzLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9iNCwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGhldmNfcmxpc3RfYjUsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBoZXZjX3JsaXN0X2I2LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2 Y19ybGlzdF9iNywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxp c3RfYjgsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2I5 LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9iMTAsCj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2IxMSwKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfYjEyLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9iMTMsCj4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2IxNCwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfYjE1LAo+ID4gPiArwqDCoMKgwqDCoMKgwqB9 Owo+ID4gPiArwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgaSwgajsKPiA+ID4gKwo+ID4gPiAr wqDCoMKgwqDCoMKgwqAvKiBMaXN0IDAgY29udGFpbnM6IHNob3J0IHRlcm0gYmVmb3JlLCBzaG9y dCB0ZXJtIGFmdGVyIGFuZCBsb25nIHRlcm0gKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgaiA9IDA7 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBkZWNvZGVfcGFyYW1zLT5udW1f cG9jX3N0X2N1cnJfYmVmb3JlICYmIGogPCBBUlJBWV9TSVpFKGxpc3QwKTsgaSsrKQo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGlzdDBbaisrXSA9IGZpbmRfcmVmX3BpY19p bmRleChkcGIsIGRlY29kZV9wYXJhbXMtPnBvY19zdF9jdXJyX2JlZm9yZVtpXSk7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBkZWNvZGVfcGFyYW1zLT5udW1fcG9jX3N0X2N1 cnJfYWZ0ZXIgJiYgaiA8IEFSUkFZX1NJWkUobGlzdDApOyBpKyspCj4gPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0MFtqKytdID0gZmluZF9yZWZfcGljX2luZGV4KGRwYiwg ZGVjb2RlX3BhcmFtcy0+cG9jX3N0X2N1cnJfYWZ0ZXJbaV0pOwo+ID4gPiArwqDCoMKgwqDCoMKg wqBmb3IgKGkgPSAwOyBpIDwgZGVjb2RlX3BhcmFtcy0+bnVtX3BvY19sdF9jdXJyICYmIGogPCBB UlJBWV9TSVpFKGxpc3QwKTsgaSsrKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgbGlzdDBbaisrXSA9IGZpbmRfcmVmX3BpY19pbmRleChkcGIsIGRlY29kZV9wYXJhbXMtPnBv Y19sdF9jdXJyW2ldKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqAvKiBGaWxsIHRoZSBs aXN0LCBjb3B5aW5nIG92ZXIgYW5kIG92ZXIgKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgaSA9IDA7 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHdoaWxlIChqIDwgQVJSQVlfU0laRShsaXN0MCkpCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0MFtqKytdID0gbGlzdDBbaSsrXTsK PiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBqID0gMDsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg Zm9yIChpID0gMDsgaSA8IGRlY29kZV9wYXJhbXMtPm51bV9wb2Nfc3RfY3Vycl9hZnRlciAmJiBq IDwgQVJSQVlfU0laRShsaXN0MSk7IGkrKykKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGxpc3QxW2orK10gPSBmaW5kX3JlZl9waWNfaW5kZXgoZHBiLCBkZWNvZGVfcGFyYW1z LT5wb2Nfc3RfY3Vycl9hZnRlcltpXSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7 IGkgPCBkZWNvZGVfcGFyYW1zLT5udW1fcG9jX3N0X2N1cnJfYmVmb3JlICYmIGogPCBBUlJBWV9T SVpFKGxpc3QxKTsgaSsrKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGlz dDFbaisrXSA9IGZpbmRfcmVmX3BpY19pbmRleChkcGIsIGRlY29kZV9wYXJhbXMtPnBvY19zdF9j dXJyX2JlZm9yZVtpXSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBkZWNv ZGVfcGFyYW1zLT5udW1fcG9jX2x0X2N1cnIgJiYgaiA8IEFSUkFZX1NJWkUobGlzdDEpOyBpKysp Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0MVtqKytdID0gZmluZF9y ZWZfcGljX2luZGV4KGRwYiwgZGVjb2RlX3BhcmFtcy0+cG9jX2x0X2N1cnJbaV0pOwo+ID4gPiAr Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGkgPSAwOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB3aGlsZSAo aiA8IEFSUkFZX1NJWkUobGlzdDEpKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgbGlzdDFbaisrXSA9IGxpc3QxW2krK107Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg Zm9yIChpID0gMDsgaSA8IFY0TDJfSEVWQ19EUEJfRU5UUklFU19OVU1fTUFYOyBpKyspIHsKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBy ZWZfcGljX3JlZ3MwW2ldLCBsaXN0MFtpXSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgcmVmX3BpY19yZWdzMVtpXSwgbGlzdDFbaV0p Owo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBp bnQgc2V0X3JlZihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+ID4gPiArewo+ID4gPiArwqDCoMKg wqDCoMKgwqBjb25zdCBzdHJ1Y3QgaGFudHJvX2hldmNfZGVjX2N0cmxzICpjdHJscyA9ICZjdHgt PmhldmNfZGVjLmN0cmxzOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBjb25zdCBzdHJ1Y3QgdjRsMl9j dHJsX2hldmNfc3BzICpzcHMgPSBjdHJscy0+c3BzOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBjb25z dCBzdHJ1Y3QgdjRsMl9jdHJsX2hldmNfcHBzICpwcHMgPSBjdHJscy0+cHBzOwo+ID4gPiArwqDC oMKgwqDCoMKgwqBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2hldmNfZGVjb2RlX3BhcmFtcyAqZGVj b2RlX3BhcmFtcyA9IGN0cmxzLT5kZWNvZGVfcGFyYW1zOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBj b25zdCBzdHJ1Y3QgdjRsMl9oZXZjX2RwYl9lbnRyeSAqZHBiID0gZGVjb2RlX3BhcmFtcy0+ZHBi Owo+ID4gPiArwqDCoMKgwqDCoMKgwqBkbWFfYWRkcl90IGx1bWFfYWRkciwgY2hyb21hX2FkZHIs IG12X2FkZHIgPSAwOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaGFudHJvX2RldiAqdnB1 ID0gY3R4LT5kZXY7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNpemVfdCBjcl9vZmZzZXQgPSBoYW50 cm9faGV2Y19jaHJvbWFfb2Zmc2V0KHNwcyk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNpemVfdCBt dl9vZmZzZXQgPSBoYW50cm9faGV2Y19tb3Rpb25fdmVjdG9yc19vZmZzZXQoc3BzKTsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgdTMyIG1heF9yZWZfZnJhbWVzOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB1 MTYgZHBiX2xvbmd0ZXJtX2U7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3Ry dWN0IGhhbnRyb19yZWcgKmN1cl9wb2NbXSA9IHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGhldmNfY3VyX3BvY18wMCwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGhldmNfY3VyX3BvY18wMSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGhldmNfY3VyX3BvY18wMiwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGhldmNfY3VyX3BvY18wMywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhl dmNfY3VyX3BvY18wNCwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNf Y3VyX3BvY18wNSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3Vy X3BvY18wNiwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3Bv Y18wNywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18w OCwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18wOSwK PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xMCwKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xMSwKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xMiwKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xMywKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xNCwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xNSwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgfTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgdW5zaWduZWQgaW50IGk7Cj4gPiA+ICsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgbWF4X3JlZl9mcmFtZXMgPSBkZWNvZGVfcGFyYW1zLT5udW1fcG9jX2x0 X2N1cnIgKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZGVjb2RlX3BhcmFt cy0+bnVtX3BvY19zdF9jdXJyX2JlZm9yZSArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBkZWNvZGVfcGFyYW1zLT5udW1fcG9jX3N0X2N1cnJfYWZ0ZXI7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoC8qCj4gPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFNldCBtYXhfcmVmX2ZyYW1lcyB0 byBub24temVybyB0byBhdm9pZCBIVyBoYW5nIHdoZW4gZGVjb2RpbmcKPiA+ID4gK8KgwqDCoMKg wqDCoMKgICogYmFkbHkgbWFya2VkIEktZnJhbWVzLgo+ID4gPiArwqDCoMKgwqDCoMKgwqAgKi8K PiA+ID4gK8KgwqDCoMKgwqDCoMKgbWF4X3JlZl9mcmFtZXMgPSBtYXhfcmVmX2ZyYW1lcyA/IG1h eF9yZWZfZnJhbWVzIDogMTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2 cHUsIGhldmNfbnVtX3JlZl9mcmFtZXMsIG1heF9yZWZfZnJhbWVzKTsKPiA+ID4gK8KgwqDCoMKg wqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfZmlsdGVyX292ZXJfc2xpY2VzLAo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMt PmZsYWdzICYgVjRMMl9IRVZDX1BQU19GTEFHX1BQU19MT09QX0ZJTFRFUl9BQ1JPU1NfU0xJQ0VT X0VOQUJMRUQpKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhl dmNfZmlsdGVyX292ZXJfdGlsZXMsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfTE9P UF9GSUxURVJfQUNST1NTX1RJTEVTX0VOQUJMRUQpKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDC oMKgwqAvKgo+ID4gPiArwqDCoMKgwqDCoMKgwqAgKiBXcml0ZSBQT0MgY291bnQgZGlmZiBmcm9t IGN1cnJlbnQgcGljLiBGb3IgZnJhbWUgZGVjb2Rpbmcgb25seSBjb21wdXRlCj4gPiA+ICvCoMKg wqDCoMKgwqDCoCAqIHBpY19vcmRlcl9jbnRbMF0gYW5kIGlnbm9yZSBwaWNfb3JkZXJfY250WzFd IHVzZWQgaW4gZmllbGQtY29kaW5nLgo+ID4gPiArwqDCoMKgwqDCoMKgwqAgKi8KPiA+ID4gK8Kg wqDCoMKgwqDCoMKgZm9yIChpID0gMDsgaSA8IGRlY29kZV9wYXJhbXMtPm51bV9hY3RpdmVfZHBi X2VudHJpZXMgJiYgaSA8IEFSUkFZX1NJWkUoY3VyX3BvYyk7IGkrKykgewo+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hhciBwb2NfZGlmZiA9IGRlY29kZV9wYXJhbXMtPnBp Y19vcmRlcl9jbnRfdmFsIC0gZHBiW2ldLnBpY19vcmRlcl9jbnRbMF07Cj4gPiA+ICsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBjdXJf cG9jW2ldLCBwb2NfZGlmZik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ID4gKwo+ID4gPiAr wqDCoMKgwqDCoMKgwqBpZiAoaSA8IEFSUkFZX1NJWkUoY3VyX3BvYykpIHsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKiBBZnRlciB0aGUgcmVmZXJlbmNlcywgZmlsbCBvbmUgZW50cnkgcG9pbnRpbmcg dG8gaXRzZWxmLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogaS5lLiBk aWZmZXJlbmNlIGlzIHplcm8uCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Ki8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUo dnB1LCBjdXJfcG9jW2ldLCAwKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGkrKzsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDC oC8qIEZpbGwgdGhlIHJlc3Qgd2l0aCB0aGUgY3VycmVudCBwaWN0dXJlICovCj4gPiA+ICvCoMKg wqDCoMKgwqDCoGZvciAoOyBpIDwgQVJSQVlfU0laRShjdXJfcG9jKTsgaSsrKQo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGN1cl9wb2Nb aV0sIGRlY29kZV9wYXJhbXMtPnBpY19vcmRlcl9jbnRfdmFsKTsKPiA+ID4gKwo+ID4gPiArwqDC oMKgwqDCoMKgwqBzZXRfcmVmX3BpY19saXN0KGN0eCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKg wqDCoMKgLyogV2Ugd2lsbCBvbmx5IGtlZXAgdGhlIHJlZmVyZW5jZXMgcGljdHVyZSB0aGF0IGFy ZSBzdGlsbCB1c2VkICovCj4gPiA+ICvCoMKgwqDCoMKgwqDCoGN0eC0+aGV2Y19kZWMucmVmX2J1 ZnNfdXNlZCA9IDA7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogU2V0IHVwIGFkZHJl c3NlcyBvZiBEUEIgYnVmZmVycyAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqBkcGJfbG9uZ3Rlcm1f ZSA9IDA7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBkZWNvZGVfcGFyYW1z LT5udW1fYWN0aXZlX2RwYl9lbnRyaWVzICYmCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGkgPCAoVjRMMl9IRVZDX0RQQl9FTlRSSUVTX05VTV9NQVggLSAxKTsgaSsrKSB7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsdW1hX2FkZHIgPSBoYW50cm9faGV2Y19nZXRf cmVmX2J1ZihjdHgsIGRwYltpXS5waWNfb3JkZXJfY250WzBdKTsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmICghbHVtYV9hZGRyKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PTUVNOwo+ID4gPiArCj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaHJvbWFfYWRkciA9IGx1bWFfYWRk ciArIGNyX29mZnNldDsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG12X2Fk ZHIgPSBsdW1hX2FkZHIgKyBtdl9vZmZzZXQ7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIChkcGJbaV0ucnBzID09IFY0TDJfSEVWQ19EUEJfRU5UUllfUlBT X0xUX0NVUlIpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZHBiX2xvbmd0ZXJtX2UgfD0gQklUKFY0TDJfSEVWQ19EUEJfRU5UUklFU19OVU1fTUFY IC0gMSAtIGkpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBo YW50cm9fd3JpdGVfYWRkcih2cHUsIEhFVkNfUkVHX0FERFJfUkVGKGkpLCBsdW1hX2FkZHIpOwo+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1 LCBIRVZDX1JFR19DSFJfUkVGKGkpLCBjaHJvbWFfYWRkcik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBoYW50cm9fd3JpdGVfYWRkcih2cHUsIEhFVkNfUkVHX0RNVl9SRUYo aSksIG12X2FkZHIpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgbHVtYV9hZGRyID0gaGFudHJvX2hldmNfZ2V0X3JlZl9idWYoY3R4LCBkZWNvZGVf cGFyYW1zLT5waWNfb3JkZXJfY250X3ZhbCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmICghbHVt YV9hZGRyKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FTk9N RU07Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY2hyb21hX2FkZHIgPSBsdW1hX2FkZHIg KyBjcl9vZmZzZXQ7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoG12X2FkZHIgPSBsdW1hX2FkZHIgKyBt dl9vZmZzZXQ7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIo dnB1LCBIRVZDX1JFR19BRERSX1JFRihpKSwgbHVtYV9hZGRyKTsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBIRVZDX1JFR19DSFJfUkVGKGkpLCBjaHJvbWFfYWRk cik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19SRUdf RE1WX1JFRihpKyspLCBtdl9hZGRyKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50 cm9fd3JpdGVfYWRkcih2cHUsIEhFVkNfQUREUl9EU1QsIGx1bWFfYWRkcik7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19BRERSX0RTVF9DSFIsIGNocm9t YV9hZGRyKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBIRVZD X0FERFJfRFNUX01WLCBtdl9hZGRyKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50 cm9faGV2Y19yZWZfcmVtb3ZlX3VudXNlZChjdHgpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGZvciAoOyBpIDwgVjRMMl9IRVZDX0RQQl9FTlRSSUVTX05VTV9NQVg7IGkrKykgewo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBI RVZDX1JFR19BRERSX1JFRihpKSwgMCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBoYW50cm9fd3JpdGVfYWRkcih2cHUsIEhFVkNfUkVHX0NIUl9SRUYoaSksIDApOwo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBI RVZDX1JFR19ETVZfUkVGKGkpLCAwKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiArCj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3JlZmVyX2x0ZXJt X2UsIGRwYl9sb25ndGVybV9lKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4g MDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIHZvaWQgc2V0X2J1ZmZlcnMoc3RydWN0 IGhhbnRyb19jdHggKmN0eCkKPiA+ID4gK3sKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHZi Ml92NGwyX2J1ZmZlciAqc3JjX2J1ZiwgKmRzdF9idWY7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0 cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBjdHgtPmRldjsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29u c3Qgc3RydWN0IGhhbnRyb19oZXZjX2RlY19jdHJscyAqY3RybHMgPSAmY3R4LT5oZXZjX2RlYy5j dHJsczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3Nw cyAqc3BzID0gY3RybHMtPnNwczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc2l6ZV90IGNyX29mZnNl dCA9IGhhbnRyb19oZXZjX2Nocm9tYV9vZmZzZXQoc3BzKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg ZG1hX2FkZHJfdCBzcmNfZG1hLCBkc3RfZG1hOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB1MzIgc3Jj X2xlbiwgc3JjX2J1Zl9sZW47Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3JjX2J1ZiA9 IGhhbnRyb19nZXRfc3JjX2J1ZihjdHgpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBkc3RfYnVmID0g aGFudHJvX2dldF9kc3RfYnVmKGN0eCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyog U291cmNlIChzdHJlYW0pIGJ1ZmZlci4gKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3JjX2RtYSA9 IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKCZzcmNfYnVmLT52YjJfYnVmLCAwKTsKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgc3JjX2xlbiA9IHZiMl9nZXRfcGxhbmVfcGF5bG9hZCgmc3JjX2J1 Zi0+dmIyX2J1ZiwgMCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNyY19idWZfbGVuID0gdmIyX3Bs YW5lX3NpemUoJnNyY19idWYtPnZiMl9idWYsIDApOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19BRERSX1NUUiwgc3JjX2RtYSk7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3N0cmVhbV9sZW4sIHNy Y19sZW4pOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19z dHJtX2J1ZmZlcl9sZW4sIHNyY19idWZfbGVuKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJv X3JlZ193cml0ZSh2cHUsIGhldmNfc3RybV9zdGFydF9vZmZzZXQsIDApOwo+ID4gPiArwqDCoMKg wqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y193cml0ZV9tdnNfZSwgMSk7Cj4gPiA+ ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogRGVzdGluYXRpb24gKGRlY29kZWQgZnJhbWUpIGJ1 ZmZlci4gKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgZHN0X2RtYSA9IGhhbnRyb19nZXRfZGVjX2J1 Zl9hZGRyKGN0eCwgJmRzdF9idWYtPnZiMl9idWYpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19SQVNURVJfU0NBTiwgZHN0X2RtYSk7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19SQVNURVJfU0NB Tl9DSFIsIGRzdF9kbWEgKyBjcl9vZmZzZXQpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9f d3JpdGVfYWRkcih2cHUsIEhFVkNfQUREUl9USUxFX1NJWkUsIGN0eC0+aGV2Y19kZWMudGlsZV9z aXplcy5kbWEpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fd3JpdGVfYWRkcih2cHUsIEhF VkNfVElMRV9GSUxURVIsIGN0eC0+aGV2Y19kZWMudGlsZV9maWx0ZXIuZG1hKTsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBIRVZDX1RJTEVfU0FPLCBjdHgtPmhl dmNfZGVjLnRpbGVfc2FvLmRtYSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb193cml0ZV9h ZGRyKHZwdSwgSEVWQ19USUxFX0JTRCwgY3R4LT5oZXZjX2RlYy50aWxlX2JzZC5kbWEpOwo+ID4g PiArfQo+ID4gPiArCj4gPiA+ICt2b2lkIGhhbnRyb19nMl9jaGVja19pZGxlKHN0cnVjdCBoYW50 cm9fZGV2ICp2cHUpCj4gPiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGludCBpOwo+ID4gPiAr Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUzMiBzdGF0dXM7Cj4gPiA+ICsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIE1ha2Ugc3VyZSB0aGUgVlBVIGlzIGlkbGUg Ki8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YXR1cyA9IHZkcHVfcmVh ZCh2cHUsIEhFVkNfUkVHX0lOVEVSUlVQVCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAoc3RhdHVzICYgSEVWQ19SRUdfSU5URVJSVVBUX0RFQ19FKSB7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJfd2FybigiJXM6 IHN0aWxsIGVuYWJsZWQhISEgcmVzZXR0aW5nLlxuIiwgX19mdW5jX18pOwo+ID4gSG93IGFib3V0 IHdlIGNsZWFuIHRoaXMgcHJfd2FybjogdXNlIGVpdGhlciB2NGwyX3dhcm4gb3IgZGV2X3dhcm4g YW5kIG1ha2UKPiA+IHRoZSB3YXJuaW5nICJkZXZpY2Ugc3RpbGwgcnVubmluZywgYWJvcnRpbmci IChJIHBlcnNvbmFsbHkgZGlzbGlrZSB0aGUgYWJvcnQKPiA+IG1ldGFwaG9yLCBidXQgZ3Vlc3Mg aXQncyBPSyBoZXJlKS4KPiAKPiBPawo+IAo+ID4gCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RhdHVzIHw9IEhFVkNfUkVHX0lOVEVSUlVQVF9E RUNfQUJPUlRfRSB8IEhFVkNfUkVHX0lOVEVSUlVQVF9ERUNfSVJRX0RJUzsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2ZHB1X3dyaXRlKHZwdSwg c3RhdHVzLCBIRVZDX1JFR19JTlRFUlJVUFQpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgfQo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4g K2ludCBoYW50cm9fZzJfaGV2Y19kZWNfcnVuKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gPiA+ ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBjdHgtPmRl djsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaW50IHJldDsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDC oMKgwqBoYW50cm9fZzJfY2hlY2tfaWRsZSh2cHUpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoC8qIFByZXBhcmUgSEVWQyBkZWNvZGVyIGNvbnRleHQuICovCj4gPiA+ICvCoMKgwqDCoMKg wqDCoHJldCA9IGhhbnRyb19oZXZjX2RlY19wcmVwYXJlX3J1bihjdHgpOwo+ID4gPiArwqDCoMKg wqDCoMKgwqBpZiAocmV0KQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 dXJuIHJldDsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqAvKiBDb25maWd1cmUgaGFyZHdh cmUgcmVnaXN0ZXJzLiAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqBzZXRfcGFyYW1zKGN0eCk7Cj4g PiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogc2V0IHJlZmVyZW5jZSBwaWN0dXJlcyAqLwo+ ID4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBzZXRfcmVmKGN0eCk7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoGlmIChyZXQpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4g cmV0Owo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNldF9idWZmZXJzKGN0eCk7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoHByZXBhcmVfdGlsZV9pbmZvX2J1ZmZlcihjdHgpOwo+ID4gPiArCj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19lbmRfcHJlcGFyZV9ydW4oY3R4KTsKPiA+ID4gKwo+ ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19tb2RlLCBIRVZD X0RFQ19NT0RFKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhl dmNfY2xrX2dhdGVfZSwgMSk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogRG9uJ3Qg ZGlzYWJsZSBvdXRwdXQgKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2 cHUsIGhldmNfb3V0X2RpcywgMCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogRG9u J3QgY29tcHJlc3MgYnVmZmVycyAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dy aXRlKHZwdSwgaGV2Y19yZWZfY29tcHJlc3NfYnlwYXNzLCAxKTsKPiA+ID4gKwo+ID4gPiArwqDC oMKgwqDCoMKgwqAvKiB1c2UgTlYxMiBhcyBvdXRwdXQgZm9ybWF0ICovCj4gPiA+ICvCoMKgwqDC oMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX291dF9yc19lLCAxKTsKPiA+ID4gKwo+ ID4gPiArwqDCoMKgwqDCoMKgwqAvKiBCdXMgd2lkdGggYW5kIG1heCBidXJzdCAqLwo+ID4gPiAr wqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19idXN3aWR0aCwgQlVTX1dJ RFRIXzEyOCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZj X21heF9idXJzdCwgMTYpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoC8qIFN3YXAgKi8K PiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfc3RybV9zd2Fw LCAweGYpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19k aXJtdl9zd2FwLCAweGYpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZw dSwgaGV2Y19jb21wcmVzc19zd2FwLCAweGYpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDC oC8qIFN0YXJ0IGRlY29kaW5nISAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqB2ZHB1X3dyaXRlKHZw dSwgSEVWQ19SRUdfSU5URVJSVVBUX0RFQ19FLCBIRVZDX1JFR19JTlRFUlJVUFQpOwo+ID4gPiAr Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gPiArfQo+ID4gPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfcmVncy5oIGIvZHJpdmVy cy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfcmVncy5oCj4gPiA+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uYTM2MWM5YmE5MTFkCj4gPiA+IC0t LSAvZGV2L251bGwKPiA+ID4gKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50 cm9fZzJfcmVncy5oCj4gPiA+IEBAIC0wLDAgKzEsMTk4IEBACj4gPiA+ICsvKiBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCj4gPiA+ICsvKgo+ID4gPiArICogQ29weXJp Z2h0IChjKSAyMDIxLCBDb2xsYWJvcmEKPiA+ID4gKyAqCj4gPiA+ICsgKiBBdXRob3I6IEJlbmph bWluIEdhaWduYXJkIDxiZW5qYW1pbi5nYWlnbmFyZEBjb2xsYWJvcmEuY29tPgo+ID4gPiArICov Cj4gPiA+ICsKPiA+ID4gKyNpZm5kZWYgSEFOVFJPX0cyX1JFR1NfSF8KPiA+ID4gKyNkZWZpbmUg SEFOVFJPX0cyX1JFR1NfSF8KPiA+ID4gKwo+ID4gPiArI2luY2x1ZGUgImhhbnRyby5oIgo+ID4g PiArCj4gPiA+ICsjZGVmaW5lIEcyX1NXUkVHKG5yKcKgwqDCoCgobnIpICogNCkKPiA+ID4gKwo+ ID4gPiArI2RlZmluZSBIRVZDX0RFQ19SRUcobmFtZSwgYmFzZSwgc2hpZnQsIG1hc2spIFwKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgc3RhdGljIGNvbnN0IHN0cnVjdCBoYW50cm9fcmVnIF9oZXZjXyMj bmFtZVtdID0geyBcCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB7IEcyX1NX UkVHKGJhc2UpLCAoc2hpZnQpLCAobWFzaykgfSBcCj4gPiA+ICvCoMKgwqDCoMKgwqDCoH07IFwK PiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RhdGljIGNvbnN0IHN0cnVjdCBoYW50cm9fcmVnIF9fbWF5 YmVfdW51c2VkICpoZXZjXyMjbmFtZSA9ICZfaGV2Y18jI25hbWVbMF07Cj4gPiA+ICsKPiA+ID4g KyNkZWZpbmUgSEVWQ19SRUdfVkVSU0lPTsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEcy X1NXUkVHKDApCj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfSU5URVJSVVBUwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBHMl9TV1JFRygxKQo+ID4gPiArI2RlZmluZSBIRVZDX1JFR19J TlRFUlJVUFRfREVDX1JEWV9JTlTCoEJJVCgxMikKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfSU5U RVJSVVBUX0RFQ19BQk9SVF9FwqBCSVQoNSkKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfSU5URVJS VVBUX0RFQ19JUlFfRElTwqBCSVQoNCkKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfSU5URVJSVVBU X0RFQ19FwqDCoMKgwqDCoMKgwqBCSVQoMCkKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKHN0 cm1fc3dhcCzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDIsIDI4LMKgwqAweGYpCj4g PiA+ICtIRVZDX0RFQ19SRUcoZGlybXZfc3dhcCzCoMKgwqDCoMKgwqDCoDIsIDIwLMKgwqAweGYp Cj4gPiA+ICsKPiA+ID4gK0hFVkNfREVDX1JFRyhtb2RlLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgMywgMjcsIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcoY29tcHJlc3Nfc3dhcCzCoMKg wqDCoMKgIDMsIDIwLCAweGYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmVmX2NvbXByZXNzX2J5cGFz cywgMywgMTcsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhvdXRfcnNfZSzCoMKgwqDCoMKgwqDC oMKgwqDCoCAzLCAxNiwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKG91dF9kaXMswqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAzLCAxNSwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKG91dF9maWx0ZXJp bmdfZGlzLMKgwqAgMywgMTQsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyh3cml0ZV9tdnNfZSzC oMKgwqDCoMKgwqDCoCAzLCAxMiwgMHgxKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcocGlj X3dpZHRoX2luX2NicyzCoDQsIDE5LMKgwqAweDFmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhwaWNf aGVpZ2h0X2luX2NicyzCoMKgwqDCoMKgwqDCoMKgNCwgNizCoMKgwqAweDFmZikKPiA+ID4gK0hF VkNfREVDX1JFRyhudW1fcmVmX2ZyYW1lcyzCoMKgwqA0LCAwLMKgwqDCoDB4MWYpCj4gPiA+ICsK PiA+ID4gK0hFVkNfREVDX1JFRyhzY2FsaW5nX2xpc3RfZSzCoMKgwqA1LCAyNCzCoMKgMHgxKQo+ ID4gPiArSEVWQ19ERUNfUkVHKGNiX3FwX29mZnNldCzCoMKgwqDCoMKgNSwgMTkswqDCoDB4MWYp Cj4gPiA+ICtIRVZDX0RFQ19SRUcoY3JfcXBfb2Zmc2V0LMKgwqDCoMKgwqA1LCAxNCzCoMKgMHgx ZikKPiA+ID4gK0hFVkNfREVDX1JFRyhzaWduX2RhdGFfaGlkZSzCoMKgwqA1LCAxMizCoMKgMHgx KQo+ID4gPiArSEVWQ19ERUNfUkVHKHRlbXBvcl9tdnBfZSzCoMKgwqDCoMKgNSwgMTEswqDCoDB4 MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhtYXhfY3VfcXBkX2RlcHRoLMKgNSwgNSzCoMKgwqAweDNm KQo+ID4gPiArSEVWQ19ERUNfUkVHKGN1X3FwZF9lLMKgwqDCoMKgwqDCoMKgwqDCoDUsIDQswqDC oMKgMHgxKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcoc3RyZWFtX2xlbizCoMKgwqDCoMKg wqDCoDYsIDAswqDCoMKgMHhmZmZmZmZmZikKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKGNh YmFjX2luaXRfcHJlc2VudCwgNywgMzEsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyh3ZWlnaHRf cHJlZF9lLMKgwqDCoMKgIDcsIDI4LCAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcod2VpZ2h0X2Jp cHJfaWRjLMKgwqAgNywgMjYsIDB4MykKPiA+ID4gK0hFVkNfREVDX1JFRyhmaWx0ZXJfb3Zlcl9z bGljZXMsIDcsIDI1LCAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoZmlsdGVyX292ZXJfdGlsZXMs wqAgNywgMjQsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhhc3ltX3ByZWRfZSzCoMKgwqDCoMKg wqAgNywgMjMsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhzYW9fZSzCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgNywgMjIsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhwY21fZmlsdF9kLMKgwqDC oMKgwqDCoMKgIDcsIDIxLCAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoc2xpY2VfY2hxcF9wcmVz ZW50LCA3LCAyMCwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKGRlcGVuZGVudF9zbGljZSzCoMKg IDcsIDE5LCAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoZmlsdGVyX292ZXJyaWRlLMKgwqAgNywg MTgsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhzdHJvbmdfc21vb3RoX2UswqDCoCA3LCAxNywg MHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKGZpbHRfb2Zmc2V0X2JldGEswqAgNywgMTIsIDB4MWYp Cj4gPiA+ICtIRVZDX0RFQ19SRUcoZmlsdF9vZmZzZXRfdGMswqDCoMKgIDcsIDcswqAgMHgxZikK PiA+ID4gK0hFVkNfREVDX1JFRyhzbGljZV9oZHJfZXh0X2UswqDCoCA3LCA2LMKgwqAweDEpCj4g PiA+ICtIRVZDX0RFQ19SRUcoc2xpY2VfaGRyX2V4dF9iaXRzLCA3LCAzLMKgMHg3KQo+ID4gPiAr Cj4gPiA+ICtIRVZDX0RFQ19SRUcoY29uc3RfaW50cmFfZSzCoMKgwqDCoCA4LCAzMSwgMHgxKQo+ ID4gPiArSEVWQ19ERUNfUkVHKGZpbHRfY3RybF9wcmVzLMKgwqDCoCA4LCAzMCwgMHgxKQo+ID4g PiArSEVWQ19ERUNfUkVHKGlkcl9waWNfZSzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCA4LCAxNiwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKGJpdF9kZXB0aF9wY21feSzCoMKgIDgs IDEyLCAweGYpCj4gPiA+ICtIRVZDX0RFQ19SRUcoYml0X2RlcHRoX3BjbV9jLMKgwqAgOCwgOCzC oCAweGYpCj4gPiA+ICtIRVZDX0RFQ19SRUcoYml0X2RlcHRoX3lfbWludXM4LCA4LCA2LMKgIDB4 MykKPiA+ID4gK0hFVkNfREVDX1JFRyhiaXRfZGVwdGhfY19taW51czgsIDgsIDQswqAgMHgzKQo+ ID4gPiArSEVWQ19ERUNfUkVHKG91dHB1dF84X2JpdHMswqDCoMKgwqAgOCwgMyzCoCAweDEpCj4g PiA+ICsKPiA+ID4gK0hFVkNfREVDX1JFRyhyZWZpZHgxX2FjdGl2ZSzCoMKgwqA5LCAxOSzCoMKg MHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhyZWZpZHgwX2FjdGl2ZSzCoMKgwqA5LCAxNCzCoMKg MHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhoZHJfc2tpcF9sZW5ndGgswqDCoDksIDAswqDCoMKg MHgzZmZmKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcoc3RhcnRfY29kZV9lLMKgwqDCoMKg wqAxMCwgMzEsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhpbml0X3FwLMKgwqDCoMKgwqDCoMKg wqDCoMKgMTAsIDI0LCAweDNmKQo+ID4gPiArSEVWQ19ERUNfUkVHKG51bV90aWxlX2NvbHMswqDC oMKgwqAxMCwgMTksIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcobnVtX3RpbGVfcm93cyzCoMKg wqDCoDEwLCAxNCwgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyh0aWxlX2UswqDCoMKgwqDCoMKg wqDCoMKgwqDCoDEwLCAxLMKgwqAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoZW50cm9weV9zeW5j X2UswqDCoMKgMTAsIDAswqDCoDB4MSkKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKHJlZmVy X2x0ZXJtX2UswqDCoMKgwqAxMiwgMTYsIDB4ZmZmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhtaW5f Y2Jfc2l6ZSzCoMKgwqDCoMKgwqAxMiwgMTMsIDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyhtYXhf Y2Jfc2l6ZSzCoMKgwqDCoMKgwqAxMiwgMTAsIDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyhtaW5f cGNtX3NpemUswqDCoMKgwqDCoDEyLCA3LMKgIDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyhtYXhf cGNtX3NpemUswqDCoMKgwqDCoDEyLCA0LMKgIDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyhwY21f ZSzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxMiwgMyzCoCAweDEpCj4gPiA+ICtIRVZDX0RFQ19S RUcodHJhbnNmb3JtX3NraXAswqDCoMKgMTIsIDIswqDCoDB4MSkKPiA+ID4gK0hFVkNfREVDX1JF Ryh0cmFuc3FfYnlwYXNzLMKgwqDCoMKgMTIsIDEswqDCoDB4MSkKPiA+ID4gK0hFVkNfREVDX1JF RyhsaXN0X21vZF9lLMKgwqDCoMKgwqDCoMKgMTIsIDAswqDCoDB4MSkKPiA+ID4gKwo+ID4gPiAr SEVWQ19ERUNfUkVHKG1pbl90cmJfc2l6ZSzCoMKgwqDCoMKgwqAgMTMsIDEzLCAweDcpCj4gPiA+ ICtIRVZDX0RFQ19SRUcobWF4X3RyYl9zaXplLMKgwqDCoMKgwqDCoCAxMywgMTAsIDB4NykKPiA+ ID4gK0hFVkNfREVDX1JFRyhtYXhfaW50cmFfaGllcmRlcHRoLCAxMywgNyzCoCAweDcpCj4gPiA+ ICtIRVZDX0RFQ19SRUcobWF4X2ludGVyX2hpZXJkZXB0aCwgMTMsIDQswqAgMHg3KQo+ID4gPiAr SEVWQ19ERUNfUkVHKHBhcmFsbGVsX21lcmdlLMKgwqDCoMKgIDEzLCAwLMKgIDB4ZikKPiA+ID4g Kwo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2YwLMKgwqDCoMKgwqDCoMKgwqDCoDE0LCAwLMKg wqAweDFmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2YxLMKgwqDCoMKgwqDCoMKgwqDCoDE0 LCAxMCzCoDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjIswqDCoMKgwqDCoMKgwqDC oMKgMTQsIDIwLMKgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iMCzCoMKgwqDCoMKg wqDCoMKgwqAxNCwgNSzCoMKgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iMSzCoMKg wqDCoMKgwqDCoMKgwqAxNCwgMTUsIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjIs wqDCoMKgwqDCoMKgwqDCoMKgMTQsIDI1LCAweDFmKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19S RUcocmxpc3RfZjMswqDCoMKgwqDCoMKgwqDCoMKgMTUsIDAswqDCoDB4MWYpCj4gPiA+ICtIRVZD X0RFQ19SRUcocmxpc3RfZjQswqDCoMKgwqDCoMKgwqDCoMKgMTUsIDEwLCAweDFmKQo+ID4gPiAr SEVWQ19ERUNfUkVHKHJsaXN0X2Y1LMKgwqDCoMKgwqDCoMKgwqDCoDE1LCAyMCwgMHgxZikKPiA+ ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iMyzCoMKgwqDCoMKgwqDCoMKgwqAxNSwgNSzCoMKgMHgx ZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iNCzCoMKgwqDCoMKgwqDCoMKgwqAxNSwgMTUs IDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjUswqDCoMKgwqDCoMKgwqDCoMKgMTUs IDI1LCAweDFmKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjYswqDCoMKgwqDC oMKgwqDCoMKgMTYsIDAswqDCoDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjcswqDC oMKgwqDCoMKgwqDCoMKgMTYsIDEwLCAweDFmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2Y4 LMKgwqDCoMKgwqDCoMKgwqDCoDE2LCAyMCwgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlz dF9iNizCoMKgwqDCoMKgwqDCoMKgwqAxNiwgNSzCoMKgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JF RyhybGlzdF9iNyzCoMKgwqDCoMKgwqDCoMKgwqAxNiwgMTUsIDB4MWYpCj4gPiA+ICtIRVZDX0RF Q19SRUcocmxpc3RfYjgswqDCoMKgwqDCoMKgwqDCoMKgMTYsIDI1LCAweDFmKQo+ID4gPiArCj4g PiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjkswqDCoMKgwqDCoMKgwqDCoMKgMTcsIDAswqDCoDB4 MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjEwLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgMTcsIDEwLCAweDFmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2YxMSzCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDE3LCAyMCwgMHgxZikKPiA+ID4gK0hFVkNfREVD X1JFRyhybGlzdF9iOSzCoMKgwqDCoMKgwqDCoMKgwqAxNywgNSzCoMKgMHgxZikKPiA+ID4gK0hF VkNfREVDX1JFRyhybGlzdF9iMTAswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxNywg MTUsIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjExLMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgMTcsIDI1LCAweDFmKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUco cmxpc3RfZjEyLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTgsIDAswqDCoDB4MWYp Cj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjEzLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgMTgsIDEwLCAweDFmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2YxNCzCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDE4LCAyMCwgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JF RyhybGlzdF9iMTIswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxOCwgNSzCoMKgMHgx ZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iMTMswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAxOCwgMTUsIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjE0LMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTgsIDI1LCAweDFmKQo+ID4gPiArCj4gPiA+ICtI RVZDX0RFQ19SRUcocmxpc3RfZjE1LMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTks IDAswqDCoDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjE1LMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgMTksIDUswqDCoDB4MWYpCj4gPiA+ICsKPiA+ID4gK0hFVkNfREVD X1JFRyhwYXJ0aWFsX2N0Yl94LMKgwqDCoMKgMjAsIDMxLCAweDEpCj4gPiA+ICtIRVZDX0RFQ19S RUcocGFydGlhbF9jdGJfeSzCoMKgwqDCoDIwLCAzMCwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVH KHBpY193aWR0aF80eDQswqDCoMKgwqAyMCwgMTYsIDB4ZmZmKQo+ID4gPiArSEVWQ19ERUNfUkVH KHBpY19oZWlnaHRfNHg0LMKgwqDCoDIwLCAwLMKgIDB4ZmZmKQo+ID4gPiArCj4gPiA+ICtIRVZD X0RFQ19SRUcoY3VyX3BvY18wMCzCoMKgwqDCoMKgwqDCoDQ2LCAyNCzCoDB4ZmYpCj4gPiA+ICtI RVZDX0RFQ19SRUcoY3VyX3BvY18wMSzCoMKgwqDCoMKgwqDCoDQ2LCAxNizCoDB4ZmYpCj4gPiA+ ICtIRVZDX0RFQ19SRUcoY3VyX3BvY18wMizCoMKgwqDCoMKgwqDCoDQ2LCA4LMKgwqAweGZmKQo+ ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMDMswqDCoMKgwqDCoMKgwqA0NiwgMCzCoMKgMHhm ZikKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMDQswqDCoMKgwqDCoMKgwqA0 NywgMjQswqAweGZmKQo+ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMDUswqDCoMKgwqDCoMKg wqA0NywgMTYswqAweGZmKQo+ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMDYswqDCoMKgwqDC oMKgwqA0NywgOCzCoMKgMHhmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhjdXJfcG9jXzA3LMKgwqDC oMKgwqDCoMKgNDcsIDAswqDCoDB4ZmYpCj4gPiA+ICsKPiA+ID4gK0hFVkNfREVDX1JFRyhjdXJf cG9jXzA4LMKgwqDCoMKgwqDCoMKgNDgsIDI0LMKgMHhmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhj dXJfcG9jXzA5LMKgwqDCoMKgwqDCoMKgNDgsIDE2LMKgMHhmZikKPiA+ID4gK0hFVkNfREVDX1JF RyhjdXJfcG9jXzEwLMKgwqDCoMKgwqDCoMKgNDgsIDgswqDCoDB4ZmYpCj4gPiA+ICtIRVZDX0RF Q19SRUcoY3VyX3BvY18xMSzCoMKgwqDCoMKgwqDCoDQ4LCAwLMKgwqAweGZmKQo+ID4gPiArCj4g PiA+ICtIRVZDX0RFQ19SRUcoY3VyX3BvY18xMizCoMKgwqDCoMKgwqDCoDQ5LCAyNCwgMHhmZikK PiA+ID4gK0hFVkNfREVDX1JFRyhjdXJfcG9jXzEzLMKgwqDCoMKgwqDCoMKgNDksIDE2LCAweGZm KQo+ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMTQswqDCoMKgwqDCoMKgwqA0OSwgOCzCoMKg MHhmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhjdXJfcG9jXzE1LMKgwqDCoMKgwqDCoMKgNDksIDAs wqDCoDB4ZmYpCj4gPiA+ICsKPiA+ID4gK0hFVkNfREVDX1JFRyhhcGZfdGhyZXNob2xkLMKgwqDC oMKgNTUsIDAswqDCoDB4ZmZmZikKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKGNsa19nYXRl X2UswqDCoMKgwqDCoMKgwqA1OCwgMTYswqAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoYnVzd2lk dGgswqDCoMKgwqDCoMKgwqDCoMKgNTgsIDgswqDCoDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyht YXhfYnVyc3QswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA1OCwgMCzCoMKgMHhmZikK PiA+ID4gKwo+ID4gPiArI2RlZmluZSBIRVZDX1JFR19DT05GSUfCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRzJfU1dSRUcoNTgp Cj4gPiA+ICsjZGVmaW5lIEhFVkNfUkVHX0NPTkZJR19ERUNfQ0xLX0dBVEVfRcKgwqDCoMKgwqDC oMKgwqDCoEJJVCgxNikKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfQ09ORklHX0RFQ19DTEtfR0FU RV9JRExFX0XCoMKgwqDCoEJJVCgxNykKPiA+ID4gKwo+ID4gPiArI2RlZmluZSBIRVZDX0FERFJf RFNUwqDCoMKgwqDCoMKgwqDCoMKgwqAoRzJfU1dSRUcoNjUpKQo+ID4gPiArI2RlZmluZSBIRVZD X1JFR19BRERSX1JFRihpKcKgwqDCoChHMl9TV1JFRyg2NynCoCArICgoaSkgKiAweDgpKQo+ID4g PiArI2RlZmluZSBIRVZDX0FERFJfRFNUX0NIUsKgwqDCoMKgwqDCoChHMl9TV1JFRyg5OSkpCj4g PiA+ICsjZGVmaW5lIEhFVkNfUkVHX0NIUl9SRUYoaSnCoMKgwqDCoChHMl9TV1JFRygxMDEpICsg KChpKSAqIDB4OCkpCj4gPiA+ICsjZGVmaW5lIEhFVkNfQUREUl9EU1RfTVbCoMKgwqDCoMKgwqDC oChHMl9TV1JFRygxMzMpKQo+ID4gPiArI2RlZmluZSBIRVZDX1JFR19ETVZfUkVGKGkpwqDCoMKg wqAoRzJfU1dSRUcoMTM1KSArICgoaSkgKiAweDgpKQo+ID4gPiArI2RlZmluZSBIRVZDX0FERFJf VElMRV9TSVpFwqDCoMKgwqAoRzJfU1dSRUcoMTY3KSkKPiA+ID4gKyNkZWZpbmUgSEVWQ19BRERS X1NUUsKgwqDCoMKgwqDCoMKgwqDCoMKgKEcyX1NXUkVHKDE2OSkpCj4gPiA+ICsjZGVmaW5lIEhF VkNfU0NBTElOR19MSVNUwqDCoMKgwqDCoMKgKEcyX1NXUkVHKDE3MSkpCj4gPiA+ICsjZGVmaW5l IEhFVkNfUkFTVEVSX1NDQU7CoMKgwqDCoMKgwqDCoChHMl9TV1JFRygxNzUpKQo+ID4gPiArI2Rl ZmluZSBIRVZDX1JBU1RFUl9TQ0FOX0NIUsKgwqDCoChHMl9TV1JFRygxNzcpKQo+ID4gPiArI2Rl ZmluZSBIRVZDX1RJTEVfRklMVEVSwqDCoMKgwqDCoMKgwqAoRzJfU1dSRUcoMTc5KSkKPiA+ID4g KyNkZWZpbmUgSEVWQ19USUxFX1NBT8KgwqDCoMKgwqDCoMKgwqDCoMKgKEcyX1NXUkVHKDE4MSkp Cj4gPiA+ICsjZGVmaW5lIEhFVkNfVElMRV9CU0TCoMKgwqDCoMKgwqDCoMKgwqDCoChHMl9TV1JF RygxODMpKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcoc3RybV9idWZmZXJfbGVuLMKgwqAy NTgsIDAswqAweGZmZmZmZmZmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHN0cm1fc3RhcnRfb2Zmc2V0 LMKgwqDCoMKgwqDCoMKgwqAyNTksIDAswqAweGZmZmZmZmZmKQo+ID4gPiArCj4gPiA+ICsjZW5k aWYKPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJv X2hldmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX2hldmMuYwo+ID4g PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjhlMzE5YTgz N2ZmMwo+ID4gPiAtLS0gL2Rldi9udWxsCj4gPiA+ICsrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRp YS9oYW50cm8vaGFudHJvX2hldmMuYwo+ID4gPiBAQCAtMCwwICsxLDMyMSBAQAo+ID4gPiArLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiA+ID4gKy8qCj4gPiA+ICsgKiBIYW50 cm8gVlBVIEhFVkMgY29kZWMgZHJpdmVyCj4gPiA+ICsgKgo+ID4gPiArICogQ29weXJpZ2h0IChD KSAyMDIwIFNhZnJhbiBQYXNzZW5nZXIgSW5ub3ZhdGlvbnMgTExDCj4gPiA+ICsgKi8KPiA+ID4g Kwo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gPiA+ICsjaW5jbHVkZSA8bWVkaWEv djRsMi1tZW0ybWVtLmg+Cj4gPiA+ICsKPiA+ID4gKyNpbmNsdWRlICJoYW50cm8uaCIKPiA+ID4g KyNpbmNsdWRlICJoYW50cm9faHcuaCIKPiA+ID4gKwo+ID4gPiArI2RlZmluZSBWRVJUX0ZJTFRF Ul9SQU1fU0laRSA4IC8qIGJ5dGVzIHBlciBwaXhlbCByb3cgKi8KPiA+ID4gKy8qCj4gPiA+ICsg KiBCU0QgY29udHJvbCBkYXRhIG9mIGN1cnJlbnQgcGljdHVyZSBhdCB0aWxlIGJvcmRlcgo+ID4g PiArICogMTI4IGJpdHMgcGVyIDR4NCB0aWxlID0gMTI4Lyg4KjQpIGJ5dGVzIHBlciByb3cKPiA+ ID4gKyAqLwo+ID4gPiArI2RlZmluZSBCU0RfQ1RSTF9SQU1fU0laRSA0IC8qIGJ5dGVzIHBlciBw aXhlbCByb3cgKi8KPiA+ID4gKy8qIHRpbGUgYm9yZGVyIGNvZWZmaWNpZW50cyBvZiBmaWx0ZXIg Ki8KPiA+ID4gKyNkZWZpbmUgVkVSVF9TQU9fUkFNX1NJWkUgNDggLyogYnl0ZXMgcGVyIHBpeGVs ICovCj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgTUFYX1RJTEVfQ09MUyAyMAo+ID4gPiArI2RlZmlu ZSBNQVhfVElMRV9ST1dTIDIyCj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgVU5VU0VEX1JFRsKgwqDC oMKgwqAtMQo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIEcyX0FMSUdOwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgMTYKPiA+ID4gKyNkZWZpbmUgTUNfV09SRF9TSVpFwqDCoMKgwqDCoMKgwqDC oMKgwqDCoDMyCj4gPiA+ICsKPiA+ID4gK3NpemVfdCBoYW50cm9faGV2Y19jaHJvbWFfb2Zmc2V0 KGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMgKnNwcykKPiA+ID4gK3sKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaW50IGJ5dGVzX3Blcl9waXhlbCA9IHNwcy0+Yml0X2RlcHRoX2x1bWFfbWlu dXM4ID09IDAgPyAxIDogMjsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gc3Bz LT5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzICoKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHNwcy0+cGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgKiBieXRlc19wZXJfcGl4 ZWw7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3NpemVfdCBoYW50cm9faGV2Y19tb3Rpb25fdmVj dG9yc19vZmZzZXQoY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3NwcyAqc3BzKQo+ID4gPiAr ewo+ID4gPiArwqDCoMKgwqDCoMKgwqBzaXplX3QgY3Jfb2Zmc2V0ID0gaGFudHJvX2hldmNfY2hy b21hX29mZnNldChzcHMpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiBBTElH TigoY3Jfb2Zmc2V0ICogMykgLyAyLCBHMl9BTElHTikgKyBNQ19XT1JEX1NJWkU7Cj4gPiA+ICt9 Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBzaXplX3QgaGFudHJvX2hldmNfbXZfc2l6ZShjb25zdCBz dHJ1Y3QgdjRsMl9jdHJsX2hldmNfc3BzICpzcHMpCj4gPiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoHUzMiBwaWNfd2lkdGhfaW5fY3RiNjQgPSAoc3BzLT5waWNfd2lkdGhfaW5fbHVtYV9zYW1w bGVzICsgKDEgPDwgOCkgLSAxKSA+PiA4Owo+ID4gPiArwqDCoMKgwqDCoMKgwqB1MzIgcGljX2hl aWdodF9pbl9jdGI2NCA9IChzcHMtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzwqAgKyAoMSA8 PCA4KSAtIDEpID4+IDg7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNpemVfdCBtdl9zaXplOwo+ID4g PiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoG12X3NpemUgPSAocGljX3dpZHRoX2luX2N0YjY0ICog cGljX2hlaWdodF9pbl9jdGI2NCAqCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAoMSA8PCAoMiAqICg4IC0gNCkpKSAqIDE2KSArIDMyOwo+ID4gPiArCj4gPiA+ICvCoMKg wqDCoMKgwqDCoHZwdV9kZWJ1Zyg0LCAiJWR4JWQgKENUQnMpICVsdSBNViBieXRlc1xuIiwKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBpY193aWR0aF9pbl9jdGI2NCwg cGljX2hlaWdodF9pbl9jdGI2NCwgbXZfc2l6ZSk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgcmV0dXJuIG12X3NpemU7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBzaXplX3Qg aGFudHJvX2hldmNfcmVmX3NpemUoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiA+ID4gK3sKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IGhhbnRyb19oZXZjX2RlY19jdHJscyAqY3Ry bHMgPSAmY3R4LT5oZXZjX2RlYy5jdHJsczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3Ry dWN0IHY0bDJfY3RybF9oZXZjX3NwcyAqc3BzID0gY3RybHMtPnNwczsKPiA+ID4gKwo+ID4gPiAr wqDCoMKgwqDCoMKgwqByZXR1cm4gaGFudHJvX2hldmNfbW90aW9uX3ZlY3RvcnNfb2Zmc2V0KHNw cykgKyBoYW50cm9faGV2Y19tdl9zaXplKHNwcyk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0 YXRpYyB2b2lkIGhhbnRyb19oZXZjX3JlZl9mcmVlKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4g PiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9faGV2Y19kZWNfaHdfY3R4 ICpoZXZjX2RlYyA9ICZjdHgtPmhldmNfZGVjOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg aGFudHJvX2RldiAqdnB1ID0gY3R4LT5kZXY7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGludCBpOwo+ ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoC8qIEp1c3QgdGFnIGJ1ZmZlciBhcyB1bnVzZWQs IGRvIG5vdCBmcmVlIHRoZW0gKi8KPiA+IFRoaXMgY29tbWVudCBzZWVtcyB3cm9uZy4KPiAKPiBZ b3UgYXJlIHJpZ2h0IEkgd2lsbCByZW1vdmUgaXQuCj4gCj4gPiAKPiA+ID4gK8KgwqDCoMKgwqDC oMKgZm9yIChpID0gMDvCoCBpIDwgTlVNX1JFRl9QSUNUVVJFUzsgaSsrKSB7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoaGV2Y19kZWMtPnJlZl9idWZzW2ldLmNwdSkg ewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1l bXNldChoZXZjX2RlYy0+cmVmX2J1ZnNbaV0uY3B1LCAwLCBoYW50cm9faGV2Y19yZWZfc2l6ZShj dHgpKTsKPiA+IElzIHRoaXMgbWVtc2V0IGNsZWFyaW5nIHRoZSBidWZmZXIgcmVxdWlyZWQ/IElm IHdlJ3JlIGdldHRpbmcgYXJ0aWZhY3RzCj4gPiBmcm9tIHByZXZpb3VzIGRlY29kZXMsIHRoZW4g dGhhdCB3b3VsZCBiZSBtb3JlIG9mIGEgYnVnIHNvbWV3aGVyZS4KPiAKPiBDbGVhciBpcyBkb25l IGFmdGVyIGFsbG9jYXRpbmcvcmV1c2VkIHRoZSBidWZmZXIgSSBjYW4gcmVtb3ZlIHRoaXMgb25l Lgo+IAo+ID4gCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZG1hX2ZyZWVfY29oZXJlbnQodnB1LT5kZXYsIGhldmNfZGVjLT5yZWZfYnVmc1tpXS5z aXplLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaGV2Y19kZWMtPnJlZl9idWZzW2ld LmNwdSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGhldmNfZGVjLT5yZWZfYnVmc1tp XS5kbWEpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gPiArwqDC oMKgwqDCoMKgwqB9Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyB2b2lkIGhhbnRyb19o ZXZjX3JlZl9pbml0KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gPiA+ICt7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoHN0cnVjdCBoYW50cm9faGV2Y19kZWNfaHdfY3R4ICpoZXZjX2RlYyA9ICZjdHgt PmhldmNfZGVjOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBpbnQgaTsKPiA+ID4gKwo+ID4gPiArwqDC oMKgwqDCoMKgwqBmb3IgKGkgPSAwO8KgIGkgPCBOVU1fUkVGX1BJQ1RVUkVTOyBpKyspCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX2RlYy0+cmVmX2J1ZnNfcG9jW2ld ID0gVU5VU0VEX1JFRjsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArZG1hX2FkZHJfdCBoYW50cm9f aGV2Y19nZXRfcmVmX2J1ZihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4LAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGludCBwb2MpCj4gPiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9faGV2 Y19kZWNfaHdfY3R4ICpoZXZjX2RlYyA9ICZjdHgtPmhldmNfZGVjOwo+ID4gPiArwqDCoMKgwqDC oMKgwqBpbnQgaTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqAvKiBGaW5kIHRoZSByZWZl cmVuY2UgYnVmZmVyIGluIGFscmVhZHkga25vdyBvbmVzICovCj4gPiA+ICvCoMKgwqDCoMKgwqDC oGZvciAoaSA9IDA7wqAgaSA8IE5VTV9SRUZfUElDVFVSRVM7IGkrKykgewo+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGhldmNfZGVjLT5yZWZfYnVmc19wb2NbaV0gPT0g cG9jKSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaGV2Y19kZWMtPnJlZl9idWZzX3VzZWQgfD0gMSA8PCBpOwo+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBoZXZjX2RlYy0+cmVmX2J1 ZnNbaV0uZG1hOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gPiAr wqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogQWxsb2NhdGUg YSBuZXcgcmVmZXJlbmNlIGJ1ZmZlciAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqBmb3IgKGkgPSAw OyBpIDwgTlVNX1JFRl9QSUNUVVJFUzsgaSsrKSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiAoaGV2Y19kZWMtPnJlZl9idWZzX3BvY1tpXSA9PSBVTlVTRURfUkVGKSB7 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg KCFoZXZjX2RlYy0+cmVmX2J1ZnNbaV0uY3B1KSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9f ZGV2ICp2cHUgPSBjdHgtPmRldjsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX2RlYy0+cmVmX2J1 ZnNbaV0uY3B1ID0KPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRtYV9hbGxvY19jb2hlcmVu dCh2cHUtPmRldiwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBoYW50cm9faGV2Y19yZWZfc2l6ZShjdHgpLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZo ZXZjX2RlYy0+cmVmX2J1ZnNbaV0uZG1hLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEdGUF9LRVJORUwpOwo+ID4gSXMgdGhl cmUgYW55IHJlYXNvbiB3aHkgd2UgbmVlZCB0byBhbGxvY2F0ZSByZWZlcmVuY2UgYnVmZmVycyBh bmQgTVYgY29udGlndW91c2x5Pwo+IAo+IEl0IGlzIGRvbmUgbGlrZSB0aGF0IGluIElNWCByZWZl cmVuY2UgY29kZSBhbmQgbWFrZXMgdGhlIG1hbmFnZW1lbnQgb2YgcmVmZXJlbmNlIGZyYW1lCj4g YW5kIE1WIG1vcmUgc2ltcGxlLgo+IAo+ID4gCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICghaGV2Y19kZWMtPnJl Zl9idWZzW2ldLmNwdSkKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4g PiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGhldmNfZGVjLT5yZWZfYnVmc1tpXS5zaXplID0gaGFudHJvX2hldmNf cmVmX3NpemUoY3R4KTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqB9Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaGV2Y19kZWMtPnJlZl9idWZzX3VzZWQgfD0gMSA8PCBpOwo+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1lbXNldChoZXZjX2RlYy0+ cmVmX2J1ZnNbaV0uY3B1LCAwLCBoYW50cm9faGV2Y19yZWZfc2l6ZShjdHgpKTsKPiA+IAo+ID4g SSBiZWxpZXZlIHRoZSBjb2hlcmVudCBhbGxvY2F0aW9uIGlzIHRvIGJlIGFibGUgdG8gY2xlYXIg ZWFjaCByZWZlcmVuY2UsIGJ1dCBpcyB0aGlzCj4gPiByZWFsbHkgbmVlZGVkPyBJIHJlY2FsbCBt YXliZSBvbmx5IHRoZSBNViBidWZmZXIgbmVlZHMgY2xlYXJpbmcsIG1heWJlIHlvdSBjYW4gdHJ5 IHRoYXQ/Cj4gPiAKPiA+IEFsc28sIGlmIHRoYXQncyB0aGUgY2FzZSwgdGhlbiBhbGxvY2F0aW5n IHRoZSBNViBidWZmZXIgc2VwYXJhdGVkbHkgd2lsbCBhbGxvdwo+ID4gdG8gbm90IGFsbG9jYXRl IHRoZSByZWZlcmVuY2UgYnVmZmVycyBjb2hlcmVudGx5IChub3RlIHRoYXQgd2UgdXNlIE5PX01B UFBJTkcKPiA+IGluIHRoZSB2YjJfcXVldWUsIHNvIHRoZSB2YjJfYnVmZmVycyBzaG91bGRuJ3Qg YmUgY29oZXJlbnQpLgo+IAo+IFRoYXQgc291bmQgbGlrZSBnb29kIHBvc3NpYmxlIG9wdGltaXph dGlvbnMgYnV0IEknbSBub3QgYXQgdGhpcyBzdGFnZS4KPiBJIHdvdWxkIHJhdGhlciBrZWVwIGl0 IGluIHRoaXMgZmFpcmx5IGZ1bmN0aW9uYWwgc3RhdGUgYW5kIGltcHJvdmUgaXQgbGF0ZXIuCj4g SSB0aGluayB0aGUgcGF0Y2hlcyBhcmUgYWxyZWFkeSBlbm91Z2ggbGFyZ2VzIGFuZCBjb21wbGV4 ZXMgbGlrZSB0aGF0Lgo+IAoKRmFpciBlbm91Z2guIEkgdGhpbmsgaXQncyBncmVhdCB0byBoYXZl IGEgZmlyc3Qgd29ya2luZwp2ZXJzaW9uIDopCgpDb3VsZCB5b3UgYWRkIGEgY29tbWVudCBmb3Ig dGhpcywgc3BlY2lhbGx5IGF0IHRoZQptZW1zZXQncyBhbmQgdGhlIGRtYV9hbGxvY19jb2hlcmVu dCwgKG9yIG9wdGlvbmFsbHkKYXQgdGhlIGhlYWRlciBvZiB0aGlzIC5jIGZpbGUpLCBpbiBjYXNl IHNvbWVvbmUKd2FudHMgdG8gcmV2aXNpdCB0aGlzIHRvcGljPwoKVGhhbmtzIGEgbG90IQpFemVx dWllbCAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpM aW51eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJv Y2tjaGlwCg== 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=-14.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, 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 6B7D0C433DB for ; Tue, 16 Mar 2021 20:37:18 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 A147D64F80 for ; Tue, 16 Mar 2021 20:37:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A147D64F80 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:Cc:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=0iOsWA1TI8uXShk0bNUn/eQ8/mW02c9LqCQcXb4VSiw=; b=ICGtpqHQGVK7ryq/RvcU3u6qK sl5QQlw6gBZvX1jI5BBQuQuo/cjYzX/btgVeLmYlHMha+Z7JOI39nJox7dc4Np4btLYHseVJ2LKGc tc1jbPGJVbhB3LJyj/veHnJp+v1dG88I3k47rNWawyU3AUo0RnZqklIThgaZhyCHe/yeCZcz9fSHu 7ubQVx8oPKSs4ZuZsRAZH0o70pZDW69EE10salcmND/leCfWENEmdOnL9J+GLN0EMi5R6CELWTZYK EQixsWdBSqjmO7faM+mNQtwQ5stn/H7+WzU8P8nUN/XnnRvtqAhdmUuOEOAUq7DxBpWW36FF/5F8I EknT2csIA==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lMGPU-001ov0-Vz; Tue, 16 Mar 2021 20:35:25 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lMGPL-001ota-Hj; Tue, 16 Mar 2021 20:35:20 +0000 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id 279821F44E31 Message-ID: <165cf812e228517c9e746691d887445dd1b732ba.camel@collabora.com> Subject: Re: [PATCH v4 07/11] media: hantro: Introduce G2/HEVC decoder From: Ezequiel Garcia To: Benjamin Gaignard , p.zabel@pengutronix.de, mchehab@kernel.org, robh+dt@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, gregkh@linuxfoundation.org, mripard@kernel.org, paul.kocialkowski@bootlin.com, wens@csie.org, jernej.skrabec@siol.net, peng.fan@nxp.com, hverkuil-cisco@xs4all.nl, dan.carpenter@oracle.com Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel@collabora.com Date: Tue, 16 Mar 2021 17:35:03 -0300 In-Reply-To: References: <20210303113952.178519-1-benjamin.gaignard@collabora.com> <20210303113952.178519-8-benjamin.gaignard@collabora.com> <0306499f9c5bb55fe5da521feaa19bd1ad8e860f.camel@collabora.com> Organization: Collabora User-Agent: Evolution 3.38.2-1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210316_203516_254300_BAA5ACCD X-CRM114-Status: GOOD ( 51.10 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVHVlLCAyMDIxLTAzLTE2IGF0IDIxOjE5ICswMTAwLCBCZW5qYW1pbiBHYWlnbmFyZCB3cm90 ZToKPiAKPiBMZSAxNi8wMy8yMDIxIMOgIDE5OjQ2LCBFemVxdWllbCBHYXJjaWEgYSDDqWNyaXTC oDoKPiA+IEhpIEJlbmphbWluLAo+ID4gCj4gPiBUaGUgc2VyaWVzIGlzIGxvb2tpbmcgcmVhbGx5 IGdvb2QuIFNvbWUgY29tbWVudHMgYmVsb3cuCj4gPiAKPiA+IE9uIFdlZCwgMjAyMS0wMy0wMyBh dCAxMjozOSArMDEwMCwgQmVuamFtaW4gR2FpZ25hcmQgd3JvdGU6Cj4gPiA+IEltcGxlbWVudCBh bGwgdGhlIGxvZ2ljIHRvIGdldCBHMiBoYXJkd2FyZSBkZWNvZGluZyBIRVZDIGZyYW1lcy4KPiA+ ID4gSXQgc3VwcG9ydCB1cCBsZXZlbCA1LjEgSEVWQyBzdHJlYW0uCj4gPiA+IEl0IGRvZXNuJ3Qg c3VwcG9ydCB5ZXQgMTAgYml0cyBmb3JtYXRzIG9yIHNjYWxpbmcgZmVhdHVyZS4KPiA+ID4gCj4g PiA+IEFkZCBIQU5UUk8gSEVWQyBkZWRpY2F0ZWQgY29udHJvbCB0byBza2lwIHNvbWUgYml0cyBh dCB0aGUgYmVnaW5uaW5nCj4gPiA+IG9mIHRoZSBzbGljZSBoZWFkZXIuIFRoYXQgaXMgdmVyeSBz cGVjaWZpYyB0byB0aGlzIGhhcmR3YXJlIHNvIGNhbid0Cj4gPiA+IGdvIGludG8gdWFwaSBzdHJ1 Y3R1cmVzLiBDb21wdXRlIHRoZSBuZWVkZWQgdmFsdWUgaXMgY29tcGxleCBhbmQgcmVxdWlyZQo+ ID4gPiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJlYW0gdGhhdCBvbmx5IHRoZSB1c2VybGFuZCBr bm93cyBzbyBsZXQgaXQKPiA+ID4gcHJvdmlkZSB0aGUgY29ycmVjdCB2YWx1ZSB0byB0aGUgZHJp dmVyLgo+ID4gPiAKPiA+ID4gU2lnbmVkLW9mZi1ieTogQmVuamFtaW4gR2FpZ25hcmQgPGJlbmph bWluLmdhaWduYXJkQGNvbGxhYm9yYS5jb20+Cj4gPiA+IC0tLQo+ID4gPiB2ZXJzaW9uIDQ6Cj4g PiA+IC0gZml4IEV6ZXF1aWVsIGNvbW1lbnRzCj4gPiA+IC0gdXNlIGRlZGljYXRlZCBjb250cm9s IGFzIGFuIGludGVnZXIKPiA+ID4gLSBjaGFuZ2UgaGFudHJvX2cyX2hldmNfZGVjX3J1biBwcm90 b3R5cGUgdG8gcmV0dXJuIGVycm9ycwo+ID4gPiAKPiA+ID4gdmVyc2lvbiAyOgo+ID4gPiAtIHNx dWFzaCBtdWx0aXBsZSBjb21taXRzIGluIHRoaXMgb25lLgo+ID4gPiAtIGZpeCB0aGUgY29tbWVu dHMgZG9uZSBieSBFemVxdWllbCBhYm91dCBkbWFfYWxsb2NfY29oZXJlbnQgdXNhZ2UKPiA+ID4g LSBmaXggRGFuJ3MgY29tbWVudHMgYWJvdXQgY29udHJvbCBjb3B5LCByZXZlcnNlIHRoZSB0ZXN0 IGxvZ2ljCj4gPiA+IGluIHRpbGVfYnVmZmVyX3JlYWxsb2NhdGUsIHJld29yayBzb21lIGdvdG8g YW5kIHJldHVybiBjYXNlcy4KPiA+ID4gCj4gPiA+IMKgwqBkcml2ZXJzL3N0YWdpbmcvbWVkaWEv aGFudHJvL01ha2VmaWxlwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCAyICsKPiA+ID4gwqDCoGRyaXZl cnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvLmjCoMKgwqDCoMKgwqDCoMKgIHzCoCAxOCAr Cj4gPiA+IMKgwqBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19kcnYuY8KgwqDC oMKgIHzCoCA1MyArKwo+ID4gPiDCoMKgLi4uL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19n Ml9oZXZjX2RlYy5jIHwgNTg3ICsrKysrKysrKysrKysrKysrKwo+ID4gPiDCoMKgZHJpdmVycy9z dGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfcmVncy5oIHwgMTk4ICsrKysrKwo+ID4gPiDC oMKgZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9faGV2Yy5jwqDCoMKgIHwgMzIx ICsrKysrKysrKysKPiA+ID4gwqDCoGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJv X2h3LmjCoMKgwqDCoMKgIHzCoCA0OSArKwo+ID4gPiDCoMKgNyBmaWxlcyBjaGFuZ2VkLCAxMjI4 IGluc2VydGlvbnMoKykKPiA+ID4gwqDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdp bmcvbWVkaWEvaGFudHJvL2hhbnRyb19nMl9oZXZjX2RlYy5jCj4gPiA+IMKgwqBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfcmVncy5oCj4g PiA+IMKgwqBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9o YW50cm9faGV2Yy5jCj4gPiA+IAo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21l ZGlhL2hhbnRyby9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vTWFrZWZp bGUKPiA+ID4gaW5kZXggNzQzY2UwOGViMTg0Li4wMzU3ZjE3NzIyNjcgMTAwNjQ0Cj4gPiA+IC0t LSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vTWFrZWZpbGUKPiA+ID4gKysrIGIvZHJp dmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9NYWtlZmlsZQo+ID4gPiBAQCAtOSwxMiArOSwxNCBA QCBoYW50cm8tdnB1LXkgKz0gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaGFudHJvX2gxX2pwZWdfZW5jLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaGFudHJvX2cxX2gyNjRfZGVjLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaGFudHJvX2cxX21wZWcyX2RlYy5vIFwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19nMl9oZXZjX2RlYy5vIFwKPiA+ID4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19nMV92cDhfZGVjLm8gXAo+ID4gPiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmszMzk5X3ZwdV9od19qcGVnX2VuYy5vIFwK PiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJrMzM5OV92cHVfaHdfbXBl ZzJfZGVjLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmszMzk5 X3ZwdV9od192cDhfZGVjLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaGFudHJvX2pwZWcubyBcCj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBoYW50cm9faDI2NC5vIFwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhh bnRyb19oZXZjLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFu dHJvX21wZWcyLm8gXAo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFu dHJvX3ZwOC5vCj4gPiA+IMKgIAo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21l ZGlhL2hhbnRyby9oYW50cm8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJv LmgKPiA+ID4gaW5kZXggMDU4NzZlNDI2NDE5Li5hOWI4MGIyYzkxMjQgMTAwNjQ0Cj4gPiA+IC0t LSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvLmgKPiA+ID4gKysrIGIvZHJp dmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm8uaAo+ID4gPiBAQCAtMjI1LDYgKzIyNSw3 IEBAIHN0cnVjdCBoYW50cm9fZGV2IHsKPiA+ID4gwqDCoCAqIEBqcGVnX2VuYzrCoMKgwqDCoMKg wqDCoMKgwqDCoEpQRUctZW5jb2RpbmcgY29udGV4dC4KPiA+ID4gwqDCoCAqIEBtcGVnMl9kZWM6 wqDCoMKgwqDCoMKgwqDCoMKgTVBFRy0yLWRlY29kaW5nIGNvbnRleHQuCj4gPiA+IMKgwqAgKiBA dnA4X2RlYzrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgVlA4LWRlY29kaW5nIGNvbnRleHQuCj4gPiA+ ICsgKiBAaGV2Y19kZWM6wqDCoMKgwqDCoMKgwqDCoMKgwqBIRVZDLWRlY29kaW5nIGNvbnRleHQu Cj4gPiA+IMKgwqAgKi8KPiA+ID4gwqDCoHN0cnVjdCBoYW50cm9fY3R4IHsKPiA+ID4gwqDCoMKg wqDCoMKgwqDCoMKgc3RydWN0IGhhbnRyb19kZXYgKmRldjsKPiA+ID4gQEAgLTI1MSw2ICsyNTIs NyBAQCBzdHJ1Y3QgaGFudHJvX2N0eCB7Cj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzdHJ1Y3QgaGFudHJvX2pwZWdfZW5jX2h3X2N0eCBqcGVnX2VuYzsKPiA+ID4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9fbXBlZzJfZGVjX2h3 X2N0eCBtcGVnMl9kZWM7Cj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBz dHJ1Y3QgaGFudHJvX3ZwOF9kZWNfaHdfY3R4IHZwOF9kZWM7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaGFudHJvX2hldmNfZGVjX2h3X2N0eCBoZXZjX2RlYzsK PiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgfTsKPiA+ID4gwqDCoH07Cj4gPiA+IMKgIAo+ID4gPiBA QCAtNDI4LDYgKzQzMCwyMiBAQCBoYW50cm9fZ2V0X2RlY19idWZfYWRkcihzdHJ1Y3QgaGFudHJv X2N0eCAqY3R4LCBzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7Cj4gPiA+IMKgwqB9 Cj4gPiA+IMKgIAo+ID4gPiArc3RhdGljIGlubGluZSBzaXplX3QKPiA+ID4gK2hhbnRyb19nZXRf ZGVjX2J1Zl9zaXplKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIHN0cnVjdCB2YjJfYnVmZmVyICp2 YikKPiA+ID4gK3sKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGhhbnRyb19uZWVkc19wb3N0cHJv YyhjdHgsIGN0eC0+dnB1X2RzdF9mbXQpKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIGN0eC0+cG9zdHByb2MuZGVjX3FbdmItPmluZGV4XS5zaXplOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqByZXR1cm4gdmIyX3BsYW5lX3NpemUodmIsIDApOwo+ID4gPiArfQo+ID4g PiArCj4gPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgKgo+ID4gPiAraGFudHJvX2dldF9kZWNfYnVm KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIHN0cnVjdCB2YjJfYnVmZmVyICp2YikKPiA+ID4gK3sK PiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGhhbnRyb19uZWVkc19wb3N0cHJvYyhjdHgsIGN0eC0+ dnB1X2RzdF9mbXQpKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IGN0eC0+cG9zdHByb2MuZGVjX3FbdmItPmluZGV4XS5jcHU7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oHJldHVybiB2YjJfcGxhbmVfdmFkZHIodmIsIDApOwo+ID4gPiArfQo+ID4gPiArCj4gPiBTZWVt cyBoYW50cm9fZ2V0X2RlY19idWZfc2l6ZSBhbmQgaGFudHJvX2dldF9kZWNfYnVmIGFyZSBub3Qg dXNlZD8KPiAKPiBZb3UgYXJlIHJpZ2h0IEkgd2lsbCByZW1vdmUgdGhlbQo+IAo+ID4gCj4gPiA+ IMKgwqB2b2lkIGhhbnRyb19wb3N0cHJvY19kaXNhYmxlKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgp Owo+ID4gPiDCoMKgdm9pZCBoYW50cm9fcG9zdHByb2NfZW5hYmxlKHN0cnVjdCBoYW50cm9fY3R4 ICpjdHgpOwo+ID4gPiDCoMKgdm9pZCBoYW50cm9fcG9zdHByb2NfZnJlZShzdHJ1Y3QgaGFudHJv X2N0eCAqY3R4KTsKPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50 cm8vaGFudHJvX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZHJ2 LmMKPiA+ID4gaW5kZXggZTNlNmRmMjhmNDcwLi5iYzkwYTUyZjRkM2QgMTAwNjQ0Cj4gPiA+IC0t LSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX2Rydi5jCj4gPiA+ICsrKyBi L2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX2Rydi5jCj4gPiA+IEBAIC0zMCw2 ICszMCwxMyBAQAo+ID4gPiDCoCAKPiA+ID4gwqDCoCNkZWZpbmUgRFJJVkVSX05BTUUgImhhbnRy by12cHUiCj4gPiA+IMKgIAo+ID4gPiArLyoKPiA+ID4gKyAqIFY0TDJfQ0lEX0hBTlRST19IRVZD X1NMSUNFX0hFQURFUl9TS0lQIC0KPiA+ID4gKyAqIHRoZSBudW1iZXIgb2YgZGF0YSAoaW4gYml0 cykgdG8gc2tpcCBpbiB0aGUKPiA+ID4gKyAqIHNsaWNlIHNlZ21lbnQgaGVhZGVyIHN5bnRheCBh ZnRlciAnc2xpY2UgdHlwZScgdG9rZW4KPiA+ID4gKyAqLwo+ID4gSSB0aGluayB3ZSBuZWVkIHRv IGRvY3VtZW50IHRoaXMgYmV0dGVyLCBzbyBhcHBsaWNhdGlvbnMgY2FuCj4gPiBjb3JyZWN0bHkg dXNlIHRoZSBjb250cm9sLiBGcm9tIGkuTVggcmVmZXJlbmNlIGNvZGUsIGl0IHNlZW1zCj4gPiB0 aGlzIG5lZWRzIHRvIGJlIHVzZWQgYXMgZm9sbG93czoKPiA+IAo+ID4gSWYgbm9uLUlEUiwgdGhl IGJpdHMgdG8gYmUgc2tpcHBlZCBnbyBmcm9tIHN5bnRheCBlbGVtZW50ICJwaWNfb3V0cHV0X2Zs YWciCj4gPiB0byBiZWZvcmUgc3ludGF4IGVsZW1lbnQgInNsaWNlX3RlbXBvcmFsX212cF9lbmFi bGVkX2ZsYWciLgo+ID4gCj4gPiBJZiBJRFIsIHRoZSBza2lwcGVkIGJpdHMgYXJlIGp1c3QgInBp Y19vdXRwdXRfZmxhZyIKPiA+IChzZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZyBpcyBub3Qgc3Vw cG9ydGVkKS4KPiA+IAo+ID4gQW5kIGl0IHNlZW1zIHRoaXMgbmVlZHMgdG8gYmUgcGFzc2VkIHBh cnNpbmcgb25seSB0aGUgZmlyc3Qgc2xpY2UsCj4gPiBnaXZlbiB0aGlzIHN5bnRheCByZW1haW5z IGludmFyaWFudCBhY3Jvc3MgYWxsIHRoZSBzbGljZXMuCj4gCj4gT2sgSSB3aWxsIGFkZCB5b3Vy IGRlc2NyaXB0aW9uIGluIHRoZSBuZXh0IHZlcnNpb24uCj4gCj4gPiAKPiA+ID4gKyNkZWZpbmUg VjRMMl9DSURfSEFOVFJPX0hFVkNfU0xJQ0VfSEVBREVSX1NLSVDCoChWNEwyX0NJRF9VU0VSX0hB TlRST19CQVNFICsgMCkKPiA+ID4gKwo+ID4gPiDCoMKgaW50IGhhbnRyb19kZWJ1ZzsKPiA+ID4g wqDCoG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaGFudHJvX2RlYnVnLCBpbnQsIDA2NDQpOwo+ ID4gPiDCoMKgTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKPiA+ID4gQEAgLTI4MSw2ICsyODgsMjYg QEAgc3RhdGljIGludCBoYW50cm9fanBlZ19zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkK PiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiA+IMKgwqB9Cj4gPiA+IMKgIAo+ ID4gPiArc3RhdGljIGludCBoYW50cm9faGV2Y19zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3Ry bCkKPiA+ID4gK3sKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGhhbnRyb19jdHggKmN0eDsK PiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBjdHggPSBjb250YWluZXJfb2YoY3RybC0+aGFu ZGxlciwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCBoYW50cm9fY3R4LCBjdHJsX2hhbmRsZXIpOwo+ID4gPiArCj4gPiA+ICvC oMKgwqDCoMKgwqDCoHZwdV9kZWJ1ZygxLCAic19jdHJsOiBpZCA9ICVkLCB2YWwgPSAlZFxuIiwg Y3RybC0+aWQsIGN0cmwtPnZhbCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3dpdGNo IChjdHJsLT5pZCkgewo+ID4gPiArwqDCoMKgwqDCoMKgwqBjYXNlIFY0TDJfQ0lEX0hBTlRST19I RVZDX1NMSUNFX0hFQURFUl9TS0lQOgo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgY3R4LT5oZXZjX2RlYy5jdHJscy5oZXZjX2hkcl9za2lwX2xlbmd0aCA9IGN0cmwtPnZhbDsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gPiArwqDCoMKg wqDCoMKgwqBkZWZhdWx0Ogo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 dXJuIC1FSU5WQUw7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ID4gKwo+ID4gPiArwqDCoMKg wqDCoMKgwqByZXR1cm4gMDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiDCoMKgc3RhdGljIGNvbnN0 IHN0cnVjdCB2NGwyX2N0cmxfb3BzIGhhbnRyb19jdHJsX29wcyA9IHsKPiA+ID4gwqDCoMKgwqDC oMKgwqDCoMKgLnRyeV9jdHJsID0gaGFudHJvX3RyeV9jdHJsLAo+ID4gPiDCoMKgfTsKPiA+ID4g QEAgLTI4OSw2ICszMTYsMTAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIGhh bnRyb19qcGVnX2N0cmxfb3BzID0gewo+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqAuc19jdHJsID0g aGFudHJvX2pwZWdfc19jdHJsLAo+ID4gPiDCoMKgfTsKPiA+ID4gwqAgCj4gPiA+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgaGFudHJvX2hldmNfY3RybF9vcHMgPSB7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoC5zX2N0cmwgPSBoYW50cm9faGV2Y19zX2N0cmwsCj4gPiA+ICt9Owo+ ID4gPiArCj4gPiA+IMKgwqBzdGF0aWMgY29uc3Qgc3RydWN0IGhhbnRyb19jdHJsIGNvbnRyb2xz W10gPSB7Cj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoHsKPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoC5jb2RlYyA9IEhBTlRST19KUEVHX0VOQ09ERVIsCj4gPiA+IEBAIC00 MDksNiArNDQwLDI4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGFudHJvX2N0cmwgY29udHJvbHNb XSA9IHsKPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5jZmcgPSB7Cj4g PiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmlk ID0gVjRMMl9DSURfTVBFR19WSURFT19IRVZDX0RFQ09ERV9QQVJBTVMsCj4gPiA+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9LAo+ID4gPiArwqDCoMKgwqDCoMKgwqB9LCB7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAuY29kZWMgPSBIQU5UUk9fSEVWQ19E RUNPREVSLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmNmZyA9IHsKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAuaWQgPSBW NEwyX0NJRF9IQU5UUk9fSEVWQ19TTElDRV9IRUFERVJfU0tJUCwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAubmFtZSA9ICJIYW50cm8gSEVWQyBz bGljZSBoZWFkZXIgc2tpcCBieXRlcyIsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5taW4gPSAw LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5k ZWYgPSAwLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoC5tYXggPSAweDdmZmZmZmZmLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoC5zdGVwID0gMSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAub3BzID0gJmhhbnRyb19oZXZjX2N0cmxfb3BzLAo+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfSwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgfSwgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmNvZGVjID0gSEFO VFJPX0pQRUdfRU5DT0RFUiB8IEhBTlRST19NUEVHMl9ERUNPREVSIHwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgSEFOVFJPX1ZQOF9ERUNPREVS IHwgSEFOVFJPX0gyNjRfREVDT0RFUiB8Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIEhBTlRST19IRVZDX0RFQ09ERVIsCj4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAuY2ZnID0gewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5pZCA9IFY0TDJfQ0lEX1VTRVJfQ0xBU1MsCj4g PiBUaGlzIHNob3VsZG4ndCBiZSBoZXJlLCBpcyB0aGlzIFY0TDJfQ0lEX1VTRVJfQ0xBU1MgcmVx dWlyZWQgYnkgdjRsMi1jb21wbGlhbmNlCj4gPiBvciBieSB0aGUgc3BlYz8KPiAKPiBJdCBpcyBy ZXF1aXJlZCBieSB2NGwyLWNvbXBsaWFuY2UuCj4gCgpVbmxlc3MgSGFucyBzYXlzIG90aGVyd2lz ZSwgSSdkIHNheSBkcm9wIHRoaXMgVjRMMl9DSURfVVNFUl9DTEFTUyBjb250cm9sLAphbmQgd2Ug Y2FuIGZpZ3VyZSBvdXQgd2hhdCdzIHdyb25nIHdpdGggdjRsMi1jb21wbGlhbmNlIGxhdGVyLgoK PiA+IAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oC5uYW1lID0gIkhBTlRSTyBjb250cm9scyIsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNT LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5m bGFncyA9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSB8IFY0TDJfQ1RSTF9GTEFHX1dSSVRFX09O TFksCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9LAo+ID4gPiDCoMKgwqDC oMKgwqDCoMKgwqB9LAo+ID4gPiDCoMKgfTsKPiA+ID4gwqAgCj4gPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19nMl9oZXZjX2RlYy5jIGIvZHJpdmVy cy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfaGV2Y19kZWMuYwo+ID4gPiBuZXcgZmls ZSBtb2RlIDEwMDY0NAo+ID4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjVkNzViMzZiYzQwYwo+ID4g PiAtLS0gL2Rldi9udWxsCj4gPiA+ICsrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8v aGFudHJvX2cyX2hldmNfZGVjLmMKPiA+ID4gQEAgLTAsMCArMSw1ODcgQEAKPiA+ID4gKy8vIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gPiA+ICsvKgo+ID4gPiArICogSGFudHJv IFZQVSBIRVZDIGNvZGVjIGRyaXZlcgo+ID4gPiArICoKPiA+ID4gKyAqIENvcHlyaWdodCAoQykg MjAyMCBTYWZyYW4gUGFzc2VuZ2VyIElubm92YXRpb25zIExMQwo+ID4gPiArICovCj4gPiA+ICsK PiA+ID4gKyNpbmNsdWRlICJoYW50cm9faHcuaCIKPiA+ID4gKyNpbmNsdWRlICJoYW50cm9fZzJf cmVncy5oIgo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIEhFVkNfREVDX01PREXCoMKgMHhDCj4gPiA+ ICsKPiA+ID4gKyNkZWZpbmUgQlVTX1dJRFRIXzMywqDCoMKgwqDCoMKgwqDCoMKgwqDCoDAKPiA+ ID4gKyNkZWZpbmUgQlVTX1dJRFRIXzY0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoDEKPiA+ID4gKyNk ZWZpbmUgQlVTX1dJRFRIXzEyOMKgwqDCoMKgwqDCoMKgwqDCoMKgMgo+ID4gPiArI2RlZmluZSBC VVNfV0lEVEhfMjU2wqDCoMKgwqDCoMKgwqDCoMKgwqAzCj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBp bmxpbmUgdm9pZCBoYW50cm9fd3JpdGVfYWRkcihzdHJ1Y3QgaGFudHJvX2RldiAqdnB1LAo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIG9mZnNldCwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZG1hX2FkZHJfdCBhZGRyKQo+ID4gPiArewo+ID4gPiArwqDCoMKgwqDCoMKgwqB2ZHB1X3dy aXRlKHZwdSwgYWRkciAmIDB4ZmZmZmZmZmYsIG9mZnNldCk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ ID4gK3N0YXRpYyB2b2lkIHByZXBhcmVfdGlsZV9pbmZvX2J1ZmZlcihzdHJ1Y3QgaGFudHJvX2N0 eCAqY3R4KQo+ID4gPiArewo+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaGFudHJvX2RldiAq dnB1ID0gY3R4LT5kZXY7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGNvbnN0IHN0cnVjdCBoYW50cm9f aGV2Y19kZWNfY3RybHMgKmN0cmxzID0gJmN0eC0+aGV2Y19kZWMuY3RybHM7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19wcHMgKnBwcyA9IGN0cmxzLT5w cHM7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMg KnNwcyA9IGN0cmxzLT5zcHM7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHUxNiAqcCA9ICh1MTYgKiko KHU4ICopY3R4LT5oZXZjX2RlYy50aWxlX3NpemVzLmNwdSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oHVuc2lnbmVkIGludCBudW1fdGlsZV9yb3dzID0gcHBzLT5udW1fdGlsZV9yb3dzX21pbnVzMSAr IDE7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGludCBudW1fdGlsZV9jb2xzID0gcHBz LT5udW1fdGlsZV9jb2x1bW5zX21pbnVzMSArIDE7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHVuc2ln bmVkIGludCBwaWNfd2lkdGhfaW5fY3RicywgcGljX2hlaWdodF9pbl9jdGJzOwo+ID4gPiArwqDC oMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgbWF4X2xvZzJfY3RiX3NpemUsIGN0Yl9zaXplOwo+ID4g PiArwqDCoMKgwqDCoMKgwqBib29sIHRpbGVzX2VuYWJsZWQsIHVuaWZvcm1fc3BhY2luZzsKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgdTMyIG5vX2Nocm9tYSA9IDA7Cj4gPiA+ICsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgdGlsZXNfZW5hYmxlZCA9ICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZM QUdfVElMRVNfRU5BQkxFRCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHVuaWZvcm1fc3BhY2luZyA9 ICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfVU5JRk9STV9TUEFDSU5HKTsKPiA+ ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y190aWxl X2UsIHRpbGVzX2VuYWJsZWQpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoG1heF9sb2cy X2N0Yl9zaXplID0gc3BzLT5sb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyAr IDMgKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemU7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoHBpY193aWR0aF9pbl9jdGJzID0gKHNwcy0+cGljX3dpZHRoX2lu X2x1bWFfc2FtcGxlcyArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICgxIDw8IG1heF9sb2cyX2N0Yl9zaXplKSAtIDEpID4+IG1heF9s b2cyX2N0Yl9zaXplOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBwaWNfaGVpZ2h0X2luX2N0YnMgPSAo c3BzLT5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcyArICgxIDw8IG1heF9sb2cyX2N0Yl9zaXpl KSAtIDEpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgPj4gbWF4X2xvZzJfY3RiX3NpemU7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGN0 Yl9zaXplID0gMSA8PCBtYXhfbG9nMl9jdGJfc2l6ZTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDC oMKgwqB2cHVfZGVidWcoMSwgIlByZXBhcmluZyB0aWxlIHNpemVzIGJ1ZmZlciBmb3IgJWR4JWQg Q1RCcyAoQ1RCIHNpemUgJWQpXG4iLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGljX3dpZHRoX2luX2N0YnMsIHBpY19oZWlnaHRfaW5fY3RicywgY3RiX3NpemUpOwo+ ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmICh0aWxlc19lbmFibGVkKSB7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgaSwgaiwgaDsKPiA+ID4g Kwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdnB1X2RlYnVnKDEsICJUaWxl cyBlbmFibGVkISAlZHglZFxuIiwgbnVtX3RpbGVfY29scywgbnVtX3RpbGVfcm93cyk7Cj4gPiA+ ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUo dnB1LCBoZXZjX251bV90aWxlX3Jvd3MsIG51bV90aWxlX3Jvd3MpOwo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbnVtX3RpbGVf Y29scywgbnVtX3RpbGVfY29scyk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoC8qIHdyaXRlIHdpZHRoICsgaGVpZ2h0IGZvciBlYWNoIHRpbGUgaW4gcGljICov Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIXVuaWZvcm1fc3BhY2lu Zykgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHUzMiB0bXBfdyA9IDAsIHRtcF9oID0gMDsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBudW1fdGlsZV9y b3dzOyBpKyspIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGkgPT0gbnVtX3RpbGVfcm93cyAtIDEpCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoID0gcGljX2hlaWdodF9pbl9jdGJzIC0gdG1wX2g7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGVsc2UKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGggPSBwcHMtPnJvd19o ZWlnaHRfbWludXMxW2ldICsgMTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdG1wX2ggKz0gaDsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgKGkgPT0gMCAmJiBoID09IDEgJiYgY3RiX3NpemUgPT0gMTYpCj4gPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBub19jaHJvbWEgPSAxOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmb3IgKGogPSAwLCB0bXBfdyA9 IDA7IGogPCBudW1fdGlsZV9jb2xzIC0gMTsgaisrKSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB0bXBfdyArPSBwcHMtPmNvbHVtbl93aWR0aF9taW51czFbal0gKyAxOwo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgKnArKyA9IHBwcy0+Y29sdW1uX3dpZHRoX21pbnVzMVtqICsgMV07 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAqcCsrID0gaDsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIChpID09IDAgJiYgaCA9PSAxICYmIGN0Yl9zaXplID09IDE2KQo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG5vX2Nocm9tYSA9IDE7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoH0KPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogbGFzdCBjb2x1bW4gKi8KPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKnArKyA9 IHBpY193aWR0aF9pbl9jdGJzIC0gdG1wX3c7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCpwKysgPSBoOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0gZWxzZSB7IC8qIHVuaWZvcm0gc3BhY2luZyAq Lwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUz MiB0bXAsIHByZXZfaCwgcHJldl93Owo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIChpID0gMCwgcHJldl9oID0gMDsgaSA8IG51 bV90aWxlX3Jvd3M7IGkrKykgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0bXAgPSAoaSArIDEpICogcGljX2hlaWdo dF9pbl9jdGJzIC8gbnVtX3RpbGVfcm93czsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaCA9IHRtcCAtIHByZXZfaDsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcHJldl9oID0gdG1wOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoaSA9PSAwICYmIGggPT0g MSAmJiBjdGJfc2l6ZSA9PSAxNikKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG5vX2Nocm9t YSA9IDE7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGZvciAoaiA9IDAsIHByZXZfdyA9IDA7IGogPCBudW1fdGlsZV9j b2xzOyBqKyspIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRtcCA9IChqICsgMSkgKiBw aWNfd2lkdGhfaW5fY3RicyAvIG51bV90aWxlX2NvbHM7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAqcCsrID0gdG1wIC0gcHJldl93Owo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKnAr KyA9IGg7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoaiA9PSAwICYmCj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHBwcy0+Y29sdW1uX3dpZHRoX21pbnVzMVswXSAr IDEpID09IDEgJiYKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjdGJfc2l6ZSA9 PSAxNikKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBub19jaHJv bWEgPSAxOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJldl93ID0gdG1wOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB9Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgfQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gPiArwqDCoMKg wqDCoMKgwqB9IGVsc2Ugewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFu dHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbnVtX3RpbGVfcm93cywgMSk7Cj4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19udW1fdGls ZV9jb2xzLCAxKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg LyogVGhlcmUncyBvbmUgdGlsZSwgd2l0aCBkaW1lbnNpb25zIGVxdWFsIHRvIHBpYyBzaXplLiAq Lwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcFswXSA9IHBpY193aWR0aF9p bl9jdGJzOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcFsxXSA9IHBpY19o ZWlnaHRfaW5fY3RiczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiArCj4gPiA+ICvCoMKg wqDCoMKgwqDCoGlmIChub19jaHJvbWEpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB2cHVfZGVidWcoMSwgIiVzOiBubyBjaHJvbWEhXG4iLCBfX2Z1bmNfXyk7Cj4gPiA+ICt9 Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyB2b2lkIHNldF9wYXJhbXMoc3RydWN0IGhhbnRyb19jdHgg KmN0eCkKPiA+ID4gK3sKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IGhhbnRyb19o ZXZjX2RlY19jdHJscyAqY3RybHMgPSAmY3R4LT5oZXZjX2RlYy5jdHJsczsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3NwcyAqc3BzID0gY3RybHMtPnNw czsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3BwcyAq cHBzID0gY3RybHMtPnBwczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJf Y3RybF9oZXZjX2RlY29kZV9wYXJhbXMgKmRlY29kZV9wYXJhbXMgPSBjdHJscy0+ZGVjb2RlX3Bh cmFtczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGhhbnRyb19kZXYgKnZwdSA9IGN0eC0+ ZGV2Owo+ID4gPiArwqDCoMKgwqDCoMKgwqB1MzIgbWluX2xvZzJfY2Jfc2l6ZSwgbWF4X2xvZzJf Y3RiX3NpemUsIG1pbl9jYl9zaXplLCBtYXhfY3RiX3NpemU7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oHUzMiBwaWNfd2lkdGhfaW5fbWluX2NicywgcGljX2hlaWdodF9pbl9taW5fY2JzOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqB1MzIgcGljX3dpZHRoX2FsaWduZWQsIHBpY19oZWlnaHRfYWxpZ25lZDsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgdTMyIHBhcnRpYWxfY3RiX3gsIHBhcnRpYWxfY3RiX3k7Cj4g PiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfYml0 X2RlcHRoX3lfbWludXM4LCBzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCk7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2JpdF9kZXB0aF9jX21pbnVzOCwg c3BzLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfb3V0cHV0XzhfYml0cywgMCk7Cj4gPiA+ICsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfaGRyX3NraXBf bGVuZ3RoLCBjdHJscy0+aGV2Y19oZHJfc2tpcF9sZW5ndGgpOwo+ID4gPiArCj4gPiA+ICvCoMKg wqDCoMKgwqDCoG1pbl9sb2cyX2NiX3NpemUgPSBzcHMtPmxvZzJfbWluX2x1bWFfY29kaW5nX2Js b2NrX3NpemVfbWludXMzICsgMzsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgbWF4X2xvZzJfY3RiX3Np emUgPSBtaW5fbG9nMl9jYl9zaXplICsgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGlu Z19ibG9ja19zaXplOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3Jp dGUodnB1LCBoZXZjX21pbl9jYl9zaXplLCBtaW5fbG9nMl9jYl9zaXplKTsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbWF4X2NiX3NpemUsIG1heF9sb2cy X2N0Yl9zaXplKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBtaW5fY2Jfc2l6ZSA9IDEg PDwgbWluX2xvZzJfY2Jfc2l6ZTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgbWF4X2N0Yl9zaXplID0g MSA8PCBtYXhfbG9nMl9jdGJfc2l6ZTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBwaWNf d2lkdGhfaW5fbWluX2NicyA9IHNwcy0+cGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcyAvIG1pbl9j Yl9zaXplOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBwaWNfaGVpZ2h0X2luX21pbl9jYnMgPSBzcHMt PnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzIC8gbWluX2NiX3NpemU7Cj4gPiA+ICvCoMKgwqDC oMKgwqDCoHBpY193aWR0aF9hbGlnbmVkID0gQUxJR04oc3BzLT5waWNfd2lkdGhfaW5fbHVtYV9z YW1wbGVzLCBtYXhfY3RiX3NpemUpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBwaWNfaGVpZ2h0X2Fs aWduZWQgPSBBTElHTihzcHMtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzLCBtYXhfY3RiX3Np emUpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoHBhcnRpYWxfY3RiX3ggPSAhIShzcHMt PnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXMgIT0gcGljX3dpZHRoX2FsaWduZWQpOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqBwYXJ0aWFsX2N0Yl95ID0gISEoc3BzLT5waWNfaGVpZ2h0X2luX2x1bWFf c2FtcGxlcyAhPSBwaWNfaGVpZ2h0X2FsaWduZWQpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3BhcnRpYWxfY3RiX3gsIHBhcnRpYWxfY3Ri X3gpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19wYXJ0 aWFsX2N0Yl95LCBwYXJ0aWFsX2N0Yl95KTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBo YW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19waWNfd2lkdGhfaW5fY2JzLCBwaWNfd2lkdGhfaW5f bWluX2Nicyk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZj X3BpY19oZWlnaHRfaW5fY2JzLCBwaWNfaGVpZ2h0X2luX21pbl9jYnMpOwo+ID4gPiArCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3BpY193aWR0aF80eDQs Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChw aWNfd2lkdGhfaW5fbWluX2NicyAqIG1pbl9jYl9zaXplKSAvIDQpOwo+ID4gPiArwqDCoMKgwqDC oMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19waWNfaGVpZ2h0XzR4NCwKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHBpY19oZWlnaHRf aW5fbWluX2NicyAqIG1pbl9jYl9zaXplKSAvIDQpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX21heF9pbnRlcl9oaWVyZGVwdGgsCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNwcy0+bWF4 X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBo YW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19tYXhfaW50cmFfaGllcmRlcHRoLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcHMtPm1heF90cmFu c2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJv X3JlZ193cml0ZSh2cHUsIGhldmNfbWluX3RyYl9zaXplLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcHMtPmxvZzJfbWluX2x1bWFfdHJhbnNm b3JtX2Jsb2NrX3NpemVfbWludXMyICsgMik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19y ZWdfd3JpdGUodnB1LCBoZXZjX21heF90cmJfc2l6ZSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3BzLT5sb2cyX21pbl9sdW1hX3RyYW5zZm9y bV9ibG9ja19zaXplX21pbnVzMiArIDIgKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2x1bWFfdHJhbnNm b3JtX2Jsb2NrX3NpemUpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdf d3JpdGUodnB1LCBoZXZjX3RlbXBvcl9tdnBfZSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgISEoc3BzLT5mbGFncyAmIFY0TDJfSEVWQ19TUFNf RkxBR19TUFNfVEVNUE9SQUxfTVZQX0VOQUJMRUQpICYmCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICEoZGVjb2RlX3BhcmFtcy0+ZmxhZ3MgJiBW NEwyX0hFVkNfREVDT0RFX1BBUkFNX0ZMQUdfSURSX1BJQykpOwo+ID4gPiArwqDCoMKgwqDCoMKg wqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19zdHJvbmdfc21vb3RoX2UsCj4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICEhKHNwcy0+ZmxhZ3Mg JiBWNEwyX0hFVkNfU1BTX0ZMQUdfU1RST05HX0lOVFJBX1NNT09USElOR19FTkFCTEVEKSk7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2FzeW1fcHJlZF9l LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAh IShzcHMtPmZsYWdzICYgVjRMMl9IRVZDX1NQU19GTEFHX0FNUF9FTkFCTEVEKSk7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3Nhb19lLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShzcHMtPmZsYWdz ICYgVjRMMl9IRVZDX1NQU19GTEFHX1NBTVBMRV9BREFQVElWRV9PRkZTRVQpKTsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfc2lnbl9kYXRhX2hpZGUsCj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICEhKHBw cy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfU0lHTl9EQVRBX0hJRElOR19FTkFCTEVEKSk7 Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNf UFBTX0ZMQUdfQ1VfUVBfREVMVEFfRU5BQkxFRCkgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfY3VfcXBkX2UsIDEpOwo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhl dmNfbWF4X2N1X3FwZF9kZXB0aCwgcHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoKTsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgfSBlbHNlIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2N1X3FwZF9lLCAwKTsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX21heF9j dV9xcGRfZGVwdGgsIDApOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfUFBTX1NMSUNF X0NIUk9NQV9RUF9PRkZTRVRTX1BSRVNFTlQpIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2NiX3FwX29mZnNldCwgcHBzLT5w cHNfY2JfcXBfb2Zmc2V0KTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhh bnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2NyX3FwX29mZnNldCwgcHBzLT5wcHNfY3JfcXBfb2Zm c2V0KTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfSBlbHNlIHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2NiX3FwX29mZnNldCwg MCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRl KHZwdSwgaGV2Y19jcl9xcF9vZmZzZXQsIDApOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfZmlsdF9v ZmZzZXRfYmV0YSwgcHBzLT5wcHNfYmV0YV9vZmZzZXRfZGl2Mik7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2ZpbHRfb2Zmc2V0X3RjLCBwcHMtPnBwc190 Y19vZmZzZXRfZGl2Mik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1 LCBoZXZjX3NsaWNlX2hkcl9leHRfZSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19T TElDRV9TRUdNRU5UX0hFQURFUl9FWFRFTlNJT05fUFJFU0VOVCkpOwo+ID4gPiArwqDCoMKgwqDC oMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19zbGljZV9oZHJfZXh0X2JpdHMsIHBwcy0+ bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJv X3JlZ193cml0ZSh2cHUsIGhldmNfc2xpY2VfY2hxcF9wcmVzZW50LAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRM Ml9IRVZDX1BQU19GTEFHX1BQU19TTElDRV9DSFJPTUFfUVBfT0ZGU0VUU19QUkVTRU5UKSk7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3dlaWdodF9iaXBy X2lkYywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19XRUlHSFRFRF9CSVBSRUQpKTsK PiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfdHJhbnNxX2J5 cGFzcywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19UUkFOU1FVQU5UX0JZUEFTU19F TkFCTEVEKSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZj X2xpc3RfbW9kX2UsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfTElTVFNfTU9ESUZJ Q0FUSU9OX1BSRVNFTlQpKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2 cHUsIGhldmNfZW50cm9weV9zeW5jX2UsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdf RU5UUk9QWV9DT0RJTkdfU1lOQ19FTkFCTEVEKSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRy b19yZWdfd3JpdGUodnB1LCBoZXZjX2NhYmFjX2luaXRfcHJlc2VudCwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgISEocHBzLT5mbGFncyAmIFY0 TDJfSEVWQ19QUFNfRkxBR19DQUJBQ19JTklUX1BSRVNFTlQpKTsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfaWRyX3BpY19lLAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShkZWNvZGVfcGFyYW1zLT5m bGFncyAmIFY0TDJfSEVWQ19ERUNPREVfUEFSQU1fRkxBR19JUkFQX1BJQykpOwo+ID4gPiArwqDC oMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19wYXJhbGxlbF9tZXJnZSwKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHBzLT5s b2cyX3BhcmFsbGVsX21lcmdlX2xldmVsX21pbnVzMiArIDIpOwo+ID4gPiArwqDCoMKgwqDCoMKg wqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19wY21fZmlsdF9kLAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShzcHMtPmZsYWdzICYgVjRM Ml9IRVZDX1NQU19GTEFHX1BDTV9MT09QX0ZJTFRFUl9ESVNBQkxFRCkpOwo+ID4gPiArwqDCoMKg wqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19wY21fZSwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgISEoc3BzLT5mbGFncyAmIFY0 TDJfSEVWQ19TUFNfRkxBR19QQ01fRU5BQkxFRCkpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBpZiAo c3BzLT5mbGFncyAmIFY0TDJfSEVWQ19TUFNfRkxBR19QQ01fRU5BQkxFRCkgewo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbWF4 X3BjbV9zaXplLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9wY21fbHVtYV9j b2RpbmdfYmxvY2tfc2l6ZSArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzcHMtPmxvZzJfbWluX3BjbV9sdW1hX2Nv ZGluZ19ibG9ja19zaXplX21pbnVzMyArIDMpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbWluX3BjbV9zaXplLAo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc3BzLT5sb2cyX21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgKyAz KTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUo dnB1LCBoZXZjX2JpdF9kZXB0aF9wY21feSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNwcy0+cGNtX3NhbXBsZV9i aXRfZGVwdGhfbHVtYV9taW51czEgKyAxKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2JpdF9kZXB0aF9wY21fYywKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHNwcy0+cGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hX21pbnVzMSArIDEpOwo+ID4g PiArwqDCoMKgwqDCoMKgwqB9IGVsc2Ugewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfbWF4X3BjbV9zaXplLCAwKTsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZj X21pbl9wY21fc2l6ZSwgMCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBo YW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19iaXRfZGVwdGhfcGNtX3ksIDApOwo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfYml0 X2RlcHRoX3BjbV9jLCAwKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiArCj4gPiA+ICvC oMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3N0YXJ0X2NvZGVfZSwgMSk7 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2luaXRfcXAs IHBwcy0+aW5pdF9xcF9taW51czI2ICsgMjYpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9f cmVnX3dyaXRlKHZwdSwgaGV2Y193ZWlnaHRfcHJlZF9lLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRMMl9IRVZD X1BQU19GTEFHX1dFSUdIVEVEX1BSRUQpKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3Jl Z193cml0ZSh2cHUsIGhldmNfY2FiYWNfaW5pdF9wcmVzZW50LAo+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRMMl9I RVZDX1BQU19GTEFHX0NBQkFDX0lOSVRfUFJFU0VOVCkpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBo YW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19jb25zdF9pbnRyYV9lLAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRM Ml9IRVZDX1BQU19GTEFHX0NPTlNUUkFJTkVEX0lOVFJBX1BSRUQpKTsKPiA+ID4gK8KgwqDCoMKg wqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfdHJhbnNmb3JtX3NraXAsCj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICEhKHBwcy0+Zmxh Z3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfVFJBTlNGT1JNX1NLSVBfRU5BQkxFRCkpOwo+ID4gPiAr wqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19vdXRfZmlsdGVyaW5nX2Rp cywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19QUFNfRElTQUJMRV9ERUJMT0NLSU5H X0ZJTFRFUikpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2 Y19maWx0X2N0cmxfcHJlcywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgISEocHBzLT5mbGFncyAmIFY0TDJfSEVWQ19QUFNfRkxBR19ERUJMT0NL SU5HX0ZJTFRFUl9DT05UUk9MX1BSRVNFTlQpKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJv X3JlZ193cml0ZSh2cHUsIGhldmNfZGVwZW5kZW50X3NsaWNlLAo+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMtPmZsYWdzICYgVjRMMl9I RVZDX1BQU19GTEFHX0RFUEVOREVOVF9TTElDRV9TRUdNRU5UKSk7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX2ZpbHRlcl9vdmVycmlkZSwKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgISEocHBzLT5mbGFn cyAmIFY0TDJfSEVWQ19QUFNfRkxBR19ERUJMT0NLSU5HX0ZJTFRFUl9PVkVSUklERV9FTkFCTEVE KSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3JlZmlk eDBfYWN0aXZlLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwcHMtPm51bV9yZWZfaWR4X2wwX2RlZmF1bHRfYWN0aXZlX21pbnVzMSArIDEpOwo+ ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19yZWZpZHgxX2Fj dGl2ZSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcHBzLT5udW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZV9taW51czEgKyAxKTsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfYXBmX3RocmVzaG9sZCwg OCk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBpbnQgZmluZF9yZWZfcGljX2luZGV4 KGNvbnN0IHN0cnVjdCB2NGwyX2hldmNfZHBiX2VudHJ5ICpkcGIsIGludCBwaWNfb3JkZXJfY250 KQo+ID4gPiArewo+ID4gPiArwqDCoMKgwqDCoMKgwqBpbnQgaTsKPiA+ID4gKwo+ID4gPiArwqDC oMKgwqDCoMKgwqBmb3IgKGkgPSAwOyBpIDwgVjRMMl9IRVZDX0RQQl9FTlRSSUVTX05VTV9NQVg7 IGkrKykgewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGRwYltpXS5w aWNfb3JkZXJfY250WzBdID09IHBpY19vcmRlcl9jbnQpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIGk7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoH0KPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gMHgwOwo+ID4gPiArfQo+ ID4gPiArCj4gPiA+ICtzdGF0aWMgdm9pZCBzZXRfcmVmX3BpY19saXN0KHN0cnVjdCBoYW50cm9f Y3R4ICpjdHgpCj4gPiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGNvbnN0IHN0cnVjdCBoYW50 cm9faGV2Y19kZWNfY3RybHMgKmN0cmxzID0gJmN0eC0+aGV2Y19kZWMuY3RybHM7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBjdHgtPmRldjsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX2RlY29kZV9wYXJhbXMgKmRl Y29kZV9wYXJhbXMgPSBjdHJscy0+ZGVjb2RlX3BhcmFtczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg Y29uc3Qgc3RydWN0IHY0bDJfaGV2Y19kcGJfZW50cnkgKmRwYiA9IGRlY29kZV9wYXJhbXMtPmRw YjsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgdTMyIGxpc3QwW1Y0TDJfSEVWQ19EUEJfRU5UUklFU19O VU1fTUFYXSA9IHswfTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgdTMyIGxpc3QxW1Y0TDJfSEVWQ19E UEJfRU5UUklFU19OVU1fTUFYXSA9IHswfTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3Ry dWN0IGhhbnRyb19yZWcgKnJlZl9waWNfcmVnczBbXSA9IHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfZjAsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBoZXZjX3JsaXN0X2YxLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgaGV2Y19ybGlzdF9mMiwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGhldmNfcmxpc3RfZjMsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZj X3JsaXN0X2Y0LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlz dF9mNSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfZjYs Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2Y3LAo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9mOCwKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfZjksCj4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2YxMCwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfZjExLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9mMTIsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBoZXZjX3JsaXN0X2YxMywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGhldmNfcmxpc3RfZjE0LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaGV2Y19ybGlzdF9mMTUsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoH07Cj4gPiA+ICvCoMKgwqDC oMKgwqDCoGNvbnN0IHN0cnVjdCBoYW50cm9fcmVnICpyZWZfcGljX3JlZ3MxW10gPSB7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2IwLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9iMSwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfYjIsCj4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2IzLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9iNCwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGhldmNfcmxpc3RfYjUsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBoZXZjX3JsaXN0X2I2LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2 Y19ybGlzdF9iNywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxp c3RfYjgsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2I5 LAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9iMTAsCj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2IxMSwKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfYjEyLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGV2Y19ybGlzdF9iMTMsCj4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX3JsaXN0X2IxNCwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfcmxpc3RfYjE1LAo+ID4gPiArwqDCoMKgwqDCoMKgwqB9 Owo+ID4gPiArwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgaSwgajsKPiA+ID4gKwo+ID4gPiAr wqDCoMKgwqDCoMKgwqAvKiBMaXN0IDAgY29udGFpbnM6IHNob3J0IHRlcm0gYmVmb3JlLCBzaG9y dCB0ZXJtIGFmdGVyIGFuZCBsb25nIHRlcm0gKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgaiA9IDA7 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBkZWNvZGVfcGFyYW1zLT5udW1f cG9jX3N0X2N1cnJfYmVmb3JlICYmIGogPCBBUlJBWV9TSVpFKGxpc3QwKTsgaSsrKQo+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGlzdDBbaisrXSA9IGZpbmRfcmVmX3BpY19p bmRleChkcGIsIGRlY29kZV9wYXJhbXMtPnBvY19zdF9jdXJyX2JlZm9yZVtpXSk7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBkZWNvZGVfcGFyYW1zLT5udW1fcG9jX3N0X2N1 cnJfYWZ0ZXIgJiYgaiA8IEFSUkFZX1NJWkUobGlzdDApOyBpKyspCj4gPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0MFtqKytdID0gZmluZF9yZWZfcGljX2luZGV4KGRwYiwg ZGVjb2RlX3BhcmFtcy0+cG9jX3N0X2N1cnJfYWZ0ZXJbaV0pOwo+ID4gPiArwqDCoMKgwqDCoMKg wqBmb3IgKGkgPSAwOyBpIDwgZGVjb2RlX3BhcmFtcy0+bnVtX3BvY19sdF9jdXJyICYmIGogPCBB UlJBWV9TSVpFKGxpc3QwKTsgaSsrKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgbGlzdDBbaisrXSA9IGZpbmRfcmVmX3BpY19pbmRleChkcGIsIGRlY29kZV9wYXJhbXMtPnBv Y19sdF9jdXJyW2ldKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqAvKiBGaWxsIHRoZSBs aXN0LCBjb3B5aW5nIG92ZXIgYW5kIG92ZXIgKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgaSA9IDA7 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHdoaWxlIChqIDwgQVJSQVlfU0laRShsaXN0MCkpCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0MFtqKytdID0gbGlzdDBbaSsrXTsK PiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBqID0gMDsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg Zm9yIChpID0gMDsgaSA8IGRlY29kZV9wYXJhbXMtPm51bV9wb2Nfc3RfY3Vycl9hZnRlciAmJiBq IDwgQVJSQVlfU0laRShsaXN0MSk7IGkrKykKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGxpc3QxW2orK10gPSBmaW5kX3JlZl9waWNfaW5kZXgoZHBiLCBkZWNvZGVfcGFyYW1z LT5wb2Nfc3RfY3Vycl9hZnRlcltpXSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7 IGkgPCBkZWNvZGVfcGFyYW1zLT5udW1fcG9jX3N0X2N1cnJfYmVmb3JlICYmIGogPCBBUlJBWV9T SVpFKGxpc3QxKTsgaSsrKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGlz dDFbaisrXSA9IGZpbmRfcmVmX3BpY19pbmRleChkcGIsIGRlY29kZV9wYXJhbXMtPnBvY19zdF9j dXJyX2JlZm9yZVtpXSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBkZWNv ZGVfcGFyYW1zLT5udW1fcG9jX2x0X2N1cnIgJiYgaiA8IEFSUkFZX1NJWkUobGlzdDEpOyBpKysp Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0MVtqKytdID0gZmluZF9y ZWZfcGljX2luZGV4KGRwYiwgZGVjb2RlX3BhcmFtcy0+cG9jX2x0X2N1cnJbaV0pOwo+ID4gPiAr Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGkgPSAwOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB3aGlsZSAo aiA8IEFSUkFZX1NJWkUobGlzdDEpKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgbGlzdDFbaisrXSA9IGxpc3QxW2krK107Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg Zm9yIChpID0gMDsgaSA8IFY0TDJfSEVWQ19EUEJfRU5UUklFU19OVU1fTUFYOyBpKyspIHsKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBy ZWZfcGljX3JlZ3MwW2ldLCBsaXN0MFtpXSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgcmVmX3BpY19yZWdzMVtpXSwgbGlzdDFbaV0p Owo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBp bnQgc2V0X3JlZihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+ID4gPiArewo+ID4gPiArwqDCoMKg wqDCoMKgwqBjb25zdCBzdHJ1Y3QgaGFudHJvX2hldmNfZGVjX2N0cmxzICpjdHJscyA9ICZjdHgt PmhldmNfZGVjLmN0cmxzOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBjb25zdCBzdHJ1Y3QgdjRsMl9j dHJsX2hldmNfc3BzICpzcHMgPSBjdHJscy0+c3BzOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBjb25z dCBzdHJ1Y3QgdjRsMl9jdHJsX2hldmNfcHBzICpwcHMgPSBjdHJscy0+cHBzOwo+ID4gPiArwqDC oMKgwqDCoMKgwqBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2hldmNfZGVjb2RlX3BhcmFtcyAqZGVj b2RlX3BhcmFtcyA9IGN0cmxzLT5kZWNvZGVfcGFyYW1zOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBj b25zdCBzdHJ1Y3QgdjRsMl9oZXZjX2RwYl9lbnRyeSAqZHBiID0gZGVjb2RlX3BhcmFtcy0+ZHBi Owo+ID4gPiArwqDCoMKgwqDCoMKgwqBkbWFfYWRkcl90IGx1bWFfYWRkciwgY2hyb21hX2FkZHIs IG12X2FkZHIgPSAwOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgaGFudHJvX2RldiAqdnB1 ID0gY3R4LT5kZXY7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNpemVfdCBjcl9vZmZzZXQgPSBoYW50 cm9faGV2Y19jaHJvbWFfb2Zmc2V0KHNwcyk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNpemVfdCBt dl9vZmZzZXQgPSBoYW50cm9faGV2Y19tb3Rpb25fdmVjdG9yc19vZmZzZXQoc3BzKTsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgdTMyIG1heF9yZWZfZnJhbWVzOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB1 MTYgZHBiX2xvbmd0ZXJtX2U7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3Ry dWN0IGhhbnRyb19yZWcgKmN1cl9wb2NbXSA9IHsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGhldmNfY3VyX3BvY18wMCwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGhldmNfY3VyX3BvY18wMSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGhldmNfY3VyX3BvY18wMiwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGhldmNfY3VyX3BvY18wMywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhl dmNfY3VyX3BvY18wNCwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNf Y3VyX3BvY18wNSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3Vy X3BvY18wNiwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3Bv Y18wNywKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18w OCwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18wOSwK PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xMCwKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xMSwKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xMiwKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xMywKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xNCwKPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhldmNfY3VyX3BvY18xNSwKPiA+ID4gK8KgwqDCoMKgwqDC oMKgfTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgdW5zaWduZWQgaW50IGk7Cj4gPiA+ICsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgbWF4X3JlZl9mcmFtZXMgPSBkZWNvZGVfcGFyYW1zLT5udW1fcG9jX2x0 X2N1cnIgKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZGVjb2RlX3BhcmFt cy0+bnVtX3BvY19zdF9jdXJyX2JlZm9yZSArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBkZWNvZGVfcGFyYW1zLT5udW1fcG9jX3N0X2N1cnJfYWZ0ZXI7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoC8qCj4gPiA+ICvCoMKgwqDCoMKgwqDCoCAqIFNldCBtYXhfcmVmX2ZyYW1lcyB0 byBub24temVybyB0byBhdm9pZCBIVyBoYW5nIHdoZW4gZGVjb2RpbmcKPiA+ID4gK8KgwqDCoMKg wqDCoMKgICogYmFkbHkgbWFya2VkIEktZnJhbWVzLgo+ID4gPiArwqDCoMKgwqDCoMKgwqAgKi8K PiA+ID4gK8KgwqDCoMKgwqDCoMKgbWF4X3JlZl9mcmFtZXMgPSBtYXhfcmVmX2ZyYW1lcyA/IG1h eF9yZWZfZnJhbWVzIDogMTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2 cHUsIGhldmNfbnVtX3JlZl9mcmFtZXMsIG1heF9yZWZfZnJhbWVzKTsKPiA+ID4gK8KgwqDCoMKg wqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfZmlsdGVyX292ZXJfc2xpY2VzLAo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhIShwcHMt PmZsYWdzICYgVjRMMl9IRVZDX1BQU19GTEFHX1BQU19MT09QX0ZJTFRFUl9BQ1JPU1NfU0xJQ0VT X0VOQUJMRUQpKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhl dmNfZmlsdGVyX292ZXJfdGlsZXMsCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICEhKHBwcy0+ZmxhZ3MgJiBWNEwyX0hFVkNfUFBTX0ZMQUdfTE9P UF9GSUxURVJfQUNST1NTX1RJTEVTX0VOQUJMRUQpKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDC oMKgwqAvKgo+ID4gPiArwqDCoMKgwqDCoMKgwqAgKiBXcml0ZSBQT0MgY291bnQgZGlmZiBmcm9t IGN1cnJlbnQgcGljLiBGb3IgZnJhbWUgZGVjb2Rpbmcgb25seSBjb21wdXRlCj4gPiA+ICvCoMKg wqDCoMKgwqDCoCAqIHBpY19vcmRlcl9jbnRbMF0gYW5kIGlnbm9yZSBwaWNfb3JkZXJfY250WzFd IHVzZWQgaW4gZmllbGQtY29kaW5nLgo+ID4gPiArwqDCoMKgwqDCoMKgwqAgKi8KPiA+ID4gK8Kg wqDCoMKgwqDCoMKgZm9yIChpID0gMDsgaSA8IGRlY29kZV9wYXJhbXMtPm51bV9hY3RpdmVfZHBi X2VudHJpZXMgJiYgaSA8IEFSUkFZX1NJWkUoY3VyX3BvYyk7IGkrKykgewo+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY2hhciBwb2NfZGlmZiA9IGRlY29kZV9wYXJhbXMtPnBp Y19vcmRlcl9jbnRfdmFsIC0gZHBiW2ldLnBpY19vcmRlcl9jbnRbMF07Cj4gPiA+ICsKPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBjdXJf cG9jW2ldLCBwb2NfZGlmZik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ID4gKwo+ID4gPiAr wqDCoMKgwqDCoMKgwqBpZiAoaSA8IEFSUkFZX1NJWkUoY3VyX3BvYykpIHsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKiBBZnRlciB0aGUgcmVmZXJlbmNlcywgZmlsbCBvbmUgZW50cnkgcG9pbnRpbmcg dG8gaXRzZWxmLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogaS5lLiBk aWZmZXJlbmNlIGlzIHplcm8uCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Ki8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUo dnB1LCBjdXJfcG9jW2ldLCAwKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGkrKzsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDC oC8qIEZpbGwgdGhlIHJlc3Qgd2l0aCB0aGUgY3VycmVudCBwaWN0dXJlICovCj4gPiA+ICvCoMKg wqDCoMKgwqDCoGZvciAoOyBpIDwgQVJSQVlfU0laRShjdXJfcG9jKTsgaSsrKQo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGN1cl9wb2Nb aV0sIGRlY29kZV9wYXJhbXMtPnBpY19vcmRlcl9jbnRfdmFsKTsKPiA+ID4gKwo+ID4gPiArwqDC oMKgwqDCoMKgwqBzZXRfcmVmX3BpY19saXN0KGN0eCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKg wqDCoMKgLyogV2Ugd2lsbCBvbmx5IGtlZXAgdGhlIHJlZmVyZW5jZXMgcGljdHVyZSB0aGF0IGFy ZSBzdGlsbCB1c2VkICovCj4gPiA+ICvCoMKgwqDCoMKgwqDCoGN0eC0+aGV2Y19kZWMucmVmX2J1 ZnNfdXNlZCA9IDA7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogU2V0IHVwIGFkZHJl c3NlcyBvZiBEUEIgYnVmZmVycyAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqBkcGJfbG9uZ3Rlcm1f ZSA9IDA7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBkZWNvZGVfcGFyYW1z LT5udW1fYWN0aXZlX2RwYl9lbnRyaWVzICYmCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGkgPCAoVjRMMl9IRVZDX0RQQl9FTlRSSUVTX05VTV9NQVggLSAxKTsgaSsrKSB7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsdW1hX2FkZHIgPSBoYW50cm9faGV2Y19nZXRf cmVmX2J1ZihjdHgsIGRwYltpXS5waWNfb3JkZXJfY250WzBdKTsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmICghbHVtYV9hZGRyKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PTUVNOwo+ID4gPiArCj4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjaHJvbWFfYWRkciA9IGx1bWFfYWRk ciArIGNyX29mZnNldDsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG12X2Fk ZHIgPSBsdW1hX2FkZHIgKyBtdl9vZmZzZXQ7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGlmIChkcGJbaV0ucnBzID09IFY0TDJfSEVWQ19EUEJfRU5UUllfUlBT X0xUX0NVUlIpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZHBiX2xvbmd0ZXJtX2UgfD0gQklUKFY0TDJfSEVWQ19EUEJfRU5UUklFU19OVU1fTUFY IC0gMSAtIGkpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBo YW50cm9fd3JpdGVfYWRkcih2cHUsIEhFVkNfUkVHX0FERFJfUkVGKGkpLCBsdW1hX2FkZHIpOwo+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1 LCBIRVZDX1JFR19DSFJfUkVGKGkpLCBjaHJvbWFfYWRkcik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBoYW50cm9fd3JpdGVfYWRkcih2cHUsIEhFVkNfUkVHX0RNVl9SRUYo aSksIG12X2FkZHIpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgbHVtYV9hZGRyID0gaGFudHJvX2hldmNfZ2V0X3JlZl9idWYoY3R4LCBkZWNvZGVf cGFyYW1zLT5waWNfb3JkZXJfY250X3ZhbCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmICghbHVt YV9hZGRyKQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FTk9N RU07Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY2hyb21hX2FkZHIgPSBsdW1hX2FkZHIg KyBjcl9vZmZzZXQ7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoG12X2FkZHIgPSBsdW1hX2FkZHIgKyBt dl9vZmZzZXQ7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIo dnB1LCBIRVZDX1JFR19BRERSX1JFRihpKSwgbHVtYV9hZGRyKTsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBIRVZDX1JFR19DSFJfUkVGKGkpLCBjaHJvbWFfYWRk cik7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19SRUdf RE1WX1JFRihpKyspLCBtdl9hZGRyKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50 cm9fd3JpdGVfYWRkcih2cHUsIEhFVkNfQUREUl9EU1QsIGx1bWFfYWRkcik7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19BRERSX0RTVF9DSFIsIGNocm9t YV9hZGRyKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBIRVZD X0FERFJfRFNUX01WLCBtdl9hZGRyKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50 cm9faGV2Y19yZWZfcmVtb3ZlX3VudXNlZChjdHgpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGZvciAoOyBpIDwgVjRMMl9IRVZDX0RQQl9FTlRSSUVTX05VTV9NQVg7IGkrKykgewo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBI RVZDX1JFR19BRERSX1JFRihpKSwgMCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBoYW50cm9fd3JpdGVfYWRkcih2cHUsIEhFVkNfUkVHX0NIUl9SRUYoaSksIDApOwo+ID4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBI RVZDX1JFR19ETVZfUkVGKGkpLCAwKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiArCj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3JlZmVyX2x0ZXJt X2UsIGRwYl9sb25ndGVybV9lKTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4g MDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIHZvaWQgc2V0X2J1ZmZlcnMoc3RydWN0 IGhhbnRyb19jdHggKmN0eCkKPiA+ID4gK3sKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHZi Ml92NGwyX2J1ZmZlciAqc3JjX2J1ZiwgKmRzdF9idWY7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0 cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBjdHgtPmRldjsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29u c3Qgc3RydWN0IGhhbnRyb19oZXZjX2RlY19jdHJscyAqY3RybHMgPSAmY3R4LT5oZXZjX2RlYy5j dHJsczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3Nw cyAqc3BzID0gY3RybHMtPnNwczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc2l6ZV90IGNyX29mZnNl dCA9IGhhbnRyb19oZXZjX2Nocm9tYV9vZmZzZXQoc3BzKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKg ZG1hX2FkZHJfdCBzcmNfZG1hLCBkc3RfZG1hOwo+ID4gPiArwqDCoMKgwqDCoMKgwqB1MzIgc3Jj X2xlbiwgc3JjX2J1Zl9sZW47Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3JjX2J1ZiA9 IGhhbnRyb19nZXRfc3JjX2J1ZihjdHgpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBkc3RfYnVmID0g aGFudHJvX2dldF9kc3RfYnVmKGN0eCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyog U291cmNlIChzdHJlYW0pIGJ1ZmZlci4gKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgc3JjX2RtYSA9 IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKCZzcmNfYnVmLT52YjJfYnVmLCAwKTsKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgc3JjX2xlbiA9IHZiMl9nZXRfcGxhbmVfcGF5bG9hZCgmc3JjX2J1 Zi0+dmIyX2J1ZiwgMCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNyY19idWZfbGVuID0gdmIyX3Bs YW5lX3NpemUoJnNyY19idWYtPnZiMl9idWYsIDApOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19BRERSX1NUUiwgc3JjX2RtYSk7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX3N0cmVhbV9sZW4sIHNy Y19sZW4pOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19z dHJtX2J1ZmZlcl9sZW4sIHNyY19idWZfbGVuKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJv X3JlZ193cml0ZSh2cHUsIGhldmNfc3RybV9zdGFydF9vZmZzZXQsIDApOwo+ID4gPiArwqDCoMKg wqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y193cml0ZV9tdnNfZSwgMSk7Cj4gPiA+ ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogRGVzdGluYXRpb24gKGRlY29kZWQgZnJhbWUpIGJ1 ZmZlci4gKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgZHN0X2RtYSA9IGhhbnRyb19nZXRfZGVjX2J1 Zl9hZGRyKGN0eCwgJmRzdF9idWYtPnZiMl9idWYpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19SQVNURVJfU0NBTiwgZHN0X2RtYSk7Cj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb193cml0ZV9hZGRyKHZwdSwgSEVWQ19SQVNURVJfU0NB Tl9DSFIsIGRzdF9kbWEgKyBjcl9vZmZzZXQpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9f d3JpdGVfYWRkcih2cHUsIEhFVkNfQUREUl9USUxFX1NJWkUsIGN0eC0+aGV2Y19kZWMudGlsZV9z aXplcy5kbWEpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fd3JpdGVfYWRkcih2cHUsIEhF VkNfVElMRV9GSUxURVIsIGN0eC0+aGV2Y19kZWMudGlsZV9maWx0ZXIuZG1hKTsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBIRVZDX1RJTEVfU0FPLCBjdHgtPmhl dmNfZGVjLnRpbGVfc2FvLmRtYSk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb193cml0ZV9h ZGRyKHZwdSwgSEVWQ19USUxFX0JTRCwgY3R4LT5oZXZjX2RlYy50aWxlX2JzZC5kbWEpOwo+ID4g PiArfQo+ID4gPiArCj4gPiA+ICt2b2lkIGhhbnRyb19nMl9jaGVja19pZGxlKHN0cnVjdCBoYW50 cm9fZGV2ICp2cHUpCj4gPiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGludCBpOwo+ID4gPiAr Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHUzMiBzdGF0dXM7Cj4gPiA+ICsKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIE1ha2Ugc3VyZSB0aGUgVlBVIGlzIGlkbGUg Ki8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YXR1cyA9IHZkcHVfcmVh ZCh2cHUsIEhFVkNfUkVHX0lOVEVSUlVQVCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAoc3RhdHVzICYgSEVWQ19SRUdfSU5URVJSVVBUX0RFQ19FKSB7Cj4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJfd2FybigiJXM6 IHN0aWxsIGVuYWJsZWQhISEgcmVzZXR0aW5nLlxuIiwgX19mdW5jX18pOwo+ID4gSG93IGFib3V0 IHdlIGNsZWFuIHRoaXMgcHJfd2FybjogdXNlIGVpdGhlciB2NGwyX3dhcm4gb3IgZGV2X3dhcm4g YW5kIG1ha2UKPiA+IHRoZSB3YXJuaW5nICJkZXZpY2Ugc3RpbGwgcnVubmluZywgYWJvcnRpbmci IChJIHBlcnNvbmFsbHkgZGlzbGlrZSB0aGUgYWJvcnQKPiA+IG1ldGFwaG9yLCBidXQgZ3Vlc3Mg aXQncyBPSyBoZXJlKS4KPiAKPiBPawo+IAo+ID4gCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RhdHVzIHw9IEhFVkNfUkVHX0lOVEVSUlVQVF9E RUNfQUJPUlRfRSB8IEhFVkNfUkVHX0lOVEVSUlVQVF9ERUNfSVJRX0RJUzsKPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2ZHB1X3dyaXRlKHZwdSwg c3RhdHVzLCBIRVZDX1JFR19JTlRFUlJVUFQpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgfQo+ID4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4g K2ludCBoYW50cm9fZzJfaGV2Y19kZWNfcnVuKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gPiA+ ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBjdHgtPmRl djsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaW50IHJldDsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDC oMKgwqBoYW50cm9fZzJfY2hlY2tfaWRsZSh2cHUpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKg wqDCoC8qIFByZXBhcmUgSEVWQyBkZWNvZGVyIGNvbnRleHQuICovCj4gPiA+ICvCoMKgwqDCoMKg wqDCoHJldCA9IGhhbnRyb19oZXZjX2RlY19wcmVwYXJlX3J1bihjdHgpOwo+ID4gPiArwqDCoMKg wqDCoMKgwqBpZiAocmV0KQo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 dXJuIHJldDsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqAvKiBDb25maWd1cmUgaGFyZHdh cmUgcmVnaXN0ZXJzLiAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqBzZXRfcGFyYW1zKGN0eCk7Cj4g PiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogc2V0IHJlZmVyZW5jZSBwaWN0dXJlcyAqLwo+ ID4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBzZXRfcmVmKGN0eCk7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoGlmIChyZXQpCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4g cmV0Owo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNldF9idWZmZXJzKGN0eCk7Cj4gPiA+ ICvCoMKgwqDCoMKgwqDCoHByZXBhcmVfdGlsZV9pbmZvX2J1ZmZlcihjdHgpOwo+ID4gPiArCj4g PiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19lbmRfcHJlcGFyZV9ydW4oY3R4KTsKPiA+ID4gKwo+ ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19tb2RlLCBIRVZD X0RFQ19NT0RFKTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhl dmNfY2xrX2dhdGVfZSwgMSk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogRG9uJ3Qg ZGlzYWJsZSBvdXRwdXQgKi8KPiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2 cHUsIGhldmNfb3V0X2RpcywgMCk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogRG9u J3QgY29tcHJlc3MgYnVmZmVycyAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dy aXRlKHZwdSwgaGV2Y19yZWZfY29tcHJlc3NfYnlwYXNzLCAxKTsKPiA+ID4gKwo+ID4gPiArwqDC oMKgwqDCoMKgwqAvKiB1c2UgTlYxMiBhcyBvdXRwdXQgZm9ybWF0ICovCj4gPiA+ICvCoMKgwqDC oMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZjX291dF9yc19lLCAxKTsKPiA+ID4gKwo+ ID4gPiArwqDCoMKgwqDCoMKgwqAvKiBCdXMgd2lkdGggYW5kIG1heCBidXJzdCAqLwo+ID4gPiAr wqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19idXN3aWR0aCwgQlVTX1dJ RFRIXzEyOCk7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGhhbnRyb19yZWdfd3JpdGUodnB1LCBoZXZj X21heF9idXJzdCwgMTYpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoC8qIFN3YXAgKi8K PiA+ID4gK8KgwqDCoMKgwqDCoMKgaGFudHJvX3JlZ193cml0ZSh2cHUsIGhldmNfc3RybV9zd2Fw LCAweGYpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZwdSwgaGV2Y19k aXJtdl9zd2FwLCAweGYpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBoYW50cm9fcmVnX3dyaXRlKHZw dSwgaGV2Y19jb21wcmVzc19zd2FwLCAweGYpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDC oC8qIFN0YXJ0IGRlY29kaW5nISAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqB2ZHB1X3dyaXRlKHZw dSwgSEVWQ19SRUdfSU5URVJSVVBUX0RFQ19FLCBIRVZDX1JFR19JTlRFUlJVUFQpOwo+ID4gPiAr Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gPiArfQo+ID4gPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfcmVncy5oIGIvZHJpdmVy cy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9fZzJfcmVncy5oCj4gPiA+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uYTM2MWM5YmE5MTFkCj4gPiA+IC0t LSAvZGV2L251bGwKPiA+ID4gKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50 cm9fZzJfcmVncy5oCj4gPiA+IEBAIC0wLDAgKzEsMTk4IEBACj4gPiA+ICsvKiBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCj4gPiA+ICsvKgo+ID4gPiArICogQ29weXJp Z2h0IChjKSAyMDIxLCBDb2xsYWJvcmEKPiA+ID4gKyAqCj4gPiA+ICsgKiBBdXRob3I6IEJlbmph bWluIEdhaWduYXJkIDxiZW5qYW1pbi5nYWlnbmFyZEBjb2xsYWJvcmEuY29tPgo+ID4gPiArICov Cj4gPiA+ICsKPiA+ID4gKyNpZm5kZWYgSEFOVFJPX0cyX1JFR1NfSF8KPiA+ID4gKyNkZWZpbmUg SEFOVFJPX0cyX1JFR1NfSF8KPiA+ID4gKwo+ID4gPiArI2luY2x1ZGUgImhhbnRyby5oIgo+ID4g PiArCj4gPiA+ICsjZGVmaW5lIEcyX1NXUkVHKG5yKcKgwqDCoCgobnIpICogNCkKPiA+ID4gKwo+ ID4gPiArI2RlZmluZSBIRVZDX0RFQ19SRUcobmFtZSwgYmFzZSwgc2hpZnQsIG1hc2spIFwKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgc3RhdGljIGNvbnN0IHN0cnVjdCBoYW50cm9fcmVnIF9oZXZjXyMj bmFtZVtdID0geyBcCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB7IEcyX1NX UkVHKGJhc2UpLCAoc2hpZnQpLCAobWFzaykgfSBcCj4gPiA+ICvCoMKgwqDCoMKgwqDCoH07IFwK PiA+ID4gK8KgwqDCoMKgwqDCoMKgc3RhdGljIGNvbnN0IHN0cnVjdCBoYW50cm9fcmVnIF9fbWF5 YmVfdW51c2VkICpoZXZjXyMjbmFtZSA9ICZfaGV2Y18jI25hbWVbMF07Cj4gPiA+ICsKPiA+ID4g KyNkZWZpbmUgSEVWQ19SRUdfVkVSU0lPTsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEcy X1NXUkVHKDApCj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfSU5URVJSVVBUwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBHMl9TV1JFRygxKQo+ID4gPiArI2RlZmluZSBIRVZDX1JFR19J TlRFUlJVUFRfREVDX1JEWV9JTlTCoEJJVCgxMikKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfSU5U RVJSVVBUX0RFQ19BQk9SVF9FwqBCSVQoNSkKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfSU5URVJS VVBUX0RFQ19JUlFfRElTwqBCSVQoNCkKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfSU5URVJSVVBU X0RFQ19FwqDCoMKgwqDCoMKgwqBCSVQoMCkKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKHN0 cm1fc3dhcCzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDIsIDI4LMKgwqAweGYpCj4g PiA+ICtIRVZDX0RFQ19SRUcoZGlybXZfc3dhcCzCoMKgwqDCoMKgwqDCoDIsIDIwLMKgwqAweGYp Cj4gPiA+ICsKPiA+ID4gK0hFVkNfREVDX1JFRyhtb2RlLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgMywgMjcsIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcoY29tcHJlc3Nfc3dhcCzCoMKg wqDCoMKgIDMsIDIwLCAweGYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmVmX2NvbXByZXNzX2J5cGFz cywgMywgMTcsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhvdXRfcnNfZSzCoMKgwqDCoMKgwqDC oMKgwqDCoCAzLCAxNiwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKG91dF9kaXMswqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAzLCAxNSwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKG91dF9maWx0ZXJp bmdfZGlzLMKgwqAgMywgMTQsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyh3cml0ZV9tdnNfZSzC oMKgwqDCoMKgwqDCoCAzLCAxMiwgMHgxKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcocGlj X3dpZHRoX2luX2NicyzCoDQsIDE5LMKgwqAweDFmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhwaWNf aGVpZ2h0X2luX2NicyzCoMKgwqDCoMKgwqDCoMKgNCwgNizCoMKgwqAweDFmZikKPiA+ID4gK0hF VkNfREVDX1JFRyhudW1fcmVmX2ZyYW1lcyzCoMKgwqA0LCAwLMKgwqDCoDB4MWYpCj4gPiA+ICsK PiA+ID4gK0hFVkNfREVDX1JFRyhzY2FsaW5nX2xpc3RfZSzCoMKgwqA1LCAyNCzCoMKgMHgxKQo+ ID4gPiArSEVWQ19ERUNfUkVHKGNiX3FwX29mZnNldCzCoMKgwqDCoMKgNSwgMTkswqDCoDB4MWYp Cj4gPiA+ICtIRVZDX0RFQ19SRUcoY3JfcXBfb2Zmc2V0LMKgwqDCoMKgwqA1LCAxNCzCoMKgMHgx ZikKPiA+ID4gK0hFVkNfREVDX1JFRyhzaWduX2RhdGFfaGlkZSzCoMKgwqA1LCAxMizCoMKgMHgx KQo+ID4gPiArSEVWQ19ERUNfUkVHKHRlbXBvcl9tdnBfZSzCoMKgwqDCoMKgNSwgMTEswqDCoDB4 MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhtYXhfY3VfcXBkX2RlcHRoLMKgNSwgNSzCoMKgwqAweDNm KQo+ID4gPiArSEVWQ19ERUNfUkVHKGN1X3FwZF9lLMKgwqDCoMKgwqDCoMKgwqDCoDUsIDQswqDC oMKgMHgxKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcoc3RyZWFtX2xlbizCoMKgwqDCoMKg wqDCoDYsIDAswqDCoMKgMHhmZmZmZmZmZikKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKGNh YmFjX2luaXRfcHJlc2VudCwgNywgMzEsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyh3ZWlnaHRf cHJlZF9lLMKgwqDCoMKgIDcsIDI4LCAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcod2VpZ2h0X2Jp cHJfaWRjLMKgwqAgNywgMjYsIDB4MykKPiA+ID4gK0hFVkNfREVDX1JFRyhmaWx0ZXJfb3Zlcl9z bGljZXMsIDcsIDI1LCAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoZmlsdGVyX292ZXJfdGlsZXMs wqAgNywgMjQsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhhc3ltX3ByZWRfZSzCoMKgwqDCoMKg wqAgNywgMjMsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhzYW9fZSzCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgNywgMjIsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhwY21fZmlsdF9kLMKgwqDC oMKgwqDCoMKgIDcsIDIxLCAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoc2xpY2VfY2hxcF9wcmVz ZW50LCA3LCAyMCwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKGRlcGVuZGVudF9zbGljZSzCoMKg IDcsIDE5LCAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoZmlsdGVyX292ZXJyaWRlLMKgwqAgNywg MTgsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhzdHJvbmdfc21vb3RoX2UswqDCoCA3LCAxNywg MHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKGZpbHRfb2Zmc2V0X2JldGEswqAgNywgMTIsIDB4MWYp Cj4gPiA+ICtIRVZDX0RFQ19SRUcoZmlsdF9vZmZzZXRfdGMswqDCoMKgIDcsIDcswqAgMHgxZikK PiA+ID4gK0hFVkNfREVDX1JFRyhzbGljZV9oZHJfZXh0X2UswqDCoCA3LCA2LMKgwqAweDEpCj4g PiA+ICtIRVZDX0RFQ19SRUcoc2xpY2VfaGRyX2V4dF9iaXRzLCA3LCAzLMKgMHg3KQo+ID4gPiAr Cj4gPiA+ICtIRVZDX0RFQ19SRUcoY29uc3RfaW50cmFfZSzCoMKgwqDCoCA4LCAzMSwgMHgxKQo+ ID4gPiArSEVWQ19ERUNfUkVHKGZpbHRfY3RybF9wcmVzLMKgwqDCoCA4LCAzMCwgMHgxKQo+ID4g PiArSEVWQ19ERUNfUkVHKGlkcl9waWNfZSzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCA4LCAxNiwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVHKGJpdF9kZXB0aF9wY21feSzCoMKgIDgs IDEyLCAweGYpCj4gPiA+ICtIRVZDX0RFQ19SRUcoYml0X2RlcHRoX3BjbV9jLMKgwqAgOCwgOCzC oCAweGYpCj4gPiA+ICtIRVZDX0RFQ19SRUcoYml0X2RlcHRoX3lfbWludXM4LCA4LCA2LMKgIDB4 MykKPiA+ID4gK0hFVkNfREVDX1JFRyhiaXRfZGVwdGhfY19taW51czgsIDgsIDQswqAgMHgzKQo+ ID4gPiArSEVWQ19ERUNfUkVHKG91dHB1dF84X2JpdHMswqDCoMKgwqAgOCwgMyzCoCAweDEpCj4g PiA+ICsKPiA+ID4gK0hFVkNfREVDX1JFRyhyZWZpZHgxX2FjdGl2ZSzCoMKgwqA5LCAxOSzCoMKg MHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhyZWZpZHgwX2FjdGl2ZSzCoMKgwqA5LCAxNCzCoMKg MHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhoZHJfc2tpcF9sZW5ndGgswqDCoDksIDAswqDCoMKg MHgzZmZmKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcoc3RhcnRfY29kZV9lLMKgwqDCoMKg wqAxMCwgMzEsIDB4MSkKPiA+ID4gK0hFVkNfREVDX1JFRyhpbml0X3FwLMKgwqDCoMKgwqDCoMKg wqDCoMKgMTAsIDI0LCAweDNmKQo+ID4gPiArSEVWQ19ERUNfUkVHKG51bV90aWxlX2NvbHMswqDC oMKgwqAxMCwgMTksIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcobnVtX3RpbGVfcm93cyzCoMKg wqDCoDEwLCAxNCwgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyh0aWxlX2UswqDCoMKgwqDCoMKg wqDCoMKgwqDCoDEwLCAxLMKgwqAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoZW50cm9weV9zeW5j X2UswqDCoMKgMTAsIDAswqDCoDB4MSkKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKHJlZmVy X2x0ZXJtX2UswqDCoMKgwqAxMiwgMTYsIDB4ZmZmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhtaW5f Y2Jfc2l6ZSzCoMKgwqDCoMKgwqAxMiwgMTMsIDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyhtYXhf Y2Jfc2l6ZSzCoMKgwqDCoMKgwqAxMiwgMTAsIDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyhtaW5f cGNtX3NpemUswqDCoMKgwqDCoDEyLCA3LMKgIDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyhtYXhf cGNtX3NpemUswqDCoMKgwqDCoDEyLCA0LMKgIDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyhwY21f ZSzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxMiwgMyzCoCAweDEpCj4gPiA+ICtIRVZDX0RFQ19S RUcodHJhbnNmb3JtX3NraXAswqDCoMKgMTIsIDIswqDCoDB4MSkKPiA+ID4gK0hFVkNfREVDX1JF Ryh0cmFuc3FfYnlwYXNzLMKgwqDCoMKgMTIsIDEswqDCoDB4MSkKPiA+ID4gK0hFVkNfREVDX1JF RyhsaXN0X21vZF9lLMKgwqDCoMKgwqDCoMKgMTIsIDAswqDCoDB4MSkKPiA+ID4gKwo+ID4gPiAr SEVWQ19ERUNfUkVHKG1pbl90cmJfc2l6ZSzCoMKgwqDCoMKgwqAgMTMsIDEzLCAweDcpCj4gPiA+ ICtIRVZDX0RFQ19SRUcobWF4X3RyYl9zaXplLMKgwqDCoMKgwqDCoCAxMywgMTAsIDB4NykKPiA+ ID4gK0hFVkNfREVDX1JFRyhtYXhfaW50cmFfaGllcmRlcHRoLCAxMywgNyzCoCAweDcpCj4gPiA+ ICtIRVZDX0RFQ19SRUcobWF4X2ludGVyX2hpZXJkZXB0aCwgMTMsIDQswqAgMHg3KQo+ID4gPiAr SEVWQ19ERUNfUkVHKHBhcmFsbGVsX21lcmdlLMKgwqDCoMKgIDEzLCAwLMKgIDB4ZikKPiA+ID4g Kwo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2YwLMKgwqDCoMKgwqDCoMKgwqDCoDE0LCAwLMKg wqAweDFmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2YxLMKgwqDCoMKgwqDCoMKgwqDCoDE0 LCAxMCzCoDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjIswqDCoMKgwqDCoMKgwqDC oMKgMTQsIDIwLMKgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iMCzCoMKgwqDCoMKg wqDCoMKgwqAxNCwgNSzCoMKgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iMSzCoMKg wqDCoMKgwqDCoMKgwqAxNCwgMTUsIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjIs wqDCoMKgwqDCoMKgwqDCoMKgMTQsIDI1LCAweDFmKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19S RUcocmxpc3RfZjMswqDCoMKgwqDCoMKgwqDCoMKgMTUsIDAswqDCoDB4MWYpCj4gPiA+ICtIRVZD X0RFQ19SRUcocmxpc3RfZjQswqDCoMKgwqDCoMKgwqDCoMKgMTUsIDEwLCAweDFmKQo+ID4gPiAr SEVWQ19ERUNfUkVHKHJsaXN0X2Y1LMKgwqDCoMKgwqDCoMKgwqDCoDE1LCAyMCwgMHgxZikKPiA+ ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iMyzCoMKgwqDCoMKgwqDCoMKgwqAxNSwgNSzCoMKgMHgx ZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iNCzCoMKgwqDCoMKgwqDCoMKgwqAxNSwgMTUs IDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjUswqDCoMKgwqDCoMKgwqDCoMKgMTUs IDI1LCAweDFmKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjYswqDCoMKgwqDC oMKgwqDCoMKgMTYsIDAswqDCoDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjcswqDC oMKgwqDCoMKgwqDCoMKgMTYsIDEwLCAweDFmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2Y4 LMKgwqDCoMKgwqDCoMKgwqDCoDE2LCAyMCwgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlz dF9iNizCoMKgwqDCoMKgwqDCoMKgwqAxNiwgNSzCoMKgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JF RyhybGlzdF9iNyzCoMKgwqDCoMKgwqDCoMKgwqAxNiwgMTUsIDB4MWYpCj4gPiA+ICtIRVZDX0RF Q19SRUcocmxpc3RfYjgswqDCoMKgwqDCoMKgwqDCoMKgMTYsIDI1LCAweDFmKQo+ID4gPiArCj4g PiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjkswqDCoMKgwqDCoMKgwqDCoMKgMTcsIDAswqDCoDB4 MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjEwLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgMTcsIDEwLCAweDFmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2YxMSzCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDE3LCAyMCwgMHgxZikKPiA+ID4gK0hFVkNfREVD X1JFRyhybGlzdF9iOSzCoMKgwqDCoMKgwqDCoMKgwqAxNywgNSzCoMKgMHgxZikKPiA+ID4gK0hF VkNfREVDX1JFRyhybGlzdF9iMTAswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxNywg MTUsIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjExLMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgMTcsIDI1LCAweDFmKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUco cmxpc3RfZjEyLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTgsIDAswqDCoDB4MWYp Cj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfZjEzLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgMTgsIDEwLCAweDFmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHJsaXN0X2YxNCzCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDE4LCAyMCwgMHgxZikKPiA+ID4gK0hFVkNfREVDX1JF RyhybGlzdF9iMTIswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxOCwgNSzCoMKgMHgx ZikKPiA+ID4gK0hFVkNfREVDX1JFRyhybGlzdF9iMTMswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAxOCwgMTUsIDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjE0LMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTgsIDI1LCAweDFmKQo+ID4gPiArCj4gPiA+ICtI RVZDX0RFQ19SRUcocmxpc3RfZjE1LMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTks IDAswqDCoDB4MWYpCj4gPiA+ICtIRVZDX0RFQ19SRUcocmxpc3RfYjE1LMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgMTksIDUswqDCoDB4MWYpCj4gPiA+ICsKPiA+ID4gK0hFVkNfREVD X1JFRyhwYXJ0aWFsX2N0Yl94LMKgwqDCoMKgMjAsIDMxLCAweDEpCj4gPiA+ICtIRVZDX0RFQ19S RUcocGFydGlhbF9jdGJfeSzCoMKgwqDCoDIwLCAzMCwgMHgxKQo+ID4gPiArSEVWQ19ERUNfUkVH KHBpY193aWR0aF80eDQswqDCoMKgwqAyMCwgMTYsIDB4ZmZmKQo+ID4gPiArSEVWQ19ERUNfUkVH KHBpY19oZWlnaHRfNHg0LMKgwqDCoDIwLCAwLMKgIDB4ZmZmKQo+ID4gPiArCj4gPiA+ICtIRVZD X0RFQ19SRUcoY3VyX3BvY18wMCzCoMKgwqDCoMKgwqDCoDQ2LCAyNCzCoDB4ZmYpCj4gPiA+ICtI RVZDX0RFQ19SRUcoY3VyX3BvY18wMSzCoMKgwqDCoMKgwqDCoDQ2LCAxNizCoDB4ZmYpCj4gPiA+ ICtIRVZDX0RFQ19SRUcoY3VyX3BvY18wMizCoMKgwqDCoMKgwqDCoDQ2LCA4LMKgwqAweGZmKQo+ ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMDMswqDCoMKgwqDCoMKgwqA0NiwgMCzCoMKgMHhm ZikKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMDQswqDCoMKgwqDCoMKgwqA0 NywgMjQswqAweGZmKQo+ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMDUswqDCoMKgwqDCoMKg wqA0NywgMTYswqAweGZmKQo+ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMDYswqDCoMKgwqDC oMKgwqA0NywgOCzCoMKgMHhmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhjdXJfcG9jXzA3LMKgwqDC oMKgwqDCoMKgNDcsIDAswqDCoDB4ZmYpCj4gPiA+ICsKPiA+ID4gK0hFVkNfREVDX1JFRyhjdXJf cG9jXzA4LMKgwqDCoMKgwqDCoMKgNDgsIDI0LMKgMHhmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhj dXJfcG9jXzA5LMKgwqDCoMKgwqDCoMKgNDgsIDE2LMKgMHhmZikKPiA+ID4gK0hFVkNfREVDX1JF RyhjdXJfcG9jXzEwLMKgwqDCoMKgwqDCoMKgNDgsIDgswqDCoDB4ZmYpCj4gPiA+ICtIRVZDX0RF Q19SRUcoY3VyX3BvY18xMSzCoMKgwqDCoMKgwqDCoDQ4LCAwLMKgwqAweGZmKQo+ID4gPiArCj4g PiA+ICtIRVZDX0RFQ19SRUcoY3VyX3BvY18xMizCoMKgwqDCoMKgwqDCoDQ5LCAyNCwgMHhmZikK PiA+ID4gK0hFVkNfREVDX1JFRyhjdXJfcG9jXzEzLMKgwqDCoMKgwqDCoMKgNDksIDE2LCAweGZm KQo+ID4gPiArSEVWQ19ERUNfUkVHKGN1cl9wb2NfMTQswqDCoMKgwqDCoMKgwqA0OSwgOCzCoMKg MHhmZikKPiA+ID4gK0hFVkNfREVDX1JFRyhjdXJfcG9jXzE1LMKgwqDCoMKgwqDCoMKgNDksIDAs wqDCoDB4ZmYpCj4gPiA+ICsKPiA+ID4gK0hFVkNfREVDX1JFRyhhcGZfdGhyZXNob2xkLMKgwqDC oMKgNTUsIDAswqDCoDB4ZmZmZikKPiA+ID4gKwo+ID4gPiArSEVWQ19ERUNfUkVHKGNsa19nYXRl X2UswqDCoMKgwqDCoMKgwqA1OCwgMTYswqAweDEpCj4gPiA+ICtIRVZDX0RFQ19SRUcoYnVzd2lk dGgswqDCoMKgwqDCoMKgwqDCoMKgNTgsIDgswqDCoDB4NykKPiA+ID4gK0hFVkNfREVDX1JFRyht YXhfYnVyc3QswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA1OCwgMCzCoMKgMHhmZikK PiA+ID4gKwo+ID4gPiArI2RlZmluZSBIRVZDX1JFR19DT05GSUfCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRzJfU1dSRUcoNTgp Cj4gPiA+ICsjZGVmaW5lIEhFVkNfUkVHX0NPTkZJR19ERUNfQ0xLX0dBVEVfRcKgwqDCoMKgwqDC oMKgwqDCoEJJVCgxNikKPiA+ID4gKyNkZWZpbmUgSEVWQ19SRUdfQ09ORklHX0RFQ19DTEtfR0FU RV9JRExFX0XCoMKgwqDCoEJJVCgxNykKPiA+ID4gKwo+ID4gPiArI2RlZmluZSBIRVZDX0FERFJf RFNUwqDCoMKgwqDCoMKgwqDCoMKgwqAoRzJfU1dSRUcoNjUpKQo+ID4gPiArI2RlZmluZSBIRVZD X1JFR19BRERSX1JFRihpKcKgwqDCoChHMl9TV1JFRyg2NynCoCArICgoaSkgKiAweDgpKQo+ID4g PiArI2RlZmluZSBIRVZDX0FERFJfRFNUX0NIUsKgwqDCoMKgwqDCoChHMl9TV1JFRyg5OSkpCj4g PiA+ICsjZGVmaW5lIEhFVkNfUkVHX0NIUl9SRUYoaSnCoMKgwqDCoChHMl9TV1JFRygxMDEpICsg KChpKSAqIDB4OCkpCj4gPiA+ICsjZGVmaW5lIEhFVkNfQUREUl9EU1RfTVbCoMKgwqDCoMKgwqDC oChHMl9TV1JFRygxMzMpKQo+ID4gPiArI2RlZmluZSBIRVZDX1JFR19ETVZfUkVGKGkpwqDCoMKg wqAoRzJfU1dSRUcoMTM1KSArICgoaSkgKiAweDgpKQo+ID4gPiArI2RlZmluZSBIRVZDX0FERFJf VElMRV9TSVpFwqDCoMKgwqAoRzJfU1dSRUcoMTY3KSkKPiA+ID4gKyNkZWZpbmUgSEVWQ19BRERS X1NUUsKgwqDCoMKgwqDCoMKgwqDCoMKgKEcyX1NXUkVHKDE2OSkpCj4gPiA+ICsjZGVmaW5lIEhF VkNfU0NBTElOR19MSVNUwqDCoMKgwqDCoMKgKEcyX1NXUkVHKDE3MSkpCj4gPiA+ICsjZGVmaW5l IEhFVkNfUkFTVEVSX1NDQU7CoMKgwqDCoMKgwqDCoChHMl9TV1JFRygxNzUpKQo+ID4gPiArI2Rl ZmluZSBIRVZDX1JBU1RFUl9TQ0FOX0NIUsKgwqDCoChHMl9TV1JFRygxNzcpKQo+ID4gPiArI2Rl ZmluZSBIRVZDX1RJTEVfRklMVEVSwqDCoMKgwqDCoMKgwqAoRzJfU1dSRUcoMTc5KSkKPiA+ID4g KyNkZWZpbmUgSEVWQ19USUxFX1NBT8KgwqDCoMKgwqDCoMKgwqDCoMKgKEcyX1NXUkVHKDE4MSkp Cj4gPiA+ICsjZGVmaW5lIEhFVkNfVElMRV9CU0TCoMKgwqDCoMKgwqDCoMKgwqDCoChHMl9TV1JF RygxODMpKQo+ID4gPiArCj4gPiA+ICtIRVZDX0RFQ19SRUcoc3RybV9idWZmZXJfbGVuLMKgwqAy NTgsIDAswqAweGZmZmZmZmZmKQo+ID4gPiArSEVWQ19ERUNfUkVHKHN0cm1fc3RhcnRfb2Zmc2V0 LMKgwqDCoMKgwqDCoMKgwqAyNTksIDAswqAweGZmZmZmZmZmKQo+ID4gPiArCj4gPiA+ICsjZW5k aWYKPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJv X2hldmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX2hldmMuYwo+ID4g PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjhlMzE5YTgz N2ZmMwo+ID4gPiAtLS0gL2Rldi9udWxsCj4gPiA+ICsrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRp YS9oYW50cm8vaGFudHJvX2hldmMuYwo+ID4gPiBAQCAtMCwwICsxLDMyMSBAQAo+ID4gPiArLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiA+ID4gKy8qCj4gPiA+ICsgKiBIYW50 cm8gVlBVIEhFVkMgY29kZWMgZHJpdmVyCj4gPiA+ICsgKgo+ID4gPiArICogQ29weXJpZ2h0IChD KSAyMDIwIFNhZnJhbiBQYXNzZW5nZXIgSW5ub3ZhdGlvbnMgTExDCj4gPiA+ICsgKi8KPiA+ID4g Kwo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gPiA+ICsjaW5jbHVkZSA8bWVkaWEv djRsMi1tZW0ybWVtLmg+Cj4gPiA+ICsKPiA+ID4gKyNpbmNsdWRlICJoYW50cm8uaCIKPiA+ID4g KyNpbmNsdWRlICJoYW50cm9faHcuaCIKPiA+ID4gKwo+ID4gPiArI2RlZmluZSBWRVJUX0ZJTFRF Ul9SQU1fU0laRSA4IC8qIGJ5dGVzIHBlciBwaXhlbCByb3cgKi8KPiA+ID4gKy8qCj4gPiA+ICsg KiBCU0QgY29udHJvbCBkYXRhIG9mIGN1cnJlbnQgcGljdHVyZSBhdCB0aWxlIGJvcmRlcgo+ID4g PiArICogMTI4IGJpdHMgcGVyIDR4NCB0aWxlID0gMTI4Lyg4KjQpIGJ5dGVzIHBlciByb3cKPiA+ ID4gKyAqLwo+ID4gPiArI2RlZmluZSBCU0RfQ1RSTF9SQU1fU0laRSA0IC8qIGJ5dGVzIHBlciBw aXhlbCByb3cgKi8KPiA+ID4gKy8qIHRpbGUgYm9yZGVyIGNvZWZmaWNpZW50cyBvZiBmaWx0ZXIg Ki8KPiA+ID4gKyNkZWZpbmUgVkVSVF9TQU9fUkFNX1NJWkUgNDggLyogYnl0ZXMgcGVyIHBpeGVs ICovCj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgTUFYX1RJTEVfQ09MUyAyMAo+ID4gPiArI2RlZmlu ZSBNQVhfVElMRV9ST1dTIDIyCj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgVU5VU0VEX1JFRsKgwqDC oMKgwqAtMQo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIEcyX0FMSUdOwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgMTYKPiA+ID4gKyNkZWZpbmUgTUNfV09SRF9TSVpFwqDCoMKgwqDCoMKgwqDC oMKgwqDCoDMyCj4gPiA+ICsKPiA+ID4gK3NpemVfdCBoYW50cm9faGV2Y19jaHJvbWFfb2Zmc2V0 KGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMgKnNwcykKPiA+ID4gK3sKPiA+ID4gK8Kg wqDCoMKgwqDCoMKgaW50IGJ5dGVzX3Blcl9waXhlbCA9IHNwcy0+Yml0X2RlcHRoX2x1bWFfbWlu dXM4ID09IDAgPyAxIDogMjsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gc3Bz LT5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzICoKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHNwcy0+cGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgKiBieXRlc19wZXJfcGl4 ZWw7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3NpemVfdCBoYW50cm9faGV2Y19tb3Rpb25fdmVj dG9yc19vZmZzZXQoY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3NwcyAqc3BzKQo+ID4gPiAr ewo+ID4gPiArwqDCoMKgwqDCoMKgwqBzaXplX3QgY3Jfb2Zmc2V0ID0gaGFudHJvX2hldmNfY2hy b21hX29mZnNldChzcHMpOwo+ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiBBTElH TigoY3Jfb2Zmc2V0ICogMykgLyAyLCBHMl9BTElHTikgKyBNQ19XT1JEX1NJWkU7Cj4gPiA+ICt9 Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBzaXplX3QgaGFudHJvX2hldmNfbXZfc2l6ZShjb25zdCBz dHJ1Y3QgdjRsMl9jdHJsX2hldmNfc3BzICpzcHMpCj4gPiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKg wqDCoHUzMiBwaWNfd2lkdGhfaW5fY3RiNjQgPSAoc3BzLT5waWNfd2lkdGhfaW5fbHVtYV9zYW1w bGVzICsgKDEgPDwgOCkgLSAxKSA+PiA4Owo+ID4gPiArwqDCoMKgwqDCoMKgwqB1MzIgcGljX2hl aWdodF9pbl9jdGI2NCA9IChzcHMtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzwqAgKyAoMSA8 PCA4KSAtIDEpID4+IDg7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHNpemVfdCBtdl9zaXplOwo+ID4g PiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoG12X3NpemUgPSAocGljX3dpZHRoX2luX2N0YjY0ICog cGljX2hlaWdodF9pbl9jdGI2NCAqCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAoMSA8PCAoMiAqICg4IC0gNCkpKSAqIDE2KSArIDMyOwo+ID4gPiArCj4gPiA+ICvCoMKg wqDCoMKgwqDCoHZwdV9kZWJ1Zyg0LCAiJWR4JWQgKENUQnMpICVsdSBNViBieXRlc1xuIiwKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBpY193aWR0aF9pbl9jdGI2NCwg cGljX2hlaWdodF9pbl9jdGI2NCwgbXZfc2l6ZSk7Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDC oMKgcmV0dXJuIG12X3NpemU7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBzaXplX3Qg aGFudHJvX2hldmNfcmVmX3NpemUoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiA+ID4gK3sKPiA+ ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IGhhbnRyb19oZXZjX2RlY19jdHJscyAqY3Ry bHMgPSAmY3R4LT5oZXZjX2RlYy5jdHJsczsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgY29uc3Qgc3Ry dWN0IHY0bDJfY3RybF9oZXZjX3NwcyAqc3BzID0gY3RybHMtPnNwczsKPiA+ID4gKwo+ID4gPiAr wqDCoMKgwqDCoMKgwqByZXR1cm4gaGFudHJvX2hldmNfbW90aW9uX3ZlY3RvcnNfb2Zmc2V0KHNw cykgKyBoYW50cm9faGV2Y19tdl9zaXplKHNwcyk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0 YXRpYyB2b2lkIGhhbnRyb19oZXZjX3JlZl9mcmVlKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4g PiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9faGV2Y19kZWNfaHdfY3R4 ICpoZXZjX2RlYyA9ICZjdHgtPmhldmNfZGVjOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg aGFudHJvX2RldiAqdnB1ID0gY3R4LT5kZXY7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoGludCBpOwo+ ID4gPiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoC8qIEp1c3QgdGFnIGJ1ZmZlciBhcyB1bnVzZWQs IGRvIG5vdCBmcmVlIHRoZW0gKi8KPiA+IFRoaXMgY29tbWVudCBzZWVtcyB3cm9uZy4KPiAKPiBZ b3UgYXJlIHJpZ2h0IEkgd2lsbCByZW1vdmUgaXQuCj4gCj4gPiAKPiA+ID4gK8KgwqDCoMKgwqDC oMKgZm9yIChpID0gMDvCoCBpIDwgTlVNX1JFRl9QSUNUVVJFUzsgaSsrKSB7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoaGV2Y19kZWMtPnJlZl9idWZzW2ldLmNwdSkg ewo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1l bXNldChoZXZjX2RlYy0+cmVmX2J1ZnNbaV0uY3B1LCAwLCBoYW50cm9faGV2Y19yZWZfc2l6ZShj dHgpKTsKPiA+IElzIHRoaXMgbWVtc2V0IGNsZWFyaW5nIHRoZSBidWZmZXIgcmVxdWlyZWQ/IElm IHdlJ3JlIGdldHRpbmcgYXJ0aWZhY3RzCj4gPiBmcm9tIHByZXZpb3VzIGRlY29kZXMsIHRoZW4g dGhhdCB3b3VsZCBiZSBtb3JlIG9mIGEgYnVnIHNvbWV3aGVyZS4KPiAKPiBDbGVhciBpcyBkb25l IGFmdGVyIGFsbG9jYXRpbmcvcmV1c2VkIHRoZSBidWZmZXIgSSBjYW4gcmVtb3ZlIHRoaXMgb25l Lgo+IAo+ID4gCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZG1hX2ZyZWVfY29oZXJlbnQodnB1LT5kZXYsIGhldmNfZGVjLT5yZWZfYnVmc1tpXS5z aXplLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaGV2Y19kZWMtPnJlZl9idWZzW2ld LmNwdSwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGhldmNfZGVjLT5yZWZfYnVmc1tp XS5kbWEpOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gPiArwqDC oMKgwqDCoMKgwqB9Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyB2b2lkIGhhbnRyb19o ZXZjX3JlZl9pbml0KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gPiA+ICt7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoHN0cnVjdCBoYW50cm9faGV2Y19kZWNfaHdfY3R4ICpoZXZjX2RlYyA9ICZjdHgt PmhldmNfZGVjOwo+ID4gPiArwqDCoMKgwqDCoMKgwqBpbnQgaTsKPiA+ID4gKwo+ID4gPiArwqDC oMKgwqDCoMKgwqBmb3IgKGkgPSAwO8KgIGkgPCBOVU1fUkVGX1BJQ1RVUkVTOyBpKyspCj4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX2RlYy0+cmVmX2J1ZnNfcG9jW2ld ID0gVU5VU0VEX1JFRjsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArZG1hX2FkZHJfdCBoYW50cm9f aGV2Y19nZXRfcmVmX2J1ZihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4LAo+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGludCBwb2MpCj4gPiA+ICt7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9faGV2 Y19kZWNfaHdfY3R4ICpoZXZjX2RlYyA9ICZjdHgtPmhldmNfZGVjOwo+ID4gPiArwqDCoMKgwqDC oMKgwqBpbnQgaTsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqAvKiBGaW5kIHRoZSByZWZl cmVuY2UgYnVmZmVyIGluIGFscmVhZHkga25vdyBvbmVzICovCj4gPiA+ICvCoMKgwqDCoMKgwqDC oGZvciAoaSA9IDA7wqAgaSA8IE5VTV9SRUZfUElDVFVSRVM7IGkrKykgewo+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGhldmNfZGVjLT5yZWZfYnVmc19wb2NbaV0gPT0g cG9jKSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaGV2Y19kZWMtPnJlZl9idWZzX3VzZWQgfD0gMSA8PCBpOwo+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBoZXZjX2RlYy0+cmVmX2J1 ZnNbaV0uZG1hOwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gPiAr wqDCoMKgwqDCoMKgwqB9Cj4gPiA+ICsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyogQWxsb2NhdGUg YSBuZXcgcmVmZXJlbmNlIGJ1ZmZlciAqLwo+ID4gPiArwqDCoMKgwqDCoMKgwqBmb3IgKGkgPSAw OyBpIDwgTlVNX1JFRl9QSUNUVVJFUzsgaSsrKSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiAoaGV2Y19kZWMtPnJlZl9idWZzX3BvY1tpXSA9PSBVTlVTRURfUkVGKSB7 Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg KCFoZXZjX2RlYy0+cmVmX2J1ZnNbaV0uY3B1KSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBoYW50cm9f ZGV2ICp2cHUgPSBjdHgtPmRldjsKPiA+ID4gKwo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoZXZjX2RlYy0+cmVmX2J1 ZnNbaV0uY3B1ID0KPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRtYV9hbGxvY19jb2hlcmVu dCh2cHUtPmRldiwKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBoYW50cm9faGV2Y19yZWZfc2l6ZShjdHgpLAo+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZo ZXZjX2RlYy0+cmVmX2J1ZnNbaV0uZG1hLAo+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEdGUF9LRVJORUwpOwo+ID4gSXMgdGhl cmUgYW55IHJlYXNvbiB3aHkgd2UgbmVlZCB0byBhbGxvY2F0ZSByZWZlcmVuY2UgYnVmZmVycyBh bmQgTVYgY29udGlndW91c2x5Pwo+IAo+IEl0IGlzIGRvbmUgbGlrZSB0aGF0IGluIElNWCByZWZl cmVuY2UgY29kZSBhbmQgbWFrZXMgdGhlIG1hbmFnZW1lbnQgb2YgcmVmZXJlbmNlIGZyYW1lCj4g YW5kIE1WIG1vcmUgc2ltcGxlLgo+IAo+ID4gCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICghaGV2Y19kZWMtPnJl Zl9idWZzW2ldLmNwdSkKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4g PiArCj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGhldmNfZGVjLT5yZWZfYnVmc1tpXS5zaXplID0gaGFudHJvX2hldmNf cmVmX3NpemUoY3R4KTsKPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqB9Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaGV2Y19kZWMtPnJlZl9idWZzX3VzZWQgfD0gMSA8PCBpOwo+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1lbXNldChoZXZjX2RlYy0+ cmVmX2J1ZnNbaV0uY3B1LCAwLCBoYW50cm9faGV2Y19yZWZfc2l6ZShjdHgpKTsKPiA+IAo+ID4g SSBiZWxpZXZlIHRoZSBjb2hlcmVudCBhbGxvY2F0aW9uIGlzIHRvIGJlIGFibGUgdG8gY2xlYXIg ZWFjaCByZWZlcmVuY2UsIGJ1dCBpcyB0aGlzCj4gPiByZWFsbHkgbmVlZGVkPyBJIHJlY2FsbCBt YXliZSBvbmx5IHRoZSBNViBidWZmZXIgbmVlZHMgY2xlYXJpbmcsIG1heWJlIHlvdSBjYW4gdHJ5 IHRoYXQ/Cj4gPiAKPiA+IEFsc28sIGlmIHRoYXQncyB0aGUgY2FzZSwgdGhlbiBhbGxvY2F0aW5n IHRoZSBNViBidWZmZXIgc2VwYXJhdGVkbHkgd2lsbCBhbGxvdwo+ID4gdG8gbm90IGFsbG9jYXRl IHRoZSByZWZlcmVuY2UgYnVmZmVycyBjb2hlcmVudGx5IChub3RlIHRoYXQgd2UgdXNlIE5PX01B UFBJTkcKPiA+IGluIHRoZSB2YjJfcXVldWUsIHNvIHRoZSB2YjJfYnVmZmVycyBzaG91bGRuJ3Qg YmUgY29oZXJlbnQpLgo+IAo+IFRoYXQgc291bmQgbGlrZSBnb29kIHBvc3NpYmxlIG9wdGltaXph dGlvbnMgYnV0IEknbSBub3QgYXQgdGhpcyBzdGFnZS4KPiBJIHdvdWxkIHJhdGhlciBrZWVwIGl0 IGluIHRoaXMgZmFpcmx5IGZ1bmN0aW9uYWwgc3RhdGUgYW5kIGltcHJvdmUgaXQgbGF0ZXIuCj4g SSB0aGluayB0aGUgcGF0Y2hlcyBhcmUgYWxyZWFkeSBlbm91Z2ggbGFyZ2VzIGFuZCBjb21wbGV4 ZXMgbGlrZSB0aGF0Lgo+IAoKRmFpciBlbm91Z2guIEkgdGhpbmsgaXQncyBncmVhdCB0byBoYXZl IGEgZmlyc3Qgd29ya2luZwp2ZXJzaW9uIDopCgpDb3VsZCB5b3UgYWRkIGEgY29tbWVudCBmb3Ig dGhpcywgc3BlY2lhbGx5IGF0IHRoZQptZW1zZXQncyBhbmQgdGhlIGRtYV9hbGxvY19jb2hlcmVu dCwgKG9yIG9wdGlvbmFsbHkKYXQgdGhlIGhlYWRlciBvZiB0aGlzIC5jIGZpbGUpLCBpbiBjYXNl IHNvbWVvbmUKd2FudHMgdG8gcmV2aXNpdCB0aGlzIHRvcGljPwoKVGhhbmtzIGEgbG90IQpFemVx dWllbCAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1hcm0ta2VybmVsCg==