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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 09F89C77B7A for ; Sat, 20 May 2023 18:58:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229963AbjETS6A (ORCPT ); Sat, 20 May 2023 14:58:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36906 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229779AbjETS57 (ORCPT ); Sat, 20 May 2023 14:57:59 -0400 Received: from mail-pg1-x535.google.com (mail-pg1-x535.google.com [IPv6:2607:f8b0:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4228DFD for ; Sat, 20 May 2023 11:57:55 -0700 (PDT) Received: by mail-pg1-x535.google.com with SMTP id 41be03b00d2f7-51f6461af24so3024558a12.2 for ; Sat, 20 May 2023 11:57:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684609075; x=1687201075; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=rrpTll+/MtlXyUgF3bRhfqGpnxE93eXDQ7Ko/cupjpY=; b=pUyBw0embAQ4Zs7tAhkY0xj78eHOmnRkj16Qi5+ZTB9Vy3ObnRovc+kKmH9V8z0it/ bicmfHFYSsLxo160zybwib0Mb6HZrLD8p/eUQVBVT5p1xTNu+I9+iufXfrgNz0wrkPNQ uGmEZ3sXi/HjceY/XFTeyLsUfUzAvT9s52W225P3T95k6SgDB6W2SFrRR26sr3xqZ2iA YdvTM3utp+sqc4yuoKBtxt452b8uOKIje1ye8idqhs2gWTzrAVAvJFrzfaX1MTm+PdhT e6K4OL/EMsRX8TTmLaxrn9Z/hUJjpWpKNHYdo0mHTOZyrc1bLQgx3aRUGhIi8GjyQlQj 4Tkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684609075; x=1687201075; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rrpTll+/MtlXyUgF3bRhfqGpnxE93eXDQ7Ko/cupjpY=; b=gvTiNq8E9M+CskOvTAEDq7DALwQOvy7nTO2SUDwX7Jq78QSoGyIURZYmtHPB+cLB37 UdknRYzPvOw3wSINWbZ+vjm/uXFTSO6cZrYI2zqZpccRCnfUicusBM7jZ/wbr/aNYxeI VeX14qrpPB83lJvasqpP5WBZJLzN2ZRDoW1zCG4SRIma13Id4LGpPUkZB5pIVgWJdwTO SxAvG8E3f1gY2gxTAQkoqYANQSLzKkPsg87YtarpNoL75rliXCvKlESjHJJQIEtedLZh 2ET6aBuKpL/c2aszHhiCknU6/U+YjASO7frX1sLy3i1DM7CiFtShDaCsMC+WqtgDY9qu iohg== X-Gm-Message-State: AC+VfDx6ibiyGbMA+J4NduL1t08HrS4tSyCSUVap14i6sCl+d2cArwRB pHlY99AhdEtLtETWU7cgKCOBFheGEKT0c1A+j674ED+o X-Google-Smtp-Source: ACHHUZ7tqIchEzpWavEuzUbE53s+Wb68jFlTeGS8tfuwpP8Oi1y/90Eak9sLvO1GfRmIcTV7baBDVlydrK/dvyFKm+4= X-Received: by 2002:a17:90a:7187:b0:254:6953:f7b6 with SMTP id i7-20020a17090a718700b002546953f7b6mr3053550pjk.20.1684609073920; Sat, 20 May 2023 11:57:53 -0700 (PDT) MIME-Version: 1.0 References: <20230309125651.23911-1-andrzej.p@collabora.com> <20230309125651.23911-3-andrzej.p@collabora.com> In-Reply-To: <20230309125651.23911-3-andrzej.p@collabora.com> From: Adam Ford Date: Sat, 20 May 2023 13:57:42 -0500 Message-ID: Subject: Re: [RFC 2/2] media: rkvdec: Add VP8 encoder To: Andrzej Pietrasiewicz Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab , Ezequiel Garcia , Philipp Zabel , Heiko Stuebner , kernel@collabora.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org On Thu, Mar 9, 2023 at 6:59=E2=80=AFAM Andrzej Pietrasiewicz wrote: > > A stateless VP8 encoder for rockchip vpu2 found e.g. in rk3399. > > Signed-off-by: Andrzej Pietrasiewicz Is there a good place or resource where I could learn more about what's needed to port the vpu1 VP8 encoder? I'd really like to port the Hantro H1 encoder that's used on the imx8mm, but it seems like the vpu2 encoder has different registers than the H1 encoder on the Mini. I was hoping my employer would send me to Prague for the conference at the end of June, but unfortunately, that's not going to happen. I'd like to get more involved with projects like this as a personal side project. adam > --- > drivers/media/platform/verisilicon/Makefile | 2 + > drivers/media/platform/verisilicon/hantro.h | 10 + > .../platform/verisilicon/hantro_boolenc.c | 69 + > .../platform/verisilicon/hantro_boolenc.h | 21 + > .../media/platform/verisilicon/hantro_drv.c | 18 +- > .../media/platform/verisilicon/hantro_hw.h | 90 + > .../media/platform/verisilicon/hantro_v4l2.c | 5 +- > .../media/platform/verisilicon/hantro_vp8.c | 118 ++ > .../verisilicon/rockchip_vpu2_hw_vp8_enc.c | 1574 +++++++++++++++++ > .../platform/verisilicon/rockchip_vpu2_regs.h | 1 + > .../platform/verisilicon/rockchip_vpu_hw.c | 23 +- > 11 files changed, 1925 insertions(+), 6 deletions(-) > create mode 100644 drivers/media/platform/verisilicon/hantro_boolenc.c > create mode 100644 drivers/media/platform/verisilicon/hantro_boolenc.h > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu2_hw_v= p8_enc.c > > diff --git a/drivers/media/platform/verisilicon/Makefile b/drivers/media/= platform/verisilicon/Makefile > index ebd5ede7bef7..a1cd18b8dfe7 100644 > --- a/drivers/media/platform/verisilicon/Makefile > +++ b/drivers/media/platform/verisilicon/Makefile > @@ -6,6 +6,7 @@ hantro-vpu-y +=3D \ > hantro_drv.o \ > hantro_v4l2.o \ > hantro_postproc.o \ > + hantro_boolenc.o \ > hantro_h1_jpeg_enc.o \ > hantro_g1.o \ > hantro_g1_h264_dec.o \ > @@ -18,6 +19,7 @@ hantro-vpu-y +=3D \ > rockchip_vpu2_hw_h264_dec.o \ > rockchip_vpu2_hw_mpeg2_dec.o \ > rockchip_vpu2_hw_vp8_dec.o \ > + rockchip_vpu2_hw_vp8_enc.o \ > hantro_jpeg.o \ > hantro_h264.o \ > hantro_hevc.o \ > diff --git a/drivers/media/platform/verisilicon/hantro.h b/drivers/media/= platform/verisilicon/hantro.h > index 2989ebc631cc..512a235686b9 100644 > --- a/drivers/media/platform/verisilicon/hantro.h > +++ b/drivers/media/platform/verisilicon/hantro.h > @@ -32,6 +32,7 @@ struct hantro_codec_ops; > struct hantro_postproc_ops; > > #define HANTRO_JPEG_ENCODER BIT(0) > +#define HANTRO_VP8_ENCODER BIT(1) > #define HANTRO_ENCODERS 0x0000ffff > #define HANTRO_MPEG2_DECODER BIT(16) > #define HANTRO_VP8_DECODER BIT(17) > @@ -111,6 +112,7 @@ struct hantro_variant { > * @HANTRO_MODE_VP8_DEC: VP8 decoder. > * @HANTRO_MODE_HEVC_DEC: HEVC decoder. > * @HANTRO_MODE_VP9_DEC: VP9 decoder. > + * @HANTRO_MODE_VP8_ENC: VP8 encoder. > */ > enum hantro_codec_mode { > HANTRO_MODE_NONE =3D -1, > @@ -120,6 +122,7 @@ enum hantro_codec_mode { > HANTRO_MODE_VP8_DEC, > HANTRO_MODE_HEVC_DEC, > HANTRO_MODE_VP9_DEC, > + HANTRO_MODE_VP8_ENC, > }; > > /* > @@ -265,6 +268,7 @@ struct hantro_ctx { > struct hantro_vp8_dec_hw_ctx vp8_dec; > struct hantro_hevc_dec_hw_ctx hevc_dec; > struct hantro_vp9_dec_hw_ctx vp9_dec; > + struct hantro_vp8_enc_hw_ctx vp8_enc; > }; > }; > > @@ -361,6 +365,12 @@ extern int hantro_debug; > #define vpu_err(fmt, args...) \ > pr_err("%s:%d: " fmt, __func__, __LINE__, ##args) > > +static inline unsigned int hantro_rounded_luma_size(unsigned int w, > + unsigned int h) > +{ > + return round_up(w, MB_DIM) * round_up(h, MB_DIM); > +} > + > /* Structure access helpers. */ > static inline struct hantro_ctx *fh_to_ctx(struct v4l2_fh *fh) > { > diff --git a/drivers/media/platform/verisilicon/hantro_boolenc.c b/driver= s/media/platform/verisilicon/hantro_boolenc.c > new file mode 100644 > index 000000000000..88a1c1c166fe > --- /dev/null > +++ b/drivers/media/platform/verisilicon/hantro_boolenc.c > @@ -0,0 +1,69 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include > + > +#include "hantro_boolenc.h" > + > +void hantro_boolenc_init(struct hantro_boolenc *e, uint8_t *output) > +{ > + e->output =3D output; > + e->range =3D 255; > + e->bottom =3D 0; > + e->bit_count =3D 24; > + e->bytes_written =3D 0; > +} > + > +/* > + * Add one to a number stored in bytes preceding *q. > + * There's exactly bytes_written such bytes. > + * > + * The spec guarantees that the backward search won't go beyond > + * the start of the buffer, so if we detect such condition we can > + * BUG_ON() - this should never happen anyway. > + */ > +static void add_one_to_output(uint8_t *q, int bytes_written) > +{ > + /* > + * originally: > + * while (*--q =3D=3D 0xff) > + * *q =3D 0; > + */ > + for (;;) { > + BUG_ON(bytes_written-- <=3D 0); /* check if we're allowed= to go back one byte */ > + > + if (*--q =3D=3D 0xff) /* adding a 1 overflows= *--q? */ > + *q =3D 0; /* yes, so zero *q */ > + else > + break; /* no, we're good to add 1 = */ > + } > + > + ++*q; /* add 1 */ > +} > + > +void hantro_boolenc_write_bool(struct hantro_boolenc *e, uint32_t prob, = bool bool_value) > +{ > + uint32_t split =3D 1 + (((e->range - 1) * prob) >> 8); > + > + if (bool_value) { > + e->bottom +=3D split; > + e->range -=3D split; > + } else { > + e->range =3D split; > + } > + > + while (e->range < 128) { > + e->range <<=3D 1; > + > + if (e->bottom & (1 << 31)) > + add_one_to_output(e->output, e->bytes_written); > + > + e->bottom <<=3D 1; > + > + if (!--e->bit_count) { > + *e->output++ =3D (uint8_t)(e->bottom >> 24); > + ++e->bytes_written; > + e->bottom &=3D (1 << 24) - 1; > + e->bit_count =3D 8; > + } > + } > +} > diff --git a/drivers/media/platform/verisilicon/hantro_boolenc.h b/driver= s/media/platform/verisilicon/hantro_boolenc.h > new file mode 100644 > index 000000000000..80ec686d504d > --- /dev/null > +++ b/drivers/media/platform/verisilicon/hantro_boolenc.h > @@ -0,0 +1,21 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > + > +#include > + > +struct hantro_boolenc { > + uint8_t *output; /* next byte pointer */ > + uint32_t range; > + uint32_t bottom; /* 4 LSB of leftmost end of the range, MS= B alread in output */ > + int bit_count; /* how many shifts until next encoded byt= e available */ > + int bytes_written; > +}; > + > +void hantro_boolenc_init(struct hantro_boolenc *e, uint8_t *output); > + > +void hantro_boolenc_write_bool(struct hantro_boolenc *e, uint32_t prob, = bool bool_value); > + > +static inline void hantro_boolenc_write_lit(struct hantro_boolenc *e, ui= nt32_t val, uint8_t n) > +{ > + while (n--) > + hantro_boolenc_write_bool(e, 128, (val >> n) & 0x1); > +} > diff --git a/drivers/media/platform/verisilicon/hantro_drv.c b/drivers/me= dia/platform/verisilicon/hantro_drv.c > index 8cb4a68c9119..a6bacf22cff5 100644 > --- a/drivers/media/platform/verisilicon/hantro_drv.c > +++ b/drivers/media/platform/verisilicon/hantro_drv.c > @@ -160,7 +160,6 @@ void hantro_end_prepare_run(struct hantro_ctx *ctx) > src_buf =3D hantro_get_src_buf(ctx); > v4l2_ctrl_request_complete(src_buf->vb2_buf.req_obj.req, > &ctx->ctrl_handler); > - > /* Kick the watchdog. */ > schedule_delayed_work(&ctx->dev->watchdog_work, > msecs_to_jiffies(2000)); > @@ -215,8 +214,7 @@ queue_init(void *priv, struct vb2_queue *src_vq, stru= ct vb2_queue *dst_vq) > * for faster allocation. Also, no CPU access on the source queue= , > * so no kernel mapping needed. > */ > - src_vq->dma_attrs =3D DMA_ATTR_ALLOC_SINGLE_PAGES | > - DMA_ATTR_NO_KERNEL_MAPPING; > + src_vq->dma_attrs =3D DMA_ATTR_ALLOC_SINGLE_PAGES; > src_vq->buf_struct_size =3D sizeof(struct v4l2_m2m_buffer); > src_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; > src_vq->lock =3D &ctx->dev->vpu_mutex; > @@ -352,6 +350,20 @@ static const struct hantro_ctrl controls[] =3D { > .def =3D 50, > .ops =3D &hantro_jpeg_ctrl_ops, > }, > + }, { > + .codec =3D HANTRO_VP8_ENCODER, > + .cfg =3D { > + .id =3D V4L2_CID_STATELESS_VP8_ENCODE_PARAMS, > + }, > + }, { > + .codec =3D HANTRO_VP8_ENCODER, > + .cfg =3D { > + .id =3D V4L2_CID_STATELESS_VP8_ENCODE_QP, > + .min =3D 0, > + .max =3D 127, > + .step =3D 1, > + .def =3D 0, > + }, > }, { > .codec =3D HANTRO_JPEG_ENCODER, > .cfg =3D { > diff --git a/drivers/media/platform/verisilicon/hantro_hw.h b/drivers/med= ia/platform/verisilicon/hantro_hw.h > index e83f0c523a30..c35cac7f88a9 100644 > --- a/drivers/media/platform/verisilicon/hantro_hw.h > +++ b/drivers/media/platform/verisilicon/hantro_hw.h > @@ -15,6 +15,8 @@ > #include > #include > > +#include "hantro_boolenc.h" > + > #define DEC_8190_ALIGN_MASK 0x07U > > #define MB_DIM 16 > @@ -171,6 +173,67 @@ struct hantro_vp8_dec_hw_ctx { > struct hantro_aux_buf prob_tbl; > }; > > +struct hantro_vp8_entropy { > + /* TODO: int32_t? */ > + int32_t coeff_prob[4][8][3][11]; > + int32_t coeff_prob_old[4][8][3][11]; > + int32_t mv_prob[2][19]; > + int32_t mv_prob_old[2][19]; > + int32_t y_mode_prob[4]; > + int32_t uv_mode_prob[3]; > +}; > + > +#define VP8_BIT_LAST 0 > +#define VP8_BIT_GOLDEN 1 > +#define VP8_BIT_ALT 2 > + > +struct hantro_vp8_enc_hw_ctx { > + struct hantro_aux_buf ref_frames[4]; /* recreated and referenc= e images */ > + struct hantro_aux_buf priv_src; /* cabac table, segment map */ > + struct hantro_aux_buf mv_buf; /* motion vector */ > + struct hantro_aux_buf priv_dst; /* prob count */ > + struct hantro_aux_buf ctrl_buf; /* size table */ > + struct hantro_boolenc boolenc; > + struct hantro_vp8_entropy entropy; > + size_t header_size; > + size_t estimated_hdr_size; > + size_t frame_counter; > + int last_ref; > + int golden_ref; > + int alt_ref; > + int first_free; > + int reconstructed; > + char ref_bitmaps[4]; > + > + int32_t mode_delta[4]; > + int32_t old_mode_delta[4]; > + int32_t ref_delta[4]; > + int32_t old_ref_delta[4]; > + > + struct { > + uint8_t tag[3]; > + > + /* the following three only used for inter frames */ > + uint8_t magic[3]; /* 0x9d012a */ > + uint8_t width[2]; /* (scale << 14) | width */ > + uint8_t height[2]; /* (scale << 14) | height */ > + } __packed *frame_tag; > + > + u8 is_intra:1; > + u8 last_intra:1; > + u8 show_frame:1; > + u8 refresh_golden_frame:1; > + u8 refresh_alternate_frame:1; > + u8 refresh_entropy_probs:1; > + > + u8 prob_skip_false; > + u8 prob_intra; > + u8 prob_last; > + u8 prob_gf; > + u8 copy_buffer_to_golden; > + u8 copy_buffer_to_alternate; > +}; > + > /** > * struct hantro_vp9_frame_info > * > @@ -417,6 +480,28 @@ hantro_hevc_mv_size(unsigned int width, unsigned int= height) > return width * height / 16; > } > > +static inline void hantro_vp8_set_bit(struct hantro_vp8_enc_hw_ctx *vp8_= enc, char bit, int idx) > +{ > + if (idx < 0) > + return; > + > + if (bit !=3D VP8_BIT_LAST && bit !=3D VP8_BIT_GOLDEN && bit !=3D = VP8_BIT_ALT) > + return; > + > + vp8_enc->ref_bitmaps[idx] |=3D (1 << bit); > +} > + > +static inline void hantro_vp8_clr_bit(struct hantro_vp8_enc_hw_ctx *vp8_= enc, char bit, int idx) > +{ > + if (idx < 0) > + return; > + > + if (bit !=3D VP8_BIT_LAST && bit !=3D VP8_BIT_GOLDEN && bit !=3D = VP8_BIT_ALT) > + return; > + > + vp8_enc->ref_bitmaps[idx] &=3D ~(1 << bit); > +} > + > int hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx); > int rockchip_vpu2_mpeg2_dec_run(struct hantro_ctx *ctx); > void hantro_mpeg2_dec_copy_qtable(u8 *qtable, > @@ -438,4 +523,9 @@ void hantro_vp9_dec_exit(struct hantro_ctx *ctx); > void hantro_g2_check_idle(struct hantro_dev *vpu); > irqreturn_t hantro_g2_irq(int irq, void *dev_id); > > +int rockchip_vpu2_vp8_enc_run(struct hantro_ctx *ctx); > +int hantro_vp8_enc_init(struct hantro_ctx *ctx); > +void rockchip_vpu2_vp8_enc_done(struct hantro_ctx *ctx); > +void hantro_vp8_enc_exit(struct hantro_ctx *ctx); > + > #endif /* HANTRO_HW_H_ */ > diff --git a/drivers/media/platform/verisilicon/hantro_v4l2.c b/drivers/m= edia/platform/verisilicon/hantro_v4l2.c > index 2c7a805289e7..7503d6b76fc9 100644 > --- a/drivers/media/platform/verisilicon/hantro_v4l2.c > +++ b/drivers/media/platform/verisilicon/hantro_v4l2.c > @@ -312,8 +312,9 @@ static int hantro_try_fmt(const struct hantro_ctx *ct= x, > > pix_mp->field =3D V4L2_FIELD_NONE; > > - v4l2_apply_frmsize_constraints(&pix_mp->width, &pix_mp->height, > - &vpu_fmt->frmsize); > + if (!capture || !ctx->is_encoder) > + v4l2_apply_frmsize_constraints(&pix_mp->width, &pix_mp->h= eight, > + &vpu_fmt->frmsize); > > if (!coded) { > /* Fill remaining fields */ > diff --git a/drivers/media/platform/verisilicon/hantro_vp8.c b/drivers/me= dia/platform/verisilicon/hantro_vp8.c > index 381bc1d3bfda..63e026055615 100644 > --- a/drivers/media/platform/verisilicon/hantro_vp8.c > +++ b/drivers/media/platform/verisilicon/hantro_vp8.c > @@ -199,3 +199,121 @@ void hantro_vp8_dec_exit(struct hantro_ctx *ctx) > dma_free_coherent(vpu->dev, vp8_dec->prob_tbl.size, > vp8_dec->prob_tbl.cpu, vp8_dec->prob_tbl.dma); > } > + > +int hantro_vp8_enc_init(struct hantro_ctx *ctx) > +{ > + struct hantro_dev *vpu =3D ctx->dev; > + struct hantro_aux_buf *aux_buf; > + unsigned int mb_width, mb_height; > + size_t luma_size, segment_map_size; > + static int32_t mode_delta[4] =3D { 4, -2, 2, 4 }; > + static int32_t ref_delta[4] =3D { 2, 0, -2, -2 }; > + int ret, i; > + > + memcpy(ctx->vp8_enc.mode_delta, mode_delta, sizeof(mode_delta)); > + memcpy(ctx->vp8_enc.ref_delta, ref_delta, sizeof(ref_delta)); > + > + mb_width =3D DIV_ROUND_UP(ctx->src_fmt.width, 16); > + mb_height =3D DIV_ROUND_UP(ctx->src_fmt.height, 16); > + luma_size =3D mb_width * mb_height * 16 * 16; > + segment_map_size =3D round_up(DIV_ROUND_UP(mb_width * mb_height, = 4), 64); > + > + for (i =3D 0; i < ARRAY_SIZE(ctx->vp8_enc.ref_frames); ++i) { > + aux_buf =3D &ctx->vp8_enc.ref_frames[i]; > + aux_buf->size =3D luma_size * 3 / 2; > + aux_buf->cpu =3D dma_alloc_coherent(vpu->dev, aux_buf->si= ze, > + &aux_buf->dma, GFP_KERN= EL); > + if (!aux_buf->cpu) { > + ret =3D -ENOMEM; > + goto err_free_ref_frames; > + } > + ctx->vp8_enc.ref_bitmaps[i] =3D 0; > + } > + ctx->vp8_enc.last_ref =3D ctx->vp8_enc.golden_ref =3D ctx->vp8_en= c.alt_ref =3D -1; > + ctx->vp8_enc.first_free =3D 0; > + > + aux_buf =3D &ctx->vp8_enc.priv_src; > + aux_buf->size =3D 1208 + segment_map_size + PAGE_SIZE; /* TODO: e= liminate one page overhead */ > + aux_buf->cpu =3D dma_alloc_coherent(vpu->dev, aux_buf->size, &aux= _buf->dma, GFP_KERNEL); > + if (!aux_buf->cpu) { > + ret =3D -ENOMEM; > + goto err_free_ref_frames; > + } > + > + aux_buf =3D &ctx->vp8_enc.mv_buf; > + aux_buf->size =3D mb_width * mb_height * 4; > + aux_buf->cpu =3D dma_alloc_coherent(vpu->dev, aux_buf->size, &aux= _buf->dma, GFP_KERNEL); > + if (!aux_buf->cpu) { > + ret =3D -ENOMEM; > + goto err_free_priv_src; > + } > + > + aux_buf =3D &ctx->vp8_enc.priv_dst; > + aux_buf->size =3D PAGE_SIZE; /* TODO: use correct size */ > + aux_buf->cpu =3D dma_alloc_coherent(vpu->dev, aux_buf->size, &aux= _buf->dma, GFP_KERNEL); > + if (!aux_buf->cpu) { > + ret =3D -ENOMEM; > + goto err_free_mv_buf; > + } > + > + aux_buf =3D &ctx->vp8_enc.ctrl_buf; > + aux_buf->size =3D PAGE_SIZE; /* TODO: use correct size */ > + aux_buf->cpu =3D dma_alloc_coherent(vpu->dev, aux_buf->size, &aux= _buf->dma, GFP_KERNEL); > + if (!aux_buf->cpu) { > + ret =3D -ENOMEM; > + goto err_free_priv_dst; > + } > + > + return 0; > + > +err_free_priv_dst: > + dma_free_coherent(vpu->dev, ctx->vp8_enc.priv_dst.size, > + ctx->vp8_enc.priv_dst.cpu, > + ctx->vp8_enc.priv_dst.dma); > + > +err_free_mv_buf: > + dma_free_coherent(vpu->dev, ctx->vp8_enc.mv_buf.size, > + ctx->vp8_enc.mv_buf.cpu, > + ctx->vp8_enc.mv_buf.dma); > + > +err_free_priv_src: > + dma_free_coherent(vpu->dev, ctx->vp8_enc.priv_src.size, > + ctx->vp8_enc.priv_src.cpu, > + ctx->vp8_enc.priv_src.dma); > + > +err_free_ref_frames: > + while (--i >=3D 0) > + dma_free_coherent(vpu->dev, ctx->vp8_enc.ref_frames[i].si= ze, > + ctx->vp8_enc.ref_frames[i].cpu, > + ctx->vp8_enc.ref_frames[i].dma); > + > + return ret; > +} > + > +void hantro_vp8_enc_exit(struct hantro_ctx *ctx) > +{ > + struct hantro_dev *vpu =3D ctx->dev; > + int i; > + > + dma_free_coherent(vpu->dev, ctx->vp8_enc.ctrl_buf.size, > + ctx->vp8_enc.ctrl_buf.cpu, > + ctx->vp8_enc.ctrl_buf.dma); > + > + dma_free_coherent(vpu->dev, ctx->vp8_enc.priv_dst.size, > + ctx->vp8_enc.priv_dst.cpu, > + ctx->vp8_enc.priv_dst.dma); > + > + dma_free_coherent(vpu->dev, ctx->vp8_enc.mv_buf.size, > + ctx->vp8_enc.mv_buf.cpu, > + ctx->vp8_enc.mv_buf.dma); > + > + dma_free_coherent(vpu->dev, ctx->vp8_enc.priv_src.size, > + ctx->vp8_enc.priv_src.cpu, > + ctx->vp8_enc.priv_src.dma); > + > + for (i =3D 0; i < ARRAY_SIZE(ctx->vp8_enc.ref_frames); ++i) > + dma_free_coherent(vpu->dev, ctx->vp8_enc.ref_frames[i].si= ze, > + ctx->vp8_enc.ref_frames[i].cpu, > + ctx->vp8_enc.ref_frames[i].dma); > + > +} > diff --git a/drivers/media/platform/verisilicon/rockchip_vpu2_hw_vp8_enc.= c b/drivers/media/platform/verisilicon/rockchip_vpu2_hw_vp8_enc.c > new file mode 100644 > index 000000000000..08e198606509 > --- /dev/null > +++ b/drivers/media/platform/verisilicon/rockchip_vpu2_hw_vp8_enc.c > @@ -0,0 +1,1574 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2023 Collabora Ltd. > + * Andrzej Pietrasiewicz > + * > + * This work is derived from: > + * > + * https://chromium.googlesource.com/chromiumos/third_party/kernel/+/ref= s/heads/chromeos-5.10/ > + * drivers/staging/media/hantro/rk3399_vpu_hw_vp8_enc.c > + * > + * which is: > + * > + * Rockchip VPU codec driver > + * > + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. > + * Alpha Lin > + * > + * Substantial portions are based on MIT-licensed code > + * > + * https://github.com/rockchip-linux/mpp/blob/develop/mpp/hal/vpu/vp8e/h= al_vp8e_entropy.{c|h} > + * https://github.com/rockchip-linux/mpp/blob/develop/mpp/hal/vpu/vp8e/h= al_vp8e_table.{c|h} > + * > + * which is: > + * > + * Copyright (c) 2017 Rockchip Electronics Co., Ltd. > + * > + */ > +#include > + > +#include "hantro.h" > +#include "hantro_hw.h" > +#include "rockchip_vpu2_regs.h" > + > +/* threshold of MBs count to disable quarter pixel mv for encode speed *= / > +#define MAX_MB_COUNT_TO_DISABLE_QUARTER_PIXEL_MV 3600 > + > +/* threshold of MBs count to disable multi mv in one macro block */ > +#define MAX_MB_COUNT_TO_DISABLE_SPLIT_MV 1584 > + > +#define QINDEX_RANGE 128 > +#define VP8_PROB_COUNT_MV_OFFSET 222 > + > +#define MODE_DELTA_BPRED 0 > +#define MODE_DELTA_ZEROMV 1 > +#define MODE_DELTA_NEWMV 2 > +#define MODE_DELTA_SPLITMV 3 > + > +#define REF_DELTA_INTRA_MB 0 > +#define REF_DELTA_LAST_REF 1 > +#define REF_DELTA_GOLDEN 2 > +#define REF_DELTA_ALT_REF 3 > + > +/* experimentally fitted, 24.893*exp(0.02545*qp) */ > +static const s32 split_penalty[QINDEX_RANGE] =3D { > + 24, 25, 26, 26, 27, 28, 29, 29, > + 30, 31, 32, 32, 33, 34, 35, 36, > + 37, 38, 39, 40, 41, 42, 43, 44, > + 45, 47, 48, 49, 50, 52, 53, 54, > + 56, 57, 59, 60, 62, 63, 65, 67, > + 68, 70, 72, 74, 76, 78, 80, 82, > + 84, 86, 88, 91, 93, 95, 98, 100, > + 103, 106, 108, 111, 114, 117, 120, 123, > + 126, 130, 133, 136, 140, 144, 147, 151, > + 155, 159, 163, 167, 172, 176, 181, 185, > + 190, 195, 200, 205, 211, 216, 222, 227, > + 233, 239, 245, 252, 258, 265, 272, 279, > + 286, 293, 301, 309, 317, 325, 333, 342, > + 351, 360, 369, 379, 388, 398, 409, 419, > + 430, 441, 453, 464, 476, 488, 501, 514, > + 527, 541, 555, 569, 584, 599, 614, 630 > +}; > + > +static const int dc_q_lookup[QINDEX_RANGE] =3D { > + 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, > + 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, > + 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, > + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, > + 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, > + 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, > + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, > + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, > + 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, > + 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, > + 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, > + 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, > + 138, 140, 143, 145, 148, 151, 154, 157 > +}; > + > +static const int ac_q_lookup[QINDEX_RANGE] =3D { > + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, > + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, > + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, > + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, > + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, > + 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, > + 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, > + 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, > + 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, > + 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, > + 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, > + 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, > + 249, 254, 259, 264, 269, 274, 279, 284 > +}; > + > +static const s32 qrounding_factors[QINDEX_RANGE] =3D { > + 56, 56, 56, 56, 56, 56, 56, 56, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, > + 48, 48, 48, 48, 48, 48, 48, 48 > +}; > + > +static const s32 qzbin_factors[QINDEX_RANGE] =3D { > + 64, 64, 64, 64, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, > + 80, 80, 80, 80, 80, 80, 80, 80 > +}; > + > +/* Intra 16x16 mode tree penalty values */ > +static s32 intra_16_tree_penalty[] =3D { > + 305, 841, 914, 1082 > +}; > + > +/* Intra 4x4 mode tree penalty values */ > +static s32 intra_4_tree_penalty[] =3D { > + 280, 622, 832, 1177, 1240, 1341, 1085, 1259, 1357, 1495 > +}; > + > + > +int32_t const offset_tbl[] =3D { > + -1, -1, -1, 0, 1, 2, -1, 3, 4, -1, 5, 6, -1, 7, 8, -1, > + 9, 10, -1, 11, 12, 13, 14, 15, -1, 16, 17, -1, 18, 19, -1, 20, > + 21, -1, 22, 23, -1, 24, 25, -1, 26, 27, 28, 29, 30, -1, 31, 32, > + -1, 33, 34, -1, 35, 36, -1, 37, 38, -1, 39, 40, -1, 41, 42, 43, > + 44, 45, -1, 46, 47, -1, 48, 49, -1, 50, 51, -1, 52, 53, -1, 54, > + 55, -1, 56, 57, -1, -1, -1, 58, 59, 60, 61, 62, 63, 64, 65, 66, > + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, > + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, > + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1= 12, 113, 114, > + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, = 128, 129, 130, > + 131, 132, 133, 134, 135, 136, 137, 138, -1, -1, -1, 139, 140, 141= , 142, 143, > + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, = 157, 158, 159, > + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, = 173, 174, 175, > + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, = 189, 190, 191, > + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, = 205, 206, 207, > + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 > +}; > + > +/* ~round((2*(2+exp((x+22)/39)) + (2+exp((x+15)/32)))/3) */ > +static s32 weight[QINDEX_RANGE] =3D { > + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, > + 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, > + 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, > + 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, > + 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, > + 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, > + 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, > + 14, 14, 14, 14, 15, 15, 15, 16, 16, 17, > + 17, 18, 18, 19, 19, 20, 20, 20, 21, 22, > + 23, 23, 24, 24, 25, 25, 26, 27, 28, 28, > + 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, > + 38, 39, 40, 41, 42, 44, 44, 46, 47, 48, > + 50, 51, 52, 54, 55, 57, 58, 61 > +}; > + > +struct tree { > + s32 value; /* Bits describe the bool tree */ > + s32 number; /* Number, valid bit count in above tree */ > + s32 index[9]; /* Probability table index */ > +}; > + > +/* Motion vector tree */ > +static struct tree mv_tree[] =3D { > + { 0, 3, { 0, 1, 2 } }, /* mv_0 000 */ > + { 1, 3, { 0, 1, 2 } }, /* mv_1 001 */ > + { 2, 3, { 0, 1, 3 } }, /* mv_2 010 */ > + { 3, 3, { 0, 1, 3 } }, /* mv_3 011 */ > + { 4, 3, { 0, 4, 5 } }, /* mv_4 100 */ > + { 5, 3, { 0, 4, 5 } }, /* mv_5 101 */ > + { 6, 3, { 0, 4, 6 } }, /* mv_6 110 */ > + { 7, 3, { 0, 4, 6 } }, /* mv_7 111 */ > +}; > + > +/* If probability being zero is p, then average number of bits used to e= ncode 0 > + * is log2(1/p), to encode 1 is log2(1/(1-p)). > + * > + * For example, if the probability of being zero is 0.5 > + * bin =3D 0 -> average bits used is log2(1/0.5) =3D 1 bits/bin > + * bin =3D 1 -> average bits used is log2(1/(1 - 0.5) =3D 1 bits/bin > + * > + * For example, if the probability of being zero is 0.95 > + * bin =3D 0 -> average bits used is log2(1/0.95) =3D 0.074 bits/bi= n > + * bin =3D 1 -> average bits used is log2(1/(1 - 0.95) =3D 4.321 bits/bi= n > + * > + * The cost[p] is average number of bits used to encode 0 if the probabi= lity is > + * p / 256, scaled by a magic number 256, > + * i.e., cost[p] =3D round(log2(256 / p) * 256). > + */ > +static const s32 vp8_prob_cost[] =3D { > + 2048, 2048, 1792, 1642, 1536, 1454, 1386, 1329, 1280, 1236, > + 1198, 1162, 1130, 1101, 1073, 1048, 1024, 1002, 980, 961, > + 942, 924, 906, 890, 874, 859, 845, 831, 817, 804, > + 792, 780, 768, 757, 746, 735, 724, 714, 705, 695, > + 686, 676, 668, 659, 650, 642, 634, 626, 618, 611, > + 603, 596, 589, 582, 575, 568, 561, 555, 548, 542, > + 536, 530, 524, 518, 512, 506, 501, 495, 490, 484, > + 479, 474, 468, 463, 458, 453, 449, 444, 439, 434, > + 430, 425, 420, 416, 412, 407, 403, 399, 394, 390, > + 386, 382, 378, 374, 370, 366, 362, 358, 355, 351, > + 347, 343, 340, 336, 333, 329, 326, 322, 319, 315, > + 312, 309, 305, 302, 299, 296, 292, 289, 286, 283, > + 280, 277, 274, 271, 268, 265, 262, 259, 256, 253, > + 250, 247, 245, 242, 239, 236, 234, 231, 228, 226, > + 223, 220, 218, 215, 212, 210, 207, 205, 202, 200, > + 197, 195, 193, 190, 188, 185, 183, 181, 178, 176, > + 174, 171, 169, 167, 164, 162, 160, 158, 156, 153, > + 151, 149, 147, 145, 143, 140, 138, 136, 134, 132, > + 130, 128, 126, 124, 122, 120, 118, 116, 114, 112, > + 110, 108, 106, 104, 102, 101, 99, 97, 95, 93, > + 91, 89, 87, 86, 84, 82, 80, 78, 77, 75, > + 73, 71, 70, 68, 66, 64, 63, 61, 59, 58, > + 56, 54, 53, 51, 49, 48, 46, 44, 43, 41, > + 40, 38, 36, 35, 33, 32, 30, 28, 27, 25, > + 24, 22, 21, 19, 18, 16, 15, 13, 12, 10, > + 9, 7, 6, 4, 3, 1 > +}; > + > +/* Approximate bit cost of bin at given probability prob */ > +#define COST_BOOL(prob, bin) vp8_prob_cost[(bin) ? 255 - (prob) : (pro= b)] > + > +uint32_t const coeff_update_prob[4][8][3][11] =3D { > + { > + { > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {176, 246, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {223, 241, 252, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {249, 253, 253, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 244, 252, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {234, 254, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {253, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 246, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {239, 253, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {254, 255, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 248, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {251, 255, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 253, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {251, 254, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {254, 255, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 254, 253, 255, 254, 255, 255, 255, 255, 255= , 255}, > + {250, 255, 254, 255, 254, 255, 255, 255, 255, 255= , 255}, > + {254, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, > + }, { > + { > + {217, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {225, 252, 241, 253, 255, 255, 254, 255, 255, 255= , 255}, > + {234, 250, 241, 250, 253, 255, 253, 254, 255, 255= , 255}, > + }, { > + {255, 254, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {223, 254, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {238, 253, 254, 254, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 248, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {249, 254, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 253, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {247, 254, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 253, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {252, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 254, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {253, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 254, 253, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {250, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {254, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, > + }, { > + { > + {186, 251, 250, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {234, 251, 244, 254, 255, 255, 255, 255, 255, 255= , 255}, > + {251, 251, 243, 253, 254, 255, 254, 255, 255, 255= , 255}, > + }, { > + {255, 253, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {236, 253, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {251, 253, 253, 254, 254, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 254, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {254, 254, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 254, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {254, 254, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {254, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {254, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, > + }, { > + { > + {248, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {250, 254, 252, 254, 255, 255, 255, 255, 255, 255= , 255}, > + {248, 254, 249, 253, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 253, 253, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {246, 253, 253, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {252, 254, 251, 254, 254, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 254, 252, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {248, 254, 253, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {253, 255, 254, 254, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 251, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {245, 251, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {253, 253, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 251, 253, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {252, 253, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 254, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 252, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {249, 255, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 254, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 255, 253, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {250, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, { > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {254, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255= , 255}, > + }, > + }, > +}; > + > +uint32_t const mv_update_prob[2][19] =3D { > + { > + 237, 246, 253, 253, 254, 254, 254, 254, 254, 254, > + 254, 254, 254, 254, 250, 250, 252, 254, 254 > + }, { > + 231, 243, 245, 253, 254, 254, 254, 254, 254, 254, > + 254, 254, 254, 254, 251, 251, 254, 254, 254 > + } > +}; > + > +uint8_t const default_prob_skip_false[128] =3D { > + 255, 255, 255, 255, 255, 255, 255, 255, > + 255, 255, 255, 255, 255, 255, 255, 255, > + 255, 255, 255, 255, 255, 255, 255, 255, > + 255, 255, 255, 255, 255, 255, 255, 255, > + 255, 255, 255, 255, 255, 255, 255, 255, > + 255, 255, 255, 255, 255, 255, 255, 255, > + 255, 255, 255, 255, 255, 255, 255, 255, > + 251, 248, 244, 240, 236, 232, 229, 225, > + 221, 217, 213, 208, 204, 199, 194, 190, > + 187, 183, 179, 175, 172, 168, 164, 160, > + 157, 153, 149, 145, 142, 138, 134, 130, > + 127, 124, 120, 117, 114, 110, 107, 104, > + 101, 98, 95, 92, 89, 86, 83, 80, > + 77, 74, 71, 68, 65, 62, 59, 56, > + 53, 50, 47, 44, 41, 38, 35, 32, > + 30, 28, 26, 24, 22, 20, 18, 16, > +}; > + > +int32_t const y_mode_prob[4] =3D { > + 112, 86, 140, 37 > +}; > + > +int32_t const uv_mode_prob[3] =3D { > + 162, 101, 204 > +}; > + > +uint32_t const default_prob_coeff[4][8][3][11] =3D { > + { > + { > + {128, 128, 128, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {128, 128, 128, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {128, 128, 128, 128, 128, 128, 128, 128, 128, 128= , 128}, > + }, { > + {253, 136, 254, 255, 228, 219, 128, 128, 128, 128= , 128}, > + {189, 129, 242, 255, 227, 213, 255, 219, 128, 128= , 128}, > + {106, 126, 227, 252, 214, 209, 255, 255, 128, 128= , 128}, > + }, { > + { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128= , 128}, > + {181, 133, 238, 254, 221, 234, 255, 154, 128, 128= , 128}, > + { 78, 134, 202, 247, 198, 180, 255, 219, 128, 128= , 128}, > + }, { > + { 1, 185, 249, 255, 243, 255, 128, 128, 128, 128= , 128}, > + {184, 150, 247, 255, 236, 224, 128, 128, 128, 128= , 128}, > + { 77, 110, 216, 255, 236, 230, 128, 128, 128, 128= , 128}, > + }, { > + { 1, 101, 251, 255, 241, 255, 128, 128, 128, 128= , 128}, > + {170, 139, 241, 252, 236, 209, 255, 255, 128, 128= , 128}, > + { 37, 116, 196, 243, 228, 255, 255, 255, 128, 128= , 128}, > + }, { > + { 1, 204, 254, 255, 245, 255, 128, 128, 128, 128= , 128}, > + {207, 160, 250, 255, 238, 128, 128, 128, 128, 128= , 128}, > + {102, 103, 231, 255, 211, 171, 128, 128, 128, 128= , 128}, > + }, { > + { 1, 152, 252, 255, 240, 255, 128, 128, 128, 128= , 128}, > + {177, 135, 243, 255, 234, 225, 128, 128, 128, 128= , 128}, > + { 80, 129, 211, 255, 194, 224, 128, 128, 128, 128= , 128}, > + }, { > + { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {246, 1, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {255, 128, 128, 128, 128, 128, 128, 128, 128, 128= , 128}, > + }, > + }, { > + { > + {198, 35, 237, 223, 193, 187, 162, 160, 145, 155= , 62}, > + {131, 45, 198, 221, 172, 176, 220, 157, 252, 221= , 1}, > + { 68, 47, 146, 208, 149, 167, 221, 162, 255, 223= , 128}, > + }, { > + { 1, 149, 241, 255, 221, 224, 255, 255, 128, 128= , 128}, > + {184, 141, 234, 253, 222, 220, 255, 199, 128, 128= , 128}, > + { 81, 99, 181, 242, 176, 190, 249, 202, 255, 255= , 128}, > + }, { > + { 1, 129, 232, 253, 214, 197, 242, 196, 255, 255= , 128}, > + { 99, 121, 210, 250, 201, 198, 255, 202, 128, 128= , 128}, > + { 23, 91, 163, 242, 170, 187, 247, 210, 255, 255= , 128}, > + }, { > + { 1, 200, 246, 255, 234, 255, 128, 128, 128, 128= , 128}, > + {109, 178, 241, 255, 231, 245, 255, 255, 128, 128= , 128}, > + { 44, 130, 201, 253, 205, 192, 255, 255, 128, 128= , 128}, > + }, { > + { 1, 132, 239, 251, 219, 209, 255, 165, 128, 128= , 128}, > + { 94, 136, 225, 251, 218, 190, 255, 255, 128, 128= , 128}, > + { 22, 100, 174, 245, 186, 161, 255, 199, 128, 128= , 128}, > + }, { > + { 1, 182, 249, 255, 232, 235, 128, 128, 128, 128= , 128}, > + {124, 143, 241, 255, 227, 234, 128, 128, 128, 128= , 128}, > + { 35, 77, 181, 251, 193, 211, 255, 205, 128, 128= , 128}, > + }, { > + { 1, 157, 247, 255, 236, 231, 255, 255, 128, 128= , 128}, > + {121, 141, 235, 255, 225, 227, 255, 255, 128, 128= , 128}, > + { 45, 99, 188, 251, 195, 217, 255, 224, 128, 128= , 128}, > + }, { > + { 1, 1, 251, 255, 213, 255, 128, 128, 128, 128= , 128}, > + {203, 1, 248, 255, 255, 128, 128, 128, 128, 128= , 128}, > + {137, 1, 177, 255, 224, 255, 128, 128, 128, 128= , 128}, > + }, > + }, { > + { > + {253, 9, 248, 251, 207, 208, 255, 192, 128, 128= , 128}, > + {175, 13, 224, 243, 193, 185, 249, 198, 255, 255= , 128}, > + { 73, 17, 171, 221, 161, 179, 236, 167, 255, 234= , 128}, > + }, { > + { 1, 95, 247, 253, 212, 183, 255, 255, 128, 128= , 128}, > + {239, 90, 244, 250, 211, 209, 255, 255, 128, 128= , 128}, > + {155, 77, 195, 248, 188, 195, 255, 255, 128, 128= , 128}, > + }, { > + { 1, 24, 239, 251, 218, 219, 255, 205, 128, 128= , 128}, > + {201, 51, 219, 255, 196, 186, 128, 128, 128, 128= , 128}, > + { 69, 46, 190, 239, 201, 218, 255, 228, 128, 128= , 128}, > + }, { > + { 1, 191, 251, 255, 255, 128, 128, 128, 128, 128= , 128}, > + {223, 165, 249, 255, 213, 255, 128, 128, 128, 128= , 128}, > + {141, 124, 248, 255, 255, 128, 128, 128, 128, 128= , 128}, > + }, { > + { 1, 16, 248, 255, 255, 128, 128, 128, 128, 128= , 128}, > + {190, 36, 230, 255, 236, 255, 128, 128, 128, 128= , 128}, > + {149, 1, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + }, { > + { 1, 226, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {247, 192, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {240, 128, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + }, { > + { 1, 134, 252, 255, 255, 128, 128, 128, 128, 128= , 128}, > + {213, 62, 250, 255, 255, 128, 128, 128, 128, 128= , 128}, > + { 55, 93, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + }, { > + {128, 128, 128, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {128, 128, 128, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {128, 128, 128, 128, 128, 128, 128, 128, 128, 128= , 128}, > + }, > + }, { > + { > + {202, 24, 213, 235, 186, 191, 220, 160, 240, 175= , 255}, > + {126, 38, 182, 232, 169, 184, 228, 174, 255, 187= , 128}, > + { 61, 46, 138, 219, 151, 178, 240, 170, 255, 216= , 128}, > + }, { > + { 1, 112, 230, 250, 199, 191, 247, 159, 255, 255= , 128}, > + {166, 109, 228, 252, 211, 215, 255, 174, 128, 128= , 128}, > + { 39, 77, 162, 232, 172, 180, 245, 178, 255, 255= , 128}, > + }, { > + { 1, 52, 220, 246, 198, 199, 249, 220, 255, 255= , 128}, > + {124, 74, 191, 243, 183, 193, 250, 221, 255, 255= , 128}, > + { 24, 71, 130, 219, 154, 170, 243, 182, 255, 255= , 128}, > + }, { > + { 1, 182, 225, 249, 219, 240, 255, 224, 128, 128= , 128}, > + {149, 150, 226, 252, 216, 205, 255, 171, 128, 128= , 128}, > + { 28, 108, 170, 242, 183, 194, 254, 223, 255, 255= , 128}, > + }, { > + { 1, 81, 230, 252, 204, 203, 255, 192, 128, 128= , 128}, > + {123, 102, 209, 247, 188, 196, 255, 233, 128, 128= , 128}, > + { 20, 95, 153, 243, 164, 173, 255, 203, 128, 128= , 128}, > + }, { > + { 1, 222, 248, 255, 216, 213, 128, 128, 128, 128= , 128}, > + {168, 175, 246, 252, 235, 205, 255, 255, 128, 128= , 128}, > + { 47, 116, 215, 255, 211, 212, 255, 255, 128, 128= , 128}, > + }, { > + { 1, 121, 236, 253, 212, 214, 255, 255, 128, 128= , 128}, > + {141, 84, 213, 252, 201, 202, 255, 219, 128, 128= , 128}, > + { 42, 80, 160, 240, 162, 185, 255, 205, 128, 128= , 128}, > + }, { > + { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {244, 1, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + {238, 1, 255, 128, 128, 128, 128, 128, 128, 128= , 128}, > + }, > + } > +}; > + > +uint32_t const default_prob_mv[2][19] =3D { > + { > + 162, 128, 225, 146, 172, 147, 214, 39, 156, 128, > + 129, 132, 75, 145, 178, 206, 239, 254, 254, > + }, { > + 164, 128, 204, 170, 119, 235, 140, 230, 228, 128, > + 130, 130, 74, 148, 180, 203, 236, 254, 254, > + }, > +}; > + > +struct hantro_vp8_enc_ctrl_buf { > + u32 hw_hdr_size; > + u32 dct_size; > + u8 reserved[1016]; > +}; > + > +static inline bool is_intra(struct hantro_ctx *ctx) > +{ > + return ctx->vp8_enc.is_intra; > +} > + > +static inline size_t frame_tag_size(struct hantro_ctx *ctx) > +{ > + return is_intra(ctx) ? 10 : 3; > +} > + > +static void rockchip_vpu2_vp8_enc_write_coeff_prob(struct hantro_ctx *ct= x) > +{ > + struct hantro_boolenc *e =3D &ctx->vp8_enc.boolenc; > + struct hantro_vp8_entropy *entropy =3D &ctx->vp8_enc.entropy; > + > + int i, j, k, l; > + uint32_t prob, new, old; > + > + for (i =3D 0; i < 4; i++) { > + for (j =3D 0; j < 8; j++) { > + for (k =3D 0; k < 3; k++) { > + for (l =3D 0; l < 11; l++) { > + prob =3D coeff_update_prob[i][j][= k][l]; > + > + old =3D entropy->coeff_prob_old[i= ][j][k][l]; > + new =3D entropy->coeff_prob[i][j]= [k][l]; > + > + if (new =3D=3D old) { > + hantro_boolenc_write_bool= (e, prob, 0); > + } else { > + hantro_boolenc_write_bool= (e, prob, 1); > + hantro_boolenc_write_lit(= e, new, 8); > + } > + } > + } > + } > + } > +} > + > +static void rockchip_vpu2_vp8_enc_write_mv_prob(struct hantro_ctx *ctx) > +{ > + struct hantro_boolenc *e =3D &ctx->vp8_enc.boolenc; > + struct hantro_vp8_entropy *entropy =3D &ctx->vp8_enc.entropy; > + > + int i, j; > + uint32_t prob, new, old; > + > + for (i =3D 0; i < 2; i++) { > + for (j =3D 0; j < 19; j++) { > + prob =3D mv_update_prob[i][j]; > + old =3D entropy->mv_prob_old[i][j]; > + new =3D entropy->mv_prob[i][j]; > + > + if (new =3D=3D old) { > + hantro_boolenc_write_bool(e, prob, 0); > + } else { > + hantro_boolenc_write_bool(e, prob, 1); > + hantro_boolenc_write_lit(e, new >> 1, 7); > + } > + } > + } > +} > + > +static void rockchip_vpu2_vp8_enc_write_filter_level_delta(struct hantro= _ctx *ctx) > +{ > + struct hantro_boolenc *e =3D &ctx->vp8_enc.boolenc; > + int32_t i, tmp; > + uint8_t update =3D 0; > + int32_t mode_update[4]; > + int32_t ref_update[4]; > + > + if (is_intra(ctx)) { > + memset(ctx->vp8_enc.old_mode_delta, 0, sizeof(ctx->vp8_en= c.old_mode_delta)); > + memset(ctx->vp8_enc.old_ref_delta, 0, sizeof(ctx->vp8_enc= .old_ref_delta)); > + } > + > + for (i =3D 0; i < 4; i++) { > + mode_update[i] =3D ctx->vp8_enc.mode_delta[i] !=3D ctx->v= p8_enc.old_mode_delta[i]; > + ref_update[i] =3D ctx->vp8_enc.ref_delta[i] !=3D ctx->vp8= _enc.old_ref_delta[i]; > + if (mode_update[i] || ref_update[i]) > + update =3D 1; > + } > + > + if (!ctx->vp8_enc.refresh_entropy_probs) > + update =3D 1; > + > + hantro_boolenc_write_lit(e, update, 1); > + if (!update) > + return; > + > + for (i =3D 0; i < 4; i++) { > + hantro_boolenc_write_lit(e, ref_update[i], 1); > + if (ref_update[i]) { > + tmp =3D ctx->vp8_enc.ref_delta[i]; > + hantro_boolenc_write_lit(e, abs(tmp), 6); > + hantro_boolenc_write_lit(e, tmp < 0, 1); > + } > + } > + > + for (i =3D 0; i < 4; i++) { > + hantro_boolenc_write_lit(e, mode_update[i], 1); > + if (mode_update[i]) { > + tmp =3D ctx->vp8_enc.mode_delta[i]; > + hantro_boolenc_write_lit(e, abs(tmp), 6); > + hantro_boolenc_write_lit(e, tmp < 0, 1); > + } > + } > + > + memcpy(ctx->vp8_enc.old_mode_delta, ctx->vp8_enc.mode_delta, > + sizeof(ctx->vp8_enc.old_mode_delta)); > + memcpy(ctx->vp8_enc.old_ref_delta, ctx->vp8_enc.ref_delta, > + sizeof(ctx->vp8_enc.old_ref_delta)); > +} > + > +static void rockchip_vpu2_vp8_enc_write_header(struct hantro_ctx *ctx, u= 32 qp, > + struct v4l2_ctrl_vp8_encod= e_params *params) > +{ > + struct hantro_boolenc *e =3D &ctx->vp8_enc.boolenc; > + struct vb2_v4l2_buffer *dst_buf =3D hantro_get_dst_buf(ctx); > + void *vaddr =3D vb2_plane_vaddr(&dst_buf->vb2_buf, 0); > + > + ctx->vp8_enc.frame_tag =3D vaddr; > + memset(ctx->vp8_enc.frame_tag, 0, sizeof(*ctx->vp8_enc.frame_tag)= ); > + ctx->vp8_enc.frame_tag->tag[0] |=3D (1 << 1); /* version 1 */ > + if (ctx->vp8_enc.show_frame) > + ctx->vp8_enc.frame_tag->tag[0] |=3D (1 << 4); > + /* first partition size is known only after encoding */ > + > + if (is_intra(ctx)) { > + ctx->vp8_enc.frame_tag->magic[0] =3D 0x9d; > + ctx->vp8_enc.frame_tag->magic[1] =3D 0x01; > + ctx->vp8_enc.frame_tag->magic[2] =3D 0x2a; > + > + ctx->vp8_enc.frame_tag->width[0] =3D ctx->src_fmt.width &= 0xff; > + ctx->vp8_enc.frame_tag->width[1] =3D (ctx->src_fmt.width = >> 8) & 0xff; > + > + ctx->vp8_enc.frame_tag->height[0] =3D ctx->src_fmt.height= & 0xff; > + ctx->vp8_enc.frame_tag->height[1] =3D (ctx->src_fmt.heigh= t >> 8) & 0xff; > + } else { > + ctx->vp8_enc.frame_tag->tag[0] |=3D 0x1; > + } > + > + hantro_boolenc_init(e, vaddr + frame_tag_size(ctx)); > + > + if (is_intra(ctx)) { > + hantro_boolenc_write_lit(e, params->color_space, 1); > + hantro_boolenc_write_lit(e, params->clamping_type, 1); > + } > + > + hantro_boolenc_write_lit(e, !!(params->flags & V4L2_VP8_FRAME_FLA= G_SEGMENT_ENABLED), 1); > + > + hantro_boolenc_write_lit(e, params->loop_filter_type, 1); > + hantro_boolenc_write_lit(e, params->loop_filter_level, 6); > + hantro_boolenc_write_lit(e, params->sharpness_level, 3); > + hantro_boolenc_write_lit(e, !!(params->flags & V4L2_VP8_FRAME_FLA= G_LOOP_FILTER_ADJ_ENABLED), > + 1); > + if (params->flags & V4L2_VP8_FRAME_FLAG_LOOP_FILTER_ADJ_ENABLED) > + rockchip_vpu2_vp8_enc_write_filter_level_delta(ctx); > + > + hantro_boolenc_write_lit(e, params->log2_nbr_of_dct_partitions, 2= ); > + > + hantro_boolenc_write_lit(e, qp, 7); > + > + hantro_boolenc_write_lit(e, 0, 1); > + hantro_boolenc_write_lit(e, 0, 1); > + hantro_boolenc_write_lit(e, 0, 1); > + hantro_boolenc_write_lit(e, 0, 1); > + hantro_boolenc_write_lit(e, 0, 1); > + > + if (!is_intra(ctx)) { > + hantro_boolenc_write_lit(e, 0, 1); /* refresh golden */ > + hantro_boolenc_write_lit(e, 0, 1); /* refresh alt */ > + hantro_boolenc_write_lit(e, 0, 2); /* copy to golden */ > + hantro_boolenc_write_lit(e, 0, 2); /* copy to alt */ > + hantro_boolenc_write_lit(e, 0, 1); /* sign bias golden */ > + hantro_boolenc_write_lit(e, 0, 1); /* sign bias alt */ > + hantro_boolenc_write_lit(e, ctx->vp8_enc.refresh_entropy_= probs, 1); > + hantro_boolenc_write_lit(e, 1, 1); > + } else { > + hantro_boolenc_write_lit(e, ctx->vp8_enc.refresh_entropy_= probs, 1); > + } > + > + rockchip_vpu2_vp8_enc_write_coeff_prob(ctx); > + > + hantro_boolenc_write_lit(e, 1, 1); > + hantro_boolenc_write_lit(e, ctx->vp8_enc.prob_skip_false, 8); > + > + if (is_intra(ctx)) > + return; > + > + hantro_boolenc_write_lit(e, ctx->vp8_enc.prob_intra, 8); > + hantro_boolenc_write_lit(e, ctx->vp8_enc.prob_last, 8); > + hantro_boolenc_write_lit(e, ctx->vp8_enc.prob_gf, 8); > + hantro_boolenc_write_lit(e, 0, 1); /* intra 16x16 prob update fla= g */ > + hantro_boolenc_write_lit(e, 0, 1); /* intra chroma prob update fl= ag */ > + > + rockchip_vpu2_vp8_enc_write_mv_prob(ctx); > +} > + > +static uint32_t calc_mvprob(uint32_t left, uint32_t right, uint32_t prob= ) > +{ > + uint32_t p; > + > + if (left + right) { > + p =3D (left * 255) / (left + right); > + p &=3D -2; > + if (!p) > + p =3D 1; > + } else { > + p =3D prob; > + } > + > + return p; > +} > + > +static uint32_t update_prob(uint32_t prob, uint32_t left, uint32_t right= , > + uint32_t old_prob, uint32_t new_prob, uint32_= t fixed) > +{ > + int32_t u, s; > + > + u =3D (int32_t)fixed + ((vp8_prob_cost[255 - prob] - vp8_prob_cos= t[prob]) >> 8); > + s =3D ((int32_t)left * (vp8_prob_cost[old_prob] - vp8_prob_cost[n= ew_prob]) + > + (int32_t)right * > + (vp8_prob_cost[255 - old_prob] - vp8_prob_cost[255 - new_= prob])) >> 8; > + > + return (s > u); > +} > + > +static void rockchip_vpu2_vp8_enc_update_entropy(struct hantro_ctx *ctx) > +{ > + struct hantro_vp8_entropy *entropy =3D &ctx->vp8_enc.entropy; > + uint16_t *p_cnt =3D (uint16_t *)ctx->vp8_enc.priv_dst.cpu; > + > + int32_t i, j, k, l; > + > + uint32_t p, left, right; > + uint32_t old_p, upd_p =3D 0; > + > + uint32_t type; > + uint32_t branch_cnt[2]; > + uint16_t *p_tmp =3D NULL; > + > + if (!ctx->vp8_enc.refresh_entropy_probs || is_intra(ctx)) { > + memcpy(entropy->coeff_prob, default_prob_coeff, sizeof(de= fault_prob_coeff)); > + memcpy(entropy->mv_prob, default_prob_mv, sizeof(default_= prob_mv)); > + } > + > + memcpy(entropy->coeff_prob_old, entropy->coeff_prob, sizeof(entro= py->coeff_prob)); > + if (ctx->vp8_enc.frame_counter =3D=3D 0 || !ctx->vp8_enc.last_int= ra) > + memcpy(entropy->mv_prob_old, entropy->mv_prob, sizeof(ent= ropy->mv_prob)); > + > + if (!ctx->vp8_enc.frame_counter) > + return; > + > + for (i =3D 0; i < 4; i++) { > + for (j =3D 0; j < 7; j++) { > + for (k =3D 0; k < 3; k++) { > + int32_t tmp, ii; > + > + tmp =3D i * 7 * 3 + j * 3 + k; > + tmp +=3D 2 * 4 * 7 * 3; > + ii =3D offset_tbl[tmp]; > + > + right =3D ii >=3D 0 ? p_cnt[ii] : 0; > + > + for (l =3D 2; l--;) { > + old_p =3D entropy->coeff_prob[i][= j][k][l]; > + old_p =3D coeff_update_prob[i][j]= [k][l]; > + > + tmp -=3D 4 * 7 * 3; > + ii =3D offset_tbl[tmp]; > + left =3D ii >=3D 0 ? p_cnt[ii] : = 0; > + if (left + right) { > + p =3D ((left * 256) + ((l= eft + right) >> 1)) / > + (left + right); > + if (p > 255) > + p =3D 255; > + } else { > + p =3D old_p; > + } > + > + if (update_prob(upd_p, left, righ= t, old_p, p, 8)) > + entropy->coeff_prob[i][j]= [k][l] =3D p; > + > + right +=3D left; > + } > + } > + } > + } > + > + p_tmp =3D p_cnt + VP8_PROB_COUNT_MV_OFFSET; > + for (i =3D 0; i < 2; i++) { > + left =3D *p_tmp++; > + right =3D *p_tmp++; > + > + p =3D calc_mvprob(left, right, entropy->mv_prob_old[i][0]= ); > + > + if (update_prob(mv_update_prob[i][0], left, right, > + entropy->mv_prob_old[i][0], p, 6)) > + entropy->mv_prob[i][0] =3D p; > + > + right +=3D left; > + left =3D *p_tmp++; > + right -=3D left - p_tmp[0]; > + > + p =3D calc_mvprob(left, right, entropy->mv_prob_old[i][1]= ); > + if (update_prob(mv_update_prob[i][1], left, right, > + entropy->mv_prob_old[i][1], p, 6)) > + entropy->mv_prob[i][1] =3D p; > + > + for (j =3D 0; j < 2; j++) { > + left =3D *p_tmp++; > + right =3D *p_tmp++; > + p =3D calc_mvprob(left, right, entropy->mv_prob_o= ld[i][4 + j]); > + if (update_prob(mv_update_prob[i][4 + j], left, r= ight, > + entropy->mv_prob_old[i][4 + j], p= , 6)) > + entropy->mv_prob[i][4 + j] =3D p; > + branch_cnt[j] =3D left + right; > + } > + > + p =3D calc_mvprob(branch_cnt[0], branch_cnt[1], entropy->= mv_prob_old[i][3]); > + if (update_prob(mv_update_prob[i][3], branch_cnt[0], bran= ch_cnt[1], > + entropy->mv_prob_old[i][3], p, 6)) > + entropy->mv_prob[i][3] =3D p; > + > + type =3D branch_cnt[0] + branch_cnt[1]; > + > + for (j =3D 0; j < 2; j++) { > + left =3D *p_tmp++; > + right =3D *p_tmp++; > + p =3D calc_mvprob(left, right, entropy->mv_prob_o= ld[i][7 + j]); > + if (update_prob(mv_update_prob[i][7 + j], left, r= ight, > + entropy->mv_prob_old[i][7 + j], p= , 6)) > + entropy->mv_prob[i][7 + j] =3D p; > + branch_cnt[j] =3D left + right; > + } > + > + p =3D calc_mvprob(branch_cnt[0], branch_cnt[1], entropy->= mv_prob_old[i][6]); > + if (update_prob(mv_update_prob[i][6], branch_cnt[0], bran= ch_cnt[1], > + entropy->mv_prob_old[i][6], p, 6)) > + entropy->mv_prob[i][6] =3D p; > + > + p =3D calc_mvprob(type, branch_cnt[0] + branch_cnt[1], > + entropy->mv_prob_old[i][2]); > + if (update_prob(mv_update_prob[i][2], type, branch_cnt[0]= + branch_cnt[1], > + entropy->mv_prob_old[i][2], p, 6)) > + entropy->mv_prob[i][2] =3D p; > + } > + > + memcpy(entropy->y_mode_prob, y_mode_prob, sizeof(y_mode_prob)); > + memcpy(entropy->uv_mode_prob, uv_mode_prob, sizeof(uv_mode_prob))= ; > +} > + > +static inline int coeff_prob_idx(int index) > +{ > + return (index / 8) * 8 + 7 - (index % 8); > +} > + > +static void rockchip_vpu2_vp8_enc_write_entropy(struct hantro_ctx *ctx) > +{ > + struct hantro_vp8_entropy *entropy =3D &ctx->vp8_enc.entropy; > + uint8_t *entropy_table =3D ctx->vp8_enc.priv_src.cpu; > + int index, i, j, k, l; > + > + memset(entropy_table, 0, 56); > + entropy_table[7] =3D ctx->vp8_enc.prob_skip_false; > + entropy_table[6] =3D ctx->vp8_enc.prob_intra; > + entropy_table[5] =3D ctx->vp8_enc.prob_last; > + entropy_table[4] =3D ctx->vp8_enc.prob_gf; > + entropy_table[3] =3D 0; /* segment_prob[0]; */ > + entropy_table[2] =3D 0; /* segment_prob[1]; */ > + entropy_table[1] =3D 0; /* segment_prob[2]; */ > + > + entropy_table[15] =3D entropy->y_mode_prob[0]; > + entropy_table[14] =3D entropy->y_mode_prob[1]; > + entropy_table[13] =3D entropy->y_mode_prob[2]; > + entropy_table[12] =3D entropy->y_mode_prob[3]; > + entropy_table[11] =3D entropy->uv_mode_prob[0]; > + entropy_table[10] =3D entropy->uv_mode_prob[1]; > + entropy_table[9] =3D entropy->uv_mode_prob[2]; > + > + entropy_table[23] =3D entropy->mv_prob[1][0]; > + entropy_table[22] =3D entropy->mv_prob[0][0]; > + entropy_table[21] =3D entropy->mv_prob[1][1]; > + entropy_table[20] =3D entropy->mv_prob[0][1]; > + entropy_table[19] =3D entropy->mv_prob[1][17]; > + entropy_table[18] =3D entropy->mv_prob[1][18]; > + entropy_table[17] =3D entropy->mv_prob[0][17]; > + entropy_table[16] =3D entropy->mv_prob[0][18]; > + > + for (i =3D 0; i < 8; ++i) > + entropy_table[24 + 7 - i] =3D entropy->mv_prob[1][9 + i]; > + > + for (i =3D 0; i < 8; ++i) > + entropy_table[32 + 7 - i] =3D entropy->mv_prob[0][9 + i]; > + > + for (i =3D 0; i < 7; ++i) > + entropy_table[40 + 7 - i] =3D entropy->mv_prob[1][2 + i]; > + > + for (i =3D 0; i < 7; ++i) > + entropy_table[48 + 7 - i] =3D entropy->mv_prob[0][2 + i]; > + > + index =3D 56; > + > + for (i =3D 0; i < 4; ++i) > + for (j =3D 0; j < 8; ++j) > + for (k =3D 0; k < 3; ++k) { > + for (l =3D 0; l < 3; ++l) > + entropy_table[coeff_prob_idx(inde= x++)] =3D > + entropy->coeff_prob[i][j]= [k][l]; > + entropy_table[coeff_prob_idx(index++)] = =3D 0; > + } > + > + for (i =3D 0; i < 4; ++i) > + for (j =3D 0; j < 8; ++j) > + for (k =3D 0; k < 3; ++k) { > + for (l =3D 4; l < 11; ++l) > + entropy_table[coeff_prob_idx(inde= x++)] =3D > + entropy->coeff_prob[i][j]= [k][l]; > + entropy_table[coeff_prob_idx(index++)] = =3D > + entropy->coeff_prob[i][j][k][3]; > + } > +} > + > +static inline size_t sw_hdr_size(struct hantro_ctx *ctx) > +{ > + return ctx->vp8_enc.boolenc.bytes_written + frame_tag_size(ctx); > +} > + > +static inline u32 enc_in_img_ctrl(struct hantro_ctx *ctx, u32 qp) > +{ > + unsigned int overfill_r, overfill_b; > + > + /* > + * The hardware needs only the value for luma plane, because > + * values of other planes are calculated internally based on > + * format setting. > + */ > + overfill_r =3D ctx->src_fmt.width - ctx->dst_fmt.width; > + overfill_b =3D ctx->src_fmt.height - ctx->dst_fmt.height; > + > + return VEPU_REG_STREAM_START_OFFSET(0) | > + VEPU_REG_IN_IMG_CTRL_OVRFLR_D4(overfill_r / 4) | > + VEPU_REG_IN_IMG_CTRL_OVRFLB(overfill_b) | > + VEPU_REG_SKIP_MACROBLOCK_PENALTY(qp >=3D 100 ? (3 * qp / = 4) : 0); > +} > + > +static void > +rockchip_vpu2_vp8_enc_set_buffers(struct hantro_dev *vpu, struct hantro_= ctx *ctx, u32 qp, > + struct v4l2_ctrl_vp8_encode_params *par= ams) > +{ > + const u32 src_addr_regs[] =3D { VEPU_REG_ADDR_IN_PLANE_0, > + VEPU_REG_ADDR_IN_PLANE_1, > + VEPU_REG_ADDR_IN_PLANE_2 }; > + struct vb2_v4l2_buffer *src_buf, *dst_buf; > + struct v4l2_pix_format_mplane *src_fmt =3D &ctx->src_fmt; > + size_t luma_size; > + dma_addr_t dst_dma; > + size_t dst_size; > + int i, ref_idx; > + > + src_buf =3D hantro_get_src_buf(ctx); > + dst_buf =3D hantro_get_dst_buf(ctx); > + > + luma_size =3D hantro_rounded_luma_size(ctx->src_fmt.width, > + ctx->src_fmt.height); > + > + dst_dma =3D vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); > + dst_size =3D vb2_plane_size(&dst_buf->vb2_buf, 0); > + > + /* > + * We assume here that 1/10 of the buffer is enough for headers. > + * DCT partition will be placed in remaining 9/10 of the buffer. > + */ > + ctx->vp8_enc.estimated_hdr_size =3D round_up(dst_size / 10, 8); > + > + /* Destination buffer. */ > + /* > + * We "abused" the first portion of this 1/10 of the buffer when = generating > + * the frame tag and compressed header, so TODO: verify that the = 1/10 can hold both the > + * compressed header and the "extended header" generated in hw. > + */ > + vepu_write_relaxed(vpu, dst_dma + round_up(sw_hdr_size(ctx), 8), > + VEPU_REG_ADDR_OUTPUT_STREAM); > + vepu_write_relaxed(vpu, dst_dma + ctx->vp8_enc.estimated_hdr_size= , > + VEPU_REG_ADDR_VP8_DCT_PART(0)); > + vepu_write_relaxed(vpu, dst_size - ctx->vp8_enc.estimated_hdr_siz= e, > + VEPU_REG_STR_BUF_LIMIT); > + > + /* Auxiliary buffers. */ > + vepu_write_relaxed(vpu, ctx->vp8_enc.ctrl_buf.dma, > + VEPU_REG_ADDR_OUTPUT_CTRL); > + memset(ctx->vp8_enc.ctrl_buf.cpu, 0, ctx->vp8_enc.ctrl_buf.size); > + vepu_write_relaxed(vpu, ctx->vp8_enc.mv_buf.dma, > + VEPU_REG_ADDR_MV_OUT); > + vepu_write_relaxed(vpu, ctx->vp8_enc.priv_dst.dma, > + VEPU_REG_ADDR_VP8_PROB_CNT); > + memset(ctx->vp8_enc.priv_dst.cpu, 0, ctx->vp8_enc.priv_dst.size); > + vepu_write_relaxed(vpu, ctx->vp8_enc.priv_src.dma, > + VEPU_REG_ADDR_CABAC_TBL); > + > + rockchip_vpu2_vp8_enc_write_entropy(ctx); > + > + vepu_write_relaxed(vpu, ctx->vp8_enc.priv_src.dma + 151 * 8, > + VEPU_REG_ADDR_VP8_SEG_MAP); > + > + /* Reference buffers. */ > + switch (params->reference_type) { > + case V4L2_VP8_FRAME_REF_LAST: > + ref_idx =3D ctx->vp8_enc.last_ref; > + break; > + case V4L2_VP8_FRAME_REF_GOLDEN: > + ref_idx =3D ctx->vp8_enc.golden_ref; > + break; > + case V4L2_VP8_FRAME_REF_ALT: > + ref_idx =3D ctx->vp8_enc.alt_ref; > + break; > + } > + if (ref_idx < 0) > + ref_idx =3D 0; > + vepu_write_relaxed(vpu, ctx->vp8_enc.ref_frames[ref_idx].dma, VEP= U_REG_ADDR_REF_LUMA); > + vepu_write_relaxed(vpu, ctx->vp8_enc.ref_frames[ref_idx].dma + lu= ma_size, > + VEPU_REG_ADDR_REF_CHROMA); > + > + /* Reconstruction buffers. */ > + ctx->vp8_enc.reconstructed =3D ctx->vp8_enc.first_free; > + vepu_write_relaxed(vpu, ctx->vp8_enc.ref_frames[ctx->vp8_enc.reco= nstructed].dma, > + VEPU_REG_ADDR_REC_LUMA); > + vepu_write_relaxed(vpu, ctx->vp8_enc.ref_frames[ctx->vp8_enc.reco= nstructed].dma + luma_size, > + VEPU_REG_ADDR_REC_CHROMA); > + > + /* Source buffer. */ > + for (i =3D 0; i < src_fmt->num_planes; ++i) > + vepu_write_relaxed(vpu, > + vb2_dma_contig_plane_dma_addr(&src_buf= ->vb2_buf, i) + > + src_buf->vb2_buf.planes[i].data_offset= , > + src_addr_regs[i]); > + > + /* Source parameters. */ > + vepu_write_relaxed(vpu, enc_in_img_ctrl(ctx, qp), > + VEPU_REG_ENC_OVER_FILL_STRM_OFFSET); > +} > + > +static inline uint32_t compute_filter_level(int32_t qp) > +{ > + return clamp((qp * 64) / 128 + 8, 0, 63); > +} > + > +static s32 cost_tree(struct tree *tree, const s32 *prob) > +{ > + s32 value =3D tree->value; > + s32 number =3D tree->number; > + s32 *index =3D tree->index; > + s32 bit_cost =3D 0; > + > + while (number--) > + bit_cost +=3D COST_BOOL(prob[*index++], (value >> number)= & 1); > + > + return bit_cost; > +} > + > +static s32 cost_mv(s32 mvd, const s32 *mv_prob) > +{ > + s32 i, tmp, bit_cost =3D 0; > + > + tmp =3D abs(mvd >> 1); > + > + /* Short Tree */ > + if (tmp < 8) { > + bit_cost +=3D COST_BOOL(mv_prob[0], 0); > + bit_cost +=3D cost_tree(&mv_tree[tmp], mv_prob + 2); > + if (!tmp) > + return bit_cost; > + > + /* Sign */ > + bit_cost +=3D COST_BOOL(mv_prob[1], mvd < 0); > + return bit_cost; > + } > + > + /* Long Tree */ > + bit_cost +=3D COST_BOOL(mv_prob[0], 1); > + > + /* Bits 0, 1, 2 */ > + for (i =3D 0; i < 3; i++) > + bit_cost +=3D COST_BOOL(mv_prob[9 + i], (tmp >> i) & 1); > + > + /* Bits 9, 8, 7, 6, 5, 4 */ > + for (i =3D 9; i > 3; i--) > + bit_cost +=3D COST_BOOL(mv_prob[9 + i], (tmp >> i) & 1); > + > + /* > + * Bit 3: if ABS(mvd) < 8, it is coded with short tree, so if her= e > + * ABS(mvd) <=3D 15, bit 3 must be one (because here we code valu= es > + * 8,...,15) and is not explicitly coded. > + */ > + if (tmp > 15) > + bit_cost +=3D COST_BOOL(mv_prob[9 + 3], (tmp >> 3) & 1); > + > + /* Sign */ > + bit_cost +=3D COST_BOOL(mv_prob[1], mvd < 0); > + > + return bit_cost; > +} > + > +static void rockchip_vpu2_vp8_enc_set_params(struct hantro_dev *vpu, str= uct hantro_ctx *ctx, u32 qp, > + struct v4l2_ctrl_vp8_encode_= params *params) > +{ > + struct hantro_vp8_entropy *entropy =3D &ctx->vp8_enc.entropy; > + int i; > + unsigned int mb_width =3D MB_WIDTH(ctx->src_fmt.width); > + unsigned int mb_height =3D MB_HEIGHT(ctx->src_fmt.height); > + u32 deq; > + u32 tmp; > + u32 reg; > + s32 inter_favor; > + > + reg =3D VEPU_REG_OUTPUT_SWAP32 > + | VEPU_REG_OUTPUT_SWAP16 > + | VEPU_REG_OUTPUT_SWAP8 > + | VEPU_REG_INPUT_SWAP8 > + | VEPU_REG_INPUT_SWAP16 > + | VEPU_REG_INPUT_SWAP32; > + vepu_write_relaxed(vpu, reg, VEPU_REG_DATA_ENDIAN); > + > + reg =3D VEPU_REG_SIZE_TABLE_PRESENT > + | VEPU_REG_IN_IMG_CTRL_FMT(ctx->vpu_src_fmt->enc_fmt) > + | VEPU_REG_IN_IMG_ROTATE_MODE(0); > + vepu_write_relaxed(vpu, reg, VEPU_REG_ENC_CTRL1); > + > + reg =3D VEPU_REG_INTERRUPT_TIMEOUT_EN > + | VEPU_REG_MV_WRITE_EN; > + vepu_write_relaxed(vpu, reg, VEPU_REG_INTERRUPT); > + > + reg =3D VEPU_REG_IN_IMG_CHROMA_OFFSET(0) > + | VEPU_REG_IN_IMG_LUMA_OFFSET(0) > + | VEPU_REG_IN_IMG_CTRL_ROW_LEN(mb_width * 16); > + vepu_write_relaxed(vpu, reg, VEPU_REG_INPUT_LUMA_INFO); > + > + vepu_write_relaxed(vpu, 0, VEPU_REG_STR_HDR_REM_MSB); > + vepu_write_relaxed(vpu, 0, VEPU_REG_STR_HDR_REM_LSB); > + > + reg =3D 0; > + if (mb_width * mb_height > MAX_MB_COUNT_TO_DISABLE_QUARTER_PIXEL_= MV) > + reg =3D VEPU_REG_DISABLE_QUARTER_PIXEL_MV; > + reg |=3D VEPU_REG_ENTROPY_CODING_MODE; > + vepu_write_relaxed(vpu, reg, VEPU_REG_ENC_CTRL0); > + > + inter_favor =3D 128 - ctx->vp8_enc.prob_intra; > + if (inter_favor >=3D 0) > + inter_favor =3D max(0, (int32_t)(qp * 2 - 40)); > + > + reg =3D VEPU_REG_INTRA16X16_MODE(qp * 1024 / 128) > + | VEPU_REG_INTER_MODE(inter_favor); > + vepu_write_relaxed(vpu, reg, VEPU_REG_INTRA_INTER_MODE); > + > + reg =3D VEPU_REG_1MV_PENALTY(60 / 2 * 32) > + | VEPU_REG_QMV_PENALTY(8) > + | VEPU_REG_4MV_PENALTY(64 / 2); > + if (mb_width * mb_height < MAX_MB_COUNT_TO_DISABLE_SPLIT_MV) > + reg |=3D VEPU_REG_SPLIT_MV_MODE_EN; > + vepu_write_relaxed(vpu, reg, VEPU_REG_MV_PENALTY); > + > + reg =3D VEPU_REG_MV_PENALTY_16X8_8X16( > + min(1023, split_penalty[qp] / 2)) > + | VEPU_REG_MV_PENALTY_8X8( > + min(1023, (2 * split_penalty[qp] + 40) / 4)) > + | VEPU_REG_MV_PENALTY_8X4_4X8(0x3ff); > + /* no 8x4 or 4x8 block define in vp8 */ > + vepu_write_relaxed(vpu, reg, VEPU_REG_ENC_CTRL4); > + > + reg =3D VEPU_REG_PENALTY_4X4MV(min(511, > + (8 * split_penalty[qp] + 500) / = 16)) > + | VEPU_REG_ZERO_MV_FAVOR_D2(0); > + vepu_write_relaxed(vpu, reg, VEPU_REG_MVC_RELATE); > + > + /* initialize quant table for segment0 */ > + deq =3D dc_q_lookup[qp]; > + reg =3D VEPU_REG_VP8_SEG0_QUT_DC_Y1(min((1 << 16) / deq, 0x3FFFu)= ); > + reg |=3D VEPU_REG_VP8_SEG0_ZBIN_DC_Y1(((qzbin_factors[qp] * deq) = + 64) >> > + 7); > + reg |=3D VEPU_REG_VP8_SEG0_RND_DC_Y1((qrounding_factors[qp] * deq= ) >> 7); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_SEG0_QUANT_DC_Y1); > + > + deq =3D ac_q_lookup[qp]; > + reg =3D VEPU_REG_VP8_SEG0_QUT_AC_Y1(min((1 << 16) / deq, 0x3FFFu)= ); > + reg |=3D VEPU_REG_VP8_SEG0_ZBIN_AC_Y1(((qzbin_factors[qp] * deq) = + 64) >> > + 7); > + reg |=3D VEPU_REG_VP8_SEG0_RND_AC_Y1((qrounding_factors[qp] * deq= ) >> 7); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_SEG0_QUANT_AC_Y1); > + > + deq =3D dc_q_lookup[qp] * 2; > + reg =3D VEPU_REG_VP8_SEG0_QUT_DC_Y2(min((1 << 16) / deq, 0x3FFFu)= ); > + reg |=3D VEPU_REG_VP8_SEG0_ZBIN_DC_Y2((qzbin_factors[qp] * deq + = 64) >> > + 7); > + reg |=3D VEPU_REG_VP8_SEG0_RND_DC_Y2((qrounding_factors[qp] * deq= ) >> 7); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_SEG0_QUANT_DC_Y2); > + > + deq =3D max(ac_q_lookup[qp] * 155 / 100, 8); > + reg =3D VEPU_REG_VP8_SEG0_QUT_AC_Y2(min((1 << 16) / deq, 0x3FFFu)= ); > + reg |=3D VEPU_REG_VP8_SEG0_ZBIN_AC_Y2((qzbin_factors[qp] * deq + = 64) >> > + 7); > + reg |=3D VEPU_REG_VP8_SEG0_RND_AC_Y2((qrounding_factors[qp] * deq= ) >> 7); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_SEG0_QUANT_AC_Y2); > + > + deq =3D min(dc_q_lookup[qp], 132); > + reg =3D VEPU_REG_VP8_SEG0_QUT_DC_CHR(min((1 << 16) / deq, 0x3FFFu= )); > + reg |=3D VEPU_REG_VP8_SEG0_ZBIN_DC_CHR((qzbin_factors[qp] * deq += 64) >> > + 7); > + reg |=3D VEPU_REG_VP8_SEG0_RND_DC_CHR((qrounding_factors[qp] * de= q) >> 7); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_SEG0_QUANT_DC_CHR); > + > + deq =3D ac_q_lookup[qp]; > + reg =3D VEPU_REG_VP8_SEG0_QUT_AC_CHR(min((1 << 16) / deq, 0x3FFFu= )); > + reg |=3D VEPU_REG_VP8_SEG0_ZBIN_AC_CHR((qzbin_factors[qp] * deq += 64) >> > + 7); > + reg |=3D VEPU_REG_VP8_SEG0_RND_AC_CHR((qrounding_factors[qp] * de= q) >> 7); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_SEG0_QUANT_AC_CHR); > + > + reg =3D VEPU_REG_VP8_MV_REF_IDX1(params->reference_type); > + reg |=3D VEPU_REG_VP8_SEG0_DQUT_DC_Y1(dc_q_lookup[qp]); > + reg |=3D VEPU_REG_VP8_SEG0_DQUT_AC_Y1(ac_q_lookup[qp]); > + reg |=3D VEPU_REG_VP8_SEG0_DQUT_DC_Y2(dc_q_lookup[qp] * 2); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_SEG0_QUANT_DQUT); > + > + reg =3D VEPU_REG_VP8_MV_REF_IDX2(0); > + reg |=3D VEPU_REG_VP8_SEG0_DQUT_DC_CHR(min(dc_q_lookup[qp], 132))= ; > + reg |=3D VEPU_REG_VP8_SEG0_DQUT_AC_CHR(ac_q_lookup[qp]); > + reg |=3D VEPU_REG_VP8_SEG0_DQUT_AC_Y2(max(ac_q_lookup[qp] * 155 /= 100, 8)); > + if (is_intra(ctx)) > + reg |=3D VEPU_REG_VP8_SEGMENT_MAP_UPDATE; > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_SEG0_QUANT_DQUT_1); > + vepu_write_relaxed(vpu, ctx->vp8_enc.boolenc.bottom, > + VEPU_REG_VP8_BOOL_ENC_VALUE); > + > + reg =3D VEPU_REG_VP8_DCT_PARTITION_CNT(0); > + reg |=3D VEPU_REG_VP8_FILTER_LEVEL(compute_filter_level(qp)); > + reg |=3D VEPU_REG_VP8_FILTER_SHARPNESS(params->sharpness_level); > + reg |=3D VEPU_REG_VP8_ZERO_MV_PENALTY_FOR_REF2(0); > + reg |=3D VEPU_REG_VP8_BOOL_ENC_VALUE_BITS(24 - ctx->vp8_enc.boole= nc.bit_count); > + reg |=3D VEPU_REG_VP8_BOOL_ENC_RANGE(ctx->vp8_enc.boolenc.range); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_ENC_CTRL2); > + > + vepu_write_relaxed(vpu, 0xffffffff, VEPU_REG_ROI1); > + vepu_write_relaxed(vpu, 0xffffffff, VEPU_REG_ROI2); > + vepu_write_relaxed(vpu, 0, VEPU_REG_STABILIZATION_OUTPUT); > + vepu_write_relaxed(vpu, 0x962b4c85, VEPU_REG_RGB2YUV_CONVERSION_C= OEF1); > + vepu_write_relaxed(vpu, 0x90901d50, VEPU_REG_RGB2YUV_CONVERSION_C= OEF2); > + vepu_write_relaxed(vpu, 0x0000b694, VEPU_REG_RGB2YUV_CONVERSION_C= OEF3); > + vepu_write_relaxed(vpu, 0, VEPU_REG_RGB_MASK_MSB); > + vepu_write_relaxed(vpu, 0, VEPU_REG_CIR_INTRA_CTRL); > + vepu_write_relaxed(vpu, 0xffffffff, VEPU_REG_INTRA_AREA_CTRL); > + > + /* Intra 4x4 mode */ > + tmp =3D qp * 2 + 8; > + for (i =3D 0; i < 5; i++) { > + reg =3D VEPU_REG_VP8_INTRA_4X4_PENALTY_0 > + ((intra_4_tree_penalty[i * 2] * tmp) >> 8); > + reg |=3D VEPU_REG_VP8_INTRA_4x4_PENALTY_1 > + ((intra_4_tree_penalty[i * 2 + 1] * tmp) >> 8); > + vepu_write_relaxed(vpu, reg, > + VEPU_REG_VP8_INTRA_4X4_PENALTY(i)); > + } > + > + /* Intra 16x16 mode */ > + tmp =3D qp * 2 + 64; > + for (i =3D 0; i < 2; i++) { > + reg =3D VEPU_REG_VP8_INTRA_16X16_PENALTY_0 > + ((intra_16_tree_penalty[2 * i] * tmp) >> 8); > + reg |=3D VEPU_REG_VP8_INTRA_16X16_PENALTY_1 > + ((intra_16_tree_penalty[2 * i + 1] * tmp) >> 8); > + vepu_write_relaxed(vpu, reg, > + VEPU_REG_VP8_INTRA_16X16_PENALTY(i)); > + } > + > + reg =3D VEPU_REG_VP8_LF_REF_DELTA_INTRA_MB(ctx->vp8_enc.ref_delta= [REF_DELTA_INTRA_MB]); > + reg |=3D VEPU_REG_VP8_LF_MODE_DELTA_BPRED(ctx->vp8_enc.mode_delta= [MODE_DELTA_BPRED]); > + reg |=3D VEPU_REG_VP8_INTER_TYPE_BIT_COST(0); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_CONTROL); > + > + reg =3D VEPU_REG_VP8_LF_REF_DELTA_ALT_REF(ctx->vp8_enc.ref_delta[= REF_DELTA_ALT_REF]) > + | VEPU_REG_VP8_LF_REF_DELTA_LAST_REF(ctx->vp8_enc.ref_del= ta[REF_DELTA_LAST_REF]) > + | VEPU_REG_VP8_LF_REF_DELTA_GOLDEN(ctx->vp8_enc.ref_delta= [REF_DELTA_GOLDEN]); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_LOOP_FILTER_REF_DELTA); > + > + reg =3D VEPU_REG_VP8_LF_MODE_DELTA_SPLITMV(ctx->vp8_enc.mode_delt= a[MODE_DELTA_SPLITMV]) > + | VEPU_REG_VP8_LF_MODE_DELTA_ZEROMV(ctx->vp8_enc.mode_del= ta[MODE_DELTA_ZEROMV]) > + | VEPU_REG_VP8_LF_MODE_DELTA_NEWMV(ctx->vp8_enc.mode_delt= a[MODE_DELTA_NEWMV]); > + vepu_write_relaxed(vpu, reg, VEPU_REG_VP8_LOOP_FILTER_MODE_DELTA)= ; > + > + for (i =3D 0; i < 128; i +=3D 4) { > + u32 x; > + u32 y; > + > + reg =3D VEPU_REG_DMV_PENALTY_TABLE_BIT(i * 2, 3); > + reg |=3D VEPU_REG_DMV_PENALTY_TABLE_BIT((i + 1) * 2, 2); > + reg |=3D VEPU_REG_DMV_PENALTY_TABLE_BIT((i + 2) * 2, 1); > + reg |=3D VEPU_REG_DMV_PENALTY_TABLE_BIT((i + 3) * 2, 0); > + vepu_write_relaxed(vpu, reg, VEPU_REG_DMV_PENALTY_TBL(i /= 4)); > + > + y =3D cost_mv(i * 2, entropy->mv_prob[0]); /* mv y= */ > + x =3D cost_mv(i * 2, entropy->mv_prob[1]); /* mv x= */ > + > + reg =3D VEPU_REG_DMV_Q_PIXEL_PENALTY_TABLE_BIT( > + min(255u, (y + x + 1) / 2 * weight[qp] >> 8), 3); > + > + y =3D cost_mv((i + 1) * 2, entropy->mv_prob[0]); /* mv y = */ > + x =3D cost_mv((i + 1) * 2, entropy->mv_prob[1]); /* mv x = */ > + reg |=3D VEPU_REG_DMV_Q_PIXEL_PENALTY_TABLE_BIT( > + min(255u, (y + x + 1) / 2 * weight[qp] >> 8), 2); > + > + y =3D cost_mv((i + 2) * 2, entropy->mv_prob[0]); /* mv y = */ > + x =3D cost_mv((i + 2) * 2, entropy->mv_prob[1]); /* mv x = */ > + reg |=3D VEPU_REG_DMV_Q_PIXEL_PENALTY_TABLE_BIT( > + min(255u, (y + x + 1) / 2 * weight[qp] >> 8), 1); > + > + y =3D cost_mv((i + 3) * 2, entropy->mv_prob[0]); /* mv y = */ > + x =3D cost_mv((i + 3) * 2, entropy->mv_prob[1]); /* mv x = */ > + reg |=3D VEPU_REG_DMV_Q_PIXEL_PENALTY_TABLE_BIT( > + min(255u, (y + x + 1) / 2 * weight[qp] >> 8), 0); > + > + vepu_write_relaxed(vpu, reg, > + VEPU_REG_DMV_Q_PIXEL_PENALTY_TBL(i / 4= )); > + } > +} > + > +int rockchip_vpu2_vp8_enc_run(struct hantro_ctx *ctx) > +{ > + struct hantro_dev *vpu =3D ctx->dev; > + struct v4l2_ctrl_vp8_encode_params *params; > + struct v4l2_ctrl *ctrl; > + u32 reg, qp; > + int i; > + > + hantro_start_prepare_run(ctx); > + > + params =3D hantro_get_ctrl(ctx, V4L2_CID_STATELESS_VP8_ENCODE_PAR= AMS); > + if (WARN_ON(!params)) > + return -EINVAL; > + > + if (params->flags & V4L2_VP8_FRAME_FLAG_SEGMENT_ENABLED) > + return -EINVAL; > + > + ctx->vp8_enc.is_intra =3D params->frame_type =3D=3D V4L2_VP8_FRAM= E_TYPE_KEYFRAME; > + > + if (is_intra(ctx)) { > + if (params->loop_filter_level !=3D 26) > + return -EINVAL; > + } else { > + if (params->loop_filter_level !=3D 12) > + return -EINVAL; > + } > + > + ctrl =3D v4l2_ctrl_find(&ctx->ctrl_handler, V4L2_CID_STATELESS_VP= 8_ENCODE_QP); > + if (WARN_ON(!ctrl)) > + return -EINVAL; > + > + ctx->vp8_enc.show_frame =3D params->flags & V4L2_VP8_FRAME_FLAG_S= HOWFRAME; > + ctx->vp8_enc.refresh_golden_frame =3D params->flags & V4L2_VP8_FR= AME_FLAG_GOLDEN_REFRESH; > + ctx->vp8_enc.refresh_alternate_frame =3D params->flags & V4L2_VP8= _FRAME_FLAG_ALTREF_REFRESH; > + ctx->vp8_enc.refresh_entropy_probs =3D > + params->flags & V4L2_VP8_FRAME_FLAG_REFRESH_ENTROPY_PROBS= ; > + ctx->vp8_enc.copy_buffer_to_golden =3D params->copy_buffer_to_gol= den; > + ctx->vp8_enc.copy_buffer_to_alternate =3D params->copy_buffer_to_= alternate; > + ctx->vp8_enc.prob_intra =3D params->prob_intra; > + ctx->vp8_enc.prob_last =3D params->prob_last; > + ctx->vp8_enc.prob_gf =3D params->prob_gf; > + > + rockchip_vpu2_vp8_enc_update_entropy(ctx); > + > + qp =3D *ctrl->p_cur.p_s32; > + ctx->vp8_enc.prob_skip_false =3D default_prob_skip_false[qp]; > + rockchip_vpu2_vp8_enc_write_header(ctx, qp, params); > + > + /* > + * Program the hardware. > + */ > + vepu_write_relaxed(vpu, VEPU_REG_ENCODE_FORMAT_VP8, VEPU_REG_ENCO= DE_START); > + > + rockchip_vpu2_vp8_enc_set_params(vpu, ctx, qp, params); > + rockchip_vpu2_vp8_enc_set_buffers(vpu, ctx, qp, params); > + > + reg =3D VEPU_REG_AXI_CTRL_READ_ID(0) > + | VEPU_REG_AXI_CTRL_WRITE_ID(0) > + | VEPU_REG_AXI_CTRL_BURST_LEN(16) > + | VEPU_REG_AXI_CTRL_INCREMENT_MODE(0) > + | VEPU_REG_AXI_CTRL_BIRST_DISCARD(0); > + vepu_write_relaxed(vpu, reg, VEPU_REG_AXI_CTRL); > + > + /* Start the hardware. */ > + reg =3D VEPU_REG_MB_HEIGHT(MB_HEIGHT(ctx->src_fmt.height)) > + | VEPU_REG_MB_WIDTH(MB_WIDTH(ctx->src_fmt.width)) > + | VEPU_REG_ENCODE_FORMAT_VP8 > + | VEPU_REG_ENCODE_ENABLE; > + > + if (is_intra(ctx)) > + reg |=3D VEPU_REG_FRAME_TYPE_INTRA; > + else > + reg |=3D VEPU_REG_FRAME_TYPE_INTER; > + > + /* Kick the watchdog and start encoding */ > + hantro_end_prepare_run(ctx); > + > + for (i =3D 0; i < 184; ++i) > + vepu_read(vpu, i * 4); > + > + vepu_write(vpu, reg, VEPU_REG_ENCODE_START); > + > + return 0; > +} > + > +void rockchip_vpu2_vp8_enc_done(struct hantro_ctx *ctx) > +{ > + struct vb2_v4l2_buffer *dst_buf; > + struct hantro_vp8_enc_ctrl_buf *ctrl_buf =3D ctx->vp8_enc.ctrl_bu= f.cpu; > + int part1_sz =3D ctx->vp8_enc.boolenc.bytes_written + ctrl_buf->h= w_hdr_size; > + void *dst =3D ctx->vp8_enc.frame_tag; > + int old_g =3D ctx->vp8_enc.golden_ref, old_a =3D ctx->vp8_enc.alt= _ref; > + int i; > + > + ctx->vp8_enc.frame_tag->tag[0] |=3D ((part1_sz << 5) & 0xff); > + ctx->vp8_enc.frame_tag->tag[1] =3D ((part1_sz << 5) >> 8) & 0xff; > + ctx->vp8_enc.frame_tag->tag[2] =3D ((part1_sz << 5) >> 16) & 0xff= ; > + > + dst_buf =3D hantro_get_dst_buf(ctx); > + > + /* assemble dst frame */ > + vb2_set_plane_payload(&dst_buf->vb2_buf, 0, > + sw_hdr_size(ctx) + ctrl_buf->hw_hdr_size + = ctrl_buf->dct_size); > + > + memmove(dst + sw_hdr_size(ctx), dst + round_up(sw_hdr_size(ctx), = 8), ctrl_buf->hw_hdr_size); > + memmove(dst + sw_hdr_size(ctx) + ctrl_buf->hw_hdr_size, > + dst + ctx->vp8_enc.estimated_hdr_size, ctrl_buf->dct_size= ); > + > + /* currently reconstructed frame becames last ref */ > + hantro_vp8_clr_bit(&ctx->vp8_enc, VP8_BIT_LAST, ctx->vp8_enc.last= _ref); > + ctx->vp8_enc.last_ref =3D ctx->vp8_enc.reconstructed; > + hantro_vp8_set_bit(&ctx->vp8_enc, VP8_BIT_LAST, ctx->vp8_enc.last= _ref); > + > + /* after update (potentially) new slots will be used */ > + hantro_vp8_clr_bit(&ctx->vp8_enc, VP8_BIT_GOLDEN, old_g); > + hantro_vp8_clr_bit(&ctx->vp8_enc, VP8_BIT_ALT, old_a); > + > + /* VP8 spec, section 9.7. Refresh Golden Frame and Altref Frame *= / > + if (is_intra(ctx)) { > + ctx->vp8_enc.golden_ref =3D ctx->vp8_enc.last_ref; > + ctx->vp8_enc.alt_ref =3D ctx->vp8_enc.last_ref; > + } else { > + if (ctx->vp8_enc.refresh_golden_frame) { > + ctx->vp8_enc.golden_ref =3D ctx->vp8_enc.last_ref= ; > + } else if (ctx->vp8_enc.copy_buffer_to_golden) { > + switch (ctx->vp8_enc.copy_buffer_to_golden) { > + case V4L2_VP8_FRAME_GOLDEN_KEEP: > + break; > + case V4L2_VP8_FRAME_GOLDEN_LASTFRAME: > + ctx->vp8_enc.golden_ref =3D ctx->vp8_enc.= last_ref; > + break; > + case V4L2_VP8_FRAME_GOLDEN_ALTREF: > + ctx->vp8_enc.golden_ref =3D old_a; > + break; > + } > + } > + > + if (ctx->vp8_enc.refresh_alternate_frame) { > + ctx->vp8_enc.alt_ref =3D ctx->vp8_enc.last_ref; > + } else if (ctx->vp8_enc.copy_buffer_to_alternate) { > + switch (ctx->vp8_enc.copy_buffer_to_alternate) { > + case V4L2_VP8_FRAME_ALTREF_KEEP: > + break; > + case V4L2_VP8_FRAME_ALTREF_LASTFRAME: > + ctx->vp8_enc.alt_ref =3D ctx->vp8_enc.las= t_ref; > + break; > + case V4L2_VP8_FRAME_ALTREF_GOLDEN: > + ctx->vp8_enc.alt_ref =3D old_g; > + break; > + } > + } > + } > + > + /* mark updated golden and alt slots used */ > + hantro_vp8_set_bit(&ctx->vp8_enc, VP8_BIT_GOLDEN, ctx->vp8_enc.go= lden_ref); > + hantro_vp8_set_bit(&ctx->vp8_enc, VP8_BIT_ALT, ctx->vp8_enc.alt_r= ef); > + > + /* find first free slot after updates */ > + for (i =3D 0; i < ARRAY_SIZE(ctx->vp8_enc.ref_bitmaps); ++i) > + if (!ctx->vp8_enc.ref_bitmaps[i]) { > + ctx->vp8_enc.first_free =3D i; > + break; > + } > + WARN_ON(i >=3D 4); > + > + ctx->vp8_enc.last_intra =3D is_intra(ctx); > + ++ctx->vp8_enc.frame_counter; > +} > diff --git a/drivers/media/platform/verisilicon/rockchip_vpu2_regs.h b/dr= ivers/media/platform/verisilicon/rockchip_vpu2_regs.h > index 49e40889545b..b68882965770 100644 > --- a/drivers/media/platform/verisilicon/rockchip_vpu2_regs.h > +++ b/drivers/media/platform/verisilicon/rockchip_vpu2_regs.h > @@ -258,6 +258,7 @@ > #define VEPU_REG_FRAME_TYPE_INTER (0x0 << 6) > #define VEPU_REG_FRAME_TYPE_INTRA (0x1 << 6) > #define VEPU_REG_FRAME_TYPE_MVCINTER (0x2 << 6) > +#define VEPU_REG_ENCODE_FORMAT_VP8 (0x1 << 4) /= * undocumented */ > #define VEPU_REG_ENCODE_FORMAT_JPEG (0x2 << 4= ) > #define VEPU_REG_ENCODE_FORMAT_H264 (0x3 << 4= ) > #define VEPU_REG_ENCODE_ENABLE BIT(0) > diff --git a/drivers/media/platform/verisilicon/rockchip_vpu_hw.c b/drive= rs/media/platform/verisilicon/rockchip_vpu_hw.c > index 8de6fd2e8eef..0671f1609ac4 100644 > --- a/drivers/media/platform/verisilicon/rockchip_vpu_hw.c > +++ b/drivers/media/platform/verisilicon/rockchip_vpu_hw.c > @@ -56,6 +56,19 @@ static const struct hantro_fmt rockchip_vpu_enc_fmts[]= =3D { > .step_height =3D MB_DIM, > }, > }, > + { > + .fourcc =3D V4L2_PIX_FMT_VP8_FRAME, > + .codec_mode =3D HANTRO_MODE_VP8_ENC, > + .max_depth =3D 2, > + .frmsize =3D { > + .min_width =3D 96, > + .max_width =3D 1920, > + .step_width =3D MB_DIM, > + .min_height =3D 96, > + .max_height =3D 1088, > + .step_height =3D MB_DIM, > + }, > + }, > }; > > static const struct hantro_fmt rockchip_vpu1_postproc_fmts[] =3D { > @@ -350,6 +363,7 @@ static int rockchip_vpu_hw_init(struct hantro_dev *vp= u) > { > /* Bump ACLK to max. possible freq. to improve performance. */ > clk_set_rate(vpu->clocks[0].clk, RK3288_ACLK_MAX_FREQ); > + > return 0; > } > > @@ -488,6 +502,13 @@ static const struct hantro_codec_ops rk3399_vpu_code= c_ops[] =3D { > .init =3D hantro_vp8_dec_init, > .exit =3D hantro_vp8_dec_exit, > }, > + [HANTRO_MODE_VP8_ENC] =3D { > + .run =3D rockchip_vpu2_vp8_enc_run, > + .reset =3D rockchip_vpu2_enc_reset, > + .init =3D hantro_vp8_enc_init, > + .done =3D rockchip_vpu2_vp8_enc_done, > + .exit =3D hantro_vp8_enc_exit, > + }, > }; > > static const struct hantro_codec_ops rk3568_vepu_codec_ops[] =3D { > @@ -626,7 +647,7 @@ const struct hantro_variant rk3399_vpu_variant =3D { > .dec_fmts =3D rk3399_vpu_dec_fmts, > .num_dec_fmts =3D ARRAY_SIZE(rk3399_vpu_dec_fmts), > .codec =3D HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER | > - HANTRO_VP8_DECODER, > + HANTRO_VP8_DECODER | HANTRO_VP8_ENCODER, > .codec_ops =3D rk3399_vpu_codec_ops, > .irqs =3D rockchip_vpu2_irqs, > .num_irqs =3D ARRAY_SIZE(rockchip_vpu2_irqs), > -- > 2.25.1 > 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 172ADC77B7A for ; Sat, 20 May 2023 18:58:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=LUQdjthhiLBgzcwImF4xjEVxm1FzQj7PPCU0qxefOfQ=; b=zIVoaDAGNpt8N8 s6fDCgLFG+sQRG1SRF/CgkfV0SZMBmgT+x11BCfbDCmF57Ez4K/QbOxRHaXO1fX4Ds4QokkM6cCUb +wAsmLcuxBOkBjAPNgLFvq+rjNbVPCoy7Xe75yPr0hcILwiuZ43gFKpyYsIpUYCDg/CsO/v/R6Xfk un1a6Q/pGPfcVS/vGlQO2VvquLT+emK56f17umH51MCcDkLw0UhjHtrNkP4zCZMCRUVl88EWb3xuz 3kVveLfCMxXNAnPcPQFUVuf3fE+rxyR2cadA6CxX5hn83UIUImjur7WQuGpMzpihoL6EZGjvaKle4 O/nWPjsgbgdvy0KoFpDw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q0RmG-0025k5-2C; Sat, 20 May 2023 18:58:04 +0000 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q0Rm9-0025if-1O; Sat, 20 May 2023 18:58:03 +0000 Received: by mail-pj1-x1029.google.com with SMTP id 98e67ed59e1d1-253e0edc278so771159a91.3; Sat, 20 May 2023 11:57:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684609075; x=1687201075; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=rrpTll+/MtlXyUgF3bRhfqGpnxE93eXDQ7Ko/cupjpY=; b=pUyBw0embAQ4Zs7tAhkY0xj78eHOmnRkj16Qi5+ZTB9Vy3ObnRovc+kKmH9V8z0it/ bicmfHFYSsLxo160zybwib0Mb6HZrLD8p/eUQVBVT5p1xTNu+I9+iufXfrgNz0wrkPNQ uGmEZ3sXi/HjceY/XFTeyLsUfUzAvT9s52W225P3T95k6SgDB6W2SFrRR26sr3xqZ2iA YdvTM3utp+sqc4yuoKBtxt452b8uOKIje1ye8idqhs2gWTzrAVAvJFrzfaX1MTm+PdhT e6K4OL/EMsRX8TTmLaxrn9Z/hUJjpWpKNHYdo0mHTOZyrc1bLQgx3aRUGhIi8GjyQlQj 4Tkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684609075; x=1687201075; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rrpTll+/MtlXyUgF3bRhfqGpnxE93eXDQ7Ko/cupjpY=; b=gFiaQxwtbLVrX/ZqlunakUxZ1k2+WMd/wFCw3UUVEKZeTWMaDPKi7s+G+L+2GnY5GD HV76JvP+boykASZNL4mJVbGqGFBE2DNwC4ZuiYiGizZMZmbnlfLAyGpaT3u+gm/WDc7T JqFRzncB6a8G5LP00XzWUpawqyWQSqNylTKi09Pe0ZRBcTL3DUrsEMduf0mc08PMrH4p n/7M1WcGdH5ypKz5uh62m43uFZ01clpAYSZTeUNgs0IWmXg3gHtfvu+aYPvKW9xE7o/y RkZfOOJmXXcCuo8TAQPWXOGgRE4Q/zs+QF4P8PT7aL/URDW6+HxE42eNHUX6aR4/zlpo 9+DA== X-Gm-Message-State: AC+VfDxJo75rVzE21X9WbI64FqnGafOQd4yaK/m0KStK905yoUwcsQOI GTtpEsIWNHjPnq5D4kVVu6dLsTAP3H9dElJ1Hes= X-Google-Smtp-Source: ACHHUZ7tqIchEzpWavEuzUbE53s+Wb68jFlTeGS8tfuwpP8Oi1y/90Eak9sLvO1GfRmIcTV7baBDVlydrK/dvyFKm+4= X-Received: by 2002:a17:90a:7187:b0:254:6953:f7b6 with SMTP id i7-20020a17090a718700b002546953f7b6mr3053550pjk.20.1684609073920; Sat, 20 May 2023 11:57:53 -0700 (PDT) MIME-Version: 1.0 References: <20230309125651.23911-1-andrzej.p@collabora.com> <20230309125651.23911-3-andrzej.p@collabora.com> In-Reply-To: <20230309125651.23911-3-andrzej.p@collabora.com> From: Adam Ford Date: Sat, 20 May 2023 13:57:42 -0500 Message-ID: Subject: Re: [RFC 2/2] media: rkvdec: Add VP8 encoder To: Andrzej Pietrasiewicz Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab , Ezequiel Garcia , Philipp Zabel , Heiko Stuebner , kernel@collabora.com 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 T24gVGh1LCBNYXIgOSwgMjAyMyBhdCA2OjU54oCvQU0gQW5kcnplaiBQaWV0cmFzaWV3aWN6Cjxh bmRyemVqLnBAY29sbGFib3JhLmNvbT4gd3JvdGU6Cj4KPiBBIHN0YXRlbGVzcyBWUDggZW5jb2Rl ciBmb3Igcm9ja2NoaXAgdnB1MiBmb3VuZCBlLmcuIGluIHJrMzM5OS4KPgo+IFNpZ25lZC1vZmYt Ynk6IEFuZHJ6ZWogUGlldHJhc2lld2ljeiA8YW5kcnplai5wQGNvbGxhYm9yYS5jb20+CgpJcyB0 aGVyZSBhIGdvb2QgcGxhY2Ugb3IgcmVzb3VyY2Ugd2hlcmUgSSBjb3VsZCBsZWFybiBtb3JlIGFi b3V0CndoYXQncyBuZWVkZWQgdG8gcG9ydCB0aGUgdnB1MSBWUDggZW5jb2Rlcj8gIEknZCByZWFs bHkgbGlrZSB0byBwb3J0CnRoZSBIYW50cm8gSDEgZW5jb2RlciB0aGF0J3MgdXNlZCBvbiB0aGUg aW14OG1tLCBidXQgaXQgc2VlbXMgbGlrZSB0aGUKdnB1MiBlbmNvZGVyIGhhcyBkaWZmZXJlbnQg cmVnaXN0ZXJzIHRoYW4gdGhlIEgxIGVuY29kZXIgb24gdGhlIE1pbmkuCkkgd2FzIGhvcGluZyBt eSBlbXBsb3llciB3b3VsZCBzZW5kIG1lIHRvIFByYWd1ZSBmb3IgdGhlIGNvbmZlcmVuY2UgYXQK dGhlIGVuZCBvZiBKdW5lLCBidXQgdW5mb3J0dW5hdGVseSwgdGhhdCdzIG5vdCBnb2luZyB0byBo YXBwZW4uICBJJ2QKbGlrZSB0byBnZXQgbW9yZSBpbnZvbHZlZCB3aXRoIHByb2plY3RzIGxpa2Ug dGhpcyBhcyBhIHBlcnNvbmFsIHNpZGUKcHJvamVjdC4KCmFkYW0KPiAtLS0KPiAgZHJpdmVycy9t ZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9NYWtlZmlsZSAgIHwgICAgMiArCj4gIGRyaXZlcnMv bWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vaGFudHJvLmggICB8ICAgMTAgKwo+ICAuLi4vcGxh dGZvcm0vdmVyaXNpbGljb24vaGFudHJvX2Jvb2xlbmMuYyAgICAgfCAgIDY5ICsKPiAgLi4uL3Bs YXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ib29sZW5jLmggICAgIHwgICAyMSArCj4gIC4uLi9t ZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fZHJ2LmMgICB8ICAgMTggKy0KPiAgLi4u L21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ody5oICAgIHwgICA5MCArCj4gIC4u Li9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fdjRsMi5jICB8ICAgIDUgKy0KPiAg Li4uL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb192cDguYyAgIHwgIDExOCArKwo+ ICAuLi4vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1Ml9od192cDhfZW5jLmMgICAgfCAxNTc0ICsr KysrKysrKysrKysrKysrCj4gIC4uLi9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9yb2NrY2hpcF92cHUy X3JlZ3MuaCB8ICAgIDEgKwo+ICAuLi4vcGxhdGZvcm0vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1 X2h3LmMgICAgfCAgIDIzICstCj4gIDExIGZpbGVzIGNoYW5nZWQsIDE5MjUgaW5zZXJ0aW9ucygr KSwgNiBkZWxldGlvbnMoLSkKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWVkaWEvcGxh dGZvcm0vdmVyaXNpbGljb24vaGFudHJvX2Jvb2xlbmMuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fYm9vbGVuYy5oCj4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tj aGlwX3ZwdTJfaHdfdnA4X2VuYy5jCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92ZXJpc2lsaWNvbi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNp bGljb24vTWFrZWZpbGUKPiBpbmRleCBlYmQ1ZWRlN2JlZjcuLmExY2QxOGI4ZGZlNyAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL01ha2VmaWxlCj4gKysr IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9NYWtlZmlsZQo+IEBAIC02LDYg KzYsNyBAQCBoYW50cm8tdnB1LXkgKz0gXAo+ICAgICAgICAgICAgICAgICBoYW50cm9fZHJ2Lm8g XAo+ICAgICAgICAgICAgICAgICBoYW50cm9fdjRsMi5vIFwKPiAgICAgICAgICAgICAgICAgaGFu dHJvX3Bvc3Rwcm9jLm8gXAo+ICsgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuYy5vIFwKPiAg ICAgICAgICAgICAgICAgaGFudHJvX2gxX2pwZWdfZW5jLm8gXAo+ICAgICAgICAgICAgICAgICBo YW50cm9fZzEubyBcCj4gICAgICAgICAgICAgICAgIGhhbnRyb19nMV9oMjY0X2RlYy5vIFwKPiBA QCAtMTgsNiArMTksNyBAQCBoYW50cm8tdnB1LXkgKz0gXAo+ICAgICAgICAgICAgICAgICByb2Nr Y2hpcF92cHUyX2h3X2gyNjRfZGVjLm8gXAo+ICAgICAgICAgICAgICAgICByb2NrY2hpcF92cHUy X2h3X21wZWcyX2RlYy5vIFwKPiAgICAgICAgICAgICAgICAgcm9ja2NoaXBfdnB1Ml9od192cDhf ZGVjLm8gXAo+ICsgICAgICAgICAgICAgICByb2NrY2hpcF92cHUyX2h3X3ZwOF9lbmMubyBcCj4g ICAgICAgICAgICAgICAgIGhhbnRyb19qcGVnLm8gXAo+ICAgICAgICAgICAgICAgICBoYW50cm9f aDI2NC5vIFwKPiAgICAgICAgICAgICAgICAgaGFudHJvX2hldmMubyBcCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vaGFudHJvLmggYi9kcml2ZXJzL21l ZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyby5oCj4gaW5kZXggMjk4OWViYzYzMWNjLi41 MTJhMjM1Njg2YjkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2ls aWNvbi9oYW50cm8uaAo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24v aGFudHJvLmgKPiBAQCAtMzIsNiArMzIsNyBAQCBzdHJ1Y3QgaGFudHJvX2NvZGVjX29wczsKPiAg c3RydWN0IGhhbnRyb19wb3N0cHJvY19vcHM7Cj4KPiAgI2RlZmluZSBIQU5UUk9fSlBFR19FTkNP REVSICAgIEJJVCgwKQo+ICsjZGVmaW5lIEhBTlRST19WUDhfRU5DT0RFUiAgICAgQklUKDEpCj4g ICNkZWZpbmUgSEFOVFJPX0VOQ09ERVJTICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKPiAgI2Rl ZmluZSBIQU5UUk9fTVBFRzJfREVDT0RFUiAgIEJJVCgxNikKPiAgI2RlZmluZSBIQU5UUk9fVlA4 X0RFQ09ERVIgICAgIEJJVCgxNykKPiBAQCAtMTExLDYgKzExMiw3IEBAIHN0cnVjdCBoYW50cm9f dmFyaWFudCB7Cj4gICAqIEBIQU5UUk9fTU9ERV9WUDhfREVDOiBWUDggZGVjb2Rlci4KPiAgICog QEhBTlRST19NT0RFX0hFVkNfREVDOiBIRVZDIGRlY29kZXIuCj4gICAqIEBIQU5UUk9fTU9ERV9W UDlfREVDOiBWUDkgZGVjb2Rlci4KPiArICogQEhBTlRST19NT0RFX1ZQOF9FTkM6IFZQOCBlbmNv ZGVyLgo+ICAgKi8KPiAgZW51bSBoYW50cm9fY29kZWNfbW9kZSB7Cj4gICAgICAgICBIQU5UUk9f TU9ERV9OT05FID0gLTEsCj4gQEAgLTEyMCw2ICsxMjIsNyBAQCBlbnVtIGhhbnRyb19jb2RlY19t b2RlIHsKPiAgICAgICAgIEhBTlRST19NT0RFX1ZQOF9ERUMsCj4gICAgICAgICBIQU5UUk9fTU9E RV9IRVZDX0RFQywKPiAgICAgICAgIEhBTlRST19NT0RFX1ZQOV9ERUMsCj4gKyAgICAgICBIQU5U Uk9fTU9ERV9WUDhfRU5DLAo+ICB9Owo+Cj4gIC8qCj4gQEAgLTI2NSw2ICsyNjgsNyBAQCBzdHJ1 Y3QgaGFudHJvX2N0eCB7Cj4gICAgICAgICAgICAgICAgIHN0cnVjdCBoYW50cm9fdnA4X2RlY19o d19jdHggdnA4X2RlYzsKPiAgICAgICAgICAgICAgICAgc3RydWN0IGhhbnRyb19oZXZjX2RlY19o d19jdHggaGV2Y19kZWM7Cj4gICAgICAgICAgICAgICAgIHN0cnVjdCBoYW50cm9fdnA5X2RlY19o d19jdHggdnA5X2RlYzsKPiArICAgICAgICAgICAgICAgc3RydWN0IGhhbnRyb192cDhfZW5jX2h3 X2N0eCB2cDhfZW5jOwo+ICAgICAgICAgfTsKPiAgfTsKPgo+IEBAIC0zNjEsNiArMzY1LDEyIEBA IGV4dGVybiBpbnQgaGFudHJvX2RlYnVnOwo+ICAjZGVmaW5lIHZwdV9lcnIoZm10LCBhcmdzLi4u KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gICAgICAgICBwcl9lcnIoIiVz OiVkOiAiIGZtdCwgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpCj4KPiArc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgaGFudHJvX3JvdW5kZWRfbHVtYV9zaXplKHVuc2lnbmVkIGludCB3LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBpbnQgaCkKPiArewo+ICsgICAgICAgcmV0dXJuIHJvdW5kX3VwKHcsIE1CX0RJTSkgKiBy b3VuZF91cChoLCBNQl9ESU0pOwo+ICt9Cj4gKwo+ICAvKiBTdHJ1Y3R1cmUgYWNjZXNzIGhlbHBl cnMuICovCj4gIHN0YXRpYyBpbmxpbmUgc3RydWN0IGhhbnRyb19jdHggKmZoX3RvX2N0eChzdHJ1 Y3QgdjRsMl9maCAqZmgpCj4gIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9y bS92ZXJpc2lsaWNvbi9oYW50cm9fYm9vbGVuYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92 ZXJpc2lsaWNvbi9oYW50cm9fYm9vbGVuYy5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRl eCAwMDAwMDAwMDAwMDAuLjg4YTFjMWMxNjZmZQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ib29sZW5jLmMKPiBAQCAtMCww ICsxLDY5IEBACj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gKwo+ICsj aW5jbHVkZSA8bGludXgvYnVnLmg+Cj4gKwo+ICsjaW5jbHVkZSAiaGFudHJvX2Jvb2xlbmMuaCIK PiArCj4gK3ZvaWQgaGFudHJvX2Jvb2xlbmNfaW5pdChzdHJ1Y3QgaGFudHJvX2Jvb2xlbmMgKmUs IHVpbnQ4X3QgKm91dHB1dCkKPiArewo+ICsgICAgICAgZS0+b3V0cHV0ID0gb3V0cHV0Owo+ICsg ICAgICAgZS0+cmFuZ2UgPSAyNTU7Cj4gKyAgICAgICBlLT5ib3R0b20gPSAwOwo+ICsgICAgICAg ZS0+Yml0X2NvdW50ID0gMjQ7Cj4gKyAgICAgICBlLT5ieXRlc193cml0dGVuID0gMDsKPiArfQo+ ICsKPiArLyoKPiArICogQWRkIG9uZSB0byBhIG51bWJlciBzdG9yZWQgaW4gYnl0ZXMgcHJlY2Vk aW5nICpxLgo+ICsgKiBUaGVyZSdzIGV4YWN0bHkgYnl0ZXNfd3JpdHRlbiBzdWNoIGJ5dGVzLgo+ ICsgKgo+ICsgKiBUaGUgc3BlYyBndWFyYW50ZWVzIHRoYXQgdGhlIGJhY2t3YXJkIHNlYXJjaCB3 b24ndCBnbyBiZXlvbmQKPiArICogdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIHNvIGlmIHdlIGRl dGVjdCBzdWNoIGNvbmRpdGlvbiB3ZSBjYW4KPiArICogQlVHX09OKCkgLSB0aGlzIHNob3VsZCBu ZXZlciBoYXBwZW4gYW55d2F5Lgo+ICsgKi8KPiArc3RhdGljIHZvaWQgYWRkX29uZV90b19vdXRw dXQodWludDhfdCAqcSwgaW50IGJ5dGVzX3dyaXR0ZW4pCj4gK3sKPiArICAgICAgIC8qCj4gKyAg ICAgICAgKiBvcmlnaW5hbGx5Ogo+ICsgICAgICAgICogd2hpbGUgKCotLXEgPT0gMHhmZikKPiAr ICAgICAgICAqICAgICAgICpxID0gMDsKPiArICAgICAgICAqLwo+ICsgICAgICAgZm9yICg7Oykg ewo+ICsgICAgICAgICAgICAgICBCVUdfT04oYnl0ZXNfd3JpdHRlbi0tIDw9IDApOyAvKiBjaGVj ayBpZiB3ZSdyZSBhbGxvd2VkIHRvIGdvIGJhY2sgb25lIGJ5dGUgKi8KPiArCj4gKyAgICAgICAg ICAgICAgIGlmICgqLS1xID09IDB4ZmYpICAgICAgICAgICAgIC8qIGFkZGluZyBhIDEgb3ZlcmZs b3dzICotLXE/ICovCj4gKyAgICAgICAgICAgICAgICAgICAgICAgKnEgPSAwOyAgICAgICAgICAg ICAgIC8qIHllcywgc28gemVybyAqcSAqLwo+ICsgICAgICAgICAgICAgICBlbHNlCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIC8qIG5vLCB3ZSdyZSBnb29k IHRvIGFkZCAxICovCj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgKysqcTsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgMSAqLwo+ICt9Cj4gKwo+ICt2b2lkIGhhbnRyb19i b29sZW5jX3dyaXRlX2Jvb2woc3RydWN0IGhhbnRyb19ib29sZW5jICplLCB1aW50MzJfdCBwcm9i LCBib29sIGJvb2xfdmFsdWUpCj4gK3sKPiArICAgICAgIHVpbnQzMl90IHNwbGl0ID0gMSArICgo KGUtPnJhbmdlIC0gMSkgKiBwcm9iKSA+PiA4KTsKPiArCj4gKyAgICAgICBpZiAoYm9vbF92YWx1 ZSkgewo+ICsgICAgICAgICAgICAgICBlLT5ib3R0b20gKz0gc3BsaXQ7Cj4gKyAgICAgICAgICAg ICAgIGUtPnJhbmdlIC09IHNwbGl0Owo+ICsgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAg ICAgZS0+cmFuZ2UgPSBzcGxpdDsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICB3aGlsZSAoZS0+ cmFuZ2UgPCAxMjgpIHsKPiArICAgICAgICAgICAgICAgZS0+cmFuZ2UgPDw9IDE7Cj4gKwo+ICsg ICAgICAgICAgICAgICBpZiAoZS0+Ym90dG9tICYgKDEgPDwgMzEpKQo+ICsgICAgICAgICAgICAg ICAgICAgICAgIGFkZF9vbmVfdG9fb3V0cHV0KGUtPm91dHB1dCwgZS0+Ynl0ZXNfd3JpdHRlbik7 Cj4gKwo+ICsgICAgICAgICAgICAgICBlLT5ib3R0b20gPDw9IDE7Cj4gKwo+ICsgICAgICAgICAg ICAgICBpZiAoIS0tZS0+Yml0X2NvdW50KSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgKmUt Pm91dHB1dCsrID0gKHVpbnQ4X3QpKGUtPmJvdHRvbSA+PiAyNCk7Cj4gKyAgICAgICAgICAgICAg ICAgICAgICAgKytlLT5ieXRlc193cml0dGVuOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGUt PmJvdHRvbSAmPSAoMSA8PCAyNCkgLSAxOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGUtPmJp dF9jb3VudCA9IDg7Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAgICAgIH0KPiArfQo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ib29sZW5j LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ib29sZW5jLmgK PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uODBlYzY4NmQ1MDRk Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGlj b24vaGFudHJvX2Jvb2xlbmMuaAo+IEBAIC0wLDAgKzEsMjEgQEAKPiArLyogU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ ICsKPiArc3RydWN0IGhhbnRyb19ib29sZW5jIHsKPiArICAgICAgIHVpbnQ4X3QgKm91dHB1dDsg ICAgICAgIC8qIG5leHQgYnl0ZSBwb2ludGVyICovCj4gKyAgICAgICB1aW50MzJfdCByYW5nZTsK PiArICAgICAgIHVpbnQzMl90IGJvdHRvbTsgICAgICAgIC8qIDQgTFNCIG9mIGxlZnRtb3N0IGVu ZCBvZiB0aGUgcmFuZ2UsIE1TQiBhbHJlYWQgaW4gb3V0cHV0ICAqLwo+ICsgICAgICAgaW50IGJp dF9jb3VudDsgICAgICAgICAgLyogaG93IG1hbnkgc2hpZnRzIHVudGlsIG5leHQgZW5jb2RlZCBi eXRlIGF2YWlsYWJsZSAqLwo+ICsgICAgICAgaW50IGJ5dGVzX3dyaXR0ZW47Cj4gK307Cj4gKwo+ ICt2b2lkIGhhbnRyb19ib29sZW5jX2luaXQoc3RydWN0IGhhbnRyb19ib29sZW5jICplLCB1aW50 OF90ICpvdXRwdXQpOwo+ICsKPiArdm9pZCBoYW50cm9fYm9vbGVuY193cml0ZV9ib29sKHN0cnVj dCBoYW50cm9fYm9vbGVuYyAqZSwgdWludDMyX3QgcHJvYiwgYm9vbCBib29sX3ZhbHVlKTsKPiAr Cj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoc3RydWN0IGhh bnRyb19ib29sZW5jICplLCB1aW50MzJfdCB2YWwsIHVpbnQ4X3QgbikKPiArewo+ICsgICAgICAg d2hpbGUgKG4tLSkKPiArICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfYm9vbChl LCAxMjgsICh2YWwgPj4gbikgJiAweDEpOwo+ICt9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVk aWEvcGxhdGZvcm0vdmVyaXNpbGljb24vaGFudHJvX2Rydi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fZHJ2LmMKPiBpbmRleCA4Y2I0YTY4YzkxMTkuLmE2YmFj ZjIyY2ZmNSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29u L2hhbnRyb19kcnYuYwo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24v aGFudHJvX2Rydi5jCj4gQEAgLTE2MCw3ICsxNjAsNiBAQCB2b2lkIGhhbnRyb19lbmRfcHJlcGFy ZV9ydW4oc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiAgICAgICAgIHNyY19idWYgPSBoYW50cm9f Z2V0X3NyY19idWYoY3R4KTsKPiAgICAgICAgIHY0bDJfY3RybF9yZXF1ZXN0X2NvbXBsZXRlKHNy Y19idWYtPnZiMl9idWYucmVxX29iai5yZXEsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAmY3R4LT5jdHJsX2hhbmRsZXIpOwo+IC0KPiAgICAgICAgIC8qIEtpY2sgdGhlIHdh dGNoZG9nLiAqLwo+ICAgICAgICAgc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjdHgtPmRldi0+d2F0 Y2hkb2dfd29yaywKPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZm aWVzKDIwMDApKTsKPiBAQCAtMjE1LDggKzIxNCw3IEBAIHF1ZXVlX2luaXQodm9pZCAqcHJpdiwg c3RydWN0IHZiMl9xdWV1ZSAqc3JjX3ZxLCBzdHJ1Y3QgdmIyX3F1ZXVlICpkc3RfdnEpCj4gICAg ICAgICAgKiBmb3IgZmFzdGVyIGFsbG9jYXRpb24uIEFsc28sIG5vIENQVSBhY2Nlc3Mgb24gdGhl IHNvdXJjZSBxdWV1ZSwKPiAgICAgICAgICAqIHNvIG5vIGtlcm5lbCBtYXBwaW5nIG5lZWRlZC4K PiAgICAgICAgICAqLwo+IC0gICAgICAgc3JjX3ZxLT5kbWFfYXR0cnMgPSBETUFfQVRUUl9BTExP Q19TSU5HTEVfUEFHRVMgfAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICBETUFfQVRUUl9O T19LRVJORUxfTUFQUElORzsKPiArICAgICAgIHNyY192cS0+ZG1hX2F0dHJzID0gRE1BX0FUVFJf QUxMT0NfU0lOR0xFX1BBR0VTOwo+ICAgICAgICAgc3JjX3ZxLT5idWZfc3RydWN0X3NpemUgPSBz aXplb2Yoc3RydWN0IHY0bDJfbTJtX2J1ZmZlcik7Cj4gICAgICAgICBzcmNfdnEtPnRpbWVzdGFt cF9mbGFncyA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX0NPUFk7Cj4gICAgICAgICBzcmNfdnEt PmxvY2sgPSAmY3R4LT5kZXYtPnZwdV9tdXRleDsKPiBAQCAtMzUyLDYgKzM1MCwyMCBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IGhhbnRyb19jdHJsIGNvbnRyb2xzW10gPSB7Cj4gICAgICAgICAgICAg ICAgICAgICAgICAgLmRlZiA9IDUwLAo+ICAgICAgICAgICAgICAgICAgICAgICAgIC5vcHMgPSAm aGFudHJvX2pwZWdfY3RybF9vcHMsCj4gICAgICAgICAgICAgICAgIH0sCj4gKyAgICAgICB9LCB7 Cj4gKyAgICAgICAgICAgICAgIC5jb2RlYyA9IEhBTlRST19WUDhfRU5DT0RFUiwKPiArICAgICAg ICAgICAgICAgLmNmZyA9IHsKPiArICAgICAgICAgICAgICAgICAgICAgICAuaWQgPSBWNEwyX0NJ RF9TVEFURUxFU1NfVlA4X0VOQ09ERV9QQVJBTVMsCj4gKyAgICAgICAgICAgICAgIH0sCj4gKyAg ICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgIC5jb2RlYyA9IEhBTlRST19WUDhfRU5DT0RFUiwK PiArICAgICAgICAgICAgICAgLmNmZyA9IHsKPiArICAgICAgICAgICAgICAgICAgICAgICAuaWQg PSBWNEwyX0NJRF9TVEFURUxFU1NfVlA4X0VOQ09ERV9RUCwKPiArICAgICAgICAgICAgICAgICAg ICAgICAubWluID0gMCwKPiArICAgICAgICAgICAgICAgICAgICAgICAubWF4ID0gMTI3LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgIC5zdGVwID0gMSwKPiArICAgICAgICAgICAgICAgICAgICAg ICAuZGVmID0gMCwKPiArICAgICAgICAgICAgICAgfSwKPiAgICAgICAgIH0sIHsKPiAgICAgICAg ICAgICAgICAgLmNvZGVjID0gSEFOVFJPX0pQRUdfRU5DT0RFUiwKPiAgICAgICAgICAgICAgICAg LmNmZyA9IHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNv bi9oYW50cm9faHcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vaGFudHJv X2h3LmgKPiBpbmRleCBlODNmMGM1MjNhMzAuLmMzNWNhYzdmODhhOSAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ody5oCj4gKysrIGIvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9faHcuaAo+IEBAIC0xNSw2ICsx NSw4IEBACj4gICNpbmNsdWRlIDxtZWRpYS92NGwyLXZwOS5oPgo+ICAjaW5jbHVkZSA8bWVkaWEv dmlkZW9idWYyLWNvcmUuaD4KPgo+ICsjaW5jbHVkZSAiaGFudHJvX2Jvb2xlbmMuaCIKPiArCj4g ICNkZWZpbmUgREVDXzgxOTBfQUxJR05fTUFTSyAgICAweDA3VQo+Cj4gICNkZWZpbmUgTUJfRElN ICAgICAgICAgICAgICAgICAxNgo+IEBAIC0xNzEsNiArMTczLDY3IEBAIHN0cnVjdCBoYW50cm9f dnA4X2RlY19od19jdHggewo+ICAgICAgICAgc3RydWN0IGhhbnRyb19hdXhfYnVmIHByb2JfdGJs Owo+ICB9Owo+Cj4gK3N0cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgewo+ICsgICAgICAgLyogVE9E TzogaW50MzJfdD8gKi8KPiArICAgICAgIGludDMyX3QgY29lZmZfcHJvYls0XVs4XVszXVsxMV07 Cj4gKyAgICAgICBpbnQzMl90IGNvZWZmX3Byb2Jfb2xkWzRdWzhdWzNdWzExXTsKPiArICAgICAg IGludDMyX3QgbXZfcHJvYlsyXVsxOV07Cj4gKyAgICAgICBpbnQzMl90IG12X3Byb2Jfb2xkWzJd WzE5XTsKPiArICAgICAgIGludDMyX3QgeV9tb2RlX3Byb2JbNF07Cj4gKyAgICAgICBpbnQzMl90 IHV2X21vZGVfcHJvYlszXTsKPiArfTsKPiArCj4gKyNkZWZpbmUgVlA4X0JJVF9MQVNUICAgMAo+ ICsjZGVmaW5lIFZQOF9CSVRfR09MREVOIDEKPiArI2RlZmluZSBWUDhfQklUX0FMVCAgICAyCj4g Kwo+ICtzdHJ1Y3QgaGFudHJvX3ZwOF9lbmNfaHdfY3R4IHsKPiArICAgICAgIHN0cnVjdCBoYW50 cm9fYXV4X2J1ZiByZWZfZnJhbWVzWzRdOyAgICAvKiByZWNyZWF0ZWQgYW5kIHJlZmVyZW5jZSBp bWFnZXMgKi8KPiArICAgICAgIHN0cnVjdCBoYW50cm9fYXV4X2J1ZiBwcml2X3NyYzsgLyogY2Fi YWMgdGFibGUsIHNlZ21lbnQgbWFwICovCj4gKyAgICAgICBzdHJ1Y3QgaGFudHJvX2F1eF9idWYg bXZfYnVmOyAgIC8qIG1vdGlvbiB2ZWN0b3IgKi8KPiArICAgICAgIHN0cnVjdCBoYW50cm9fYXV4 X2J1ZiBwcml2X2RzdDsgLyogcHJvYiBjb3VudCAqLwo+ICsgICAgICAgc3RydWN0IGhhbnRyb19h dXhfYnVmIGN0cmxfYnVmOyAvKiBzaXplIHRhYmxlICovCj4gKyAgICAgICBzdHJ1Y3QgaGFudHJv X2Jvb2xlbmMgYm9vbGVuYzsKPiArICAgICAgIHN0cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgZW50 cm9weTsKPiArICAgICAgIHNpemVfdCBoZWFkZXJfc2l6ZTsKPiArICAgICAgIHNpemVfdCBlc3Rp bWF0ZWRfaGRyX3NpemU7Cj4gKyAgICAgICBzaXplX3QgZnJhbWVfY291bnRlcjsKPiArICAgICAg IGludCBsYXN0X3JlZjsKPiArICAgICAgIGludCBnb2xkZW5fcmVmOwo+ICsgICAgICAgaW50IGFs dF9yZWY7Cj4gKyAgICAgICBpbnQgZmlyc3RfZnJlZTsKPiArICAgICAgIGludCByZWNvbnN0cnVj dGVkOwo+ICsgICAgICAgY2hhciByZWZfYml0bWFwc1s0XTsKPiArCj4gKyAgICAgICBpbnQzMl90 IG1vZGVfZGVsdGFbNF07Cj4gKyAgICAgICBpbnQzMl90IG9sZF9tb2RlX2RlbHRhWzRdOwo+ICsg ICAgICAgaW50MzJfdCByZWZfZGVsdGFbNF07Cj4gKyAgICAgICBpbnQzMl90IG9sZF9yZWZfZGVs dGFbNF07Cj4gKwo+ICsgICAgICAgc3RydWN0IHsKPiArICAgICAgICAgICAgICAgdWludDhfdCB0 YWdbM107Cj4gKwo+ICsgICAgICAgICAgICAgICAvKiB0aGUgZm9sbG93aW5nIHRocmVlIG9ubHkg dXNlZCBmb3IgaW50ZXIgZnJhbWVzICovCj4gKyAgICAgICAgICAgICAgIHVpbnQ4X3QgbWFnaWNb M107ICAgICAgIC8qIDB4OWQwMTJhICovCj4gKyAgICAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGhb Ml07ICAgICAgIC8qIChzY2FsZSA8PCAxNCkgfCB3aWR0aCAqLwo+ICsgICAgICAgICAgICAgICB1 aW50OF90IGhlaWdodFsyXTsgICAgICAvKiAoc2NhbGUgPDwgMTQpIHwgaGVpZ2h0ICovCj4gKyAg ICAgICB9IF9fcGFja2VkICpmcmFtZV90YWc7Cj4gKwo+ICsgICAgICAgdTggaXNfaW50cmE6MTsK PiArICAgICAgIHU4IGxhc3RfaW50cmE6MTsKPiArICAgICAgIHU4IHNob3dfZnJhbWU6MTsKPiAr ICAgICAgIHU4IHJlZnJlc2hfZ29sZGVuX2ZyYW1lOjE7Cj4gKyAgICAgICB1OCByZWZyZXNoX2Fs dGVybmF0ZV9mcmFtZToxOwo+ICsgICAgICAgdTggcmVmcmVzaF9lbnRyb3B5X3Byb2JzOjE7Cj4g Kwo+ICsgICAgICAgdTggcHJvYl9za2lwX2ZhbHNlOwo+ICsgICAgICAgdTggcHJvYl9pbnRyYTsK PiArICAgICAgIHU4IHByb2JfbGFzdDsKPiArICAgICAgIHU4IHByb2JfZ2Y7Cj4gKyAgICAgICB1 OCBjb3B5X2J1ZmZlcl90b19nb2xkZW47Cj4gKyAgICAgICB1OCBjb3B5X2J1ZmZlcl90b19hbHRl cm5hdGU7Cj4gK307Cj4gKwo+ICAvKioKPiAgICogc3RydWN0IGhhbnRyb192cDlfZnJhbWVfaW5m bwo+ICAgKgo+IEBAIC00MTcsNiArNDgwLDI4IEBAIGhhbnRyb19oZXZjX212X3NpemUodW5zaWdu ZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KQo+ICAgICAgICAgcmV0dXJuIHdpZHRo ICogaGVpZ2h0IC8gMTY7Cj4gIH0KPgo+ICtzdGF0aWMgaW5saW5lIHZvaWQgaGFudHJvX3ZwOF9z ZXRfYml0KHN0cnVjdCBoYW50cm9fdnA4X2VuY19od19jdHggKnZwOF9lbmMsIGNoYXIgYml0LCBp bnQgaWR4KQo+ICt7Cj4gKyAgICAgICBpZiAoaWR4IDwgMCkKPiArICAgICAgICAgICAgICAgcmV0 dXJuOwo+ICsKPiArICAgICAgIGlmIChiaXQgIT0gVlA4X0JJVF9MQVNUICYmIGJpdCAhPSBWUDhf QklUX0dPTERFTiAmJiBiaXQgIT0gVlA4X0JJVF9BTFQpCj4gKyAgICAgICAgICAgICAgIHJldHVy bjsKPiArCj4gKyAgICAgICB2cDhfZW5jLT5yZWZfYml0bWFwc1tpZHhdIHw9ICgxIDw8IGJpdCk7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW50cm9fdnA4X2Nscl9iaXQoc3RydWN0 IGhhbnRyb192cDhfZW5jX2h3X2N0eCAqdnA4X2VuYywgY2hhciBiaXQsIGludCBpZHgpCj4gK3sK PiArICAgICAgIGlmIChpZHggPCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gKwo+ICsg ICAgICAgaWYgKGJpdCAhPSBWUDhfQklUX0xBU1QgJiYgYml0ICE9IFZQOF9CSVRfR09MREVOICYm IGJpdCAhPSBWUDhfQklUX0FMVCkKPiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ICsKPiArICAg ICAgIHZwOF9lbmMtPnJlZl9iaXRtYXBzW2lkeF0gJj0gfigxIDw8IGJpdCk7Cj4gK30KPiArCj4g IGludCBoYW50cm9fZzFfbXBlZzJfZGVjX3J1bihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KTsKPiAg aW50IHJvY2tjaGlwX3ZwdTJfbXBlZzJfZGVjX3J1bihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KTsK PiAgdm9pZCBoYW50cm9fbXBlZzJfZGVjX2NvcHlfcXRhYmxlKHU4ICpxdGFibGUsCj4gQEAgLTQz OCw0ICs1MjMsOSBAQCB2b2lkIGhhbnRyb192cDlfZGVjX2V4aXQoc3RydWN0IGhhbnRyb19jdHgg KmN0eCk7Cj4gIHZvaWQgaGFudHJvX2cyX2NoZWNrX2lkbGUoc3RydWN0IGhhbnRyb19kZXYgKnZw dSk7Cj4gIGlycXJldHVybl90IGhhbnRyb19nMl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsK Pgo+ICtpbnQgcm9ja2NoaXBfdnB1Ml92cDhfZW5jX3J1bihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4 KTsKPiAraW50IGhhbnRyb192cDhfZW5jX2luaXQoc3RydWN0IGhhbnRyb19jdHggKmN0eCk7Cj4g K3ZvaWQgcm9ja2NoaXBfdnB1Ml92cDhfZW5jX2RvbmUoc3RydWN0IGhhbnRyb19jdHggKmN0eCk7 Cj4gK3ZvaWQgaGFudHJvX3ZwOF9lbmNfZXhpdChzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KTsKPiAr Cj4gICNlbmRpZiAvKiBIQU5UUk9fSFdfSF8gKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRp YS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fdjRsMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fdjRsMi5jCj4gaW5kZXggMmM3YTgwNTI4OWU3Li43NTAz ZDZiNzZmYzkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNv bi9oYW50cm9fdjRsMi5jCj4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNv bi9oYW50cm9fdjRsMi5jCj4gQEAgLTMxMiw4ICszMTIsOSBAQCBzdGF0aWMgaW50IGhhbnRyb190 cnlfZm10KGNvbnN0IHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsCj4KPiAgICAgICAgIHBpeF9tcC0+ ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cj4KPiAtICAgICAgIHY0bDJfYXBwbHlfZnJtc2l6ZV9j b25zdHJhaW50cygmcGl4X21wLT53aWR0aCwgJnBpeF9tcC0+aGVpZ2h0LAo+IC0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2cHVfZm10LT5mcm1zaXplKTsKPiArICAgICAg IGlmICghY2FwdHVyZSB8fCAhY3R4LT5pc19lbmNvZGVyKQo+ICsgICAgICAgICAgICAgICB2NGwy X2FwcGx5X2ZybXNpemVfY29uc3RyYWludHMoJnBpeF9tcC0+d2lkdGgsICZwaXhfbXAtPmhlaWdo dCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2cHVf Zm10LT5mcm1zaXplKTsKPgo+ICAgICAgICAgaWYgKCFjb2RlZCkgewo+ICAgICAgICAgICAgICAg ICAvKiBGaWxsIHJlbWFpbmluZyBmaWVsZHMgKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRp YS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fdnA4LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRm b3JtL3ZlcmlzaWxpY29uL2hhbnRyb192cDguYwo+IGluZGV4IDM4MWJjMWQzYmZkYS4uNjNlMDI2 MDU1NjE1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24v aGFudHJvX3ZwOC5jCj4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9o YW50cm9fdnA4LmMKPiBAQCAtMTk5LDMgKzE5OSwxMjEgQEAgdm9pZCBoYW50cm9fdnA4X2RlY19l eGl0KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gICAgICAgICBkbWFfZnJlZV9jb2hlcmVudCh2 cHUtPmRldiwgdnA4X2RlYy0+cHJvYl90Ymwuc2l6ZSwKPiAgICAgICAgICAgICAgICAgICAgICAg ICAgIHZwOF9kZWMtPnByb2JfdGJsLmNwdSwgdnA4X2RlYy0+cHJvYl90YmwuZG1hKTsKPiAgfQo+ ICsKPiAraW50IGhhbnRyb192cDhfZW5jX2luaXQoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiAr ewo+ICsgICAgICAgc3RydWN0IGhhbnRyb19kZXYgKnZwdSA9IGN0eC0+ZGV2Owo+ICsgICAgICAg c3RydWN0IGhhbnRyb19hdXhfYnVmICphdXhfYnVmOwo+ICsgICAgICAgdW5zaWduZWQgaW50IG1i X3dpZHRoLCBtYl9oZWlnaHQ7Cj4gKyAgICAgICBzaXplX3QgbHVtYV9zaXplLCBzZWdtZW50X21h cF9zaXplOwo+ICsgICAgICAgc3RhdGljIGludDMyX3QgbW9kZV9kZWx0YVs0XSA9IHsgNCwgLTIs IDIsIDQgfTsKPiArICAgICAgIHN0YXRpYyBpbnQzMl90IHJlZl9kZWx0YVs0XSA9IHsgMiwgMCwg LTIsIC0yIH07Cj4gKyAgICAgICBpbnQgcmV0LCBpOwo+ICsKPiArICAgICAgIG1lbWNweShjdHgt PnZwOF9lbmMubW9kZV9kZWx0YSwgbW9kZV9kZWx0YSwgc2l6ZW9mKG1vZGVfZGVsdGEpKTsKPiAr ICAgICAgIG1lbWNweShjdHgtPnZwOF9lbmMucmVmX2RlbHRhLCByZWZfZGVsdGEsIHNpemVvZihy ZWZfZGVsdGEpKTsKPiArCj4gKyAgICAgICBtYl93aWR0aCA9IERJVl9ST1VORF9VUChjdHgtPnNy Y19mbXQud2lkdGgsIDE2KTsKPiArICAgICAgIG1iX2hlaWdodCA9IERJVl9ST1VORF9VUChjdHgt PnNyY19mbXQuaGVpZ2h0LCAxNik7Cj4gKyAgICAgICBsdW1hX3NpemUgPSBtYl93aWR0aCAqIG1i X2hlaWdodCAqIDE2ICogMTY7Cj4gKyAgICAgICBzZWdtZW50X21hcF9zaXplID0gcm91bmRfdXAo RElWX1JPVU5EX1VQKG1iX3dpZHRoICogbWJfaGVpZ2h0LCA0KSwgNjQpOwo+ICsKPiArICAgICAg IGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0eC0+dnA4X2VuYy5yZWZfZnJhbWVzKTsgKytp KSB7Cj4gKyAgICAgICAgICAgICAgIGF1eF9idWYgPSAmY3R4LT52cDhfZW5jLnJlZl9mcmFtZXNb aV07Cj4gKyAgICAgICAgICAgICAgIGF1eF9idWYtPnNpemUgPSBsdW1hX3NpemUgKiAzIC8gMjsK PiArICAgICAgICAgICAgICAgYXV4X2J1Zi0+Y3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KHZwdS0+ ZGV2LCBhdXhfYnVmLT5zaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJmF1eF9idWYtPmRtYSwgR0ZQX0tFUk5FTCk7Cj4gKyAgICAgICAgICAg ICAgIGlmICghYXV4X2J1Zi0+Y3B1KSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0g LUVOT01FTTsKPiArICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycl9mcmVlX3JlZl9mcmFt ZXM7Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLnJl Zl9iaXRtYXBzW2ldID0gMDsKPiArICAgICAgIH0KPiArICAgICAgIGN0eC0+dnA4X2VuYy5sYXN0 X3JlZiA9IGN0eC0+dnA4X2VuYy5nb2xkZW5fcmVmID0gY3R4LT52cDhfZW5jLmFsdF9yZWYgPSAt MTsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5maXJzdF9mcmVlID0gMDsKPiArCj4gKyAgICAgICBh dXhfYnVmID0gJmN0eC0+dnA4X2VuYy5wcml2X3NyYzsKPiArICAgICAgIGF1eF9idWYtPnNpemUg PSAxMjA4ICsgc2VnbWVudF9tYXBfc2l6ZSArIFBBR0VfU0laRTsgLyogVE9ETzogZWxpbWluYXRl IG9uZSBwYWdlIG92ZXJoZWFkICovCj4gKyAgICAgICBhdXhfYnVmLT5jcHUgPSBkbWFfYWxsb2Nf Y29oZXJlbnQodnB1LT5kZXYsIGF1eF9idWYtPnNpemUsICZhdXhfYnVmLT5kbWEsIEdGUF9LRVJO RUwpOwo+ICsgICAgICAgaWYgKCFhdXhfYnVmLT5jcHUpIHsKPiArICAgICAgICAgICAgICAgcmV0 ID0gLUVOT01FTTsKPiArICAgICAgICAgICAgICAgZ290byBlcnJfZnJlZV9yZWZfZnJhbWVzOwo+ ICsgICAgICAgfQo+ICsKPiArICAgICAgIGF1eF9idWYgPSAmY3R4LT52cDhfZW5jLm12X2J1ZjsK PiArICAgICAgIGF1eF9idWYtPnNpemUgPSBtYl93aWR0aCAqIG1iX2hlaWdodCAqIDQ7Cj4gKyAg ICAgICBhdXhfYnVmLT5jcHUgPSBkbWFfYWxsb2NfY29oZXJlbnQodnB1LT5kZXYsIGF1eF9idWYt PnNpemUsICZhdXhfYnVmLT5kbWEsIEdGUF9LRVJORUwpOwo+ICsgICAgICAgaWYgKCFhdXhfYnVm LT5jcHUpIHsKPiArICAgICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKPiArICAgICAgICAgICAg ICAgZ290byBlcnJfZnJlZV9wcml2X3NyYzsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBhdXhf YnVmID0gJmN0eC0+dnA4X2VuYy5wcml2X2RzdDsKPiArICAgICAgIGF1eF9idWYtPnNpemUgPSBQ QUdFX1NJWkU7IC8qIFRPRE86IHVzZSBjb3JyZWN0IHNpemUgKi8KPiArICAgICAgIGF1eF9idWYt PmNwdSA9IGRtYV9hbGxvY19jb2hlcmVudCh2cHUtPmRldiwgYXV4X2J1Zi0+c2l6ZSwgJmF1eF9i dWYtPmRtYSwgR0ZQX0tFUk5FTCk7Cj4gKyAgICAgICBpZiAoIWF1eF9idWYtPmNwdSkgewo+ICsg ICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOwo+ICsgICAgICAgICAgICAgICBnb3RvIGVycl9m cmVlX212X2J1ZjsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBhdXhfYnVmID0gJmN0eC0+dnA4 X2VuYy5jdHJsX2J1ZjsKPiArICAgICAgIGF1eF9idWYtPnNpemUgPSBQQUdFX1NJWkU7IC8qIFRP RE86IHVzZSBjb3JyZWN0IHNpemUgKi8KPiArICAgICAgIGF1eF9idWYtPmNwdSA9IGRtYV9hbGxv Y19jb2hlcmVudCh2cHUtPmRldiwgYXV4X2J1Zi0+c2l6ZSwgJmF1eF9idWYtPmRtYSwgR0ZQX0tF Uk5FTCk7Cj4gKyAgICAgICBpZiAoIWF1eF9idWYtPmNwdSkgewo+ICsgICAgICAgICAgICAgICBy ZXQgPSAtRU5PTUVNOwo+ICsgICAgICAgICAgICAgICBnb3RvIGVycl9mcmVlX3ByaXZfZHN0Owo+ ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJldHVybiAwOwo+ICsKPiArZXJyX2ZyZWVfcHJpdl9k c3Q6Cj4gKyAgICAgICBkbWFfZnJlZV9jb2hlcmVudCh2cHUtPmRldiwgY3R4LT52cDhfZW5jLnBy aXZfZHN0LnNpemUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMucHJp dl9kc3QuY3B1LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLnByaXZf ZHN0LmRtYSk7Cj4gKwo+ICtlcnJfZnJlZV9tdl9idWY6Cj4gKyAgICAgICBkbWFfZnJlZV9jb2hl cmVudCh2cHUtPmRldiwgY3R4LT52cDhfZW5jLm12X2J1Zi5zaXplLAo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgY3R4LT52cDhfZW5jLm12X2J1Zi5jcHUsCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICBjdHgtPnZwOF9lbmMubXZfYnVmLmRtYSk7Cj4gKwo+ICtlcnJfZnJlZV9wcml2X3Ny YzoKPiArICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KHZwdS0+ZGV2LCBjdHgtPnZwOF9lbmMucHJp dl9zcmMuc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5wcml2 X3NyYy5jcHUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMucHJpdl9z cmMuZG1hKTsKPiArCj4gK2Vycl9mcmVlX3JlZl9mcmFtZXM6Cj4gKyAgICAgICB3aGlsZSAoLS1p ID49IDApCj4gKyAgICAgICAgICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KHZwdS0+ZGV2LCBjdHgt PnZwOF9lbmMucmVmX2ZyYW1lc1tpXS5zaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjdHgtPnZwOF9lbmMucmVmX2ZyYW1lc1tpXS5jcHUsCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5yZWZfZnJhbWVzW2ldLmRtYSk7Cj4gKwo+ ICsgICAgICAgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArdm9pZCBoYW50cm9fdnA4X2VuY19leGl0 KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gK3sKPiArICAgICAgIHN0cnVjdCBoYW50cm9fZGV2 ICp2cHUgPSBjdHgtPmRldjsKPiArICAgICAgIGludCBpOwo+ICsKPiArICAgICAgIGRtYV9mcmVl X2NvaGVyZW50KHZwdS0+ZGV2LCBjdHgtPnZwOF9lbmMuY3RybF9idWYuc2l6ZSwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5jdHJsX2J1Zi5jcHUsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuY3RybF9idWYuZG1hKTsKPiArCj4gKyAgICAg ICBkbWFfZnJlZV9jb2hlcmVudCh2cHUtPmRldiwgY3R4LT52cDhfZW5jLnByaXZfZHN0LnNpemUs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMucHJpdl9kc3QuY3B1LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLnByaXZfZHN0LmRtYSk7Cj4g Kwo+ICsgICAgICAgZG1hX2ZyZWVfY29oZXJlbnQodnB1LT5kZXYsIGN0eC0+dnA4X2VuYy5tdl9i dWYuc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5tdl9idWYu Y3B1LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLm12X2J1Zi5kbWEp Owo+ICsKPiArICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KHZwdS0+ZGV2LCBjdHgtPnZwOF9lbmMu cHJpdl9zcmMuc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5w cml2X3NyYy5jcHUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMucHJp dl9zcmMuZG1hKTsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHgt PnZwOF9lbmMucmVmX2ZyYW1lcyk7ICsraSkKPiArICAgICAgICAgICAgICAgZG1hX2ZyZWVfY29o ZXJlbnQodnB1LT5kZXYsIGN0eC0+dnA4X2VuYy5yZWZfZnJhbWVzW2ldLnNpemUsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5yZWZfZnJhbWVzW2ldLmNw dSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLnJlZl9m cmFtZXNbaV0uZG1hKTsKPiArCj4gK30KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92ZXJpc2lsaWNvbi9yb2NrY2hpcF92cHUyX2h3X3ZwOF9lbmMuYyBiL2RyaXZlcnMvbWVk aWEvcGxhdGZvcm0vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1Ml9od192cDhfZW5jLmMKPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uMDhlMTk4NjA2NTA5Cj4gLS0t IC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vcm9j a2NoaXBfdnB1Ml9od192cDhfZW5jLmMKPiBAQCAtMCwwICsxLDE1NzQgQEAKPiArLy8gU1BEWC1M aWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogQ29weXJpZ2h0IChDKSAyMDIz IENvbGxhYm9yYSBMdGQuCj4gKyAqICAgICBBbmRyemVqIFBpZXRyYXNpZXdpY3ogPGFuZHJ6ZWou cEBjb2xsYWJvcmEuY29tPgo+ICsgKgo+ICsgKiBUaGlzIHdvcmsgaXMgZGVyaXZlZCBmcm9tOgo+ ICsgKgo+ICsgKiBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW1vcy90 aGlyZF9wYXJ0eS9rZXJuZWwvKy9yZWZzL2hlYWRzL2Nocm9tZW9zLTUuMTAvCj4gKyAqIGRyaXZl cnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vcmszMzk5X3ZwdV9od192cDhfZW5jLmMKPiArICoKPiAr ICogd2hpY2ggaXM6Cj4gKyAqCj4gKyAqIFJvY2tjaGlwIFZQVSBjb2RlYyBkcml2ZXIKPiArICoK PiArICogQ29weXJpZ2h0IChDKSAyMDE2IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkLgo+ ICsgKiAgICAgQWxwaGEgTGluIDxBbHBoYS5MaW5Acm9jay1jaGlwcy5jb20+Cj4gKyAqCj4gKyAq IFN1YnN0YW50aWFsIHBvcnRpb25zIGFyZSBiYXNlZCBvbiBNSVQtbGljZW5zZWQgY29kZQo+ICsg Kgo+ICsgKiBodHRwczovL2dpdGh1Yi5jb20vcm9ja2NoaXAtbGludXgvbXBwL2Jsb2IvZGV2ZWxv cC9tcHAvaGFsL3ZwdS92cDhlL2hhbF92cDhlX2VudHJvcHkue2N8aH0KPiArICogaHR0cHM6Ly9n aXRodWIuY29tL3JvY2tjaGlwLWxpbnV4L21wcC9ibG9iL2RldmVsb3AvbXBwL2hhbC92cHUvdnA4 ZS9oYWxfdnA4ZV90YWJsZS57Y3xofQo+ICsgKgo+ICsgKiB3aGljaCBpczoKPiArICoKPiArICog Q29weXJpZ2h0IChjKSAyMDE3IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkLgo+ICsgKgo+ ICsgKi8KPiArI2luY2x1ZGUgPGxpbnV4L21pbm1heC5oPgo+ICsKPiArI2luY2x1ZGUgImhhbnRy by5oIgo+ICsjaW5jbHVkZSAiaGFudHJvX2h3LmgiCj4gKyNpbmNsdWRlICJyb2NrY2hpcF92cHUy X3JlZ3MuaCIKPiArCj4gKy8qIHRocmVzaG9sZCBvZiBNQnMgY291bnQgdG8gZGlzYWJsZSBxdWFy dGVyIHBpeGVsIG12IGZvciBlbmNvZGUgc3BlZWQgKi8KPiArI2RlZmluZSBNQVhfTUJfQ09VTlRf VE9fRElTQUJMRV9RVUFSVEVSX1BJWEVMX01WICAgICAgIDM2MDAKPiArCj4gKy8qIHRocmVzaG9s ZCBvZiBNQnMgY291bnQgdG8gZGlzYWJsZSBtdWx0aSBtdiBpbiBvbmUgbWFjcm8gYmxvY2sgKi8K PiArI2RlZmluZSBNQVhfTUJfQ09VTlRfVE9fRElTQUJMRV9TUExJVF9NViAgICAgICAgICAgICAg IDE1ODQKPiArCj4gKyNkZWZpbmUgUUlOREVYX1JBTkdFIDEyOAo+ICsjZGVmaW5lIFZQOF9QUk9C X0NPVU5UX01WX09GRlNFVCAyMjIKPiArCj4gKyNkZWZpbmUgTU9ERV9ERUxUQV9CUFJFRCAgICAg ICAwCj4gKyNkZWZpbmUgTU9ERV9ERUxUQV9aRVJPTVYgICAgICAxCj4gKyNkZWZpbmUgTU9ERV9E RUxUQV9ORVdNViAgICAgICAyCj4gKyNkZWZpbmUgTU9ERV9ERUxUQV9TUExJVE1WICAgICAzCj4g Kwo+ICsjZGVmaW5lIFJFRl9ERUxUQV9JTlRSQV9NQiAgICAgMAo+ICsjZGVmaW5lIFJFRl9ERUxU QV9MQVNUX1JFRiAgICAgMQo+ICsjZGVmaW5lIFJFRl9ERUxUQV9HT0xERU4gICAgICAgMgo+ICsj ZGVmaW5lIFJFRl9ERUxUQV9BTFRfUkVGICAgICAgMwo+ICsKPiArLyogZXhwZXJpbWVudGFsbHkg Zml0dGVkLCAyNC44OTMqZXhwKDAuMDI1NDUqcXApICovCj4gK3N0YXRpYyBjb25zdCBzMzIgc3Bs aXRfcGVuYWx0eVtRSU5ERVhfUkFOR0VdID0gewo+ICsgICAgICAgMjQsIDI1LCAyNiwgMjYsIDI3 LCAyOCwgMjksIDI5LAo+ICsgICAgICAgMzAsIDMxLCAzMiwgMzIsIDMzLCAzNCwgMzUsIDM2LAo+ ICsgICAgICAgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LAo+ICsgICAgICAgNDUsIDQ3 LCA0OCwgNDksIDUwLCA1MiwgNTMsIDU0LAo+ICsgICAgICAgNTYsIDU3LCA1OSwgNjAsIDYyLCA2 MywgNjUsIDY3LAo+ICsgICAgICAgNjgsIDcwLCA3MiwgNzQsIDc2LCA3OCwgODAsIDgyLAo+ICsg ICAgICAgODQsIDg2LCA4OCwgOTEsIDkzLCA5NSwgOTgsIDEwMCwKPiArICAgICAgIDEwMywgMTA2 LCAxMDgsIDExMSwgMTE0LCAxMTcsIDEyMCwgMTIzLAo+ICsgICAgICAgMTI2LCAxMzAsIDEzMywg MTM2LCAxNDAsIDE0NCwgMTQ3LCAxNTEsCj4gKyAgICAgICAxNTUsIDE1OSwgMTYzLCAxNjcsIDE3 MiwgMTc2LCAxODEsIDE4NSwKPiArICAgICAgIDE5MCwgMTk1LCAyMDAsIDIwNSwgMjExLCAyMTYs IDIyMiwgMjI3LAo+ICsgICAgICAgMjMzLCAyMzksIDI0NSwgMjUyLCAyNTgsIDI2NSwgMjcyLCAy NzksCj4gKyAgICAgICAyODYsIDI5MywgMzAxLCAzMDksIDMxNywgMzI1LCAzMzMsIDM0MiwKPiAr ICAgICAgIDM1MSwgMzYwLCAzNjksIDM3OSwgMzg4LCAzOTgsIDQwOSwgNDE5LAo+ICsgICAgICAg NDMwLCA0NDEsIDQ1MywgNDY0LCA0NzYsIDQ4OCwgNTAxLCA1MTQsCj4gKyAgICAgICA1MjcsIDU0 MSwgNTU1LCA1NjksIDU4NCwgNTk5LCA2MTQsIDYzMAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0 IGludCBkY19xX2xvb2t1cFtRSU5ERVhfUkFOR0VdID0gewo+ICsgICAgICAgNCwgICA1LCAgIDYs ICAgNywgICA4LCAgIDksICAgMTAsICAxMCwgIDExLCAgMTIsCj4gKyAgICAgICAxMywgIDE0LCAg MTUsICAxNiwgIDE3LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMCwKPiArICAgICAgIDIxLCAgMjEs ICAyMiwgIDIyLCAgMjMsICAyMywgIDI0LCAgMjUsICAyNSwgIDI2LAo+ICsgICAgICAgMjcsICAy OCwgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsCj4gKyAgICAgICAzNywg IDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwKPiArICAgICAgIDQ2 LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LAo+ICsgICAgICAg NTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsCj4gKyAgICAg ICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwKPiArICAg ICAgIDc1LCAgNzYsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsICA4MiwgIDgzLAo+ICsg ICAgICAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTEsICA5MywgIDk1LCAgOTYsCj4g KyAgICAgICA5OCwgIDEwMCwgMTAxLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQs Cj4gKyAgICAgICAxMTYsIDExOCwgMTIyLCAxMjQsIDEyNiwgMTI4LCAxMzAsIDEzMiwgMTM0LCAx MzYsCj4gKyAgICAgICAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0OCwgMTUxLCAxNTQsIDE1Nwo+ICt9 Owo+ICsKPiArc3RhdGljIGNvbnN0IGludCBhY19xX2xvb2t1cFtRSU5ERVhfUkFOR0VdID0gewo+ ICsgICAgICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAgMTAsICAxMSwgIDEyLCAgMTMs Cj4gKyAgICAgICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAy MywKPiArICAgICAgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwg IDMzLAo+ICsgICAgICAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQy LCAgNDMsCj4gKyAgICAgICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAg NTIsICA1MywKPiArICAgICAgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA2MCwgIDYyLCAgNjQs ICA2NiwgIDY4LAo+ICsgICAgICAgNzAsICA3MiwgIDc0LCAgNzYsICA3OCwgIDgwLCAgODIsICA4 NCwgIDg2LCAgODgsCj4gKyAgICAgICA5MCwgIDkyLCAgOTQsICA5NiwgIDk4LCAgMTAwLCAxMDIs IDEwNCwgMTA2LCAxMDgsCj4gKyAgICAgICAxMTAsIDExMiwgMTE0LCAxMTYsIDExOSwgMTIyLCAx MjUsIDEyOCwgMTMxLCAxMzQsCj4gKyAgICAgICAxMzcsIDE0MCwgMTQzLCAxNDYsIDE0OSwgMTUy LCAxNTUsIDE1OCwgMTYxLCAxNjQsCj4gKyAgICAgICAxNjcsIDE3MCwgMTczLCAxNzcsIDE4MSwg MTg1LCAxODksIDE5MywgMTk3LCAyMDEsCj4gKyAgICAgICAyMDUsIDIwOSwgMjEzLCAyMTcsIDIy MSwgMjI1LCAyMjksIDIzNCwgMjM5LCAyNDUsCj4gKyAgICAgICAyNDksIDI1NCwgMjU5LCAyNjQs IDI2OSwgMjc0LCAyNzksIDI4NAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHMzMiBxcm91bmRp bmdfZmFjdG9yc1tRSU5ERVhfUkFOR0VdID0gewo+ICsgICAgICAgNTYsIDU2LCA1NiwgNTYsIDU2 LCA1NiwgNTYsIDU2LCA0OCwgNDgsCj4gKyAgICAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0 OCwgNDgsIDQ4LCA0OCwKPiArICAgICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwg NDgsIDQ4LAo+ICsgICAgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgs Cj4gKyAgICAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKPiArICAg ICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAo+ICsgICAgICAgNDgs IDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCj4gKyAgICAgICA0OCwgNDgsIDQ4 LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKPiArICAgICAgIDQ4LCA0OCwgNDgsIDQ4LCA0 OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAo+ICsgICAgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwg NDgsIDQ4LCA0OCwgNDgsCj4gKyAgICAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgs IDQ4LCA0OCwKPiArICAgICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4 LAo+ICsgICAgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4Cj4gK307Cj4gKwo+ICtz dGF0aWMgY29uc3QgczMyIHF6YmluX2ZhY3RvcnNbUUlOREVYX1JBTkdFXSA9IHsKPiArICAgICAg IDY0LCA2NCwgNjQsIDY0LCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAo+ICsgICAgICAgODAsIDgw LCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCj4gKyAgICAgICA4MCwgODAsIDgwLCA4 MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKPiArICAgICAgIDgwLCA4MCwgODAsIDgwLCA4MCwg ODAsIDgwLCA4MCwgODAsIDgwLAo+ICsgICAgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAs IDgwLCA4MCwgODAsCj4gKyAgICAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgw LCA4MCwKPiArICAgICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAo+ ICsgICAgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCj4gKyAgICAg ICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKPiArICAgICAgIDgwLCA4 MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAo+ICsgICAgICAgODAsIDgwLCA4MCwg ODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCj4gKyAgICAgICA4MCwgODAsIDgwLCA4MCwgODAs IDgwLCA4MCwgODAsIDgwLCA4MCwKPiArICAgICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgw LCA4MAo+ICt9Owo+ICsKPiArLyogSW50cmEgMTZ4MTYgbW9kZSB0cmVlIHBlbmFsdHkgdmFsdWVz ICovCj4gK3N0YXRpYyBzMzIgaW50cmFfMTZfdHJlZV9wZW5hbHR5W10gPSB7Cj4gKyAgICAgICAz MDUsIDg0MSwgOTE0LCAxMDgyCj4gK307Cj4gKwo+ICsvKiBJbnRyYSA0eDQgbW9kZSB0cmVlIHBl bmFsdHkgdmFsdWVzICovCj4gK3N0YXRpYyBzMzIgaW50cmFfNF90cmVlX3BlbmFsdHlbXSA9IHsK PiArICAgICAgIDI4MCwgNjIyLCA4MzIsIDExNzcsIDEyNDAsIDEzNDEsIDEwODUsIDEyNTksIDEz NTcsIDE0OTUKPiArfTsKPiArCj4gKwo+ICtpbnQzMl90IGNvbnN0IG9mZnNldF90YmxbXSA9IHsK PiArICAgICAgIC0xLCAtMSwgLTEsICAwLCAgMSwgIDIsIC0xLCAgMywgIDQsIC0xLCAgNSwgIDYs IC0xLCAgNywgIDgsIC0xLAo+ICsgICAgICAgOSwgMTAsIC0xLCAxMSwgMTIsIDEzLCAxNCwgMTUs IC0xLCAxNiwgMTcsIC0xLCAxOCwgMTksIC0xLCAyMCwKPiArICAgICAgIDIxLCAtMSwgMjIsIDIz LCAtMSwgMjQsIDI1LCAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAtMSwgMzEsIDMyLAo+ICsgICAg ICAgLTEsIDMzLCAzNCwgLTEsIDM1LCAzNiwgLTEsIDM3LCAzOCwgLTEsIDM5LCA0MCwgLTEsIDQx LCA0MiwgNDMsCj4gKyAgICAgICA0NCwgNDUsIC0xLCA0NiwgNDcsIC0xLCA0OCwgNDksIC0xLCA1 MCwgNTEsIC0xLCA1MiwgNTMsIC0xLCA1NCwKPiArICAgICAgIDU1LCAtMSwgNTYsIDU3LCAtMSwg LTEsIC0xLCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LAo+ICsgICAgICAgNjcs IDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwg ODIsCj4gKyAgICAgICA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMs IDk0LCA5NSwgOTYsIDk3LCA5OCwKPiArICAgICAgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEw NCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LAo+ICsg ICAgICAgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAx MjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAo+ICsgICAgICAgMTMxLCAxMzIsIDEzMywgMTM0 LCAxMzUsIDEzNiwgMTM3LCAxMzgsIC0xLCAtMSwgLTEsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQz LAo+ICsgICAgICAgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1Miwg MTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAo+ICsgICAgICAgMTYwLCAxNjEsIDE2 MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMs IDE3NCwgMTc1LAo+ICsgICAgICAgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAx ODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLAo+ICsgICAgICAgMTky LCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywg MjA0LCAyMDUsIDIwNiwgMjA3LAo+ICsgICAgICAgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIx MywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOQo+ICt9Owo+ICsKPiArLyogfnJvdW5kKCgy KigyK2V4cCgoeCsyMikvMzkpKSArICgyK2V4cCgoeCsxNSkvMzIpKSkvMykgKi8KPiArc3RhdGlj IHMzMiB3ZWlnaHRbUUlOREVYX1JBTkdFXSA9IHsKPiArICAgICAgIDQsICA0LCAgNCwgIDQsICA0 LCAgNCwgIDQsICA0LCAgNCwgIDQsCj4gKyAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA1 LCAgNSwgIDUsICA1LAo+ICsgICAgICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2 LCAgNiwKPiArICAgICAgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsCj4g KyAgICAgICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LAo+ICsgICAgICAg OCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwKPiArICAgICAgIDEwLCAxMSwg MTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLAo+ICsgICAgICAgMTQsIDE0LCAxNCwgMTQs IDE1LCAxNSwgMTUsIDE2LCAxNiwgMTcsCj4gKyAgICAgICAxNywgMTgsIDE4LCAxOSwgMTksIDIw LCAyMCwgMjAsIDIxLCAyMiwKPiArICAgICAgIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAy NywgMjgsIDI4LAo+ICsgICAgICAgMjksIDMwLCAzMSwgMzIsIDMyLCAzMywgMzQsIDM1LCAzNiwg MzcsCj4gKyAgICAgICAzOCwgMzksIDQwLCA0MSwgNDIsIDQ0LCA0NCwgNDYsIDQ3LCA0OCwKPiAr ICAgICAgIDUwLCA1MSwgNTIsIDU0LCA1NSwgNTcsIDU4LCA2MQo+ICt9Owo+ICsKPiArc3RydWN0 IHRyZWUgewo+ICsgICAgICAgczMyIHZhbHVlOyAgICAgICAvKiBCaXRzIGRlc2NyaWJlIHRoZSBi b29sIHRyZWUgICovCj4gKyAgICAgICBzMzIgbnVtYmVyOyAgICAgIC8qIE51bWJlciwgdmFsaWQg Yml0IGNvdW50IGluIGFib3ZlIHRyZWUgKi8KPiArICAgICAgIHMzMiBpbmRleFs5XTsgICAgLyog UHJvYmFiaWxpdHkgdGFibGUgaW5kZXggKi8KPiArfTsKPiArCj4gKy8qIE1vdGlvbiB2ZWN0b3Ig dHJlZSAqLwo+ICtzdGF0aWMgc3RydWN0IHRyZWUgbXZfdHJlZVtdID0gewo+ICsgICAgICAgeyAw LCAzLCB7IDAsIDEsIDIgfSB9LCAgICAgICAgLyogbXZfMCAwMDAgKi8KPiArICAgICAgIHsgMSwg MywgeyAwLCAxLCAyIH0gfSwgICAgICAgIC8qIG12XzEgMDAxICovCj4gKyAgICAgICB7IDIsIDMs IHsgMCwgMSwgMyB9IH0sICAgICAgICAvKiBtdl8yIDAxMCAqLwo+ICsgICAgICAgeyAzLCAzLCB7 IDAsIDEsIDMgfSB9LCAgICAgICAgLyogbXZfMyAwMTEgKi8KPiArICAgICAgIHsgNCwgMywgeyAw LCA0LCA1IH0gfSwgICAgICAgIC8qIG12XzQgMTAwICovCj4gKyAgICAgICB7IDUsIDMsIHsgMCwg NCwgNSB9IH0sICAgICAgICAvKiBtdl81IDEwMSAqLwo+ICsgICAgICAgeyA2LCAzLCB7IDAsIDQs IDYgfSB9LCAgICAgICAgLyogbXZfNiAxMTAgKi8KPiArICAgICAgIHsgNywgMywgeyAwLCA0LCA2 IH0gfSwgICAgICAgIC8qIG12XzcgMTExICovCj4gK307Cj4gKwo+ICsvKiBJZiBwcm9iYWJpbGl0 eSBiZWluZyB6ZXJvIGlzIHAsIHRoZW4gYXZlcmFnZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGVu Y29kZSAwCj4gKyAqIGlzIGxvZzIoMS9wKSwgdG8gZW5jb2RlIDEgaXMgbG9nMigxLygxLXApKS4K PiArICoKPiArICogRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyB6ZXJv IGlzIDAuNQo+ICsgKiBiaW4gPSAwIC0+IGF2ZXJhZ2UgYml0cyB1c2VkIGlzIGxvZzIoMS8wLjUp ICAgICAgPSAxIGJpdHMvYmluCj4gKyAqIGJpbiA9IDEgLT4gYXZlcmFnZSBiaXRzIHVzZWQgaXMg bG9nMigxLygxIC0gMC41KSA9IDEgYml0cy9iaW4KPiArICoKPiArICogRm9yIGV4YW1wbGUsIGlm IHRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyB6ZXJvIGlzIDAuOTUKPiArICogYmluID0gMCAtPiBh dmVyYWdlIGJpdHMgdXNlZCBpcyBsb2cyKDEvMC45NSkgICAgICA9IDAuMDc0IGJpdHMvYmluCj4g KyAqIGJpbiA9IDEgLT4gYXZlcmFnZSBiaXRzIHVzZWQgaXMgbG9nMigxLygxIC0gMC45NSkgPSA0 LjMyMSBiaXRzL2Jpbgo+ICsgKgo+ICsgKiBUaGUgY29zdFtwXSBpcyBhdmVyYWdlIG51bWJlciBv ZiBiaXRzIHVzZWQgdG8gZW5jb2RlIDAgaWYgdGhlIHByb2JhYmlsaXR5IGlzCj4gKyAqIHAgLyAy NTYsIHNjYWxlZCBieSBhIG1hZ2ljIG51bWJlciAyNTYsCj4gKyAqIGkuZS4sIGNvc3RbcF0gPSBy b3VuZChsb2cyKDI1NiAvIHApICogMjU2KS4KPiArICovCj4gK3N0YXRpYyBjb25zdCBzMzIgdnA4 X3Byb2JfY29zdFtdID0gewo+ICsgICAgICAgMjA0OCwgMjA0OCwgMTc5MiwgMTY0MiwgMTUzNiwg MTQ1NCwgMTM4NiwgMTMyOSwgMTI4MCwgMTIzNiwKPiArICAgICAgIDExOTgsIDExNjIsIDExMzAs IDExMDEsIDEwNzMsIDEwNDgsIDEwMjQsIDEwMDIsICA5ODAsICA5NjEsCj4gKyAgICAgICA5NDIs ICA5MjQsICA5MDYsICA4OTAsICA4NzQsICA4NTksICA4NDUsICA4MzEsICA4MTcsICA4MDQsCj4g KyAgICAgICA3OTIsICA3ODAsICA3NjgsICA3NTcsICA3NDYsICA3MzUsICA3MjQsICA3MTQsICA3 MDUsICA2OTUsCj4gKyAgICAgICA2ODYsICA2NzYsICA2NjgsICA2NTksICA2NTAsICA2NDIsICA2 MzQsICA2MjYsICA2MTgsICA2MTEsCj4gKyAgICAgICA2MDMsICA1OTYsICA1ODksICA1ODIsICA1 NzUsICA1NjgsICA1NjEsICA1NTUsICA1NDgsICA1NDIsCj4gKyAgICAgICA1MzYsICA1MzAsICA1 MjQsICA1MTgsICA1MTIsICA1MDYsICA1MDEsICA0OTUsICA0OTAsICA0ODQsCj4gKyAgICAgICA0 NzksICA0NzQsICA0NjgsICA0NjMsICA0NTgsICA0NTMsICA0NDksICA0NDQsICA0MzksICA0MzQs Cj4gKyAgICAgICA0MzAsICA0MjUsICA0MjAsICA0MTYsICA0MTIsICA0MDcsICA0MDMsICAzOTks ICAzOTQsICAzOTAsCj4gKyAgICAgICAzODYsICAzODIsICAzNzgsICAzNzQsICAzNzAsICAzNjYs ICAzNjIsICAzNTgsICAzNTUsICAzNTEsCj4gKyAgICAgICAzNDcsICAzNDMsICAzNDAsICAzMzYs ICAzMzMsICAzMjksICAzMjYsICAzMjIsICAzMTksICAzMTUsCj4gKyAgICAgICAzMTIsICAzMDks ICAzMDUsICAzMDIsICAyOTksICAyOTYsICAyOTIsICAyODksICAyODYsICAyODMsCj4gKyAgICAg ICAyODAsICAyNzcsICAyNzQsICAyNzEsICAyNjgsICAyNjUsICAyNjIsICAyNTksICAyNTYsICAy NTMsCj4gKyAgICAgICAyNTAsICAyNDcsICAyNDUsICAyNDIsICAyMzksICAyMzYsICAyMzQsICAy MzEsICAyMjgsICAyMjYsCj4gKyAgICAgICAyMjMsICAyMjAsICAyMTgsICAyMTUsICAyMTIsICAy MTAsICAyMDcsICAyMDUsICAyMDIsICAyMDAsCj4gKyAgICAgICAxOTcsICAxOTUsICAxOTMsICAx OTAsICAxODgsICAxODUsICAxODMsICAxODEsICAxNzgsICAxNzYsCj4gKyAgICAgICAxNzQsICAx NzEsICAxNjksICAxNjcsICAxNjQsICAxNjIsICAxNjAsICAxNTgsICAxNTYsICAxNTMsCj4gKyAg ICAgICAxNTEsICAxNDksICAxNDcsICAxNDUsICAxNDMsICAxNDAsICAxMzgsICAxMzYsICAxMzQs ICAxMzIsCj4gKyAgICAgICAxMzAsICAxMjgsICAxMjYsICAxMjQsICAxMjIsICAxMjAsICAxMTgs ICAxMTYsICAxMTQsICAxMTIsCj4gKyAgICAgICAxMTAsICAxMDgsICAxMDYsICAxMDQsICAxMDIs ICAxMDEsICAgOTksICAgOTcsICAgOTUsICAgOTMsCj4gKyAgICAgICA5MSwgICA4OSwgICA4Nywg ICA4NiwgICA4NCwgICA4MiwgICA4MCwgICA3OCwgICA3NywgICA3NSwKPiArICAgICAgIDczLCAg IDcxLCAgIDcwLCAgIDY4LCAgIDY2LCAgIDY0LCAgIDYzLCAgIDYxLCAgIDU5LCAgIDU4LAo+ICsg ICAgICAgNTYsICAgNTQsICAgNTMsICAgNTEsICAgNDksICAgNDgsICAgNDYsICAgNDQsICAgNDMs ICAgNDEsCj4gKyAgICAgICA0MCwgICAzOCwgICAzNiwgICAzNSwgICAzMywgICAzMiwgICAzMCwg ICAyOCwgICAyNywgICAyNSwKPiArICAgICAgIDI0LCAgIDIyLCAgIDIxLCAgIDE5LCAgIDE4LCAg IDE2LCAgIDE1LCAgIDEzLCAgIDEyLCAgIDEwLAo+ICsgICAgICAgOSwgICAgNywgICAgNiwgICAg NCwgICAgMywgICAgMQo+ICt9Owo+ICsKPiArLyogQXBwcm94aW1hdGUgYml0IGNvc3Qgb2YgYmlu IGF0IGdpdmVuIHByb2JhYmlsaXR5IHByb2IgKi8KPiArI2RlZmluZSBDT1NUX0JPT0wocHJvYiwg YmluKSAgIHZwOF9wcm9iX2Nvc3RbKGJpbikgPyAyNTUgLSAocHJvYikgOiAocHJvYildCj4gKwo+ ICt1aW50MzJfdCBjb25zdCBjb2VmZl91cGRhdGVfcHJvYls0XVs4XVszXVsxMV0gPSB7Cj4gKyAg ICAgICB7Cj4gKyAgICAgICAgICAgICAgIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAg ICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxNzYsIDI0NiwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgezIyMywgMjQxLCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjQ5LCAyNTMsIDI1MywgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7 Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjQ0LCAyNTIsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjM0 LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgIHsyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAg ICAgICAgICAgICAgICB7MjU1LCAyNDYsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMzksIDI1MywgMjU0LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgezI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAg IHsyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0s Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1MSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsg ICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjUzLCAy NTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAg ICAgICAgICAgICAgICB7MjUxLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU0LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAg IH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTQsIDI1MywgMjU1LCAyNTQs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAg IHsyNTAsIDI1NSwgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0s Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAg ICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAg ICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LAo+ICsgICAgICAgfSwgewo+ICsgICAg ICAgICAgICAgICB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezIxNywgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAg ICAgICAgICB7MjI1LCAyNTIsIDI0MSwgMjUzLCAyNTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1 LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMzQsIDI1MCwgMjQxLCAyNTAsIDI1 MywgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsK PiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMjMs IDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgezIzOCwgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI0OSwgMjU0LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAg ICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAg ezI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwK PiArICAgICAgICAgICAgICAgICAgICAgICB7MjQ3LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAg ICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTMsIDI1 NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAg fSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ezI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwK PiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgezI1NSwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjUwLCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAg ICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAy NTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwK PiArICAgICAgICAgICAgICAgfSwKPiArICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgewo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsxODYsIDI1MSwgMjUwLCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezIzNCwg MjUxLCAyNDQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAg ICAgICAgICAgICAgICAgICAgICB7MjUxLCAyNTEsIDI0MywgMjUzLCAyNTQsIDI1NSwgMjU0LCAy NTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAg ICAgICAgICAgICAgezI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjM2LCAyNTMsIDI1NCwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHsyNTEsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTQsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAg ICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NCwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgezI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU0LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9 LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAg ICAgICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAg ICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAg ICAgICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAg ICAgIH0sCj4gKyAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgIHsKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjQ4LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTAsIDI1NCwgMjUyLCAyNTQs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgezI0OCwgMjU0LCAyNDksIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsy NTUsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgezI0NiwgMjUzLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjUyLCAy NTQsIDI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAg ICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU0LCAyNTIs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjQ4LCAyNTQsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTMsIDI1NSwgMjU0LCAyNTQs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0s IHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsy NDUsIDI1MSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgezI1MywgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAg ICAgICAgICAgICAgICAgIHsyNTUsIDI1MSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1MiwgMjUzLCAyNTQs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgezI1NSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjQ5LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsy NTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4g KyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTUs IDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgIHsyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAg ICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgezI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LAo+ICsgICAg ICAgfSwKPiArfTsKPiArCj4gK3VpbnQzMl90IGNvbnN0IG12X3VwZGF0ZV9wcm9iWzJdWzE5XSA9 IHsKPiArICAgICAgIHsKPiArICAgICAgICAgICAgICAgMjM3LCAyNDYsIDI1MywgMjUzLCAyNTQs IDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LAo+ICsgICAgICAgICAgICAgICAyNTQsIDI1NCwgMjU0 LCAyNTQsIDI1MCwgMjUwLCAyNTIsIDI1NCwgMjU0Cj4gKyAgICAgICB9LCB7Cj4gKyAgICAgICAg ICAgICAgIDIzMSwgMjQzLCAyNDUsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwK PiArICAgICAgICAgICAgICAgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTEsIDI1MSwgMjU0LCAyNTQs IDI1NAo+ICsgICAgICAgfQo+ICt9Owo+ICsKPiArdWludDhfdCBjb25zdCBkZWZhdWx0X3Byb2Jf c2tpcF9mYWxzZVsxMjhdID0gewo+ICsgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsCj4gKyAgICAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwKPiArICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAo+ ICsgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCj4gKyAgICAg ICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKPiArICAgICAgIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAo+ICsgICAgICAgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCj4gKyAgICAgICAyNTEsIDI0OCwgMjQ0LCAyNDAs IDIzNiwgMjMyLCAyMjksIDIyNSwKPiArICAgICAgIDIyMSwgMjE3LCAyMTMsIDIwOCwgMjA0LCAx OTksIDE5NCwgMTkwLAo+ICsgICAgICAgMTg3LCAxODMsIDE3OSwgMTc1LCAxNzIsIDE2OCwgMTY0 LCAxNjAsCj4gKyAgICAgICAxNTcsIDE1MywgMTQ5LCAxNDUsIDE0MiwgMTM4LCAxMzQsIDEzMCwK PiArICAgICAgIDEyNywgMTI0LCAxMjAsIDExNywgMTE0LCAxMTAsIDEwNywgMTA0LAo+ICsgICAg ICAgMTAxLCA5OCwgIDk1LCAgOTIsICA4OSwgIDg2LCAgODMsIDgwLAo+ICsgICAgICAgNzcsICA3 NCwgIDcxLCAgNjgsICA2NSwgIDYyLCAgNTksIDU2LAo+ICsgICAgICAgNTMsICA1MCwgIDQ3LCAg NDQsICA0MSwgIDM4LCAgMzUsIDMyLAo+ICsgICAgICAgMzAsICAyOCwgIDI2LCAgMjQsICAyMiwg IDIwLCAgMTgsIDE2LAo+ICt9Owo+ICsKPiAraW50MzJfdCBjb25zdCB5X21vZGVfcHJvYls0XSA9 IHsKPiArICAgICAgIDExMiwgODYsIDE0MCwgMzcKPiArfTsKPiArCj4gK2ludDMyX3QgY29uc3Qg dXZfbW9kZV9wcm9iWzNdID0gewo+ICsgICAgICAgMTYyLCAxMDEsIDIwNAo+ICt9Owo+ICsKPiAr dWludDMyX3QgY29uc3QgZGVmYXVsdF9wcm9iX2NvZWZmWzRdWzhdWzNdWzExXSA9IHsKPiArICAg ICAgIHsKPiArICAgICAgICAgICAgICAgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxMjgs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgezEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTI4LCAxMjgs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAg ICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1MywgMTM2LCAyNTQsIDI1 NSwgMjI4LCAyMTksIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAg ICAgICAgICB7MTg5LCAxMjksIDI0MiwgMjU1LCAyMjcsIDIxMywgMjU1LCAyMTksIDEyOCwgMTI4 LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxMDYsIDEyNiwgMjI3LCAyNTIsIDIx NCwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsK PiArICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAgOTgsIDI0OCwgMjU1LCAyMzYsIDIyNiwg MjU1LCAyNTUsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxODEs IDEzMywgMjM4LCAyNTQsIDIyMSwgMjM0LCAyNTUsIDE1NCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgeyA3OCwgMTM0LCAyMDIsIDI0NywgMTk4LCAxODAsIDI1NSwg MjE5LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsgIDEsIDE4NSwgMjQ5LCAyNTUsIDI0MywgMjU1LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezE4NCwgMTUwLCAyNDcsIDI1 NSwgMjM2LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAg ICAgICAgICB7IDc3LCAxMTAsIDIxNiwgMjU1LCAyMzYsIDIzMCwgMTI4LCAxMjgsIDEyOCwgMTI4 LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAg eyAgMSwgMTAxLCAyNTEsIDI1NSwgMjQxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwK PiArICAgICAgICAgICAgICAgICAgICAgICB7MTcwLCAxMzksIDI0MSwgMjUyLCAyMzYsIDIwOSwg MjU1LCAyNTUsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgMzcs IDExNiwgMTk2LCAyNDMsIDIyOCwgMjU1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAg ICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAyMDQsIDI1 NCwgMjU1LCAyNDUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyMDcsIDE2MCwgMjUwLCAyNTUsIDIzOCwgMTI4LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezEwMiwgMTAzLCAyMzEsIDI1 NSwgMjExLCAxNzEsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAg fSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDE1MiwgMjUyLCAyNTUsIDI0MCwg MjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ezE3NywgMTM1LCAyNDMsIDI1NSwgMjM0LCAyMjUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwK PiArICAgICAgICAgICAgICAgICAgICAgICB7IDgwLCAxMjksIDIxMSwgMjU1LCAxOTQsIDIyNCwg MTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgeyAgMSwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjQ2LCAgIDEsIDI1 NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sCj4gKyAgICAgICB9LCB7Cj4gKyAgICAg ICAgICAgICAgIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTk4LCAgMzUsIDIzNywgMjIz LCAxOTMsIDE4NywgMTYyLCAxNjAsIDE0NSwgMTU1LCAgNjJ9LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHsxMzEsICA0NSwgMTk4LCAyMjEsIDE3MiwgMTc2LCAyMjAsIDE1NywgMjUyLCAyMjEs ICAgMX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyA2OCwgIDQ3LCAxNDYsIDIwOCwgMTQ5 LCAxNjcsIDIyMSwgMTYyLCAyNTUsIDIyMywgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDE0OSwgMjQxLCAyNTUsIDIyMSwgMjI0LCAy NTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezE4NCwg MTQxLCAyMzQsIDI1MywgMjIyLCAyMjAsIDI1NSwgMTk5LCAxMjgsIDEyOCwgMTI4fSwKPiArICAg ICAgICAgICAgICAgICAgICAgICB7IDgxLCAgOTksIDE4MSwgMjQyLCAxNzYsIDE5MCwgMjQ5LCAy MDIsIDI1NSwgMjU1LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAg ICAgICAgICAgICAgeyAgMSwgMTI5LCAyMzIsIDI1MywgMjE0LCAxOTcsIDI0MiwgMTk2LCAyNTUs IDI1NSwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7IDk5LCAxMjEsIDIxMCwgMjUw LCAyMDEsIDE5OCwgMjU1LCAyMDIsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHsgMjMsICA5MSwgMTYzLCAyNDIsIDE3MCwgMTg3LCAyNDcsIDIxMCwgMjU1LCAyNTUs IDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7 ICAxLCAyMDAsIDI0NiwgMjU1LCAyMzQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsxMDksIDE3OCwgMjQxLCAyNTUsIDIzMSwgMjQ1LCAy NTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyA0NCwg MTMwLCAyMDEsIDI1MywgMjA1LCAxOTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4fSwKPiArICAg ICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDEzMiwgMjM5 LCAyNTEsIDIxOSwgMjA5LCAyNTUsIDE2NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgeyA5NCwgMTM2LCAyMjUsIDI1MSwgMjE4LCAxOTAsIDI1NSwgMjU1LCAxMjgs IDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7IDIyLCAxMDAsIDE3NCwgMjQ1 LCAxODYsIDE2MSwgMjU1LCAxOTksIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9 LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMTgyLCAyNDksIDI1NSwgMjMyLCAy MzUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MTI0LCAxNDMsIDI0MSwgMjU1LCAyMjcsIDIzNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsgMzUsICA3NywgMTgxLCAyNTEsIDE5MywgMjExLCAy NTUsIDIwNSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAg ICAgICAgICAgICAgICAgICB7ICAxLCAxNTcsIDI0NywgMjU1LCAyMzYsIDIzMSwgMjU1LCAyNTUs IDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxMjEsIDE0MSwgMjM1 LCAyNTUsIDIyNSwgMjI3LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgeyA0NSwgIDk5LCAxODgsIDI1MSwgMTk1LCAyMTcsIDI1NSwgMjI0LCAxMjgs IDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAg ICAgIHsgIDEsICAgMSwgMjUxLCAyNTUsIDIxMywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEy OH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezIwMywgICAxLCAyNDgsIDI1NSwgMjU1LCAx MjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MTM3LCAgIDEsIDE3NywgMjU1LCAyMjQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ ICsgICAgICAgICAgICAgICB9LAo+ICsgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICB7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgezI1MywgICA5LCAyNDgsIDI1MSwgMjA3LCAyMDgsIDI1 NSwgMTkyLCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTc1LCAg MTMsIDIyNCwgMjQzLCAxOTMsIDE4NSwgMjQ5LCAxOTgsIDI1NSwgMjU1LCAxMjh9LAo+ICsgICAg ICAgICAgICAgICAgICAgICAgIHsgNzMsICAxNywgMTcxLCAyMjEsIDE2MSwgMTc5LCAyMzYsIDE2 NywgMjU1LCAyMzQsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAg ICAgICAgICAgICB7ICAxLCAgOTUsIDI0NywgMjUzLCAyMTIsIDE4MywgMjU1LCAyNTUsIDEyOCwg MTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMzksICA5MCwgMjQ0LCAyNTAs IDIxMSwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgezE1NSwgIDc3LCAxOTUsIDI0OCwgMTg4LCAxOTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwg MTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsg IDEsICAyNCwgMjM5LCAyNTEsIDIxOCwgMjE5LCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOH0sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgezIwMSwgIDUxLCAyMTksIDI1NSwgMTk2LCAxODYsIDEy OCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7IDY5LCAg NDYsIDE5MCwgMjM5LCAyMDEsIDIxOCwgMjU1LCAyMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAg ICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMTkxLCAyNTEs IDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjIzLCAxNjUsIDI0OSwgMjU1LCAyMTMsIDI1NSwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxNDEsIDEyNCwgMjQ4LCAyNTUs IDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0s IHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAgMTYsIDI0OCwgMjU1LCAyNTUsIDEy OCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsx OTAsICAzNiwgMjMwLCAyNTUsIDIzNiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgezE0OSwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEy OCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAg ICAgICAgICAgICAgICAgIHsgIDEsIDIyNiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI0NywgMTkyLCAyNTUs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjQwLCAxMjgsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgeyAgMSwgMTM0LCAyNTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4 fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjEzLCAgNjIsIDI1MCwgMjU1LCAyNTUsIDEy OCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsg NTUsICA5MywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4g KyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTI4LCAxMjgs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgIHsxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezEyOCwgMTI4LCAxMjgs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAg ICAgfSwKPiArICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgewo+ICsgICAgICAgICAgICAg ICAgICAgICAgIHsyMDIsICAyNCwgMjEzLCAyMzUsIDE4NiwgMTkxLCAyMjAsIDE2MCwgMjQwLCAx NzUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezEyNiwgIDM4LCAxODIsIDIzMiwg MTY5LCAxODQsIDIyOCwgMTc0LCAyNTUsIDE4NywgMTI4fSwKPiArICAgICAgICAgICAgICAgICAg ICAgICB7IDYxLCAgNDYsIDEzOCwgMjE5LCAxNTEsIDE3OCwgMjQwLCAxNzAsIDI1NSwgMjE2LCAx Mjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAg MSwgMTEyLCAyMzAsIDI1MCwgMTk5LCAxOTEsIDI0NywgMTU5LCAyNTUsIDI1NSwgMTI4fSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICB7MTY2LCAxMDksIDIyOCwgMjUyLCAyMTEsIDIxNSwgMjU1 LCAxNzQsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgMzksICA3 NywgMTYyLCAyMzIsIDE3MiwgMTgwLCAyNDUsIDE3OCwgMjU1LCAyNTUsIDEyOH0sCj4gKyAgICAg ICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAgNTIsIDIyMCwg MjQ2LCAxOTgsIDE5OSwgMjQ5LCAyMjAsIDI1NSwgMjU1LCAxMjh9LAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIHsxMjQsICA3NCwgMTkxLCAyNDMsIDE4MywgMTkzLCAyNTAsIDIyMSwgMjU1LCAy NTUsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAyNCwgIDcxLCAxMzAsIDIxOSwg MTU0LCAxNzAsIDI0MywgMTgyLCAyNTUsIDI1NSwgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwg ewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDE4MiwgMjI1LCAyNDksIDIxOSwgMjQw LCAyNTUsIDIyNCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezE0 OSwgMTUwLCAyMjYsIDI1MiwgMjE2LCAyMDUsIDI1NSwgMTcxLCAxMjgsIDEyOCwgMTI4fSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICB7IDI4LCAxMDgsIDE3MCwgMjQyLCAxODMsIDE5NCwgMjU0 LCAyMjMsIDI1NSwgMjU1LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgeyAgMSwgIDgxLCAyMzAsIDI1MiwgMjA0LCAyMDMsIDI1NSwgMTkyLCAx MjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTIzLCAxMDIsIDIwOSwg MjQ3LCAxODgsIDE5NiwgMjU1LCAyMzMsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIHsgMjAsICA5NSwgMTUzLCAyNDMsIDE2NCwgMTczLCAyNTUsIDIwMywgMTI4LCAx MjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAg ICB7ICAxLCAyMjIsIDI0OCwgMjU1LCAyMTYsIDIxMywgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9 LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxNjgsIDE3NSwgMjQ2LCAyNTIsIDIzNSwgMjA1 LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyA0 NywgMTE2LCAyMTUsIDI1NSwgMjExLCAyMTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4fSwKPiAr ICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDEyMSwg MjM2LCAyNTMsIDIxMiwgMjE0LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgezE0MSwgIDg0LCAyMTMsIDI1MiwgMjAxLCAyMDIsIDI1NSwgMjE5LCAx MjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7IDQyLCAgODAsIDE2MCwg MjQwLCAxNjIsIDE4NSwgMjU1LCAyMDUsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAg ICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgICAxLCAyNTUsIDEyOCwgMTI4 LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAg ICB7MjQ0LCAgIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9 LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMzgsICAgMSwgMjU1LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sCj4gKyAgICAg ICB9Cj4gK307Cj4gKwo+ICt1aW50MzJfdCBjb25zdCBkZWZhdWx0X3Byb2JfbXZbMl1bMTldID0g ewo+ICsgICAgICAgewo+ICsgICAgICAgICAgICAgICAxNjIsIDEyOCwgMjI1LCAxNDYsIDE3Miwg MTQ3LCAyMTQsICAzOSwgMTU2LCAxMjgsCj4gKyAgICAgICAgICAgICAgIDEyOSwgMTMyLCAgNzUs IDE0NSwgMTc4LCAyMDYsIDIzOSwgMjU0LCAyNTQsCj4gKyAgICAgICB9LCB7Cj4gKyAgICAgICAg ICAgICAgIDE2NCwgMTI4LCAyMDQsIDE3MCwgMTE5LCAyMzUsIDE0MCwgMjMwLCAyMjgsIDEyOCwK PiArICAgICAgICAgICAgICAgMTMwLCAxMzAsICA3NCwgMTQ4LCAxODAsIDIwMywgMjM2LCAyNTQs IDI1NCwKPiArICAgICAgIH0sCj4gK307Cj4gKwo+ICtzdHJ1Y3QgaGFudHJvX3ZwOF9lbmNfY3Ry bF9idWYgewo+ICsgICAgICAgdTMyIGh3X2hkcl9zaXplOwo+ICsgICAgICAgdTMyIGRjdF9zaXpl Owo+ICsgICAgICAgdTggcmVzZXJ2ZWRbMTAxNl07Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5l IGJvb2wgaXNfaW50cmEoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiArewo+ICsgICAgICAgcmV0 dXJuIGN0eC0+dnA4X2VuYy5pc19pbnRyYTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBzaXpl X3QgZnJhbWVfdGFnX3NpemUoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiArewo+ICsgICAgICAg cmV0dXJuIGlzX2ludHJhKGN0eCkgPyAxMCA6IDM7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJv Y2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9jb2VmZl9wcm9iKHN0cnVjdCBoYW50cm9fY3R4ICpj dHgpCj4gK3sKPiArICAgICAgIHN0cnVjdCBoYW50cm9fYm9vbGVuYyAqZSA9ICZjdHgtPnZwOF9l bmMuYm9vbGVuYzsKPiArICAgICAgIHN0cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgKmVudHJvcHkg PSAmY3R4LT52cDhfZW5jLmVudHJvcHk7Cj4gKwo+ICsgICAgICAgaW50IGksIGosIGssIGw7Cj4g KyAgICAgICB1aW50MzJfdCBwcm9iLCBuZXcsIG9sZDsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAw OyBpIDwgNDsgaSsrKSB7Cj4gKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKysp IHsKPiArICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgMTE7IGwrKykg ewo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iID0gY29lZmZf dXBkYXRlX3Byb2JbaV1bal1ba11bbF07Cj4gKwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBvbGQgPSBlbnRyb3B5LT5jb2VmZl9wcm9iX29sZFtpXVtqXVtrXVtsXTsK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ID0gZW50cm9weS0+ Y29lZmZfcHJvYltpXVtqXVtrXVtsXTsKPiArCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGlmIChuZXcgPT0gb2xkKSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfYm9vbChlLCBwcm9i LCAwKTsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW50cm9f Ym9vbGVuY193cml0ZV9ib29sKGUsIHByb2IsIDEpOwo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBuZXcs IDgpOwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB9Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgfQo+ ICsgICAgICAgICAgICAgICB9Cj4gKyAgICAgICB9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJv Y2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9tdl9wcm9iKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgp Cj4gK3sKPiArICAgICAgIHN0cnVjdCBoYW50cm9fYm9vbGVuYyAqZSA9ICZjdHgtPnZwOF9lbmMu Ym9vbGVuYzsKPiArICAgICAgIHN0cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgKmVudHJvcHkgPSAm Y3R4LT52cDhfZW5jLmVudHJvcHk7Cj4gKwo+ICsgICAgICAgaW50IGksIGo7Cj4gKyAgICAgICB1 aW50MzJfdCBwcm9iLCBuZXcsIG9sZDsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsg aSsrKSB7Cj4gKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxOTsgaisrKSB7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgcHJvYiA9IG12X3VwZGF0ZV9wcm9iW2ldW2pdOwo+ICsgICAg ICAgICAgICAgICAgICAgICAgIG9sZCA9IGVudHJvcHktPm12X3Byb2Jfb2xkW2ldW2pdOwo+ICsg ICAgICAgICAgICAgICAgICAgICAgIG5ldyA9IGVudHJvcHktPm12X3Byb2JbaV1bal07Cj4gKwo+ ICsgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgPT0gb2xkKSB7Cj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9ib29sKGUsIHByb2IsIDAp Owo+ICsgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9ib29sKGUsIHByb2IsIDEpOwo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUs IG5ldyA+PiAxLCA3KTsKPiArICAgICAgICAgICAgICAgICAgICAgICB9Cj4gKyAgICAgICAgICAg ICAgIH0KPiArICAgICAgIH0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcm9ja2NoaXBfdnB1Ml92 cDhfZW5jX3dyaXRlX2ZpbHRlcl9sZXZlbF9kZWx0YShzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+ ICt7Cj4gKyAgICAgICBzdHJ1Y3QgaGFudHJvX2Jvb2xlbmMgKmUgPSAmY3R4LT52cDhfZW5jLmJv b2xlbmM7Cj4gKyAgICAgICBpbnQzMl90IGksIHRtcDsKPiArICAgICAgIHVpbnQ4X3QgIHVwZGF0 ZSA9IDA7Cj4gKyAgICAgICBpbnQzMl90IG1vZGVfdXBkYXRlWzRdOwo+ICsgICAgICAgaW50MzJf dCByZWZfdXBkYXRlWzRdOwo+ICsKPiArICAgICAgIGlmIChpc19pbnRyYShjdHgpKSB7Cj4gKyAg ICAgICAgICAgICAgIG1lbXNldChjdHgtPnZwOF9lbmMub2xkX21vZGVfZGVsdGEsIDAsIHNpemVv ZihjdHgtPnZwOF9lbmMub2xkX21vZGVfZGVsdGEpKTsKPiArICAgICAgICAgICAgICAgbWVtc2V0 KGN0eC0+dnA4X2VuYy5vbGRfcmVmX2RlbHRhLCAwLCBzaXplb2YoY3R4LT52cDhfZW5jLm9sZF9y ZWZfZGVsdGEpKTsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsg aSsrKSB7Cj4gKyAgICAgICAgICAgICAgIG1vZGVfdXBkYXRlW2ldID0gY3R4LT52cDhfZW5jLm1v ZGVfZGVsdGFbaV0gIT0gY3R4LT52cDhfZW5jLm9sZF9tb2RlX2RlbHRhW2ldOwo+ICsgICAgICAg ICAgICAgICByZWZfdXBkYXRlW2ldID0gY3R4LT52cDhfZW5jLnJlZl9kZWx0YVtpXSAhPSBjdHgt PnZwOF9lbmMub2xkX3JlZl9kZWx0YVtpXTsKPiArICAgICAgICAgICAgICAgaWYgKG1vZGVfdXBk YXRlW2ldIHx8IHJlZl91cGRhdGVbaV0pCj4gKyAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRl ID0gMTsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBpZiAoIWN0eC0+dnA4X2VuYy5yZWZyZXNo X2VudHJvcHlfcHJvYnMpCj4gKyAgICAgICAgICAgICAgIHVwZGF0ZSA9IDE7Cj4gKwo+ICsgICAg ICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIHVwZGF0ZSwgMSk7Cj4gKyAgICAgICBpZiAo IXVwZGF0ZSkKPiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ICsKPiArICAgICAgIGZvciAoaSA9 IDA7IGkgPCA0OyBpKyspIHsKPiArICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVf bGl0KGUsIHJlZl91cGRhdGVbaV0sIDEpOwo+ICsgICAgICAgICAgICAgICBpZiAocmVmX3VwZGF0 ZVtpXSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGN0eC0+dnA4X2VuYy5yZWZf ZGVsdGFbaV07Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVf bGl0KGUsIGFicyh0bXApLCA2KTsKPiArICAgICAgICAgICAgICAgICAgICAgICBoYW50cm9fYm9v bGVuY193cml0ZV9saXQoZSwgdG1wIDwgMCwgMSk7Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAg ICAgIH0KPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Cj4gKyAgICAgICAg ICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBtb2RlX3VwZGF0ZVtpXSwgMSk7Cj4g KyAgICAgICAgICAgICAgIGlmIChtb2RlX3VwZGF0ZVtpXSkgewo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHRtcCA9IGN0eC0+dnA4X2VuYy5tb2RlX2RlbHRhW2ldOwo+ICsgICAgICAgICAgICAg ICAgICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBhYnModG1wKSwgNik7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIHRtcCA8IDAs IDEpOwo+ICsgICAgICAgICAgICAgICB9Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgbWVtY3B5 KGN0eC0+dnA4X2VuYy5vbGRfbW9kZV9kZWx0YSwgY3R4LT52cDhfZW5jLm1vZGVfZGVsdGEsCj4g KyAgICAgICAgICAgICAgc2l6ZW9mKGN0eC0+dnA4X2VuYy5vbGRfbW9kZV9kZWx0YSkpOwo+ICsg ICAgICAgbWVtY3B5KGN0eC0+dnA4X2VuYy5vbGRfcmVmX2RlbHRhLCBjdHgtPnZwOF9lbmMucmVm X2RlbHRhLAo+ICsgICAgICAgICAgICAgIHNpemVvZihjdHgtPnZwOF9lbmMub2xkX3JlZl9kZWx0 YSkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCByb2NrY2hpcF92cHUyX3ZwOF9lbmNfd3JpdGVf aGVhZGVyKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIHUzMiBxcCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2N0cmxfdnA4X2VuY29k ZV9wYXJhbXMgKnBhcmFtcykKPiArewo+ICsgICAgICAgc3RydWN0IGhhbnRyb19ib29sZW5jICpl ID0gJmN0eC0+dnA4X2VuYy5ib29sZW5jOwo+ICsgICAgICAgc3RydWN0IHZiMl92NGwyX2J1ZmZl ciAqZHN0X2J1ZiA9IGhhbnRyb19nZXRfZHN0X2J1ZihjdHgpOwo+ICsgICAgICAgdm9pZCAqdmFk ZHIgPSB2YjJfcGxhbmVfdmFkZHIoJmRzdF9idWYtPnZiMl9idWYsIDApOwo+ICsKPiArICAgICAg IGN0eC0+dnA4X2VuYy5mcmFtZV90YWcgPSB2YWRkcjsKPiArICAgICAgIG1lbXNldChjdHgtPnZw OF9lbmMuZnJhbWVfdGFnLCAwLCBzaXplb2YoKmN0eC0+dnA4X2VuYy5mcmFtZV90YWcpKTsKPiAr ICAgICAgIGN0eC0+dnA4X2VuYy5mcmFtZV90YWctPnRhZ1swXSB8PSAoMSA8PCAxKTsgICAgIC8q IHZlcnNpb24gMSAqLwo+ICsgICAgICAgaWYgKGN0eC0+dnA4X2VuYy5zaG93X2ZyYW1lKQo+ICsg ICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFnLT50YWdbMF0gfD0gKDEgPDwgNCk7 Cj4gKyAgICAgICAvKiBmaXJzdCBwYXJ0aXRpb24gc2l6ZSBpcyBrbm93biBvbmx5IGFmdGVyIGVu Y29kaW5nICovCj4gKwo+ICsgICAgICAgaWYgKGlzX2ludHJhKGN0eCkpIHsKPiArICAgICAgICAg ICAgICAgY3R4LT52cDhfZW5jLmZyYW1lX3RhZy0+bWFnaWNbMF0gPSAweDlkOwo+ICsgICAgICAg ICAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFnLT5tYWdpY1sxXSA9IDB4MDE7Cj4gKyAgICAg ICAgICAgICAgIGN0eC0+dnA4X2VuYy5mcmFtZV90YWctPm1hZ2ljWzJdID0gMHgyYTsKPiArCj4g KyAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5mcmFtZV90YWctPndpZHRoWzBdID0gY3R4LT5z cmNfZm10LndpZHRoICYgMHhmZjsKPiArICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLmZyYW1l X3RhZy0+d2lkdGhbMV0gPSAoY3R4LT5zcmNfZm10LndpZHRoID4+IDgpICYgMHhmZjsKPiArCj4g KyAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5mcmFtZV90YWctPmhlaWdodFswXSA9IGN0eC0+ c3JjX2ZtdC5oZWlnaHQgJiAweGZmOwo+ICsgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuZnJh bWVfdGFnLT5oZWlnaHRbMV0gPSAoY3R4LT5zcmNfZm10LmhlaWdodCA+PiA4KSAmIDB4ZmY7Cj4g KyAgICAgICB9IGVsc2Ugewo+ICsgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFn LT50YWdbMF0gfD0gMHgxOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIGhhbnRyb19ib29sZW5j X2luaXQoZSwgdmFkZHIgKyBmcmFtZV90YWdfc2l6ZShjdHgpKTsKPiArCj4gKyAgICAgICBpZiAo aXNfaW50cmEoY3R4KSkgewo+ICsgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9s aXQoZSwgcGFyYW1zLT5jb2xvcl9zcGFjZSwgMSk7Cj4gKyAgICAgICAgICAgICAgIGhhbnRyb19i b29sZW5jX3dyaXRlX2xpdChlLCBwYXJhbXMtPmNsYW1waW5nX3R5cGUsIDEpOwo+ICsgICAgICAg fQo+ICsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCAhIShwYXJhbXMtPmZs YWdzICYgVjRMMl9WUDhfRlJBTUVfRkxBR19TRUdNRU5UX0VOQUJMRUQpLCAxKTsKPiArCj4gKyAg ICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgcGFyYW1zLT5sb29wX2ZpbHRlcl90eXBl LCAxKTsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBwYXJhbXMtPmxvb3Bf ZmlsdGVyX2xldmVsLCA2KTsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBw YXJhbXMtPnNoYXJwbmVzc19sZXZlbCwgMyk7Cj4gKyAgICAgICBoYW50cm9fYm9vbGVuY193cml0 ZV9saXQoZSwgISEocGFyYW1zLT5mbGFncyAmIFY0TDJfVlA4X0ZSQU1FX0ZMQUdfTE9PUF9GSUxU RVJfQURKX0VOQUJMRUQpLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwo+ ICsgICAgICAgaWYgKHBhcmFtcy0+ZmxhZ3MgJiBWNEwyX1ZQOF9GUkFNRV9GTEFHX0xPT1BfRklM VEVSX0FESl9FTkFCTEVEKQo+ICsgICAgICAgICAgICAgICByb2NrY2hpcF92cHUyX3ZwOF9lbmNf d3JpdGVfZmlsdGVyX2xldmVsX2RlbHRhKGN0eCk7Cj4gKwo+ICsgICAgICAgaGFudHJvX2Jvb2xl bmNfd3JpdGVfbGl0KGUsIHBhcmFtcy0+bG9nMl9uYnJfb2ZfZGN0X3BhcnRpdGlvbnMsIDIpOwo+ ICsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBxcCwgNyk7Cj4gKwo+ICsg ICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDEpOwo+ICsgICAgICAgaGFudHJv X2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDEpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3Jp dGVfbGl0KGUsIDAsIDEpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAs IDEpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDEpOwo+ICsKPiAr ICAgICAgIGlmICghaXNfaW50cmEoY3R4KSkgewo+ICsgICAgICAgICAgICAgICBoYW50cm9fYm9v bGVuY193cml0ZV9saXQoZSwgMCwgMSk7IC8qIHJlZnJlc2ggZ29sZGVuICovCj4gKyAgICAgICAg ICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCAwLCAxKTsgLyogcmVmcmVzaCBhbHQg Ki8KPiArICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDIpOyAv KiBjb3B5IHRvIGdvbGRlbiAqLwo+ICsgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0 ZV9saXQoZSwgMCwgMik7IC8qIGNvcHkgdG8gYWx0ICovCj4gKyAgICAgICAgICAgICAgIGhhbnRy b19ib29sZW5jX3dyaXRlX2xpdChlLCAwLCAxKTsgLyogc2lnbiBiaWFzIGdvbGRlbiAqLwo+ICsg ICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgMCwgMSk7IC8qIHNpZ24g YmlhcyBhbHQgKi8KPiArICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUs IGN0eC0+dnA4X2VuYy5yZWZyZXNoX2VudHJvcHlfcHJvYnMsIDEpOwo+ICsgICAgICAgICAgICAg ICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgMSwgMSk7Cj4gKyAgICAgICB9IGVsc2Ugewo+ ICsgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgY3R4LT52cDhfZW5j LnJlZnJlc2hfZW50cm9weV9wcm9icywgMSk7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcm9j a2NoaXBfdnB1Ml92cDhfZW5jX3dyaXRlX2NvZWZmX3Byb2IoY3R4KTsKPiArCj4gKyAgICAgICBo YW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgMSwgMSk7Cj4gKyAgICAgICBoYW50cm9fYm9vbGVu Y193cml0ZV9saXQoZSwgY3R4LT52cDhfZW5jLnByb2Jfc2tpcF9mYWxzZSwgOCk7Cj4gKwo+ICsg ICAgICAgaWYgKGlzX2ludHJhKGN0eCkpCj4gKyAgICAgICAgICAgICAgIHJldHVybjsKPiArCj4g KyAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgY3R4LT52cDhfZW5jLnByb2JfaW50 cmEsIDgpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIGN0eC0+dnA4X2Vu Yy5wcm9iX2xhc3QsIDgpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIGN0 eC0+dnA4X2VuYy5wcm9iX2dmLCA4KTsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xp dChlLCAwLCAxKTsgLyogaW50cmEgMTZ4MTYgcHJvYiB1cGRhdGUgZmxhZyAqLwo+ICsgICAgICAg aGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDEpOyAvKiBpbnRyYSBjaHJvbWEgcHJvYiB1 cGRhdGUgZmxhZyAqLwo+ICsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9t dl9wcm9iKGN0eCk7Cj4gK30KPiArCj4gK3N0YXRpYyB1aW50MzJfdCBjYWxjX212cHJvYih1aW50 MzJfdCBsZWZ0LCB1aW50MzJfdCByaWdodCwgdWludDMyX3QgcHJvYikKPiArewo+ICsgICAgICAg dWludDMyX3QgcDsKPiArCj4gKyAgICAgICBpZiAobGVmdCArIHJpZ2h0KSB7Cj4gKyAgICAgICAg ICAgICAgIHAgPSAobGVmdCAqIDI1NSkgLyAobGVmdCArIHJpZ2h0KTsKPiArICAgICAgICAgICAg ICAgcCAmPSAtMjsKPiArICAgICAgICAgICAgICAgaWYgKCFwKQo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHAgPSAxOwo+ICsgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAgICAgcCA9IHBy b2I7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcmV0dXJuIHA7Cj4gK30KPiArCj4gK3N0YXRp YyB1aW50MzJfdCB1cGRhdGVfcHJvYih1aW50MzJfdCBwcm9iLCB1aW50MzJfdCBsZWZ0LCB1aW50 MzJfdCByaWdodCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX3By b2IsIHVpbnQzMl90IG5ld19wcm9iLCB1aW50MzJfdCBmaXhlZCkKPiArewo+ICsgICAgICAgaW50 MzJfdCB1LCBzOwo+ICsKPiArICAgICAgIHUgPSAoaW50MzJfdClmaXhlZCArICgodnA4X3Byb2Jf Y29zdFsyNTUgLSBwcm9iXSAtIHZwOF9wcm9iX2Nvc3RbcHJvYl0pID4+IDgpOwo+ICsgICAgICAg cyA9ICgoaW50MzJfdClsZWZ0ICogKHZwOF9wcm9iX2Nvc3Rbb2xkX3Byb2JdIC0gdnA4X3Byb2Jf Y29zdFtuZXdfcHJvYl0pICsKPiArICAgICAgICAgICAgICAgKGludDMyX3QpcmlnaHQgKgo+ICsg ICAgICAgICAgICAgICAodnA4X3Byb2JfY29zdFsyNTUgLSBvbGRfcHJvYl0gLSB2cDhfcHJvYl9j b3N0WzI1NSAtIG5ld19wcm9iXSkpID4+IDg7Cj4gKwo+ICsgICAgICAgcmV0dXJuIChzID4gdSk7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY191cGRhdGVfZW50 cm9weShzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgaGFudHJv X3ZwOF9lbnRyb3B5ICplbnRyb3B5ID0gJmN0eC0+dnA4X2VuYy5lbnRyb3B5Owo+ICsgICAgICAg dWludDE2X3QgKnBfY250ID0gKHVpbnQxNl90ICopY3R4LT52cDhfZW5jLnByaXZfZHN0LmNwdTsK PiArCj4gKyAgICAgICBpbnQzMl90IGksIGosIGssIGw7Cj4gKwo+ICsgICAgICAgdWludDMyX3Qg cCwgbGVmdCwgcmlnaHQ7Cj4gKyAgICAgICB1aW50MzJfdCBvbGRfcCwgdXBkX3AgPSAwOwo+ICsK PiArICAgICAgIHVpbnQzMl90IHR5cGU7Cj4gKyAgICAgICB1aW50MzJfdCBicmFuY2hfY250WzJd Owo+ICsgICAgICAgdWludDE2X3QgKnBfdG1wID0gTlVMTDsKPiArCj4gKyAgICAgICBpZiAoIWN0 eC0+dnA4X2VuYy5yZWZyZXNoX2VudHJvcHlfcHJvYnMgfHwgaXNfaW50cmEoY3R4KSkgewo+ICsg ICAgICAgICAgICAgICBtZW1jcHkoZW50cm9weS0+Y29lZmZfcHJvYiwgZGVmYXVsdF9wcm9iX2Nv ZWZmLCBzaXplb2YoZGVmYXVsdF9wcm9iX2NvZWZmKSk7Cj4gKyAgICAgICAgICAgICAgIG1lbWNw eShlbnRyb3B5LT5tdl9wcm9iLCBkZWZhdWx0X3Byb2JfbXYsIHNpemVvZihkZWZhdWx0X3Byb2Jf bXYpKTsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBtZW1jcHkoZW50cm9weS0+Y29lZmZfcHJv Yl9vbGQsIGVudHJvcHktPmNvZWZmX3Byb2IsIHNpemVvZihlbnRyb3B5LT5jb2VmZl9wcm9iKSk7 Cj4gKyAgICAgICBpZiAoY3R4LT52cDhfZW5jLmZyYW1lX2NvdW50ZXIgPT0gMCB8fCAhY3R4LT52 cDhfZW5jLmxhc3RfaW50cmEpCj4gKyAgICAgICAgICAgICAgIG1lbWNweShlbnRyb3B5LT5tdl9w cm9iX29sZCwgZW50cm9weS0+bXZfcHJvYiwgc2l6ZW9mKGVudHJvcHktPm12X3Byb2IpKTsKPiAr Cj4gKyAgICAgICBpZiAoIWN0eC0+dnA4X2VuYy5mcmFtZV9jb3VudGVyKQo+ICsgICAgICAgICAg ICAgICByZXR1cm47Cj4gKwo+ICsgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewo+ICsg ICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNzsgaisrKSB7Cj4gKyAgICAgICAgICAgICAg ICAgICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykgewo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW50MzJfdCB0bXAsIGlpOwo+ICsKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHRtcCA9IGkgKiA3ICogMyArIGogKiAzICsgazsKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHRtcCArPSAyICogNCAqIDcgKiAzOwo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgaWkgPSBvZmZzZXRfdGJsW3RtcF07Cj4gKwo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmlnaHQgPSBpaSA+PSAwID8gcF9jbnRbaWldIDogMDsKPiArCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAyOyBsLS07KSB7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9wID0gZW50cm9weS0+Y29l ZmZfcHJvYltpXVtqXVtrXVtsXTsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgb2xkX3AgPSBjb2VmZl91cGRhdGVfcHJvYltpXVtqXVtrXVtsXTsKPiArCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCAtPSA0ICogNyAqIDM7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpID0gb2Zmc2V0X3RibFt0bXBd Owo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaWkgPj0g MCA/IHBfY250W2lpXSA6IDA7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGlmIChsZWZ0ICsgcmlnaHQpIHsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwID0gKChsZWZ0ICogMjU2KSArICgobGVmdCArIHJpZ2h0KSA+PiAx KSkgLwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAobGVmdCArIHJpZ2h0KTsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBpZiAocCA+IDI1NSkKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAyNTU7Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcCA9IG9sZF9wOwo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpZiAodXBkYXRlX3Byb2IodXBkX3AsIGxlZnQsIHJpZ2h0LCBvbGRfcCwgcCwgOCkp Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9w eS0+Y29lZmZfcHJvYltpXVtqXVtrXVtsXSA9IHA7Cj4gKwo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByaWdodCArPSBsZWZ0Owo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfQo+ICsgICAgICAgICAgICAgICAgICAgICAgIH0KPiArICAgICAgICAgICAg ICAgfQo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHBfdG1wID0gcF9jbnQgKyBWUDhfUFJPQl9D T1VOVF9NVl9PRkZTRVQ7Cj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Cj4gKyAg ICAgICAgICAgICAgIGxlZnQgID0gKnBfdG1wKys7Cj4gKyAgICAgICAgICAgICAgIHJpZ2h0ID0g KnBfdG1wKys7Cj4gKwo+ICsgICAgICAgICAgICAgICBwID0gY2FsY19tdnByb2IobGVmdCwgcmln aHQsIGVudHJvcHktPm12X3Byb2Jfb2xkW2ldWzBdKTsKPiArCj4gKyAgICAgICAgICAgICAgIGlm ICh1cGRhdGVfcHJvYihtdl91cGRhdGVfcHJvYltpXVswXSwgbGVmdCwgcmlnaHQsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5tdl9wcm9iX29sZFtpXVswXSwgcCwg NikpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weS0+bXZfcHJvYltpXVswXSA9IHA7 Cj4gKwo+ICsgICAgICAgICAgICAgICByaWdodCArPSBsZWZ0Owo+ICsgICAgICAgICAgICAgICBs ZWZ0ID0gKnBfdG1wKys7Cj4gKyAgICAgICAgICAgICAgIHJpZ2h0IC09IGxlZnQgLSBwX3RtcFsw XTsKPiArCj4gKyAgICAgICAgICAgICAgIHAgPSBjYWxjX212cHJvYihsZWZ0LCByaWdodCwgZW50 cm9weS0+bXZfcHJvYl9vbGRbaV1bMV0pOwo+ICsgICAgICAgICAgICAgICBpZiAodXBkYXRlX3By b2IobXZfdXBkYXRlX3Byb2JbaV1bMV0sIGxlZnQsIHJpZ2h0LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZW50cm9weS0+bXZfcHJvYl9vbGRbaV1bMV0sIHAsIDYpKQo+ICsgICAg ICAgICAgICAgICAgICAgICAgIGVudHJvcHktPm12X3Byb2JbaV1bMV0gPSBwOwo+ICsKPiArICAg ICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgewo+ICsgICAgICAgICAgICAgICAg ICAgICAgIGxlZnQgPSAqcF90bXArKzsKPiArICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9 ICpwX3RtcCsrOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIHAgPSBjYWxjX212cHJvYihsZWZ0 LCByaWdodCwgZW50cm9weS0+bXZfcHJvYl9vbGRbaV1bNCArIGpdKTsKPiArICAgICAgICAgICAg ICAgICAgICAgICBpZiAodXBkYXRlX3Byb2IobXZfdXBkYXRlX3Byb2JbaV1bNCArIGpdLCBsZWZ0 LCByaWdodCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9w eS0+bXZfcHJvYl9vbGRbaV1bNCArIGpdLCBwLCA2KSkKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGVudHJvcHktPm12X3Byb2JbaV1bNCArIGpdID0gcDsKPiArICAgICAgICAgICAg ICAgICAgICAgICBicmFuY2hfY250W2pdID0gbGVmdCArIHJpZ2h0Owo+ICsgICAgICAgICAgICAg ICB9Cj4gKwo+ICsgICAgICAgICAgICAgICBwID0gY2FsY19tdnByb2IoYnJhbmNoX2NudFswXSwg YnJhbmNoX2NudFsxXSwgZW50cm9weS0+bXZfcHJvYl9vbGRbaV1bM10pOwo+ICsgICAgICAgICAg ICAgICBpZiAodXBkYXRlX3Byb2IobXZfdXBkYXRlX3Byb2JbaV1bM10sIGJyYW5jaF9jbnRbMF0s IGJyYW5jaF9jbnRbMV0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5 LT5tdl9wcm9iX29sZFtpXVszXSwgcCwgNikpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgZW50 cm9weS0+bXZfcHJvYltpXVszXSA9IHA7Cj4gKwo+ICsgICAgICAgICAgICAgICB0eXBlID0gYnJh bmNoX2NudFswXSArIGJyYW5jaF9jbnRbMV07Cj4gKwo+ICsgICAgICAgICAgICAgICBmb3IgKGog PSAwOyBqIDwgMjsgaisrKSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9ICpwX3Rt cCsrOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gKnBfdG1wKys7Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgcCA9IGNhbGNfbXZwcm9iKGxlZnQsIHJpZ2h0LCBlbnRyb3B5LT5t dl9wcm9iX29sZFtpXVs3ICsgal0pOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRh dGVfcHJvYihtdl91cGRhdGVfcHJvYltpXVs3ICsgal0sIGxlZnQsIHJpZ2h0LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5tdl9wcm9iX29sZFtpXVs3 ICsgal0sIHAsIDYpKQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weS0+ bXZfcHJvYltpXVs3ICsgal0gPSBwOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaF9j bnRbal0gPSBsZWZ0ICsgcmlnaHQ7Cj4gKyAgICAgICAgICAgICAgIH0KPiArCj4gKyAgICAgICAg ICAgICAgIHAgPSBjYWxjX212cHJvYihicmFuY2hfY250WzBdLCBicmFuY2hfY250WzFdLCBlbnRy b3B5LT5tdl9wcm9iX29sZFtpXVs2XSk7Cj4gKyAgICAgICAgICAgICAgIGlmICh1cGRhdGVfcHJv Yihtdl91cGRhdGVfcHJvYltpXVs2XSwgYnJhbmNoX2NudFswXSwgYnJhbmNoX2NudFsxXSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJvcHktPm12X3Byb2Jfb2xkW2ldWzZd LCBwLCA2KSkKPiArICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5tdl9wcm9iW2ldWzZd ID0gcDsKPiArCj4gKyAgICAgICAgICAgICAgIHAgPSBjYWxjX212cHJvYih0eXBlLCBicmFuY2hf Y250WzBdICsgYnJhbmNoX2NudFsxXSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGVudHJvcHktPm12X3Byb2Jfb2xkW2ldWzJdKTsKPiArICAgICAgICAgICAgICAgaWYgKHVwZGF0 ZV9wcm9iKG12X3VwZGF0ZV9wcm9iW2ldWzJdLCB0eXBlLCBicmFuY2hfY250WzBdICsgYnJhbmNo X2NudFsxXSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJvcHktPm12X3By b2Jfb2xkW2ldWzJdLCBwLCA2KSkKPiArICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5t dl9wcm9iW2ldWzJdID0gcDsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBtZW1jcHkoZW50cm9w eS0+eV9tb2RlX3Byb2IsIHlfbW9kZV9wcm9iLCBzaXplb2YoeV9tb2RlX3Byb2IpKTsKPiArICAg ICAgIG1lbWNweShlbnRyb3B5LT51dl9tb2RlX3Byb2IsIHV2X21vZGVfcHJvYiwgc2l6ZW9mKHV2 X21vZGVfcHJvYikpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGludCBjb2VmZl9wcm9iX2lk eChpbnQgaW5kZXgpCj4gK3sKPiArICAgICAgIHJldHVybiAoaW5kZXggLyA4KSAqIDggKyA3IC0g KGluZGV4ICUgOCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3ZwdTJfdnA4X2Vu Y193cml0ZV9lbnRyb3B5KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gK3sKPiArICAgICAgIHN0 cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgKmVudHJvcHkgPSAmY3R4LT52cDhfZW5jLmVudHJvcHk7 Cj4gKyAgICAgICB1aW50OF90ICplbnRyb3B5X3RhYmxlID0gY3R4LT52cDhfZW5jLnByaXZfc3Jj LmNwdTsKPiArICAgICAgIGludCBpbmRleCwgaSwgaiwgaywgbDsKPiArCj4gKyAgICAgICBtZW1z ZXQoZW50cm9weV90YWJsZSwgMCwgNTYpOwo+ICsgICAgICAgZW50cm9weV90YWJsZVs3XSA9IGN0 eC0+dnA4X2VuYy5wcm9iX3NraXBfZmFsc2U7Cj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzZdID0g Y3R4LT52cDhfZW5jLnByb2JfaW50cmE7Cj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzVdID0gY3R4 LT52cDhfZW5jLnByb2JfbGFzdDsKPiArICAgICAgIGVudHJvcHlfdGFibGVbNF0gPSBjdHgtPnZw OF9lbmMucHJvYl9nZjsKPiArICAgICAgIGVudHJvcHlfdGFibGVbM10gPSAwOyAvKiBzZWdtZW50 X3Byb2JbMF07ICovCj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzJdID0gMDsgLyogc2VnbWVudF9w cm9iWzFdOyAqLwo+ICsgICAgICAgZW50cm9weV90YWJsZVsxXSA9IDA7IC8qIHNlZ21lbnRfcHJv YlsyXTsgKi8KPiArCj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzE1XSA9IGVudHJvcHktPnlfbW9k ZV9wcm9iWzBdOwo+ICsgICAgICAgZW50cm9weV90YWJsZVsxNF0gPSBlbnRyb3B5LT55X21vZGVf cHJvYlsxXTsKPiArICAgICAgIGVudHJvcHlfdGFibGVbMTNdID0gZW50cm9weS0+eV9tb2RlX3By b2JbMl07Cj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzEyXSA9IGVudHJvcHktPnlfbW9kZV9wcm9i WzNdOwo+ICsgICAgICAgZW50cm9weV90YWJsZVsxMV0gPSBlbnRyb3B5LT51dl9tb2RlX3Byb2Jb MF07Cj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzEwXSA9IGVudHJvcHktPnV2X21vZGVfcHJvYlsx XTsKPiArICAgICAgIGVudHJvcHlfdGFibGVbOV0gPSBlbnRyb3B5LT51dl9tb2RlX3Byb2JbMl07 Cj4gKwo+ICsgICAgICAgZW50cm9weV90YWJsZVsyM10gPSBlbnRyb3B5LT5tdl9wcm9iWzFdWzBd Owo+ICsgICAgICAgZW50cm9weV90YWJsZVsyMl0gPSBlbnRyb3B5LT5tdl9wcm9iWzBdWzBdOwo+ ICsgICAgICAgZW50cm9weV90YWJsZVsyMV0gPSBlbnRyb3B5LT5tdl9wcm9iWzFdWzFdOwo+ICsg ICAgICAgZW50cm9weV90YWJsZVsyMF0gPSBlbnRyb3B5LT5tdl9wcm9iWzBdWzFdOwo+ICsgICAg ICAgZW50cm9weV90YWJsZVsxOV0gPSBlbnRyb3B5LT5tdl9wcm9iWzFdWzE3XTsKPiArICAgICAg IGVudHJvcHlfdGFibGVbMThdID0gZW50cm9weS0+bXZfcHJvYlsxXVsxOF07Cj4gKyAgICAgICBl bnRyb3B5X3RhYmxlWzE3XSA9IGVudHJvcHktPm12X3Byb2JbMF1bMTddOwo+ICsgICAgICAgZW50 cm9weV90YWJsZVsxNl0gPSBlbnRyb3B5LT5tdl9wcm9iWzBdWzE4XTsKPiArCj4gKyAgICAgICBm b3IgKGkgPSAwOyBpIDwgODsgKytpKQo+ICsgICAgICAgICAgICAgICBlbnRyb3B5X3RhYmxlWzI0 ICsgNyAtIGldID0gZW50cm9weS0+bXZfcHJvYlsxXVs5ICsgaV07Cj4gKwo+ICsgICAgICAgZm9y IChpID0gMDsgaSA8IDg7ICsraSkKPiArICAgICAgICAgICAgICAgZW50cm9weV90YWJsZVszMiAr IDcgLSBpXSA9IGVudHJvcHktPm12X3Byb2JbMF1bOSArIGldOwo+ICsKPiArICAgICAgIGZvciAo aSA9IDA7IGkgPCA3OyArK2kpCj4gKyAgICAgICAgICAgICAgIGVudHJvcHlfdGFibGVbNDAgKyA3 IC0gaV0gPSBlbnRyb3B5LT5tdl9wcm9iWzFdWzIgKyBpXTsKPiArCj4gKyAgICAgICBmb3IgKGkg PSAwOyBpIDwgNzsgKytpKQo+ICsgICAgICAgICAgICAgICBlbnRyb3B5X3RhYmxlWzQ4ICsgNyAt IGldID0gZW50cm9weS0+bXZfcHJvYlswXVsyICsgaV07Cj4gKwo+ICsgICAgICAgaW5kZXggPSA1 NjsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQo+ICsgICAgICAgICAgICAg ICBmb3IgKGogPSAwOyBqIDwgODsgKytqKQo+ICsgICAgICAgICAgICAgICAgICAgICAgIGZvciAo ayA9IDA7IGsgPCAzOyArK2spIHsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZv ciAobCA9IDA7IGwgPCAzOyArK2wpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGVudHJvcHlfdGFibGVbY29lZmZfcHJvYl9pZHgoaW5kZXgrKyldID0KPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5jb2VmZl9w cm9iW2ldW2pdW2tdW2xdOwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9w eV90YWJsZVtjb2VmZl9wcm9iX2lkeChpbmRleCsrKV0gPSAwOwo+ICsgICAgICAgICAgICAgICAg ICAgICAgIH0KPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQo+ICsgICAgICAg ICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgKytqKQo+ICsgICAgICAgICAgICAgICAgICAgICAg IGZvciAoayA9IDA7IGsgPCAzOyArK2spIHsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGZvciAobCA9IDQ7IGwgPCAxMTsgKytsKQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBlbnRyb3B5X3RhYmxlW2NvZWZmX3Byb2JfaWR4KGluZGV4KyspXSA9Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weS0+ Y29lZmZfcHJvYltpXVtqXVtrXVtsXTsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGVudHJvcHlfdGFibGVbY29lZmZfcHJvYl9pZHgoaW5kZXgrKyldID0KPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weS0+Y29lZmZfcHJvYltpXVtqXVtrXVsz XTsKPiArICAgICAgICAgICAgICAgICAgICAgICB9Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUg c2l6ZV90IHN3X2hkcl9zaXplKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gK3sKPiArICAgICAg IHJldHVybiBjdHgtPnZwOF9lbmMuYm9vbGVuYy5ieXRlc193cml0dGVuICsgZnJhbWVfdGFnX3Np emUoY3R4KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1MzIgZW5jX2luX2ltZ19jdHJsKHN0 cnVjdCBoYW50cm9fY3R4ICpjdHgsIHUzMiBxcCkKPiArewo+ICsgICAgICAgdW5zaWduZWQgaW50 IG92ZXJmaWxsX3IsIG92ZXJmaWxsX2I7Cj4gKwo+ICsgICAgICAgLyoKPiArICAgICAgICAqIFRo ZSBoYXJkd2FyZSBuZWVkcyBvbmx5IHRoZSB2YWx1ZSBmb3IgbHVtYSBwbGFuZSwgYmVjYXVzZQo+ ICsgICAgICAgICogdmFsdWVzIG9mIG90aGVyIHBsYW5lcyBhcmUgY2FsY3VsYXRlZCBpbnRlcm5h bGx5IGJhc2VkIG9uCj4gKyAgICAgICAgKiBmb3JtYXQgc2V0dGluZy4KPiArICAgICAgICAqLwo+ ICsgICAgICAgb3ZlcmZpbGxfciA9IGN0eC0+c3JjX2ZtdC53aWR0aCAtIGN0eC0+ZHN0X2ZtdC53 aWR0aDsKPiArICAgICAgIG92ZXJmaWxsX2IgPSBjdHgtPnNyY19mbXQuaGVpZ2h0IC0gY3R4LT5k c3RfZm10LmhlaWdodDsKPiArCj4gKyAgICAgICByZXR1cm4gVkVQVV9SRUdfU1RSRUFNX1NUQVJU X09GRlNFVCgwKSB8Cj4gKyAgICAgICAgICAgICAgIFZFUFVfUkVHX0lOX0lNR19DVFJMX09WUkZM Ul9ENChvdmVyZmlsbF9yIC8gNCkgfAo+ICsgICAgICAgICAgICAgICBWRVBVX1JFR19JTl9JTUdf Q1RSTF9PVlJGTEIob3ZlcmZpbGxfYikgfAo+ICsgICAgICAgICAgICAgICBWRVBVX1JFR19TS0lQ X01BQ1JPQkxPQ0tfUEVOQUxUWShxcCA+PSAxMDAgPyAoMyAqIHFwIC8gNCkgOiAwKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQKPiArcm9ja2NoaXBfdnB1Ml92cDhfZW5jX3NldF9idWZmZXJzKHN0 cnVjdCBoYW50cm9fZGV2ICp2cHUsIHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIHUzMiBxcCwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY3RybF92cDhfZW5j b2RlX3BhcmFtcyAqcGFyYW1zKQo+ICt7Cj4gKyAgICAgICBjb25zdCB1MzIgc3JjX2FkZHJfcmVn c1tdID0geyBWRVBVX1JFR19BRERSX0lOX1BMQU5FXzAsCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBWRVBVX1JFR19BRERSX0lOX1BMQU5FXzEsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBWRVBVX1JFR19BRERSX0lOX1BMQU5FXzIgfTsKPiAr ICAgICAgIHN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnNyY19idWYsICpkc3RfYnVmOwo+ICsgICAg ICAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnNyY19mbXQgPSAmY3R4LT5zcmNfZm10 Owo+ICsgICAgICAgc2l6ZV90IGx1bWFfc2l6ZTsKPiArICAgICAgIGRtYV9hZGRyX3QgZHN0X2Rt YTsKPiArICAgICAgIHNpemVfdCBkc3Rfc2l6ZTsKPiArICAgICAgIGludCBpLCByZWZfaWR4Owo+ ICsKPiArICAgICAgIHNyY19idWYgPSBoYW50cm9fZ2V0X3NyY19idWYoY3R4KTsKPiArICAgICAg IGRzdF9idWYgPSBoYW50cm9fZ2V0X2RzdF9idWYoY3R4KTsKPiArCj4gKyAgICAgICBsdW1hX3Np emUgPSBoYW50cm9fcm91bmRlZF9sdW1hX3NpemUoY3R4LT5zcmNfZm10LndpZHRoLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c3JjX2ZtdC5oZWln aHQpOwo+ICsKPiArICAgICAgIGRzdF9kbWEgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRk cigmZHN0X2J1Zi0+dmIyX2J1ZiwgMCk7Cj4gKyAgICAgICBkc3Rfc2l6ZSA9IHZiMl9wbGFuZV9z aXplKCZkc3RfYnVmLT52YjJfYnVmLCAwKTsKPiArCj4gKyAgICAgICAvKgo+ICsgICAgICAgICog V2UgYXNzdW1lIGhlcmUgdGhhdCAxLzEwIG9mIHRoZSBidWZmZXIgaXMgZW5vdWdoIGZvciBoZWFk ZXJzLgo+ICsgICAgICAgICogRENUIHBhcnRpdGlvbiB3aWxsIGJlIHBsYWNlZCBpbiByZW1haW5p bmcgOS8xMCBvZiB0aGUgYnVmZmVyLgo+ICsgICAgICAgICovCj4gKyAgICAgICBjdHgtPnZwOF9l bmMuZXN0aW1hdGVkX2hkcl9zaXplID0gcm91bmRfdXAoZHN0X3NpemUgLyAxMCwgOCk7Cj4gKwo+ ICsgICAgICAgLyogRGVzdGluYXRpb24gYnVmZmVyLiAqLwo+ICsgICAgICAgLyoKPiArICAgICAg ICAqIFdlICJhYnVzZWQiIHRoZSBmaXJzdCBwb3J0aW9uIG9mIHRoaXMgMS8xMCBvZiB0aGUgYnVm ZmVyIHdoZW4gZ2VuZXJhdGluZwo+ICsgICAgICAgICogdGhlIGZyYW1lIHRhZyBhbmQgY29tcHJl c3NlZCBoZWFkZXIsIHNvIFRPRE86IHZlcmlmeSB0aGF0IHRoZSAxLzEwIGNhbiBob2xkIGJvdGgg dGhlCj4gKyAgICAgICAgKiBjb21wcmVzc2VkIGhlYWRlciBhbmQgdGhlICJleHRlbmRlZCBoZWFk ZXIiIGdlbmVyYXRlZCBpbiBody4KPiArICAgICAgICAqLwo+ICsgICAgICAgdmVwdV93cml0ZV9y ZWxheGVkKHZwdSwgZHN0X2RtYSArIHJvdW5kX3VwKHN3X2hkcl9zaXplKGN0eCksIDgpLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgIFZFUFVfUkVHX0FERFJfT1VUUFVUX1NUUkVBTSk7Cj4g KyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBkc3RfZG1hICsgY3R4LT52cDhfZW5jLmVz dGltYXRlZF9oZHJfc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICBWRVBVX1JFR19B RERSX1ZQOF9EQ1RfUEFSVCgwKSk7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBk c3Rfc2l6ZSAtIGN0eC0+dnA4X2VuYy5lc3RpbWF0ZWRfaGRyX3NpemUsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgVkVQVV9SRUdfU1RSX0JVRl9MSU1JVCk7Cj4gKwo+ICsgICAgICAgLyog QXV4aWxpYXJ5IGJ1ZmZlcnMuICovCj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBj dHgtPnZwOF9lbmMuY3RybF9idWYuZG1hLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIFZF UFVfUkVHX0FERFJfT1VUUFVUX0NUUkwpOwo+ICsgICAgICAgbWVtc2V0KGN0eC0+dnA4X2VuYy5j dHJsX2J1Zi5jcHUsIDAsIGN0eC0+dnA4X2VuYy5jdHJsX2J1Zi5zaXplKTsKPiArICAgICAgIHZl cHVfd3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+dnA4X2VuYy5tdl9idWYuZG1hLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgIFZFUFVfUkVHX0FERFJfTVZfT1VUKTsKPiArICAgICAgIHZlcHVf d3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+dnA4X2VuYy5wcml2X2RzdC5kbWEsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgVkVQVV9SRUdfQUREUl9WUDhfUFJPQl9DTlQpOwo+ICsgICAgICAg bWVtc2V0KGN0eC0+dnA4X2VuYy5wcml2X2RzdC5jcHUsIDAsIGN0eC0+dnA4X2VuYy5wcml2X2Rz dC5zaXplKTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+dnA4X2VuYy5w cml2X3NyYy5kbWEsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkVQVV9SRUdfQUREUl9D QUJBQ19UQkwpOwo+ICsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9lbnRy b3B5KGN0eCk7Cj4gKwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgY3R4LT52cDhf ZW5jLnByaXZfc3JjLmRtYSArIDE1MSAqIDgsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg VkVQVV9SRUdfQUREUl9WUDhfU0VHX01BUCk7Cj4gKwo+ICsgICAgICAgLyogUmVmZXJlbmNlIGJ1 ZmZlcnMuICovCj4gKyAgICAgICBzd2l0Y2ggKHBhcmFtcy0+cmVmZXJlbmNlX3R5cGUpIHsKPiAr ICAgICAgIGNhc2UgVjRMMl9WUDhfRlJBTUVfUkVGX0xBU1Q6Cj4gKyAgICAgICAgICAgICAgIHJl Zl9pZHggPSBjdHgtPnZwOF9lbmMubGFzdF9yZWY7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ ICsgICAgICAgY2FzZSBWNEwyX1ZQOF9GUkFNRV9SRUZfR09MREVOOgo+ICsgICAgICAgICAgICAg ICByZWZfaWR4ID0gY3R4LT52cDhfZW5jLmdvbGRlbl9yZWY7Cj4gKyAgICAgICAgICAgICAgIGJy ZWFrOwo+ICsgICAgICAgY2FzZSBWNEwyX1ZQOF9GUkFNRV9SRUZfQUxUOgo+ICsgICAgICAgICAg ICAgICByZWZfaWR4ID0gY3R4LT52cDhfZW5jLmFsdF9yZWY7Cj4gKyAgICAgICAgICAgICAgIGJy ZWFrOwo+ICsgICAgICAgfQo+ICsgICAgICAgaWYgKHJlZl9pZHggPCAwKQo+ICsgICAgICAgICAg ICAgICByZWZfaWR4ID0gMDsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+ dnA4X2VuYy5yZWZfZnJhbWVzW3JlZl9pZHhdLmRtYSwgVkVQVV9SRUdfQUREUl9SRUZfTFVNQSk7 Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBjdHgtPnZwOF9lbmMucmVmX2ZyYW1l c1tyZWZfaWR4XS5kbWEgKyBsdW1hX3NpemUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg VkVQVV9SRUdfQUREUl9SRUZfQ0hST01BKTsKPiArCj4gKyAgICAgICAvKiBSZWNvbnN0cnVjdGlv biBidWZmZXJzLiAqLwo+ICsgICAgICAgY3R4LT52cDhfZW5jLnJlY29uc3RydWN0ZWQgPSAgY3R4 LT52cDhfZW5jLmZpcnN0X2ZyZWU7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBj dHgtPnZwOF9lbmMucmVmX2ZyYW1lc1tjdHgtPnZwOF9lbmMucmVjb25zdHJ1Y3RlZF0uZG1hLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUFVfUkVHX0FERFJfUkVDX0xVTUEpOwo+ICsg ICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgY3R4LT52cDhfZW5jLnJlZl9mcmFtZXNbY3R4 LT52cDhfZW5jLnJlY29uc3RydWN0ZWRdLmRtYSArIGx1bWFfc2l6ZSwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICBWRVBVX1JFR19BRERSX1JFQ19DSFJPTUEpOwo+ICsKPiArICAgICAgIC8q IFNvdXJjZSBidWZmZXIuICovCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2ZtdC0+bnVt X3BsYW5lczsgKytpKQo+ICsgICAgICAgICAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmIyX2RtYV9jb250aWdfcGxhbmVf ZG1hX2FkZHIoJnNyY19idWYtPnZiMl9idWYsIGkpICsKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNyY19idWYtPnZiMl9idWYucGxhbmVzW2ldLmRhdGFfb2Zmc2V0LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FkZHJfcmVnc1tpXSk7Cj4gKwo+ ICsgICAgICAgLyogU291cmNlIHBhcmFtZXRlcnMuICovCj4gKyAgICAgICB2ZXB1X3dyaXRlX3Jl bGF4ZWQodnB1LCBlbmNfaW5faW1nX2N0cmwoY3R4LCBxcCksCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgVkVQVV9SRUdfRU5DX09WRVJfRklMTF9TVFJNX09GRlNFVCk7Cj4gK30KPiArCj4g K3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY29tcHV0ZV9maWx0ZXJfbGV2ZWwoaW50MzJfdCBxcCkK PiArewo+ICsgICAgICAgcmV0dXJuIGNsYW1wKChxcCAqIDY0KSAvIDEyOCArIDgsIDAsIDYzKTsK PiArfQo+ICsKPiArc3RhdGljIHMzMiBjb3N0X3RyZWUoc3RydWN0IHRyZWUgKnRyZWUsIGNvbnN0 IHMzMiAqcHJvYikKPiArewo+ICsgICAgICAgczMyIHZhbHVlID0gdHJlZS0+dmFsdWU7Cj4gKyAg ICAgICBzMzIgbnVtYmVyID0gdHJlZS0+bnVtYmVyOwo+ICsgICAgICAgczMyICppbmRleCA9IHRy ZWUtPmluZGV4Owo+ICsgICAgICAgczMyIGJpdF9jb3N0ID0gMDsKPiArCj4gKyAgICAgICB3aGls ZSAobnVtYmVyLS0pCj4gKyAgICAgICAgICAgICAgIGJpdF9jb3N0ICs9IENPU1RfQk9PTChwcm9i WyppbmRleCsrXSwgKHZhbHVlID4+IG51bWJlcikgJiAxKTsKPiArCj4gKyAgICAgICByZXR1cm4g Yml0X2Nvc3Q7Cj4gK30KPiArCj4gK3N0YXRpYyBzMzIgY29zdF9tdihzMzIgbXZkLCBjb25zdCBz MzIgKm12X3Byb2IpCj4gK3sKPiArICAgICAgIHMzMiBpLCB0bXAsIGJpdF9jb3N0ID0gMDsKPiAr Cj4gKyAgICAgICB0bXAgPSBhYnMobXZkID4+IDEpOwo+ICsKPiArICAgICAgIC8qIFNob3J0IFRy ZWUgKi8KPiArICAgICAgIGlmICh0bXAgPCA4KSB7Cj4gKyAgICAgICAgICAgICAgIGJpdF9jb3N0 ICs9IENPU1RfQk9PTChtdl9wcm9iWzBdLCAwKTsKPiArICAgICAgICAgICAgICAgYml0X2Nvc3Qg Kz0gY29zdF90cmVlKCZtdl90cmVlW3RtcF0sIG12X3Byb2IgKyAyKTsKPiArICAgICAgICAgICAg ICAgaWYgKCF0bXApCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdF9jb3N0Owo+ ICsKPiArICAgICAgICAgICAgICAgLyogU2lnbiAqLwo+ICsgICAgICAgICAgICAgICBiaXRfY29z dCArPSBDT1NUX0JPT0wobXZfcHJvYlsxXSwgbXZkIDwgMCk7Cj4gKyAgICAgICAgICAgICAgIHJl dHVybiBiaXRfY29zdDsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICAvKiBMb25nIFRyZWUgKi8K PiArICAgICAgIGJpdF9jb3N0ICs9IENPU1RfQk9PTChtdl9wcm9iWzBdLCAxKTsKPiArCj4gKyAg ICAgICAvKiBCaXRzIDAsIDEsIDIgKi8KPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKysp Cj4gKyAgICAgICAgICAgICAgIGJpdF9jb3N0ICs9IENPU1RfQk9PTChtdl9wcm9iWzkgKyBpXSwg KHRtcCA+PiBpKSAmIDEpOwo+ICsKPiArICAgICAgIC8qIEJpdHMgOSwgOCwgNywgNiwgNSwgNCAq Lwo+ICsgICAgICAgZm9yIChpID0gOTsgaSA+IDM7IGktLSkKPiArICAgICAgICAgICAgICAgYml0 X2Nvc3QgKz0gQ09TVF9CT09MKG12X3Byb2JbOSArIGldLCAodG1wID4+IGkpICYgMSk7Cj4gKwo+ ICsgICAgICAgLyoKPiArICAgICAgICAqIEJpdCAzOiBpZiBBQlMobXZkKSA8IDgsIGl0IGlzIGNv ZGVkIHdpdGggc2hvcnQgdHJlZSwgc28gaWYgaGVyZQo+ICsgICAgICAgICogQUJTKG12ZCkgPD0g MTUsIGJpdCAzIG11c3QgYmUgb25lIChiZWNhdXNlIGhlcmUgd2UgY29kZSB2YWx1ZXMKPiArICAg ICAgICAqIDgsLi4uLDE1KSBhbmQgaXMgbm90IGV4cGxpY2l0bHkgY29kZWQuCj4gKyAgICAgICAg Ki8KPiArICAgICAgIGlmICh0bXAgPiAxNSkKPiArICAgICAgICAgICAgICAgYml0X2Nvc3QgKz0g Q09TVF9CT09MKG12X3Byb2JbOSArIDNdLCAodG1wID4+IDMpICYgMSk7Cj4gKwo+ICsgICAgICAg LyogU2lnbiAqLwo+ICsgICAgICAgYml0X2Nvc3QgKz0gQ09TVF9CT09MKG12X3Byb2JbMV0sIG12 ZCA8IDApOwo+ICsKPiArICAgICAgIHJldHVybiBiaXRfY29zdDsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgcm9ja2NoaXBfdnB1Ml92cDhfZW5jX3NldF9wYXJhbXMoc3RydWN0IGhhbnRyb19kZXYg KnZwdSwgc3RydWN0IGhhbnRyb19jdHggKmN0eCwgdTMyIHFwLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2N0cmxfdnA4X2VuY29kZV9w YXJhbXMgKnBhcmFtcykKPiArewo+ICsgICAgICAgc3RydWN0IGhhbnRyb192cDhfZW50cm9weSAq ZW50cm9weSA9ICZjdHgtPnZwOF9lbmMuZW50cm9weTsKPiArICAgICAgIGludCBpOwo+ICsgICAg ICAgdW5zaWduZWQgaW50IG1iX3dpZHRoID0gTUJfV0lEVEgoY3R4LT5zcmNfZm10LndpZHRoKTsK PiArICAgICAgIHVuc2lnbmVkIGludCBtYl9oZWlnaHQgPSBNQl9IRUlHSFQoY3R4LT5zcmNfZm10 LmhlaWdodCk7Cj4gKyAgICAgICB1MzIgZGVxOwo+ICsgICAgICAgdTMyIHRtcDsKPiArICAgICAg IHUzMiByZWc7Cj4gKyAgICAgICBzMzIgaW50ZXJfZmF2b3I7Cj4gKwo+ICsgICAgICAgcmVnID0g VkVQVV9SRUdfT1VUUFVUX1NXQVAzMgo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX09VVFBV VF9TV0FQMTYKPiArICAgICAgICAgICAgICAgfCBWRVBVX1JFR19PVVRQVVRfU1dBUDgKPiArICAg ICAgICAgICAgICAgfCBWRVBVX1JFR19JTlBVVF9TV0FQOAo+ICsgICAgICAgICAgICAgICB8IFZF UFVfUkVHX0lOUFVUX1NXQVAxNgo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0lOUFVUX1NX QVAzMjsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfREFU QV9FTkRJQU4pOwo+ICsKPiArICAgICAgIHJlZyA9IFZFUFVfUkVHX1NJWkVfVEFCTEVfUFJFU0VO VAo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0lOX0lNR19DVFJMX0ZNVChjdHgtPnZwdV9z cmNfZm10LT5lbmNfZm10KQo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0lOX0lNR19ST1RB VEVfTU9ERSgwKTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9S RUdfRU5DX0NUUkwxKTsKPiArCj4gKyAgICAgICByZWcgPSBWRVBVX1JFR19JTlRFUlJVUFRfVElN RU9VVF9FTgo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX01WX1dSSVRFX0VOOwo+ICsgICAg ICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19JTlRFUlJVUFQpOwo+ICsK PiArICAgICAgIHJlZyA9IFZFUFVfUkVHX0lOX0lNR19DSFJPTUFfT0ZGU0VUKDApCj4gKyAgICAg ICAgICAgICAgIHwgVkVQVV9SRUdfSU5fSU1HX0xVTUFfT0ZGU0VUKDApCj4gKyAgICAgICAgICAg ICAgIHwgVkVQVV9SRUdfSU5fSU1HX0NUUkxfUk9XX0xFTihtYl93aWR0aCAqIDE2KTsKPiArICAg ICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfSU5QVVRfTFVNQV9JTkZP KTsKPiArCj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCAwLCBWRVBVX1JFR19TVFJf SERSX1JFTV9NU0IpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgMCwgVkVQVV9S RUdfU1RSX0hEUl9SRU1fTFNCKTsKPiArCj4gKyAgICAgICByZWcgPSAwOwo+ICsgICAgICAgaWYg KG1iX3dpZHRoICogbWJfaGVpZ2h0ID4gTUFYX01CX0NPVU5UX1RPX0RJU0FCTEVfUVVBUlRFUl9Q SVhFTF9NVikKPiArICAgICAgICAgICAgICAgcmVnID0gVkVQVV9SRUdfRElTQUJMRV9RVUFSVEVS X1BJWEVMX01WOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX0VOVFJPUFlfQ09ESU5HX01PREU7 Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsIFZFUFVfUkVHX0VOQ19DVFJM MCk7Cj4gKwo+ICsgICAgICAgaW50ZXJfZmF2b3IgPSAxMjggLSBjdHgtPnZwOF9lbmMucHJvYl9p bnRyYTsKPiArICAgICAgIGlmIChpbnRlcl9mYXZvciA+PSAwKQo+ICsgICAgICAgICAgICAgICBp bnRlcl9mYXZvciA9IG1heCgwLCAoaW50MzJfdCkocXAgKiAyIC0gNDApKTsKPiArCj4gKyAgICAg ICByZWcgPSBWRVBVX1JFR19JTlRSQTE2WDE2X01PREUocXAgKiAxMDI0IC8gMTI4KQo+ICsgICAg ICAgICAgICAgICB8IFZFUFVfUkVHX0lOVEVSX01PREUoaW50ZXJfZmF2b3IpOwo+ICsgICAgICAg dmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19JTlRSQV9JTlRFUl9NT0RFKTsK PiArCj4gKyAgICAgICByZWcgPSBWRVBVX1JFR18xTVZfUEVOQUxUWSg2MCAvIDIgKiAzMikKPiAr ICAgICAgICAgICAgICAgfCBWRVBVX1JFR19RTVZfUEVOQUxUWSg4KQo+ICsgICAgICAgICAgICAg ICB8IFZFUFVfUkVHXzRNVl9QRU5BTFRZKDY0IC8gMik7Cj4gKyAgICAgICBpZiAobWJfd2lkdGgg KiBtYl9oZWlnaHQgPCBNQVhfTUJfQ09VTlRfVE9fRElTQUJMRV9TUExJVF9NVikKPiArICAgICAg ICAgICAgICAgcmVnIHw9IFZFUFVfUkVHX1NQTElUX01WX01PREVfRU47Cj4gKyAgICAgICB2ZXB1 X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsIFZFUFVfUkVHX01WX1BFTkFMVFkpOwo+ICsKPiArICAg ICAgIHJlZyA9IFZFUFVfUkVHX01WX1BFTkFMVFlfMTZYOF84WDE2KAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIG1pbigxMDIzLCBzcGxpdF9wZW5hbHR5W3FwXSAvIDIpKQo+ICsgICAgICAgICAg ICAgICB8IFZFUFVfUkVHX01WX1BFTkFMVFlfOFg4KAo+ICsgICAgICAgICAgICAgICAgICAgICAg IG1pbigxMDIzLCAoMiAqIHNwbGl0X3BlbmFsdHlbcXBdICsgNDApIC8gNCkpCj4gKyAgICAgICAg ICAgICAgIHwgVkVQVV9SRUdfTVZfUEVOQUxUWV84WDRfNFg4KDB4M2ZmKTsKPiArICAgICAgIC8q IG5vIDh4NCBvciA0eDggYmxvY2sgZGVmaW5lIGluIHZwOCAqLwo+ICsgICAgICAgdmVwdV93cml0 ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19FTkNfQ1RSTDQpOwo+ICsKPiArICAgICAgIHJl ZyA9IFZFUFVfUkVHX1BFTkFMVFlfNFg0TVYobWluKDUxMSwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICg4ICogc3BsaXRfcGVuYWx0eVtxcF0gKyA1MDApIC8gMTYp KQo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX1pFUk9fTVZfRkFWT1JfRDIoMCk7Cj4gKyAg ICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsIFZFUFVfUkVHX01WQ19SRUxBVEUpOwo+ ICsKPiArICAgICAgIC8qIGluaXRpYWxpemUgcXVhbnQgdGFibGUgZm9yIHNlZ21lbnQwICovCj4g KyAgICAgICBkZXEgPSBkY19xX2xvb2t1cFtxcF07Cj4gKyAgICAgICByZWcgPSBWRVBVX1JFR19W UDhfU0VHMF9RVVRfRENfWTEobWluKCgxIDw8IDE2KSAvIGRlcSwgMHgzRkZGdSkpOwo+ICsgICAg ICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9TRUcwX1pCSU5fRENfWTEoKChxemJpbl9mYWN0b3JzW3Fw XSAqIGRlcSkgKyA2NCkgPj4KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDcpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9TRUcwX1JORF9EQ19ZMSgo cXJvdW5kaW5nX2ZhY3RvcnNbcXBdICogZGVxKSA+PiA3KTsKPiArICAgICAgIHZlcHVfd3JpdGVf cmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfVlA4X1NFRzBfUVVBTlRfRENfWTEpOwo+ICsKPiAr ICAgICAgIGRlcSA9IGFjX3FfbG9va3VwW3FwXTsKPiArICAgICAgIHJlZyA9IFZFUFVfUkVHX1ZQ OF9TRUcwX1FVVF9BQ19ZMShtaW4oKDEgPDwgMTYpIC8gZGVxLCAweDNGRkZ1KSk7Cj4gKyAgICAg ICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBfWkJJTl9BQ19ZMSgoKHF6YmluX2ZhY3RvcnNbcXBd ICogZGVxKSArIDY0KSA+Pgo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgNyk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBfUk5EX0FDX1kxKChx cm91bmRpbmdfZmFjdG9yc1txcF0gKiBkZXEpID4+IDcpOwo+ICsgICAgICAgdmVwdV93cml0ZV9y ZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19WUDhfU0VHMF9RVUFOVF9BQ19ZMSk7Cj4gKwo+ICsg ICAgICAgZGVxID0gZGNfcV9sb29rdXBbcXBdICogMjsKPiArICAgICAgIHJlZyA9IFZFUFVfUkVH X1ZQOF9TRUcwX1FVVF9EQ19ZMihtaW4oKDEgPDwgMTYpIC8gZGVxLCAweDNGRkZ1KSk7Cj4gKyAg ICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBfWkJJTl9EQ19ZMigocXpiaW5fZmFjdG9yc1tx cF0gKiBkZXEgKyA2NCkgPj4KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDcpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9TRUcwX1JORF9EQ19ZMigo cXJvdW5kaW5nX2ZhY3RvcnNbcXBdICogZGVxKSA+PiA3KTsKPiArICAgICAgIHZlcHVfd3JpdGVf cmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfVlA4X1NFRzBfUVVBTlRfRENfWTIpOwo+ICsKPiAr ICAgICAgIGRlcSA9IG1heChhY19xX2xvb2t1cFtxcF0gKiAxNTUgLyAxMDAsIDgpOwo+ICsgICAg ICAgcmVnID0gVkVQVV9SRUdfVlA4X1NFRzBfUVVUX0FDX1kyKG1pbigoMSA8PCAxNikgLyBkZXEs IDB4M0ZGRnUpKTsKPiArICAgICAgIHJlZyB8PSBWRVBVX1JFR19WUDhfU0VHMF9aQklOX0FDX1ky KChxemJpbl9mYWN0b3JzW3FwXSAqIGRlcSArIDY0KSA+Pgo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgNyk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4 X1NFRzBfUk5EX0FDX1kyKChxcm91bmRpbmdfZmFjdG9yc1txcF0gKiBkZXEpID4+IDcpOwo+ICsg ICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19WUDhfU0VHMF9RVUFO VF9BQ19ZMik7Cj4gKwo+ICsgICAgICAgZGVxID0gbWluKGRjX3FfbG9va3VwW3FwXSwgMTMyKTsK PiArICAgICAgIHJlZyA9IFZFUFVfUkVHX1ZQOF9TRUcwX1FVVF9EQ19DSFIobWluKCgxIDw8IDE2 KSAvIGRlcSwgMHgzRkZGdSkpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9TRUcwX1pC SU5fRENfQ0hSKChxemJpbl9mYWN0b3JzW3FwXSAqIGRlcSArIDY0KSA+Pgo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcpOwo+ICsgICAgICAgcmVnIHw9IFZF UFVfUkVHX1ZQOF9TRUcwX1JORF9EQ19DSFIoKHFyb3VuZGluZ19mYWN0b3JzW3FwXSAqIGRlcSkg Pj4gNyk7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsIFZFUFVfUkVHX1ZQ OF9TRUcwX1FVQU5UX0RDX0NIUik7Cj4gKwo+ICsgICAgICAgZGVxID0gYWNfcV9sb29rdXBbcXBd Owo+ICsgICAgICAgcmVnID0gVkVQVV9SRUdfVlA4X1NFRzBfUVVUX0FDX0NIUihtaW4oKDEgPDwg MTYpIC8gZGVxLCAweDNGRkZ1KSk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBf WkJJTl9BQ19DSFIoKHF6YmluX2ZhY3RvcnNbcXBdICogZGVxICsgNjQpID4+Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyk7Cj4gKyAgICAgICByZWcgfD0g VkVQVV9SRUdfVlA4X1NFRzBfUk5EX0FDX0NIUigocXJvdW5kaW5nX2ZhY3RvcnNbcXBdICogZGVx KSA+PiA3KTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdf VlA4X1NFRzBfUVVBTlRfQUNfQ0hSKTsKPiArCj4gKyAgICAgICByZWcgPSBWRVBVX1JFR19WUDhf TVZfUkVGX0lEWDEocGFyYW1zLT5yZWZlcmVuY2VfdHlwZSk7Cj4gKyAgICAgICByZWcgfD0gVkVQ VV9SRUdfVlA4X1NFRzBfRFFVVF9EQ19ZMShkY19xX2xvb2t1cFtxcF0pOwo+ICsgICAgICAgcmVn IHw9IFZFUFVfUkVHX1ZQOF9TRUcwX0RRVVRfQUNfWTEoYWNfcV9sb29rdXBbcXBdKTsKPiArICAg ICAgIHJlZyB8PSBWRVBVX1JFR19WUDhfU0VHMF9EUVVUX0RDX1kyKGRjX3FfbG9va3VwW3FwXSAq IDIpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19WUDhf U0VHMF9RVUFOVF9EUVVUKTsKPiArCj4gKyAgICAgICByZWcgPSBWRVBVX1JFR19WUDhfTVZfUkVG X0lEWDIoMCk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBfRFFVVF9EQ19DSFIo bWluKGRjX3FfbG9va3VwW3FwXSwgMTMyKSk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4 X1NFRzBfRFFVVF9BQ19DSFIoYWNfcV9sb29rdXBbcXBdKTsKPiArICAgICAgIHJlZyB8PSBWRVBV X1JFR19WUDhfU0VHMF9EUVVUX0FDX1kyKG1heChhY19xX2xvb2t1cFtxcF0gKiAxNTUgLyAxMDAs IDgpKTsKPiArICAgICAgIGlmIChpc19pbnRyYShjdHgpKQo+ICsgICAgICAgICAgICAgICByZWcg fD0gVkVQVV9SRUdfVlA4X1NFR01FTlRfTUFQX1VQREFURTsKPiArICAgICAgIHZlcHVfd3JpdGVf cmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfVlA4X1NFRzBfUVVBTlRfRFFVVF8xKTsKPiArICAg ICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+dnA4X2VuYy5ib29sZW5jLmJvdHRvbSwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICBWRVBVX1JFR19WUDhfQk9PTF9FTkNfVkFMVUUp Owo+ICsKPiArICAgICAgIHJlZyA9IFZFUFVfUkVHX1ZQOF9EQ1RfUEFSVElUSU9OX0NOVCgwKTsK PiArICAgICAgIHJlZyB8PSBWRVBVX1JFR19WUDhfRklMVEVSX0xFVkVMKGNvbXB1dGVfZmlsdGVy X2xldmVsKHFwKSk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X0ZJTFRFUl9TSEFSUE5F U1MocGFyYW1zLT5zaGFycG5lc3NfbGV2ZWwpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQ OF9aRVJPX01WX1BFTkFMVFlfRk9SX1JFRjIoMCk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdf VlA4X0JPT0xfRU5DX1ZBTFVFX0JJVFMoMjQgLSBjdHgtPnZwOF9lbmMuYm9vbGVuYy5iaXRfY291 bnQpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9CT09MX0VOQ19SQU5HRShjdHgtPnZw OF9lbmMuYm9vbGVuYy5yYW5nZSk7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBy ZWcsIFZFUFVfUkVHX1ZQOF9FTkNfQ1RSTDIpOwo+ICsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVs YXhlZCh2cHUsIDB4ZmZmZmZmZmYsIFZFUFVfUkVHX1JPSTEpOwo+ICsgICAgICAgdmVwdV93cml0 ZV9yZWxheGVkKHZwdSwgMHhmZmZmZmZmZiwgVkVQVV9SRUdfUk9JMik7Cj4gKyAgICAgICB2ZXB1 X3dyaXRlX3JlbGF4ZWQodnB1LCAwLCBWRVBVX1JFR19TVEFCSUxJWkFUSU9OX09VVFBVVCk7Cj4g KyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCAweDk2MmI0Yzg1LCBWRVBVX1JFR19SR0Iy WVVWX0NPTlZFUlNJT05fQ09FRjEpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwg MHg5MDkwMWQ1MCwgVkVQVV9SRUdfUkdCMllVVl9DT05WRVJTSU9OX0NPRUYyKTsKPiArICAgICAg IHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIDB4MDAwMGI2OTQsIFZFUFVfUkVHX1JHQjJZVVZfQ09O VkVSU0lPTl9DT0VGMyk7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCAwLCBWRVBV X1JFR19SR0JfTUFTS19NU0IpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgMCwg VkVQVV9SRUdfQ0lSX0lOVFJBX0NUUkwpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZw dSwgMHhmZmZmZmZmZiwgVkVQVV9SRUdfSU5UUkFfQVJFQV9DVFJMKTsKPiArCj4gKyAgICAgICAv KiBJbnRyYSA0eDQgbW9kZSAqLwo+ICsgICAgICAgdG1wID0gcXAgKiAyICsgODsKPiArICAgICAg IGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKPiArICAgICAgICAgICAgICAgcmVnID0gVkVQVV9S RUdfVlA4X0lOVFJBXzRYNF9QRU5BTFRZXzAKPiArICAgICAgICAgICAgICAgICAgICAgICAoKGlu dHJhXzRfdHJlZV9wZW5hbHR5W2kgKiAyXSAqIHRtcCkgPj4gOCk7Cj4gKyAgICAgICAgICAgICAg IHJlZyB8PSBWRVBVX1JFR19WUDhfSU5UUkFfNHg0X1BFTkFMVFlfMQo+ICsgICAgICAgICAgICAg ICAgICAgICAgICgoaW50cmFfNF90cmVlX3BlbmFsdHlbaSAqIDIgKyAxXSAqIHRtcCkgPj4gOCk7 Cj4gKyAgICAgICAgICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUFVfUkVHX1ZQOF9JTlRSQV80WDRfUEVOQUxU WShpKSk7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgLyogSW50cmEgMTZ4MTYgbW9kZSAqLwo+ ICsgICAgICAgdG1wID0gcXAgKiAyICsgNjQ7Cj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsg aSsrKSB7Cj4gKyAgICAgICAgICAgICAgIHJlZyA9IFZFUFVfUkVHX1ZQOF9JTlRSQV8xNlgxNl9Q RU5BTFRZXzAKPiArICAgICAgICAgICAgICAgICAgICAgICAoKGludHJhXzE2X3RyZWVfcGVuYWx0 eVsyICogaV0gKiB0bXApID4+IDgpOwo+ICsgICAgICAgICAgICAgICByZWcgfD0gVkVQVV9SRUdf VlA4X0lOVFJBXzE2WDE2X1BFTkFMVFlfMQo+ICsgICAgICAgICAgICAgICAgICAgICAgICgoaW50 cmFfMTZfdHJlZV9wZW5hbHR5WzIgKiBpICsgMV0gKiB0bXApID4+IDgpOwo+ICsgICAgICAgICAg ICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBWRVBVX1JFR19WUDhfSU5UUkFfMTZYMTZfUEVOQUxUWShpKSk7Cj4gKyAg ICAgICB9Cj4gKwo+ICsgICAgICAgcmVnID0gVkVQVV9SRUdfVlA4X0xGX1JFRl9ERUxUQV9JTlRS QV9NQihjdHgtPnZwOF9lbmMucmVmX2RlbHRhW1JFRl9ERUxUQV9JTlRSQV9NQl0pOwo+ICsgICAg ICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9MRl9NT0RFX0RFTFRBX0JQUkVEKGN0eC0+dnA4X2VuYy5t b2RlX2RlbHRhW01PREVfREVMVEFfQlBSRURdKTsKPiArICAgICAgIHJlZyB8PSBWRVBVX1JFR19W UDhfSU5URVJfVFlQRV9CSVRfQ09TVCgwKTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2 cHUsIHJlZywgVkVQVV9SRUdfVlA4X0NPTlRST0wpOwo+ICsKPiArICAgICAgIHJlZyA9IFZFUFVf UkVHX1ZQOF9MRl9SRUZfREVMVEFfQUxUX1JFRihjdHgtPnZwOF9lbmMucmVmX2RlbHRhW1JFRl9E RUxUQV9BTFRfUkVGXSkKPiArICAgICAgICAgICAgICAgfCBWRVBVX1JFR19WUDhfTEZfUkVGX0RF TFRBX0xBU1RfUkVGKGN0eC0+dnA4X2VuYy5yZWZfZGVsdGFbUkVGX0RFTFRBX0xBU1RfUkVGXSkK PiArICAgICAgICAgICAgICAgfCBWRVBVX1JFR19WUDhfTEZfUkVGX0RFTFRBX0dPTERFTihjdHgt PnZwOF9lbmMucmVmX2RlbHRhW1JFRl9ERUxUQV9HT0xERU5dKTsKPiArICAgICAgIHZlcHVfd3Jp dGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfVlA4X0xPT1BfRklMVEVSX1JFRl9ERUxUQSk7 Cj4gKwo+ICsgICAgICAgcmVnID0gVkVQVV9SRUdfVlA4X0xGX01PREVfREVMVEFfU1BMSVRNVihj dHgtPnZwOF9lbmMubW9kZV9kZWx0YVtNT0RFX0RFTFRBX1NQTElUTVZdKQo+ICsgICAgICAgICAg ICAgICB8IFZFUFVfUkVHX1ZQOF9MRl9NT0RFX0RFTFRBX1pFUk9NVihjdHgtPnZwOF9lbmMubW9k ZV9kZWx0YVtNT0RFX0RFTFRBX1pFUk9NVl0pCj4gKyAgICAgICAgICAgICAgIHwgVkVQVV9SRUdf VlA4X0xGX01PREVfREVMVEFfTkVXTVYoY3R4LT52cDhfZW5jLm1vZGVfZGVsdGFbTU9ERV9ERUxU QV9ORVdNVl0pOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JF R19WUDhfTE9PUF9GSUxURVJfTU9ERV9ERUxUQSk7Cj4gKwo+ICsgICAgICAgZm9yIChpID0gMDsg aSA8IDEyODsgaSArPSA0KSB7Cj4gKyAgICAgICAgICAgICAgIHUzMiB4Owo+ICsgICAgICAgICAg ICAgICB1MzIgeTsKPiArCj4gKyAgICAgICAgICAgICAgIHJlZyA9IFZFUFVfUkVHX0RNVl9QRU5B TFRZX1RBQkxFX0JJVChpICogMiwgMyk7Cj4gKyAgICAgICAgICAgICAgIHJlZyB8PSBWRVBVX1JF R19ETVZfUEVOQUxUWV9UQUJMRV9CSVQoKGkgKyAxKSAqIDIsIDIpOwo+ICsgICAgICAgICAgICAg ICByZWcgfD0gVkVQVV9SRUdfRE1WX1BFTkFMVFlfVEFCTEVfQklUKChpICsgMikgKiAyLCAxKTsK PiArICAgICAgICAgICAgICAgcmVnIHw9IFZFUFVfUkVHX0RNVl9QRU5BTFRZX1RBQkxFX0JJVCgo aSArIDMpICogMiwgMCk7Cj4gKyAgICAgICAgICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUs IHJlZywgVkVQVV9SRUdfRE1WX1BFTkFMVFlfVEJMKGkgLyA0KSk7Cj4gKwo+ICsgICAgICAgICAg ICAgICB5ID0gY29zdF9tdihpICogMiwgZW50cm9weS0+bXZfcHJvYlswXSk7ICAgICAgICAvKiBt diB5ICovCj4gKyAgICAgICAgICAgICAgIHggPSBjb3N0X212KGkgKiAyLCBlbnRyb3B5LT5tdl9w cm9iWzFdKTsgICAgICAgIC8qIG12IHggKi8KPiArCj4gKyAgICAgICAgICAgICAgIHJlZyA9IFZF UFVfUkVHX0RNVl9RX1BJWEVMX1BFTkFMVFlfVEFCTEVfQklUKAo+ICsgICAgICAgICAgICAgICAg ICAgICAgIG1pbigyNTV1LCAoeSArIHggKyAxKSAvIDIgKiB3ZWlnaHRbcXBdID4+IDgpLCAzKTsK PiArCj4gKyAgICAgICAgICAgICAgIHkgPSBjb3N0X212KChpICsgMSkgKiAyLCBlbnRyb3B5LT5t dl9wcm9iWzBdKTsgLyogbXYgeSAqLwo+ICsgICAgICAgICAgICAgICB4ID0gY29zdF9tdigoaSAr IDEpICogMiwgZW50cm9weS0+bXZfcHJvYlsxXSk7IC8qIG12IHggKi8KPiArICAgICAgICAgICAg ICAgcmVnIHw9IFZFUFVfUkVHX0RNVl9RX1BJWEVMX1BFTkFMVFlfVEFCTEVfQklUKAo+ICsgICAg ICAgICAgICAgICAgICAgICAgIG1pbigyNTV1LCAoeSArIHggKyAxKSAvIDIgKiB3ZWlnaHRbcXBd ID4+IDgpLCAyKTsKPiArCj4gKyAgICAgICAgICAgICAgIHkgPSBjb3N0X212KChpICsgMikgKiAy LCBlbnRyb3B5LT5tdl9wcm9iWzBdKTsgLyogbXYgeSAqLwo+ICsgICAgICAgICAgICAgICB4ID0g Y29zdF9tdigoaSArIDIpICogMiwgZW50cm9weS0+bXZfcHJvYlsxXSk7IC8qIG12IHggKi8KPiAr ICAgICAgICAgICAgICAgcmVnIHw9IFZFUFVfUkVHX0RNVl9RX1BJWEVMX1BFTkFMVFlfVEFCTEVf QklUKAo+ICsgICAgICAgICAgICAgICAgICAgICAgIG1pbigyNTV1LCAoeSArIHggKyAxKSAvIDIg KiB3ZWlnaHRbcXBdID4+IDgpLCAxKTsKPiArCj4gKyAgICAgICAgICAgICAgIHkgPSBjb3N0X212 KChpICsgMykgKiAyLCBlbnRyb3B5LT5tdl9wcm9iWzBdKTsgLyogbXYgeSAqLwo+ICsgICAgICAg ICAgICAgICB4ID0gY29zdF9tdigoaSArIDMpICogMiwgZW50cm9weS0+bXZfcHJvYlsxXSk7IC8q IG12IHggKi8KPiArICAgICAgICAgICAgICAgcmVnIHw9IFZFUFVfUkVHX0RNVl9RX1BJWEVMX1BF TkFMVFlfVEFCTEVfQklUKAo+ICsgICAgICAgICAgICAgICAgICAgICAgIG1pbigyNTV1LCAoeSAr IHggKyAxKSAvIDIgKiB3ZWlnaHRbcXBdID4+IDgpLCAwKTsKPiArCj4gKyAgICAgICAgICAgICAg IHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFZFUFVfUkVHX0RNVl9RX1BJWEVMX1BFTkFMVFlfVEJMKGkgLyA0KSk7Cj4gKyAg ICAgICB9Cj4gK30KPiArCj4gK2ludCByb2NrY2hpcF92cHUyX3ZwOF9lbmNfcnVuKHN0cnVjdCBo YW50cm9fY3R4ICpjdHgpCj4gK3sKPiArICAgICAgIHN0cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBj dHgtPmRldjsKPiArICAgICAgIHN0cnVjdCB2NGwyX2N0cmxfdnA4X2VuY29kZV9wYXJhbXMgKnBh cmFtczsKPiArICAgICAgIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmw7Cj4gKyAgICAgICB1MzIgcmVn LCBxcDsKPiArICAgICAgIGludCBpOwo+ICsKPiArICAgICAgIGhhbnRyb19zdGFydF9wcmVwYXJl X3J1bihjdHgpOwo+ICsKPiArICAgICAgIHBhcmFtcyA9IGhhbnRyb19nZXRfY3RybChjdHgsIFY0 TDJfQ0lEX1NUQVRFTEVTU19WUDhfRU5DT0RFX1BBUkFNUyk7Cj4gKyAgICAgICBpZiAoV0FSTl9P TighcGFyYW1zKSkKPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsgICAg ICAgaWYgKHBhcmFtcy0+ZmxhZ3MgJiBWNEwyX1ZQOF9GUkFNRV9GTEFHX1NFR01FTlRfRU5BQkxF RCkKPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsgICAgICAgY3R4LT52 cDhfZW5jLmlzX2ludHJhID0gcGFyYW1zLT5mcmFtZV90eXBlID09IFY0TDJfVlA4X0ZSQU1FX1RZ UEVfS0VZRlJBTUU7Cj4gKwo+ICsgICAgICAgaWYgKGlzX2ludHJhKGN0eCkpIHsKPiArICAgICAg ICAgICAgICAgaWYgKHBhcmFtcy0+bG9vcF9maWx0ZXJfbGV2ZWwgIT0gMjYpCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gKyAgICAgICB9IGVsc2Ugewo+ICsgICAg ICAgICAgICAgICBpZiAocGFyYW1zLT5sb29wX2ZpbHRlcl9sZXZlbCAhPSAxMikKPiArICAgICAg ICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiArICAgICAgIH0KPiArCj4gKyAgICAg ICBjdHJsID0gdjRsMl9jdHJsX2ZpbmQoJmN0eC0+Y3RybF9oYW5kbGVyLCBWNEwyX0NJRF9TVEFU RUxFU1NfVlA4X0VOQ09ERV9RUCk7Cj4gKyAgICAgICBpZiAoV0FSTl9PTighY3RybCkpCj4gKyAg ICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ICsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5z aG93X2ZyYW1lID0gcGFyYW1zLT5mbGFncyAmIFY0TDJfVlA4X0ZSQU1FX0ZMQUdfU0hPV0ZSQU1F Owo+ICsgICAgICAgY3R4LT52cDhfZW5jLnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gcGFyYW1zLT5m bGFncyAmIFY0TDJfVlA4X0ZSQU1FX0ZMQUdfR09MREVOX1JFRlJFU0g7Cj4gKyAgICAgICBjdHgt PnZwOF9lbmMucmVmcmVzaF9hbHRlcm5hdGVfZnJhbWUgPSBwYXJhbXMtPmZsYWdzICYgVjRMMl9W UDhfRlJBTUVfRkxBR19BTFRSRUZfUkVGUkVTSDsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5yZWZy ZXNoX2VudHJvcHlfcHJvYnMgPQo+ICsgICAgICAgICAgICAgICBwYXJhbXMtPmZsYWdzICYgVjRM Ml9WUDhfRlJBTUVfRkxBR19SRUZSRVNIX0VOVFJPUFlfUFJPQlM7Cj4gKyAgICAgICBjdHgtPnZw OF9lbmMuY29weV9idWZmZXJfdG9fZ29sZGVuID0gcGFyYW1zLT5jb3B5X2J1ZmZlcl90b19nb2xk ZW47Cj4gKyAgICAgICBjdHgtPnZwOF9lbmMuY29weV9idWZmZXJfdG9fYWx0ZXJuYXRlID0gcGFy YW1zLT5jb3B5X2J1ZmZlcl90b19hbHRlcm5hdGU7Cj4gKyAgICAgICBjdHgtPnZwOF9lbmMucHJv Yl9pbnRyYSA9IHBhcmFtcy0+cHJvYl9pbnRyYTsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5wcm9i X2xhc3QgPSBwYXJhbXMtPnByb2JfbGFzdDsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5wcm9iX2dm ID0gcGFyYW1zLT5wcm9iX2dmOwo+ICsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY191 cGRhdGVfZW50cm9weShjdHgpOwo+ICsKPiArICAgICAgIHFwID0gKmN0cmwtPnBfY3VyLnBfczMy Owo+ICsgICAgICAgY3R4LT52cDhfZW5jLnByb2Jfc2tpcF9mYWxzZSA9IGRlZmF1bHRfcHJvYl9z a2lwX2ZhbHNlW3FwXTsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9oZWFk ZXIoY3R4LCBxcCwgcGFyYW1zKTsKPiArCj4gKyAgICAgICAvKgo+ICsgICAgICAgICogUHJvZ3Jh bSB0aGUgaGFyZHdhcmUuCj4gKyAgICAgICAgKi8KPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhl ZCh2cHUsIFZFUFVfUkVHX0VOQ09ERV9GT1JNQVRfVlA4LCBWRVBVX1JFR19FTkNPREVfU1RBUlQp Owo+ICsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY19zZXRfcGFyYW1zKHZwdSwgY3R4 LCBxcCwgcGFyYW1zKTsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY19zZXRfYnVmZmVy cyh2cHUsIGN0eCwgcXAsIHBhcmFtcyk7Cj4gKwo+ICsgICAgICAgcmVnID0gVkVQVV9SRUdfQVhJ X0NUUkxfUkVBRF9JRCgwKQo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0FYSV9DVFJMX1dS SVRFX0lEKDApCj4gKyAgICAgICAgICAgICAgIHwgVkVQVV9SRUdfQVhJX0NUUkxfQlVSU1RfTEVO KDE2KQo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0FYSV9DVFJMX0lOQ1JFTUVOVF9NT0RF KDApCj4gKyAgICAgICAgICAgICAgIHwgVkVQVV9SRUdfQVhJX0NUUkxfQklSU1RfRElTQ0FSRCgw KTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfQVhJX0NU UkwpOwo+ICsKPiArICAgICAgIC8qIFN0YXJ0IHRoZSBoYXJkd2FyZS4gKi8KPiArICAgICAgIHJl ZyA9IFZFUFVfUkVHX01CX0hFSUdIVChNQl9IRUlHSFQoY3R4LT5zcmNfZm10LmhlaWdodCkpCj4g KyAgICAgICAgICAgICAgIHwgVkVQVV9SRUdfTUJfV0lEVEgoTUJfV0lEVEgoY3R4LT5zcmNfZm10 LndpZHRoKSkKPiArICAgICAgICAgICAgICAgfCBWRVBVX1JFR19FTkNPREVfRk9STUFUX1ZQOAo+ ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0VOQ09ERV9FTkFCTEU7Cj4gKwo+ICsgICAgICAg aWYgKGlzX2ludHJhKGN0eCkpCj4gKyAgICAgICAgICAgICAgIHJlZyB8PSBWRVBVX1JFR19GUkFN RV9UWVBFX0lOVFJBOwo+ICsgICAgICAgZWxzZQo+ICsgICAgICAgICAgICAgICByZWcgfD0gVkVQ VV9SRUdfRlJBTUVfVFlQRV9JTlRFUjsKPiArCj4gKyAgICAgICAvKiBLaWNrIHRoZSB3YXRjaGRv ZyBhbmQgc3RhcnQgZW5jb2RpbmcgKi8KPiArICAgICAgIGhhbnRyb19lbmRfcHJlcGFyZV9ydW4o Y3R4KTsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTg0OyArK2kpCj4gKyAgICAgICAg ICAgICAgIHZlcHVfcmVhZCh2cHUsIGkgKiA0KTsKPiArCj4gKyAgICAgICB2ZXB1X3dyaXRlKHZw dSwgcmVnLCBWRVBVX1JFR19FTkNPREVfU1RBUlQpOwo+ICsKPiArICAgICAgIHJldHVybiAwOwo+ ICt9Cj4gKwo+ICt2b2lkIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY19kb25lKHN0cnVjdCBoYW50cm9f Y3R4ICpjdHgpCj4gK3sKPiArICAgICAgIHN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKmRzdF9idWY7 Cj4gKyAgICAgICBzdHJ1Y3QgaGFudHJvX3ZwOF9lbmNfY3RybF9idWYgKmN0cmxfYnVmID0gY3R4 LT52cDhfZW5jLmN0cmxfYnVmLmNwdTsKPiArICAgICAgIGludCBwYXJ0MV9zeiA9IGN0eC0+dnA4 X2VuYy5ib29sZW5jLmJ5dGVzX3dyaXR0ZW4gKyBjdHJsX2J1Zi0+aHdfaGRyX3NpemU7Cj4gKyAg ICAgICB2b2lkICpkc3QgPSBjdHgtPnZwOF9lbmMuZnJhbWVfdGFnOwo+ICsgICAgICAgaW50IG9s ZF9nID0gY3R4LT52cDhfZW5jLmdvbGRlbl9yZWYsIG9sZF9hID0gY3R4LT52cDhfZW5jLmFsdF9y ZWY7Cj4gKyAgICAgICBpbnQgaTsKPiArCj4gKyAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFn LT50YWdbMF0gfD0gKChwYXJ0MV9zeiA8PCA1KSAmIDB4ZmYpOwo+ICsgICAgICAgY3R4LT52cDhf ZW5jLmZyYW1lX3RhZy0+dGFnWzFdID0gKChwYXJ0MV9zeiA8PCA1KSA+PiA4KSAmIDB4ZmY7Cj4g KyAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFnLT50YWdbMl0gPSAoKHBhcnQxX3N6IDw8IDUp ID4+IDE2KSAmIDB4ZmY7Cj4gKwo+ICsgICAgICAgZHN0X2J1ZiA9IGhhbnRyb19nZXRfZHN0X2J1 ZihjdHgpOwo+ICsKPiArICAgICAgIC8qIGFzc2VtYmxlIGRzdCBmcmFtZSAqLwo+ICsgICAgICAg dmIyX3NldF9wbGFuZV9wYXlsb2FkKCZkc3RfYnVmLT52YjJfYnVmLCAwLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN3X2hkcl9zaXplKGN0eCkgKyBjdHJsX2J1Zi0+aHdfaGRyX3Np emUgKyBjdHJsX2J1Zi0+ZGN0X3NpemUpOwo+ICsKPiArICAgICAgIG1lbW1vdmUoZHN0ICsgc3df aGRyX3NpemUoY3R4KSwgZHN0ICsgcm91bmRfdXAoc3dfaGRyX3NpemUoY3R4KSwgOCksIGN0cmxf YnVmLT5od19oZHJfc2l6ZSk7Cj4gKyAgICAgICBtZW1tb3ZlKGRzdCArIHN3X2hkcl9zaXplKGN0 eCkgKyBjdHJsX2J1Zi0+aHdfaGRyX3NpemUsCj4gKyAgICAgICAgICAgICAgIGRzdCArIGN0eC0+ dnA4X2VuYy5lc3RpbWF0ZWRfaGRyX3NpemUsIGN0cmxfYnVmLT5kY3Rfc2l6ZSk7Cj4gKwo+ICsg ICAgICAgLyogY3VycmVudGx5IHJlY29uc3RydWN0ZWQgZnJhbWUgYmVjYW1lcyBsYXN0IHJlZiAq Lwo+ICsgICAgICAgaGFudHJvX3ZwOF9jbHJfYml0KCZjdHgtPnZwOF9lbmMsIFZQOF9CSVRfTEFT VCwgY3R4LT52cDhfZW5jLmxhc3RfcmVmKTsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5sYXN0X3Jl ZiA9IGN0eC0+dnA4X2VuYy5yZWNvbnN0cnVjdGVkOwo+ICsgICAgICAgaGFudHJvX3ZwOF9zZXRf Yml0KCZjdHgtPnZwOF9lbmMsIFZQOF9CSVRfTEFTVCwgY3R4LT52cDhfZW5jLmxhc3RfcmVmKTsK PiArCj4gKyAgICAgICAvKiBhZnRlciB1cGRhdGUgKHBvdGVudGlhbGx5KSBuZXcgc2xvdHMgd2ls bCBiZSB1c2VkICovCj4gKyAgICAgICBoYW50cm9fdnA4X2Nscl9iaXQoJmN0eC0+dnA4X2VuYywg VlA4X0JJVF9HT0xERU4sIG9sZF9nKTsKPiArICAgICAgIGhhbnRyb192cDhfY2xyX2JpdCgmY3R4 LT52cDhfZW5jLCBWUDhfQklUX0FMVCwgb2xkX2EpOwo+ICsKPiArICAgICAgIC8qIFZQOCBzcGVj LCBzZWN0aW9uIDkuNy4gUmVmcmVzaCBHb2xkZW4gRnJhbWUgYW5kIEFsdHJlZiBGcmFtZSAqLwo+ ICsgICAgICAgaWYgKGlzX2ludHJhKGN0eCkpIHsKPiArICAgICAgICAgICAgICAgY3R4LT52cDhf ZW5jLmdvbGRlbl9yZWYgPSBjdHgtPnZwOF9lbmMubGFzdF9yZWY7Cj4gKyAgICAgICAgICAgICAg IGN0eC0+dnA4X2VuYy5hbHRfcmVmID0gY3R4LT52cDhfZW5jLmxhc3RfcmVmOwo+ICsgICAgICAg fSBlbHNlIHsKPiArICAgICAgICAgICAgICAgaWYgKGN0eC0+dnA4X2VuYy5yZWZyZXNoX2dvbGRl bl9mcmFtZSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5nb2xkZW5f cmVmID0gY3R4LT52cDhfZW5jLmxhc3RfcmVmOwo+ICsgICAgICAgICAgICAgICB9IGVsc2UgaWYg KGN0eC0+dnA4X2VuYy5jb3B5X2J1ZmZlcl90b19nb2xkZW4pIHsKPiArICAgICAgICAgICAgICAg ICAgICAgICBzd2l0Y2ggKGN0eC0+dnA4X2VuYy5jb3B5X2J1ZmZlcl90b19nb2xkZW4pIHsKPiAr ICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfVlA4X0ZSQU1FX0dPTERFTl9LRUVQOgo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICAgICAgICAg ICAgICAgICAgY2FzZSBWNEwyX1ZQOF9GUkFNRV9HT0xERU5fTEFTVEZSQU1FOgo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLmdvbGRlbl9yZWYgPSBjdHgtPnZw OF9lbmMubGFzdF9yZWY7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK PiArICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfVlA4X0ZSQU1FX0dPTERFTl9BTFRS RUY6Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuZ29sZGVu X3JlZiA9IG9sZF9hOwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgfQo+ICsgICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAg ICAgICAgICAgICBpZiAoY3R4LT52cDhfZW5jLnJlZnJlc2hfYWx0ZXJuYXRlX2ZyYW1lKSB7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLmFsdF9yZWYgPSBjdHgtPnZwOF9l bmMubGFzdF9yZWY7Cj4gKyAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4LT52cDhfZW5jLmNv cHlfYnVmZmVyX3RvX2FsdGVybmF0ZSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHN3aXRj aCAoY3R4LT52cDhfZW5jLmNvcHlfYnVmZmVyX3RvX2FsdGVybmF0ZSkgewo+ICsgICAgICAgICAg ICAgICAgICAgICAgIGNhc2UgVjRMMl9WUDhfRlJBTUVfQUxUUkVGX0tFRVA6Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgICAgICAgICAgICAgICAgICBj YXNlIFY0TDJfVlA4X0ZSQU1FX0FMVFJFRl9MQVNURlJBTUU6Cj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuYWx0X3JlZiA9IGN0eC0+dnA4X2VuYy5sYXN0X3Jl ZjsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgICAg ICAgICAgICAgICAgIGNhc2UgVjRMMl9WUDhfRlJBTUVfQUxUUkVGX0dPTERFTjoKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5hbHRfcmVmID0gb2xkX2c7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgICAgICAgICAg ICAgICAgICB9Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAgICAgIH0KPiArCj4gKyAgICAgICAv KiBtYXJrIHVwZGF0ZWQgZ29sZGVuIGFuZCBhbHQgc2xvdHMgdXNlZCAqLwo+ICsgICAgICAgaGFu dHJvX3ZwOF9zZXRfYml0KCZjdHgtPnZwOF9lbmMsIFZQOF9CSVRfR09MREVOLCBjdHgtPnZwOF9l bmMuZ29sZGVuX3JlZik7Cj4gKyAgICAgICBoYW50cm9fdnA4X3NldF9iaXQoJmN0eC0+dnA4X2Vu YywgVlA4X0JJVF9BTFQsIGN0eC0+dnA4X2VuYy5hbHRfcmVmKTsKPiArCj4gKyAgICAgICAvKiBm aW5kIGZpcnN0IGZyZWUgc2xvdCBhZnRlciB1cGRhdGVzICovCj4gKyAgICAgICBmb3IgKGkgPSAw OyBpIDwgQVJSQVlfU0laRShjdHgtPnZwOF9lbmMucmVmX2JpdG1hcHMpOyArK2kpCj4gKyAgICAg ICAgICAgICAgIGlmICghY3R4LT52cDhfZW5jLnJlZl9iaXRtYXBzW2ldKSB7Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLmZpcnN0X2ZyZWUgPSBpOwo+ICsgICAgICAgICAg ICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgICAgICAgICB9Cj4gKyAgICAgICBXQVJOX09O KGkgPj0gNCk7Cj4gKwo+ICsgICAgICAgY3R4LT52cDhfZW5jLmxhc3RfaW50cmEgPSBpc19pbnRy YShjdHgpOwo+ICsgICAgICAgKytjdHgtPnZwOF9lbmMuZnJhbWVfY291bnRlcjsKPiArfQo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tjaGlwX3Zw dTJfcmVncy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9yb2NrY2hpcF92 cHUyX3JlZ3MuaAo+IGluZGV4IDQ5ZTQwODg5NTQ1Yi4uYjY4ODgyOTY1NzcwIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1Ml9yZWdz LmgKPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tjaGlwX3Zw dTJfcmVncy5oCj4gQEAgLTI1OCw2ICsyNTgsNyBAQAo+ICAjZGVmaW5lICAgICBWRVBVX1JFR19G UkFNRV9UWVBFX0lOVEVSICAgICAgICAgICAgICAgICAgKDB4MCA8PCA2KQo+ICAjZGVmaW5lICAg ICBWRVBVX1JFR19GUkFNRV9UWVBFX0lOVFJBICAgICAgICAgICAgICAgICAgKDB4MSA8PCA2KQo+ ICAjZGVmaW5lICAgICBWRVBVX1JFR19GUkFNRV9UWVBFX01WQ0lOVEVSICAgICAgICAgICAgICAg KDB4MiA8PCA2KQo+ICsjZGVmaW5lICAgICBWRVBVX1JFR19FTkNPREVfRk9STUFUX1ZQOCAgICAg ICAgICAgICAgICAgKDB4MSA8PCA0KSAgICAgIC8qIHVuZG9jdW1lbnRlZCAqLwo+ICAjZGVmaW5l ICAgICBWRVBVX1JFR19FTkNPREVfRk9STUFUX0pQRUcgICAgICAgICAgICAgICAgICAgICAgICAo MHgyIDw8IDQpCj4gICNkZWZpbmUgICAgIFZFUFVfUkVHX0VOQ09ERV9GT1JNQVRfSDI2NCAgICAg ICAgICAgICAgICAgICAgICAgICgweDMgPDwgNCkKPiAgI2RlZmluZSAgICAgVkVQVV9SRUdfRU5D T0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEJJVCgwKQo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tjaGlwX3ZwdV9ody5jIGIvZHJpdmVy cy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9yb2NrY2hpcF92cHVfaHcuYwo+IGluZGV4IDhk ZTZmZDJlOGVlZi4uMDY3MWYxNjA5YWM0IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxh dGZvcm0vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1X2h3LmMKPiArKysgYi9kcml2ZXJzL21lZGlh L3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tjaGlwX3ZwdV9ody5jCj4gQEAgLTU2LDYgKzU2LDE5 IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGFudHJvX2ZtdCByb2NrY2hpcF92cHVfZW5jX2ZtdHNb XSA9IHsKPiAgICAgICAgICAgICAgICAgICAgICAgICAuc3RlcF9oZWlnaHQgPSBNQl9ESU0sCj4g ICAgICAgICAgICAgICAgIH0sCj4gICAgICAgICB9LAo+ICsgICAgICAgewo+ICsgICAgICAgICAg ICAgICAuZm91cmNjID0gVjRMMl9QSVhfRk1UX1ZQOF9GUkFNRSwKPiArICAgICAgICAgICAgICAg LmNvZGVjX21vZGUgPSBIQU5UUk9fTU9ERV9WUDhfRU5DLAo+ICsgICAgICAgICAgICAgICAubWF4 X2RlcHRoID0gMiwKPiArICAgICAgICAgICAgICAgLmZybXNpemUgPSB7Cj4gKyAgICAgICAgICAg ICAgICAgICAgICAgLm1pbl93aWR0aCA9IDk2LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIC5t YXhfd2lkdGggPSAxOTIwLAo+ICsgICAgICAgICAgICAgICAgICAgICAgIC5zdGVwX3dpZHRoID0g TUJfRElNLAo+ICsgICAgICAgICAgICAgICAgICAgICAgIC5taW5faGVpZ2h0ID0gOTYsCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgLm1heF9oZWlnaHQgPSAxMDg4LAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIC5zdGVwX2hlaWdodCA9IE1CX0RJTSwKPiArICAgICAgICAgICAgICAgfSwKPiAr ICAgICAgIH0sCj4gIH07Cj4KPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBoYW50cm9fZm10IHJvY2tj aGlwX3ZwdTFfcG9zdHByb2NfZm10c1tdID0gewo+IEBAIC0zNTAsNiArMzYzLDcgQEAgc3RhdGlj IGludCByb2NrY2hpcF92cHVfaHdfaW5pdChzdHJ1Y3QgaGFudHJvX2RldiAqdnB1KQo+ICB7Cj4g ICAgICAgICAvKiBCdW1wIEFDTEsgdG8gbWF4LiBwb3NzaWJsZSBmcmVxLiB0byBpbXByb3ZlIHBl cmZvcm1hbmNlLiAqLwo+ICAgICAgICAgY2xrX3NldF9yYXRlKHZwdS0+Y2xvY2tzWzBdLmNsaywg UkszMjg4X0FDTEtfTUFYX0ZSRVEpOwo+ICsKPiAgICAgICAgIHJldHVybiAwOwo+ICB9Cj4KPiBA QCAtNDg4LDYgKzUwMiwxMyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGhhbnRyb19jb2RlY19vcHMg cmszMzk5X3ZwdV9jb2RlY19vcHNbXSA9IHsKPiAgICAgICAgICAgICAgICAgLmluaXQgPSBoYW50 cm9fdnA4X2RlY19pbml0LAo+ICAgICAgICAgICAgICAgICAuZXhpdCA9IGhhbnRyb192cDhfZGVj X2V4aXQsCj4gICAgICAgICB9LAo+ICsgICAgICAgW0hBTlRST19NT0RFX1ZQOF9FTkNdID0gewo+ ICsgICAgICAgICAgICAgICAucnVuID0gcm9ja2NoaXBfdnB1Ml92cDhfZW5jX3J1biwKPiArICAg ICAgICAgICAgICAgLnJlc2V0ID0gcm9ja2NoaXBfdnB1Ml9lbmNfcmVzZXQsCj4gKyAgICAgICAg ICAgICAgIC5pbml0ID0gaGFudHJvX3ZwOF9lbmNfaW5pdCwKPiArICAgICAgICAgICAgICAgLmRv bmUgPSByb2NrY2hpcF92cHUyX3ZwOF9lbmNfZG9uZSwKPiArICAgICAgICAgICAgICAgLmV4aXQg PSBoYW50cm9fdnA4X2VuY19leGl0LAo+ICsgICAgICAgfSwKPiAgfTsKPgo+ICBzdGF0aWMgY29u c3Qgc3RydWN0IGhhbnRyb19jb2RlY19vcHMgcmszNTY4X3ZlcHVfY29kZWNfb3BzW10gPSB7Cj4g QEAgLTYyNiw3ICs2NDcsNyBAQCBjb25zdCBzdHJ1Y3QgaGFudHJvX3ZhcmlhbnQgcmszMzk5X3Zw dV92YXJpYW50ID0gewo+ICAgICAgICAgLmRlY19mbXRzID0gcmszMzk5X3ZwdV9kZWNfZm10cywK PiAgICAgICAgIC5udW1fZGVjX2ZtdHMgPSBBUlJBWV9TSVpFKHJrMzM5OV92cHVfZGVjX2ZtdHMp LAo+ICAgICAgICAgLmNvZGVjID0gSEFOVFJPX0pQRUdfRU5DT0RFUiB8IEhBTlRST19NUEVHMl9E RUNPREVSIHwKPiAtICAgICAgICAgICAgICAgIEhBTlRST19WUDhfREVDT0RFUiwKPiArICAgICAg ICAgICAgICAgIEhBTlRST19WUDhfREVDT0RFUiB8IEhBTlRST19WUDhfRU5DT0RFUiwKPiAgICAg ICAgIC5jb2RlY19vcHMgPSByazMzOTlfdnB1X2NvZGVjX29wcywKPiAgICAgICAgIC5pcnFzID0g cm9ja2NoaXBfdnB1Ml9pcnFzLAo+ICAgICAgICAgLm51bV9pcnFzID0gQVJSQVlfU0laRShyb2Nr Y2hpcF92cHUyX2lycXMpLAo+IC0tCj4gMi4yNS4xCj4KCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LXJvY2tjaGlwIG1haWxpbmcgbGlzdApMaW51 eC1yb2NrY2hpcEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8vbGludXgtcm9ja2NoaXAK 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5F43FC77B7A for ; Sat, 20 May 2023 18:58:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=yoJ5JXWizI8LU+ets+ggAqp8WSbN3jUc3mo+5aqZ6Ro=; b=C4T9DySXok70qi vWutIaCLQQM0gjpXVLF3ukf1E21ekl64HNlnIr4gjAsTyhuob245nu1ceUVp2lPpt65Rgx/9f0Xhh dkIS5X/EOZcZPdgKIbEoMkwDsfFJVmhvV5d1DpBuANzR+Qx3mwVUX9EucHx1tUbphb/4lKDtONfXM 7VEkCFSTZnFXeXD28w+foTM2+/6EJbFm0DwUzZBlYXm2NryJDS+FxUWWLHMdnIbM059FIwAL5/KwZ jFxPbfUXVftQWsbez3Rx8ruW2NM7VVs65Zylub64ti7Qsd81NAV81mus0VgUEzPINdA3cnVOOoJRJ dnT+1XZ3NoanAu3qv0xQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q0RmH-0025kM-1z; Sat, 20 May 2023 18:58:05 +0000 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q0Rm9-0025if-1O; Sat, 20 May 2023 18:58:03 +0000 Received: by mail-pj1-x1029.google.com with SMTP id 98e67ed59e1d1-253e0edc278so771159a91.3; Sat, 20 May 2023 11:57:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684609075; x=1687201075; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=rrpTll+/MtlXyUgF3bRhfqGpnxE93eXDQ7Ko/cupjpY=; b=pUyBw0embAQ4Zs7tAhkY0xj78eHOmnRkj16Qi5+ZTB9Vy3ObnRovc+kKmH9V8z0it/ bicmfHFYSsLxo160zybwib0Mb6HZrLD8p/eUQVBVT5p1xTNu+I9+iufXfrgNz0wrkPNQ uGmEZ3sXi/HjceY/XFTeyLsUfUzAvT9s52W225P3T95k6SgDB6W2SFrRR26sr3xqZ2iA YdvTM3utp+sqc4yuoKBtxt452b8uOKIje1ye8idqhs2gWTzrAVAvJFrzfaX1MTm+PdhT e6K4OL/EMsRX8TTmLaxrn9Z/hUJjpWpKNHYdo0mHTOZyrc1bLQgx3aRUGhIi8GjyQlQj 4Tkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684609075; x=1687201075; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rrpTll+/MtlXyUgF3bRhfqGpnxE93eXDQ7Ko/cupjpY=; b=gFiaQxwtbLVrX/ZqlunakUxZ1k2+WMd/wFCw3UUVEKZeTWMaDPKi7s+G+L+2GnY5GD HV76JvP+boykASZNL4mJVbGqGFBE2DNwC4ZuiYiGizZMZmbnlfLAyGpaT3u+gm/WDc7T JqFRzncB6a8G5LP00XzWUpawqyWQSqNylTKi09Pe0ZRBcTL3DUrsEMduf0mc08PMrH4p n/7M1WcGdH5ypKz5uh62m43uFZ01clpAYSZTeUNgs0IWmXg3gHtfvu+aYPvKW9xE7o/y RkZfOOJmXXcCuo8TAQPWXOGgRE4Q/zs+QF4P8PT7aL/URDW6+HxE42eNHUX6aR4/zlpo 9+DA== X-Gm-Message-State: AC+VfDxJo75rVzE21X9WbI64FqnGafOQd4yaK/m0KStK905yoUwcsQOI GTtpEsIWNHjPnq5D4kVVu6dLsTAP3H9dElJ1Hes= X-Google-Smtp-Source: ACHHUZ7tqIchEzpWavEuzUbE53s+Wb68jFlTeGS8tfuwpP8Oi1y/90Eak9sLvO1GfRmIcTV7baBDVlydrK/dvyFKm+4= X-Received: by 2002:a17:90a:7187:b0:254:6953:f7b6 with SMTP id i7-20020a17090a718700b002546953f7b6mr3053550pjk.20.1684609073920; Sat, 20 May 2023 11:57:53 -0700 (PDT) MIME-Version: 1.0 References: <20230309125651.23911-1-andrzej.p@collabora.com> <20230309125651.23911-3-andrzej.p@collabora.com> In-Reply-To: <20230309125651.23911-3-andrzej.p@collabora.com> From: Adam Ford Date: Sat, 20 May 2023 13:57:42 -0500 Message-ID: Subject: Re: [RFC 2/2] media: rkvdec: Add VP8 encoder To: Andrzej Pietrasiewicz Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Mauro Carvalho Chehab , Ezequiel Garcia , Philipp Zabel , Heiko Stuebner , kernel@collabora.com 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 T24gVGh1LCBNYXIgOSwgMjAyMyBhdCA2OjU54oCvQU0gQW5kcnplaiBQaWV0cmFzaWV3aWN6Cjxh bmRyemVqLnBAY29sbGFib3JhLmNvbT4gd3JvdGU6Cj4KPiBBIHN0YXRlbGVzcyBWUDggZW5jb2Rl ciBmb3Igcm9ja2NoaXAgdnB1MiBmb3VuZCBlLmcuIGluIHJrMzM5OS4KPgo+IFNpZ25lZC1vZmYt Ynk6IEFuZHJ6ZWogUGlldHJhc2lld2ljeiA8YW5kcnplai5wQGNvbGxhYm9yYS5jb20+CgpJcyB0 aGVyZSBhIGdvb2QgcGxhY2Ugb3IgcmVzb3VyY2Ugd2hlcmUgSSBjb3VsZCBsZWFybiBtb3JlIGFi b3V0CndoYXQncyBuZWVkZWQgdG8gcG9ydCB0aGUgdnB1MSBWUDggZW5jb2Rlcj8gIEknZCByZWFs bHkgbGlrZSB0byBwb3J0CnRoZSBIYW50cm8gSDEgZW5jb2RlciB0aGF0J3MgdXNlZCBvbiB0aGUg aW14OG1tLCBidXQgaXQgc2VlbXMgbGlrZSB0aGUKdnB1MiBlbmNvZGVyIGhhcyBkaWZmZXJlbnQg cmVnaXN0ZXJzIHRoYW4gdGhlIEgxIGVuY29kZXIgb24gdGhlIE1pbmkuCkkgd2FzIGhvcGluZyBt eSBlbXBsb3llciB3b3VsZCBzZW5kIG1lIHRvIFByYWd1ZSBmb3IgdGhlIGNvbmZlcmVuY2UgYXQK dGhlIGVuZCBvZiBKdW5lLCBidXQgdW5mb3J0dW5hdGVseSwgdGhhdCdzIG5vdCBnb2luZyB0byBo YXBwZW4uICBJJ2QKbGlrZSB0byBnZXQgbW9yZSBpbnZvbHZlZCB3aXRoIHByb2plY3RzIGxpa2Ug dGhpcyBhcyBhIHBlcnNvbmFsIHNpZGUKcHJvamVjdC4KCmFkYW0KPiAtLS0KPiAgZHJpdmVycy9t ZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9NYWtlZmlsZSAgIHwgICAgMiArCj4gIGRyaXZlcnMv bWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vaGFudHJvLmggICB8ICAgMTAgKwo+ICAuLi4vcGxh dGZvcm0vdmVyaXNpbGljb24vaGFudHJvX2Jvb2xlbmMuYyAgICAgfCAgIDY5ICsKPiAgLi4uL3Bs YXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ib29sZW5jLmggICAgIHwgICAyMSArCj4gIC4uLi9t ZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fZHJ2LmMgICB8ICAgMTggKy0KPiAgLi4u L21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ody5oICAgIHwgICA5MCArCj4gIC4u Li9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fdjRsMi5jICB8ICAgIDUgKy0KPiAg Li4uL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb192cDguYyAgIHwgIDExOCArKwo+ ICAuLi4vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1Ml9od192cDhfZW5jLmMgICAgfCAxNTc0ICsr KysrKysrKysrKysrKysrCj4gIC4uLi9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9yb2NrY2hpcF92cHUy X3JlZ3MuaCB8ICAgIDEgKwo+ICAuLi4vcGxhdGZvcm0vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1 X2h3LmMgICAgfCAgIDIzICstCj4gIDExIGZpbGVzIGNoYW5nZWQsIDE5MjUgaW5zZXJ0aW9ucygr KSwgNiBkZWxldGlvbnMoLSkKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWVkaWEvcGxh dGZvcm0vdmVyaXNpbGljb24vaGFudHJvX2Jvb2xlbmMuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fYm9vbGVuYy5oCj4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tj aGlwX3ZwdTJfaHdfdnA4X2VuYy5jCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92ZXJpc2lsaWNvbi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNp bGljb24vTWFrZWZpbGUKPiBpbmRleCBlYmQ1ZWRlN2JlZjcuLmExY2QxOGI4ZGZlNyAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL01ha2VmaWxlCj4gKysr IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9NYWtlZmlsZQo+IEBAIC02LDYg KzYsNyBAQCBoYW50cm8tdnB1LXkgKz0gXAo+ICAgICAgICAgICAgICAgICBoYW50cm9fZHJ2Lm8g XAo+ICAgICAgICAgICAgICAgICBoYW50cm9fdjRsMi5vIFwKPiAgICAgICAgICAgICAgICAgaGFu dHJvX3Bvc3Rwcm9jLm8gXAo+ICsgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuYy5vIFwKPiAg ICAgICAgICAgICAgICAgaGFudHJvX2gxX2pwZWdfZW5jLm8gXAo+ICAgICAgICAgICAgICAgICBo YW50cm9fZzEubyBcCj4gICAgICAgICAgICAgICAgIGhhbnRyb19nMV9oMjY0X2RlYy5vIFwKPiBA QCAtMTgsNiArMTksNyBAQCBoYW50cm8tdnB1LXkgKz0gXAo+ICAgICAgICAgICAgICAgICByb2Nr Y2hpcF92cHUyX2h3X2gyNjRfZGVjLm8gXAo+ICAgICAgICAgICAgICAgICByb2NrY2hpcF92cHUy X2h3X21wZWcyX2RlYy5vIFwKPiAgICAgICAgICAgICAgICAgcm9ja2NoaXBfdnB1Ml9od192cDhf ZGVjLm8gXAo+ICsgICAgICAgICAgICAgICByb2NrY2hpcF92cHUyX2h3X3ZwOF9lbmMubyBcCj4g ICAgICAgICAgICAgICAgIGhhbnRyb19qcGVnLm8gXAo+ICAgICAgICAgICAgICAgICBoYW50cm9f aDI2NC5vIFwKPiAgICAgICAgICAgICAgICAgaGFudHJvX2hldmMubyBcCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vaGFudHJvLmggYi9kcml2ZXJzL21l ZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyby5oCj4gaW5kZXggMjk4OWViYzYzMWNjLi41 MTJhMjM1Njg2YjkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2ls aWNvbi9oYW50cm8uaAo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24v aGFudHJvLmgKPiBAQCAtMzIsNiArMzIsNyBAQCBzdHJ1Y3QgaGFudHJvX2NvZGVjX29wczsKPiAg c3RydWN0IGhhbnRyb19wb3N0cHJvY19vcHM7Cj4KPiAgI2RlZmluZSBIQU5UUk9fSlBFR19FTkNP REVSICAgIEJJVCgwKQo+ICsjZGVmaW5lIEhBTlRST19WUDhfRU5DT0RFUiAgICAgQklUKDEpCj4g ICNkZWZpbmUgSEFOVFJPX0VOQ09ERVJTICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKPiAgI2Rl ZmluZSBIQU5UUk9fTVBFRzJfREVDT0RFUiAgIEJJVCgxNikKPiAgI2RlZmluZSBIQU5UUk9fVlA4 X0RFQ09ERVIgICAgIEJJVCgxNykKPiBAQCAtMTExLDYgKzExMiw3IEBAIHN0cnVjdCBoYW50cm9f dmFyaWFudCB7Cj4gICAqIEBIQU5UUk9fTU9ERV9WUDhfREVDOiBWUDggZGVjb2Rlci4KPiAgICog QEhBTlRST19NT0RFX0hFVkNfREVDOiBIRVZDIGRlY29kZXIuCj4gICAqIEBIQU5UUk9fTU9ERV9W UDlfREVDOiBWUDkgZGVjb2Rlci4KPiArICogQEhBTlRST19NT0RFX1ZQOF9FTkM6IFZQOCBlbmNv ZGVyLgo+ICAgKi8KPiAgZW51bSBoYW50cm9fY29kZWNfbW9kZSB7Cj4gICAgICAgICBIQU5UUk9f TU9ERV9OT05FID0gLTEsCj4gQEAgLTEyMCw2ICsxMjIsNyBAQCBlbnVtIGhhbnRyb19jb2RlY19t b2RlIHsKPiAgICAgICAgIEhBTlRST19NT0RFX1ZQOF9ERUMsCj4gICAgICAgICBIQU5UUk9fTU9E RV9IRVZDX0RFQywKPiAgICAgICAgIEhBTlRST19NT0RFX1ZQOV9ERUMsCj4gKyAgICAgICBIQU5U Uk9fTU9ERV9WUDhfRU5DLAo+ICB9Owo+Cj4gIC8qCj4gQEAgLTI2NSw2ICsyNjgsNyBAQCBzdHJ1 Y3QgaGFudHJvX2N0eCB7Cj4gICAgICAgICAgICAgICAgIHN0cnVjdCBoYW50cm9fdnA4X2RlY19o d19jdHggdnA4X2RlYzsKPiAgICAgICAgICAgICAgICAgc3RydWN0IGhhbnRyb19oZXZjX2RlY19o d19jdHggaGV2Y19kZWM7Cj4gICAgICAgICAgICAgICAgIHN0cnVjdCBoYW50cm9fdnA5X2RlY19o d19jdHggdnA5X2RlYzsKPiArICAgICAgICAgICAgICAgc3RydWN0IGhhbnRyb192cDhfZW5jX2h3 X2N0eCB2cDhfZW5jOwo+ICAgICAgICAgfTsKPiAgfTsKPgo+IEBAIC0zNjEsNiArMzY1LDEyIEBA IGV4dGVybiBpbnQgaGFudHJvX2RlYnVnOwo+ICAjZGVmaW5lIHZwdV9lcnIoZm10LCBhcmdzLi4u KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gICAgICAgICBwcl9lcnIoIiVz OiVkOiAiIGZtdCwgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpCj4KPiArc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgaGFudHJvX3JvdW5kZWRfbHVtYV9zaXplKHVuc2lnbmVkIGludCB3LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBpbnQgaCkKPiArewo+ICsgICAgICAgcmV0dXJuIHJvdW5kX3VwKHcsIE1CX0RJTSkgKiBy b3VuZF91cChoLCBNQl9ESU0pOwo+ICt9Cj4gKwo+ICAvKiBTdHJ1Y3R1cmUgYWNjZXNzIGhlbHBl cnMuICovCj4gIHN0YXRpYyBpbmxpbmUgc3RydWN0IGhhbnRyb19jdHggKmZoX3RvX2N0eChzdHJ1 Y3QgdjRsMl9maCAqZmgpCj4gIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9y bS92ZXJpc2lsaWNvbi9oYW50cm9fYm9vbGVuYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92 ZXJpc2lsaWNvbi9oYW50cm9fYm9vbGVuYy5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRl eCAwMDAwMDAwMDAwMDAuLjg4YTFjMWMxNjZmZQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ib29sZW5jLmMKPiBAQCAtMCww ICsxLDY5IEBACj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gKwo+ICsj aW5jbHVkZSA8bGludXgvYnVnLmg+Cj4gKwo+ICsjaW5jbHVkZSAiaGFudHJvX2Jvb2xlbmMuaCIK PiArCj4gK3ZvaWQgaGFudHJvX2Jvb2xlbmNfaW5pdChzdHJ1Y3QgaGFudHJvX2Jvb2xlbmMgKmUs IHVpbnQ4X3QgKm91dHB1dCkKPiArewo+ICsgICAgICAgZS0+b3V0cHV0ID0gb3V0cHV0Owo+ICsg ICAgICAgZS0+cmFuZ2UgPSAyNTU7Cj4gKyAgICAgICBlLT5ib3R0b20gPSAwOwo+ICsgICAgICAg ZS0+Yml0X2NvdW50ID0gMjQ7Cj4gKyAgICAgICBlLT5ieXRlc193cml0dGVuID0gMDsKPiArfQo+ ICsKPiArLyoKPiArICogQWRkIG9uZSB0byBhIG51bWJlciBzdG9yZWQgaW4gYnl0ZXMgcHJlY2Vk aW5nICpxLgo+ICsgKiBUaGVyZSdzIGV4YWN0bHkgYnl0ZXNfd3JpdHRlbiBzdWNoIGJ5dGVzLgo+ ICsgKgo+ICsgKiBUaGUgc3BlYyBndWFyYW50ZWVzIHRoYXQgdGhlIGJhY2t3YXJkIHNlYXJjaCB3 b24ndCBnbyBiZXlvbmQKPiArICogdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIHNvIGlmIHdlIGRl dGVjdCBzdWNoIGNvbmRpdGlvbiB3ZSBjYW4KPiArICogQlVHX09OKCkgLSB0aGlzIHNob3VsZCBu ZXZlciBoYXBwZW4gYW55d2F5Lgo+ICsgKi8KPiArc3RhdGljIHZvaWQgYWRkX29uZV90b19vdXRw dXQodWludDhfdCAqcSwgaW50IGJ5dGVzX3dyaXR0ZW4pCj4gK3sKPiArICAgICAgIC8qCj4gKyAg ICAgICAgKiBvcmlnaW5hbGx5Ogo+ICsgICAgICAgICogd2hpbGUgKCotLXEgPT0gMHhmZikKPiAr ICAgICAgICAqICAgICAgICpxID0gMDsKPiArICAgICAgICAqLwo+ICsgICAgICAgZm9yICg7Oykg ewo+ICsgICAgICAgICAgICAgICBCVUdfT04oYnl0ZXNfd3JpdHRlbi0tIDw9IDApOyAvKiBjaGVj ayBpZiB3ZSdyZSBhbGxvd2VkIHRvIGdvIGJhY2sgb25lIGJ5dGUgKi8KPiArCj4gKyAgICAgICAg ICAgICAgIGlmICgqLS1xID09IDB4ZmYpICAgICAgICAgICAgIC8qIGFkZGluZyBhIDEgb3ZlcmZs b3dzICotLXE/ICovCj4gKyAgICAgICAgICAgICAgICAgICAgICAgKnEgPSAwOyAgICAgICAgICAg ICAgIC8qIHllcywgc28gemVybyAqcSAqLwo+ICsgICAgICAgICAgICAgICBlbHNlCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIC8qIG5vLCB3ZSdyZSBnb29k IHRvIGFkZCAxICovCj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgKysqcTsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgMSAqLwo+ICt9Cj4gKwo+ICt2b2lkIGhhbnRyb19i b29sZW5jX3dyaXRlX2Jvb2woc3RydWN0IGhhbnRyb19ib29sZW5jICplLCB1aW50MzJfdCBwcm9i LCBib29sIGJvb2xfdmFsdWUpCj4gK3sKPiArICAgICAgIHVpbnQzMl90IHNwbGl0ID0gMSArICgo KGUtPnJhbmdlIC0gMSkgKiBwcm9iKSA+PiA4KTsKPiArCj4gKyAgICAgICBpZiAoYm9vbF92YWx1 ZSkgewo+ICsgICAgICAgICAgICAgICBlLT5ib3R0b20gKz0gc3BsaXQ7Cj4gKyAgICAgICAgICAg ICAgIGUtPnJhbmdlIC09IHNwbGl0Owo+ICsgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAg ICAgZS0+cmFuZ2UgPSBzcGxpdDsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICB3aGlsZSAoZS0+ cmFuZ2UgPCAxMjgpIHsKPiArICAgICAgICAgICAgICAgZS0+cmFuZ2UgPDw9IDE7Cj4gKwo+ICsg ICAgICAgICAgICAgICBpZiAoZS0+Ym90dG9tICYgKDEgPDwgMzEpKQo+ICsgICAgICAgICAgICAg ICAgICAgICAgIGFkZF9vbmVfdG9fb3V0cHV0KGUtPm91dHB1dCwgZS0+Ynl0ZXNfd3JpdHRlbik7 Cj4gKwo+ICsgICAgICAgICAgICAgICBlLT5ib3R0b20gPDw9IDE7Cj4gKwo+ICsgICAgICAgICAg ICAgICBpZiAoIS0tZS0+Yml0X2NvdW50KSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgKmUt Pm91dHB1dCsrID0gKHVpbnQ4X3QpKGUtPmJvdHRvbSA+PiAyNCk7Cj4gKyAgICAgICAgICAgICAg ICAgICAgICAgKytlLT5ieXRlc193cml0dGVuOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGUt PmJvdHRvbSAmPSAoMSA8PCAyNCkgLSAxOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGUtPmJp dF9jb3VudCA9IDg7Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAgICAgIH0KPiArfQo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ib29sZW5j LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ib29sZW5jLmgK PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uODBlYzY4NmQ1MDRk Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGlj b24vaGFudHJvX2Jvb2xlbmMuaAo+IEBAIC0wLDAgKzEsMjEgQEAKPiArLyogU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ ICsKPiArc3RydWN0IGhhbnRyb19ib29sZW5jIHsKPiArICAgICAgIHVpbnQ4X3QgKm91dHB1dDsg ICAgICAgIC8qIG5leHQgYnl0ZSBwb2ludGVyICovCj4gKyAgICAgICB1aW50MzJfdCByYW5nZTsK PiArICAgICAgIHVpbnQzMl90IGJvdHRvbTsgICAgICAgIC8qIDQgTFNCIG9mIGxlZnRtb3N0IGVu ZCBvZiB0aGUgcmFuZ2UsIE1TQiBhbHJlYWQgaW4gb3V0cHV0ICAqLwo+ICsgICAgICAgaW50IGJp dF9jb3VudDsgICAgICAgICAgLyogaG93IG1hbnkgc2hpZnRzIHVudGlsIG5leHQgZW5jb2RlZCBi eXRlIGF2YWlsYWJsZSAqLwo+ICsgICAgICAgaW50IGJ5dGVzX3dyaXR0ZW47Cj4gK307Cj4gKwo+ ICt2b2lkIGhhbnRyb19ib29sZW5jX2luaXQoc3RydWN0IGhhbnRyb19ib29sZW5jICplLCB1aW50 OF90ICpvdXRwdXQpOwo+ICsKPiArdm9pZCBoYW50cm9fYm9vbGVuY193cml0ZV9ib29sKHN0cnVj dCBoYW50cm9fYm9vbGVuYyAqZSwgdWludDMyX3QgcHJvYiwgYm9vbCBib29sX3ZhbHVlKTsKPiAr Cj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoc3RydWN0IGhh bnRyb19ib29sZW5jICplLCB1aW50MzJfdCB2YWwsIHVpbnQ4X3QgbikKPiArewo+ICsgICAgICAg d2hpbGUgKG4tLSkKPiArICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfYm9vbChl LCAxMjgsICh2YWwgPj4gbikgJiAweDEpOwo+ICt9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVk aWEvcGxhdGZvcm0vdmVyaXNpbGljb24vaGFudHJvX2Rydi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fZHJ2LmMKPiBpbmRleCA4Y2I0YTY4YzkxMTkuLmE2YmFj ZjIyY2ZmNSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29u L2hhbnRyb19kcnYuYwo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24v aGFudHJvX2Rydi5jCj4gQEAgLTE2MCw3ICsxNjAsNiBAQCB2b2lkIGhhbnRyb19lbmRfcHJlcGFy ZV9ydW4oc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiAgICAgICAgIHNyY19idWYgPSBoYW50cm9f Z2V0X3NyY19idWYoY3R4KTsKPiAgICAgICAgIHY0bDJfY3RybF9yZXF1ZXN0X2NvbXBsZXRlKHNy Y19idWYtPnZiMl9idWYucmVxX29iai5yZXEsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAmY3R4LT5jdHJsX2hhbmRsZXIpOwo+IC0KPiAgICAgICAgIC8qIEtpY2sgdGhlIHdh dGNoZG9nLiAqLwo+ICAgICAgICAgc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjdHgtPmRldi0+d2F0 Y2hkb2dfd29yaywKPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZm aWVzKDIwMDApKTsKPiBAQCAtMjE1LDggKzIxNCw3IEBAIHF1ZXVlX2luaXQodm9pZCAqcHJpdiwg c3RydWN0IHZiMl9xdWV1ZSAqc3JjX3ZxLCBzdHJ1Y3QgdmIyX3F1ZXVlICpkc3RfdnEpCj4gICAg ICAgICAgKiBmb3IgZmFzdGVyIGFsbG9jYXRpb24uIEFsc28sIG5vIENQVSBhY2Nlc3Mgb24gdGhl IHNvdXJjZSBxdWV1ZSwKPiAgICAgICAgICAqIHNvIG5vIGtlcm5lbCBtYXBwaW5nIG5lZWRlZC4K PiAgICAgICAgICAqLwo+IC0gICAgICAgc3JjX3ZxLT5kbWFfYXR0cnMgPSBETUFfQVRUUl9BTExP Q19TSU5HTEVfUEFHRVMgfAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICBETUFfQVRUUl9O T19LRVJORUxfTUFQUElORzsKPiArICAgICAgIHNyY192cS0+ZG1hX2F0dHJzID0gRE1BX0FUVFJf QUxMT0NfU0lOR0xFX1BBR0VTOwo+ICAgICAgICAgc3JjX3ZxLT5idWZfc3RydWN0X3NpemUgPSBz aXplb2Yoc3RydWN0IHY0bDJfbTJtX2J1ZmZlcik7Cj4gICAgICAgICBzcmNfdnEtPnRpbWVzdGFt cF9mbGFncyA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX0NPUFk7Cj4gICAgICAgICBzcmNfdnEt PmxvY2sgPSAmY3R4LT5kZXYtPnZwdV9tdXRleDsKPiBAQCAtMzUyLDYgKzM1MCwyMCBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IGhhbnRyb19jdHJsIGNvbnRyb2xzW10gPSB7Cj4gICAgICAgICAgICAg ICAgICAgICAgICAgLmRlZiA9IDUwLAo+ICAgICAgICAgICAgICAgICAgICAgICAgIC5vcHMgPSAm aGFudHJvX2pwZWdfY3RybF9vcHMsCj4gICAgICAgICAgICAgICAgIH0sCj4gKyAgICAgICB9LCB7 Cj4gKyAgICAgICAgICAgICAgIC5jb2RlYyA9IEhBTlRST19WUDhfRU5DT0RFUiwKPiArICAgICAg ICAgICAgICAgLmNmZyA9IHsKPiArICAgICAgICAgICAgICAgICAgICAgICAuaWQgPSBWNEwyX0NJ RF9TVEFURUxFU1NfVlA4X0VOQ09ERV9QQVJBTVMsCj4gKyAgICAgICAgICAgICAgIH0sCj4gKyAg ICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgIC5jb2RlYyA9IEhBTlRST19WUDhfRU5DT0RFUiwK PiArICAgICAgICAgICAgICAgLmNmZyA9IHsKPiArICAgICAgICAgICAgICAgICAgICAgICAuaWQg PSBWNEwyX0NJRF9TVEFURUxFU1NfVlA4X0VOQ09ERV9RUCwKPiArICAgICAgICAgICAgICAgICAg ICAgICAubWluID0gMCwKPiArICAgICAgICAgICAgICAgICAgICAgICAubWF4ID0gMTI3LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgIC5zdGVwID0gMSwKPiArICAgICAgICAgICAgICAgICAgICAg ICAuZGVmID0gMCwKPiArICAgICAgICAgICAgICAgfSwKPiAgICAgICAgIH0sIHsKPiAgICAgICAg ICAgICAgICAgLmNvZGVjID0gSEFOVFJPX0pQRUdfRU5DT0RFUiwKPiAgICAgICAgICAgICAgICAg LmNmZyA9IHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNv bi9oYW50cm9faHcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vaGFudHJv X2h3LmgKPiBpbmRleCBlODNmMGM1MjNhMzAuLmMzNWNhYzdmODhhOSAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL2hhbnRyb19ody5oCj4gKysrIGIvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9faHcuaAo+IEBAIC0xNSw2ICsx NSw4IEBACj4gICNpbmNsdWRlIDxtZWRpYS92NGwyLXZwOS5oPgo+ICAjaW5jbHVkZSA8bWVkaWEv dmlkZW9idWYyLWNvcmUuaD4KPgo+ICsjaW5jbHVkZSAiaGFudHJvX2Jvb2xlbmMuaCIKPiArCj4g ICNkZWZpbmUgREVDXzgxOTBfQUxJR05fTUFTSyAgICAweDA3VQo+Cj4gICNkZWZpbmUgTUJfRElN ICAgICAgICAgICAgICAgICAxNgo+IEBAIC0xNzEsNiArMTczLDY3IEBAIHN0cnVjdCBoYW50cm9f dnA4X2RlY19od19jdHggewo+ICAgICAgICAgc3RydWN0IGhhbnRyb19hdXhfYnVmIHByb2JfdGJs Owo+ICB9Owo+Cj4gK3N0cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgewo+ICsgICAgICAgLyogVE9E TzogaW50MzJfdD8gKi8KPiArICAgICAgIGludDMyX3QgY29lZmZfcHJvYls0XVs4XVszXVsxMV07 Cj4gKyAgICAgICBpbnQzMl90IGNvZWZmX3Byb2Jfb2xkWzRdWzhdWzNdWzExXTsKPiArICAgICAg IGludDMyX3QgbXZfcHJvYlsyXVsxOV07Cj4gKyAgICAgICBpbnQzMl90IG12X3Byb2Jfb2xkWzJd WzE5XTsKPiArICAgICAgIGludDMyX3QgeV9tb2RlX3Byb2JbNF07Cj4gKyAgICAgICBpbnQzMl90 IHV2X21vZGVfcHJvYlszXTsKPiArfTsKPiArCj4gKyNkZWZpbmUgVlA4X0JJVF9MQVNUICAgMAo+ ICsjZGVmaW5lIFZQOF9CSVRfR09MREVOIDEKPiArI2RlZmluZSBWUDhfQklUX0FMVCAgICAyCj4g Kwo+ICtzdHJ1Y3QgaGFudHJvX3ZwOF9lbmNfaHdfY3R4IHsKPiArICAgICAgIHN0cnVjdCBoYW50 cm9fYXV4X2J1ZiByZWZfZnJhbWVzWzRdOyAgICAvKiByZWNyZWF0ZWQgYW5kIHJlZmVyZW5jZSBp bWFnZXMgKi8KPiArICAgICAgIHN0cnVjdCBoYW50cm9fYXV4X2J1ZiBwcml2X3NyYzsgLyogY2Fi YWMgdGFibGUsIHNlZ21lbnQgbWFwICovCj4gKyAgICAgICBzdHJ1Y3QgaGFudHJvX2F1eF9idWYg bXZfYnVmOyAgIC8qIG1vdGlvbiB2ZWN0b3IgKi8KPiArICAgICAgIHN0cnVjdCBoYW50cm9fYXV4 X2J1ZiBwcml2X2RzdDsgLyogcHJvYiBjb3VudCAqLwo+ICsgICAgICAgc3RydWN0IGhhbnRyb19h dXhfYnVmIGN0cmxfYnVmOyAvKiBzaXplIHRhYmxlICovCj4gKyAgICAgICBzdHJ1Y3QgaGFudHJv X2Jvb2xlbmMgYm9vbGVuYzsKPiArICAgICAgIHN0cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgZW50 cm9weTsKPiArICAgICAgIHNpemVfdCBoZWFkZXJfc2l6ZTsKPiArICAgICAgIHNpemVfdCBlc3Rp bWF0ZWRfaGRyX3NpemU7Cj4gKyAgICAgICBzaXplX3QgZnJhbWVfY291bnRlcjsKPiArICAgICAg IGludCBsYXN0X3JlZjsKPiArICAgICAgIGludCBnb2xkZW5fcmVmOwo+ICsgICAgICAgaW50IGFs dF9yZWY7Cj4gKyAgICAgICBpbnQgZmlyc3RfZnJlZTsKPiArICAgICAgIGludCByZWNvbnN0cnVj dGVkOwo+ICsgICAgICAgY2hhciByZWZfYml0bWFwc1s0XTsKPiArCj4gKyAgICAgICBpbnQzMl90 IG1vZGVfZGVsdGFbNF07Cj4gKyAgICAgICBpbnQzMl90IG9sZF9tb2RlX2RlbHRhWzRdOwo+ICsg ICAgICAgaW50MzJfdCByZWZfZGVsdGFbNF07Cj4gKyAgICAgICBpbnQzMl90IG9sZF9yZWZfZGVs dGFbNF07Cj4gKwo+ICsgICAgICAgc3RydWN0IHsKPiArICAgICAgICAgICAgICAgdWludDhfdCB0 YWdbM107Cj4gKwo+ICsgICAgICAgICAgICAgICAvKiB0aGUgZm9sbG93aW5nIHRocmVlIG9ubHkg dXNlZCBmb3IgaW50ZXIgZnJhbWVzICovCj4gKyAgICAgICAgICAgICAgIHVpbnQ4X3QgbWFnaWNb M107ICAgICAgIC8qIDB4OWQwMTJhICovCj4gKyAgICAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGhb Ml07ICAgICAgIC8qIChzY2FsZSA8PCAxNCkgfCB3aWR0aCAqLwo+ICsgICAgICAgICAgICAgICB1 aW50OF90IGhlaWdodFsyXTsgICAgICAvKiAoc2NhbGUgPDwgMTQpIHwgaGVpZ2h0ICovCj4gKyAg ICAgICB9IF9fcGFja2VkICpmcmFtZV90YWc7Cj4gKwo+ICsgICAgICAgdTggaXNfaW50cmE6MTsK PiArICAgICAgIHU4IGxhc3RfaW50cmE6MTsKPiArICAgICAgIHU4IHNob3dfZnJhbWU6MTsKPiAr ICAgICAgIHU4IHJlZnJlc2hfZ29sZGVuX2ZyYW1lOjE7Cj4gKyAgICAgICB1OCByZWZyZXNoX2Fs dGVybmF0ZV9mcmFtZToxOwo+ICsgICAgICAgdTggcmVmcmVzaF9lbnRyb3B5X3Byb2JzOjE7Cj4g Kwo+ICsgICAgICAgdTggcHJvYl9za2lwX2ZhbHNlOwo+ICsgICAgICAgdTggcHJvYl9pbnRyYTsK PiArICAgICAgIHU4IHByb2JfbGFzdDsKPiArICAgICAgIHU4IHByb2JfZ2Y7Cj4gKyAgICAgICB1 OCBjb3B5X2J1ZmZlcl90b19nb2xkZW47Cj4gKyAgICAgICB1OCBjb3B5X2J1ZmZlcl90b19hbHRl cm5hdGU7Cj4gK307Cj4gKwo+ICAvKioKPiAgICogc3RydWN0IGhhbnRyb192cDlfZnJhbWVfaW5m bwo+ICAgKgo+IEBAIC00MTcsNiArNDgwLDI4IEBAIGhhbnRyb19oZXZjX212X3NpemUodW5zaWdu ZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KQo+ICAgICAgICAgcmV0dXJuIHdpZHRo ICogaGVpZ2h0IC8gMTY7Cj4gIH0KPgo+ICtzdGF0aWMgaW5saW5lIHZvaWQgaGFudHJvX3ZwOF9z ZXRfYml0KHN0cnVjdCBoYW50cm9fdnA4X2VuY19od19jdHggKnZwOF9lbmMsIGNoYXIgYml0LCBp bnQgaWR4KQo+ICt7Cj4gKyAgICAgICBpZiAoaWR4IDwgMCkKPiArICAgICAgICAgICAgICAgcmV0 dXJuOwo+ICsKPiArICAgICAgIGlmIChiaXQgIT0gVlA4X0JJVF9MQVNUICYmIGJpdCAhPSBWUDhf QklUX0dPTERFTiAmJiBiaXQgIT0gVlA4X0JJVF9BTFQpCj4gKyAgICAgICAgICAgICAgIHJldHVy bjsKPiArCj4gKyAgICAgICB2cDhfZW5jLT5yZWZfYml0bWFwc1tpZHhdIHw9ICgxIDw8IGJpdCk7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW50cm9fdnA4X2Nscl9iaXQoc3RydWN0 IGhhbnRyb192cDhfZW5jX2h3X2N0eCAqdnA4X2VuYywgY2hhciBiaXQsIGludCBpZHgpCj4gK3sK PiArICAgICAgIGlmIChpZHggPCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gKwo+ICsg ICAgICAgaWYgKGJpdCAhPSBWUDhfQklUX0xBU1QgJiYgYml0ICE9IFZQOF9CSVRfR09MREVOICYm IGJpdCAhPSBWUDhfQklUX0FMVCkKPiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ICsKPiArICAg ICAgIHZwOF9lbmMtPnJlZl9iaXRtYXBzW2lkeF0gJj0gfigxIDw8IGJpdCk7Cj4gK30KPiArCj4g IGludCBoYW50cm9fZzFfbXBlZzJfZGVjX3J1bihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KTsKPiAg aW50IHJvY2tjaGlwX3ZwdTJfbXBlZzJfZGVjX3J1bihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KTsK PiAgdm9pZCBoYW50cm9fbXBlZzJfZGVjX2NvcHlfcXRhYmxlKHU4ICpxdGFibGUsCj4gQEAgLTQz OCw0ICs1MjMsOSBAQCB2b2lkIGhhbnRyb192cDlfZGVjX2V4aXQoc3RydWN0IGhhbnRyb19jdHgg KmN0eCk7Cj4gIHZvaWQgaGFudHJvX2cyX2NoZWNrX2lkbGUoc3RydWN0IGhhbnRyb19kZXYgKnZw dSk7Cj4gIGlycXJldHVybl90IGhhbnRyb19nMl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsK Pgo+ICtpbnQgcm9ja2NoaXBfdnB1Ml92cDhfZW5jX3J1bihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4 KTsKPiAraW50IGhhbnRyb192cDhfZW5jX2luaXQoc3RydWN0IGhhbnRyb19jdHggKmN0eCk7Cj4g K3ZvaWQgcm9ja2NoaXBfdnB1Ml92cDhfZW5jX2RvbmUoc3RydWN0IGhhbnRyb19jdHggKmN0eCk7 Cj4gK3ZvaWQgaGFudHJvX3ZwOF9lbmNfZXhpdChzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KTsKPiAr Cj4gICNlbmRpZiAvKiBIQU5UUk9fSFdfSF8gKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRp YS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fdjRsMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fdjRsMi5jCj4gaW5kZXggMmM3YTgwNTI4OWU3Li43NTAz ZDZiNzZmYzkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNv bi9oYW50cm9fdjRsMi5jCj4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNv bi9oYW50cm9fdjRsMi5jCj4gQEAgLTMxMiw4ICszMTIsOSBAQCBzdGF0aWMgaW50IGhhbnRyb190 cnlfZm10KGNvbnN0IHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsCj4KPiAgICAgICAgIHBpeF9tcC0+ ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cj4KPiAtICAgICAgIHY0bDJfYXBwbHlfZnJtc2l6ZV9j b25zdHJhaW50cygmcGl4X21wLT53aWR0aCwgJnBpeF9tcC0+aGVpZ2h0LAo+IC0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2cHVfZm10LT5mcm1zaXplKTsKPiArICAgICAg IGlmICghY2FwdHVyZSB8fCAhY3R4LT5pc19lbmNvZGVyKQo+ICsgICAgICAgICAgICAgICB2NGwy X2FwcGx5X2ZybXNpemVfY29uc3RyYWludHMoJnBpeF9tcC0+d2lkdGgsICZwaXhfbXAtPmhlaWdo dCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2cHVf Zm10LT5mcm1zaXplKTsKPgo+ICAgICAgICAgaWYgKCFjb2RlZCkgewo+ICAgICAgICAgICAgICAg ICAvKiBGaWxsIHJlbWFpbmluZyBmaWVsZHMgKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRp YS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9oYW50cm9fdnA4LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRm b3JtL3ZlcmlzaWxpY29uL2hhbnRyb192cDguYwo+IGluZGV4IDM4MWJjMWQzYmZkYS4uNjNlMDI2 MDU1NjE1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24v aGFudHJvX3ZwOC5jCj4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9o YW50cm9fdnA4LmMKPiBAQCAtMTk5LDMgKzE5OSwxMjEgQEAgdm9pZCBoYW50cm9fdnA4X2RlY19l eGl0KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gICAgICAgICBkbWFfZnJlZV9jb2hlcmVudCh2 cHUtPmRldiwgdnA4X2RlYy0+cHJvYl90Ymwuc2l6ZSwKPiAgICAgICAgICAgICAgICAgICAgICAg ICAgIHZwOF9kZWMtPnByb2JfdGJsLmNwdSwgdnA4X2RlYy0+cHJvYl90YmwuZG1hKTsKPiAgfQo+ ICsKPiAraW50IGhhbnRyb192cDhfZW5jX2luaXQoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiAr ewo+ICsgICAgICAgc3RydWN0IGhhbnRyb19kZXYgKnZwdSA9IGN0eC0+ZGV2Owo+ICsgICAgICAg c3RydWN0IGhhbnRyb19hdXhfYnVmICphdXhfYnVmOwo+ICsgICAgICAgdW5zaWduZWQgaW50IG1i X3dpZHRoLCBtYl9oZWlnaHQ7Cj4gKyAgICAgICBzaXplX3QgbHVtYV9zaXplLCBzZWdtZW50X21h cF9zaXplOwo+ICsgICAgICAgc3RhdGljIGludDMyX3QgbW9kZV9kZWx0YVs0XSA9IHsgNCwgLTIs IDIsIDQgfTsKPiArICAgICAgIHN0YXRpYyBpbnQzMl90IHJlZl9kZWx0YVs0XSA9IHsgMiwgMCwg LTIsIC0yIH07Cj4gKyAgICAgICBpbnQgcmV0LCBpOwo+ICsKPiArICAgICAgIG1lbWNweShjdHgt PnZwOF9lbmMubW9kZV9kZWx0YSwgbW9kZV9kZWx0YSwgc2l6ZW9mKG1vZGVfZGVsdGEpKTsKPiAr ICAgICAgIG1lbWNweShjdHgtPnZwOF9lbmMucmVmX2RlbHRhLCByZWZfZGVsdGEsIHNpemVvZihy ZWZfZGVsdGEpKTsKPiArCj4gKyAgICAgICBtYl93aWR0aCA9IERJVl9ST1VORF9VUChjdHgtPnNy Y19mbXQud2lkdGgsIDE2KTsKPiArICAgICAgIG1iX2hlaWdodCA9IERJVl9ST1VORF9VUChjdHgt PnNyY19mbXQuaGVpZ2h0LCAxNik7Cj4gKyAgICAgICBsdW1hX3NpemUgPSBtYl93aWR0aCAqIG1i X2hlaWdodCAqIDE2ICogMTY7Cj4gKyAgICAgICBzZWdtZW50X21hcF9zaXplID0gcm91bmRfdXAo RElWX1JPVU5EX1VQKG1iX3dpZHRoICogbWJfaGVpZ2h0LCA0KSwgNjQpOwo+ICsKPiArICAgICAg IGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0eC0+dnA4X2VuYy5yZWZfZnJhbWVzKTsgKytp KSB7Cj4gKyAgICAgICAgICAgICAgIGF1eF9idWYgPSAmY3R4LT52cDhfZW5jLnJlZl9mcmFtZXNb aV07Cj4gKyAgICAgICAgICAgICAgIGF1eF9idWYtPnNpemUgPSBsdW1hX3NpemUgKiAzIC8gMjsK PiArICAgICAgICAgICAgICAgYXV4X2J1Zi0+Y3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KHZwdS0+ ZGV2LCBhdXhfYnVmLT5zaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJmF1eF9idWYtPmRtYSwgR0ZQX0tFUk5FTCk7Cj4gKyAgICAgICAgICAg ICAgIGlmICghYXV4X2J1Zi0+Y3B1KSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0g LUVOT01FTTsKPiArICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycl9mcmVlX3JlZl9mcmFt ZXM7Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLnJl Zl9iaXRtYXBzW2ldID0gMDsKPiArICAgICAgIH0KPiArICAgICAgIGN0eC0+dnA4X2VuYy5sYXN0 X3JlZiA9IGN0eC0+dnA4X2VuYy5nb2xkZW5fcmVmID0gY3R4LT52cDhfZW5jLmFsdF9yZWYgPSAt MTsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5maXJzdF9mcmVlID0gMDsKPiArCj4gKyAgICAgICBh dXhfYnVmID0gJmN0eC0+dnA4X2VuYy5wcml2X3NyYzsKPiArICAgICAgIGF1eF9idWYtPnNpemUg PSAxMjA4ICsgc2VnbWVudF9tYXBfc2l6ZSArIFBBR0VfU0laRTsgLyogVE9ETzogZWxpbWluYXRl IG9uZSBwYWdlIG92ZXJoZWFkICovCj4gKyAgICAgICBhdXhfYnVmLT5jcHUgPSBkbWFfYWxsb2Nf Y29oZXJlbnQodnB1LT5kZXYsIGF1eF9idWYtPnNpemUsICZhdXhfYnVmLT5kbWEsIEdGUF9LRVJO RUwpOwo+ICsgICAgICAgaWYgKCFhdXhfYnVmLT5jcHUpIHsKPiArICAgICAgICAgICAgICAgcmV0 ID0gLUVOT01FTTsKPiArICAgICAgICAgICAgICAgZ290byBlcnJfZnJlZV9yZWZfZnJhbWVzOwo+ ICsgICAgICAgfQo+ICsKPiArICAgICAgIGF1eF9idWYgPSAmY3R4LT52cDhfZW5jLm12X2J1ZjsK PiArICAgICAgIGF1eF9idWYtPnNpemUgPSBtYl93aWR0aCAqIG1iX2hlaWdodCAqIDQ7Cj4gKyAg ICAgICBhdXhfYnVmLT5jcHUgPSBkbWFfYWxsb2NfY29oZXJlbnQodnB1LT5kZXYsIGF1eF9idWYt PnNpemUsICZhdXhfYnVmLT5kbWEsIEdGUF9LRVJORUwpOwo+ICsgICAgICAgaWYgKCFhdXhfYnVm LT5jcHUpIHsKPiArICAgICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKPiArICAgICAgICAgICAg ICAgZ290byBlcnJfZnJlZV9wcml2X3NyYzsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBhdXhf YnVmID0gJmN0eC0+dnA4X2VuYy5wcml2X2RzdDsKPiArICAgICAgIGF1eF9idWYtPnNpemUgPSBQ QUdFX1NJWkU7IC8qIFRPRE86IHVzZSBjb3JyZWN0IHNpemUgKi8KPiArICAgICAgIGF1eF9idWYt PmNwdSA9IGRtYV9hbGxvY19jb2hlcmVudCh2cHUtPmRldiwgYXV4X2J1Zi0+c2l6ZSwgJmF1eF9i dWYtPmRtYSwgR0ZQX0tFUk5FTCk7Cj4gKyAgICAgICBpZiAoIWF1eF9idWYtPmNwdSkgewo+ICsg ICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOwo+ICsgICAgICAgICAgICAgICBnb3RvIGVycl9m cmVlX212X2J1ZjsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBhdXhfYnVmID0gJmN0eC0+dnA4 X2VuYy5jdHJsX2J1ZjsKPiArICAgICAgIGF1eF9idWYtPnNpemUgPSBQQUdFX1NJWkU7IC8qIFRP RE86IHVzZSBjb3JyZWN0IHNpemUgKi8KPiArICAgICAgIGF1eF9idWYtPmNwdSA9IGRtYV9hbGxv Y19jb2hlcmVudCh2cHUtPmRldiwgYXV4X2J1Zi0+c2l6ZSwgJmF1eF9idWYtPmRtYSwgR0ZQX0tF Uk5FTCk7Cj4gKyAgICAgICBpZiAoIWF1eF9idWYtPmNwdSkgewo+ICsgICAgICAgICAgICAgICBy ZXQgPSAtRU5PTUVNOwo+ICsgICAgICAgICAgICAgICBnb3RvIGVycl9mcmVlX3ByaXZfZHN0Owo+ ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJldHVybiAwOwo+ICsKPiArZXJyX2ZyZWVfcHJpdl9k c3Q6Cj4gKyAgICAgICBkbWFfZnJlZV9jb2hlcmVudCh2cHUtPmRldiwgY3R4LT52cDhfZW5jLnBy aXZfZHN0LnNpemUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMucHJp dl9kc3QuY3B1LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLnByaXZf ZHN0LmRtYSk7Cj4gKwo+ICtlcnJfZnJlZV9tdl9idWY6Cj4gKyAgICAgICBkbWFfZnJlZV9jb2hl cmVudCh2cHUtPmRldiwgY3R4LT52cDhfZW5jLm12X2J1Zi5zaXplLAo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgY3R4LT52cDhfZW5jLm12X2J1Zi5jcHUsCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICBjdHgtPnZwOF9lbmMubXZfYnVmLmRtYSk7Cj4gKwo+ICtlcnJfZnJlZV9wcml2X3Ny YzoKPiArICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KHZwdS0+ZGV2LCBjdHgtPnZwOF9lbmMucHJp dl9zcmMuc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5wcml2 X3NyYy5jcHUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMucHJpdl9z cmMuZG1hKTsKPiArCj4gK2Vycl9mcmVlX3JlZl9mcmFtZXM6Cj4gKyAgICAgICB3aGlsZSAoLS1p ID49IDApCj4gKyAgICAgICAgICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KHZwdS0+ZGV2LCBjdHgt PnZwOF9lbmMucmVmX2ZyYW1lc1tpXS5zaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjdHgtPnZwOF9lbmMucmVmX2ZyYW1lc1tpXS5jcHUsCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5yZWZfZnJhbWVzW2ldLmRtYSk7Cj4gKwo+ ICsgICAgICAgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArdm9pZCBoYW50cm9fdnA4X2VuY19leGl0 KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gK3sKPiArICAgICAgIHN0cnVjdCBoYW50cm9fZGV2 ICp2cHUgPSBjdHgtPmRldjsKPiArICAgICAgIGludCBpOwo+ICsKPiArICAgICAgIGRtYV9mcmVl X2NvaGVyZW50KHZwdS0+ZGV2LCBjdHgtPnZwOF9lbmMuY3RybF9idWYuc2l6ZSwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5jdHJsX2J1Zi5jcHUsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuY3RybF9idWYuZG1hKTsKPiArCj4gKyAgICAg ICBkbWFfZnJlZV9jb2hlcmVudCh2cHUtPmRldiwgY3R4LT52cDhfZW5jLnByaXZfZHN0LnNpemUs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMucHJpdl9kc3QuY3B1LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLnByaXZfZHN0LmRtYSk7Cj4g Kwo+ICsgICAgICAgZG1hX2ZyZWVfY29oZXJlbnQodnB1LT5kZXYsIGN0eC0+dnA4X2VuYy5tdl9i dWYuc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5tdl9idWYu Y3B1LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLm12X2J1Zi5kbWEp Owo+ICsKPiArICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KHZwdS0+ZGV2LCBjdHgtPnZwOF9lbmMu cHJpdl9zcmMuc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5w cml2X3NyYy5jcHUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMucHJp dl9zcmMuZG1hKTsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHgt PnZwOF9lbmMucmVmX2ZyYW1lcyk7ICsraSkKPiArICAgICAgICAgICAgICAgZG1hX2ZyZWVfY29o ZXJlbnQodnB1LT5kZXYsIGN0eC0+dnA4X2VuYy5yZWZfZnJhbWVzW2ldLnNpemUsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5yZWZfZnJhbWVzW2ldLmNw dSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLnJlZl9m cmFtZXNbaV0uZG1hKTsKPiArCj4gK30KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92ZXJpc2lsaWNvbi9yb2NrY2hpcF92cHUyX2h3X3ZwOF9lbmMuYyBiL2RyaXZlcnMvbWVk aWEvcGxhdGZvcm0vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1Ml9od192cDhfZW5jLmMKPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uMDhlMTk4NjA2NTA5Cj4gLS0t IC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vcm9j a2NoaXBfdnB1Ml9od192cDhfZW5jLmMKPiBAQCAtMCwwICsxLDE1NzQgQEAKPiArLy8gU1BEWC1M aWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogQ29weXJpZ2h0IChDKSAyMDIz IENvbGxhYm9yYSBMdGQuCj4gKyAqICAgICBBbmRyemVqIFBpZXRyYXNpZXdpY3ogPGFuZHJ6ZWou cEBjb2xsYWJvcmEuY29tPgo+ICsgKgo+ICsgKiBUaGlzIHdvcmsgaXMgZGVyaXZlZCBmcm9tOgo+ ICsgKgo+ICsgKiBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW1vcy90 aGlyZF9wYXJ0eS9rZXJuZWwvKy9yZWZzL2hlYWRzL2Nocm9tZW9zLTUuMTAvCj4gKyAqIGRyaXZl cnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vcmszMzk5X3ZwdV9od192cDhfZW5jLmMKPiArICoKPiAr ICogd2hpY2ggaXM6Cj4gKyAqCj4gKyAqIFJvY2tjaGlwIFZQVSBjb2RlYyBkcml2ZXIKPiArICoK PiArICogQ29weXJpZ2h0IChDKSAyMDE2IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkLgo+ ICsgKiAgICAgQWxwaGEgTGluIDxBbHBoYS5MaW5Acm9jay1jaGlwcy5jb20+Cj4gKyAqCj4gKyAq IFN1YnN0YW50aWFsIHBvcnRpb25zIGFyZSBiYXNlZCBvbiBNSVQtbGljZW5zZWQgY29kZQo+ICsg Kgo+ICsgKiBodHRwczovL2dpdGh1Yi5jb20vcm9ja2NoaXAtbGludXgvbXBwL2Jsb2IvZGV2ZWxv cC9tcHAvaGFsL3ZwdS92cDhlL2hhbF92cDhlX2VudHJvcHkue2N8aH0KPiArICogaHR0cHM6Ly9n aXRodWIuY29tL3JvY2tjaGlwLWxpbnV4L21wcC9ibG9iL2RldmVsb3AvbXBwL2hhbC92cHUvdnA4 ZS9oYWxfdnA4ZV90YWJsZS57Y3xofQo+ICsgKgo+ICsgKiB3aGljaCBpczoKPiArICoKPiArICog Q29weXJpZ2h0IChjKSAyMDE3IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkLgo+ICsgKgo+ ICsgKi8KPiArI2luY2x1ZGUgPGxpbnV4L21pbm1heC5oPgo+ICsKPiArI2luY2x1ZGUgImhhbnRy by5oIgo+ICsjaW5jbHVkZSAiaGFudHJvX2h3LmgiCj4gKyNpbmNsdWRlICJyb2NrY2hpcF92cHUy X3JlZ3MuaCIKPiArCj4gKy8qIHRocmVzaG9sZCBvZiBNQnMgY291bnQgdG8gZGlzYWJsZSBxdWFy dGVyIHBpeGVsIG12IGZvciBlbmNvZGUgc3BlZWQgKi8KPiArI2RlZmluZSBNQVhfTUJfQ09VTlRf VE9fRElTQUJMRV9RVUFSVEVSX1BJWEVMX01WICAgICAgIDM2MDAKPiArCj4gKy8qIHRocmVzaG9s ZCBvZiBNQnMgY291bnQgdG8gZGlzYWJsZSBtdWx0aSBtdiBpbiBvbmUgbWFjcm8gYmxvY2sgKi8K PiArI2RlZmluZSBNQVhfTUJfQ09VTlRfVE9fRElTQUJMRV9TUExJVF9NViAgICAgICAgICAgICAg IDE1ODQKPiArCj4gKyNkZWZpbmUgUUlOREVYX1JBTkdFIDEyOAo+ICsjZGVmaW5lIFZQOF9QUk9C X0NPVU5UX01WX09GRlNFVCAyMjIKPiArCj4gKyNkZWZpbmUgTU9ERV9ERUxUQV9CUFJFRCAgICAg ICAwCj4gKyNkZWZpbmUgTU9ERV9ERUxUQV9aRVJPTVYgICAgICAxCj4gKyNkZWZpbmUgTU9ERV9E RUxUQV9ORVdNViAgICAgICAyCj4gKyNkZWZpbmUgTU9ERV9ERUxUQV9TUExJVE1WICAgICAzCj4g Kwo+ICsjZGVmaW5lIFJFRl9ERUxUQV9JTlRSQV9NQiAgICAgMAo+ICsjZGVmaW5lIFJFRl9ERUxU QV9MQVNUX1JFRiAgICAgMQo+ICsjZGVmaW5lIFJFRl9ERUxUQV9HT0xERU4gICAgICAgMgo+ICsj ZGVmaW5lIFJFRl9ERUxUQV9BTFRfUkVGICAgICAgMwo+ICsKPiArLyogZXhwZXJpbWVudGFsbHkg Zml0dGVkLCAyNC44OTMqZXhwKDAuMDI1NDUqcXApICovCj4gK3N0YXRpYyBjb25zdCBzMzIgc3Bs aXRfcGVuYWx0eVtRSU5ERVhfUkFOR0VdID0gewo+ICsgICAgICAgMjQsIDI1LCAyNiwgMjYsIDI3 LCAyOCwgMjksIDI5LAo+ICsgICAgICAgMzAsIDMxLCAzMiwgMzIsIDMzLCAzNCwgMzUsIDM2LAo+ ICsgICAgICAgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LAo+ICsgICAgICAgNDUsIDQ3 LCA0OCwgNDksIDUwLCA1MiwgNTMsIDU0LAo+ICsgICAgICAgNTYsIDU3LCA1OSwgNjAsIDYyLCA2 MywgNjUsIDY3LAo+ICsgICAgICAgNjgsIDcwLCA3MiwgNzQsIDc2LCA3OCwgODAsIDgyLAo+ICsg ICAgICAgODQsIDg2LCA4OCwgOTEsIDkzLCA5NSwgOTgsIDEwMCwKPiArICAgICAgIDEwMywgMTA2 LCAxMDgsIDExMSwgMTE0LCAxMTcsIDEyMCwgMTIzLAo+ICsgICAgICAgMTI2LCAxMzAsIDEzMywg MTM2LCAxNDAsIDE0NCwgMTQ3LCAxNTEsCj4gKyAgICAgICAxNTUsIDE1OSwgMTYzLCAxNjcsIDE3 MiwgMTc2LCAxODEsIDE4NSwKPiArICAgICAgIDE5MCwgMTk1LCAyMDAsIDIwNSwgMjExLCAyMTYs IDIyMiwgMjI3LAo+ICsgICAgICAgMjMzLCAyMzksIDI0NSwgMjUyLCAyNTgsIDI2NSwgMjcyLCAy NzksCj4gKyAgICAgICAyODYsIDI5MywgMzAxLCAzMDksIDMxNywgMzI1LCAzMzMsIDM0MiwKPiAr ICAgICAgIDM1MSwgMzYwLCAzNjksIDM3OSwgMzg4LCAzOTgsIDQwOSwgNDE5LAo+ICsgICAgICAg NDMwLCA0NDEsIDQ1MywgNDY0LCA0NzYsIDQ4OCwgNTAxLCA1MTQsCj4gKyAgICAgICA1MjcsIDU0 MSwgNTU1LCA1NjksIDU4NCwgNTk5LCA2MTQsIDYzMAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0 IGludCBkY19xX2xvb2t1cFtRSU5ERVhfUkFOR0VdID0gewo+ICsgICAgICAgNCwgICA1LCAgIDYs ICAgNywgICA4LCAgIDksICAgMTAsICAxMCwgIDExLCAgMTIsCj4gKyAgICAgICAxMywgIDE0LCAg MTUsICAxNiwgIDE3LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMCwKPiArICAgICAgIDIxLCAgMjEs ICAyMiwgIDIyLCAgMjMsICAyMywgIDI0LCAgMjUsICAyNSwgIDI2LAo+ICsgICAgICAgMjcsICAy OCwgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsCj4gKyAgICAgICAzNywg IDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwKPiArICAgICAgIDQ2 LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LAo+ICsgICAgICAg NTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsCj4gKyAgICAg ICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwKPiArICAg ICAgIDc1LCAgNzYsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsICA4MiwgIDgzLAo+ICsg ICAgICAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTEsICA5MywgIDk1LCAgOTYsCj4g KyAgICAgICA5OCwgIDEwMCwgMTAxLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQs Cj4gKyAgICAgICAxMTYsIDExOCwgMTIyLCAxMjQsIDEyNiwgMTI4LCAxMzAsIDEzMiwgMTM0LCAx MzYsCj4gKyAgICAgICAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0OCwgMTUxLCAxNTQsIDE1Nwo+ICt9 Owo+ICsKPiArc3RhdGljIGNvbnN0IGludCBhY19xX2xvb2t1cFtRSU5ERVhfUkFOR0VdID0gewo+ ICsgICAgICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAgMTAsICAxMSwgIDEyLCAgMTMs Cj4gKyAgICAgICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAy MywKPiArICAgICAgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwg IDMzLAo+ICsgICAgICAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQy LCAgNDMsCj4gKyAgICAgICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAg NTIsICA1MywKPiArICAgICAgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA2MCwgIDYyLCAgNjQs ICA2NiwgIDY4LAo+ICsgICAgICAgNzAsICA3MiwgIDc0LCAgNzYsICA3OCwgIDgwLCAgODIsICA4 NCwgIDg2LCAgODgsCj4gKyAgICAgICA5MCwgIDkyLCAgOTQsICA5NiwgIDk4LCAgMTAwLCAxMDIs IDEwNCwgMTA2LCAxMDgsCj4gKyAgICAgICAxMTAsIDExMiwgMTE0LCAxMTYsIDExOSwgMTIyLCAx MjUsIDEyOCwgMTMxLCAxMzQsCj4gKyAgICAgICAxMzcsIDE0MCwgMTQzLCAxNDYsIDE0OSwgMTUy LCAxNTUsIDE1OCwgMTYxLCAxNjQsCj4gKyAgICAgICAxNjcsIDE3MCwgMTczLCAxNzcsIDE4MSwg MTg1LCAxODksIDE5MywgMTk3LCAyMDEsCj4gKyAgICAgICAyMDUsIDIwOSwgMjEzLCAyMTcsIDIy MSwgMjI1LCAyMjksIDIzNCwgMjM5LCAyNDUsCj4gKyAgICAgICAyNDksIDI1NCwgMjU5LCAyNjQs IDI2OSwgMjc0LCAyNzksIDI4NAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHMzMiBxcm91bmRp bmdfZmFjdG9yc1tRSU5ERVhfUkFOR0VdID0gewo+ICsgICAgICAgNTYsIDU2LCA1NiwgNTYsIDU2 LCA1NiwgNTYsIDU2LCA0OCwgNDgsCj4gKyAgICAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0 OCwgNDgsIDQ4LCA0OCwKPiArICAgICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwg NDgsIDQ4LAo+ICsgICAgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgs Cj4gKyAgICAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKPiArICAg ICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAo+ICsgICAgICAgNDgs IDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsCj4gKyAgICAgICA0OCwgNDgsIDQ4 LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwKPiArICAgICAgIDQ4LCA0OCwgNDgsIDQ4LCA0 OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LAo+ICsgICAgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwg NDgsIDQ4LCA0OCwgNDgsCj4gKyAgICAgICA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgs IDQ4LCA0OCwKPiArICAgICAgIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4 LAo+ICsgICAgICAgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4Cj4gK307Cj4gKwo+ICtz dGF0aWMgY29uc3QgczMyIHF6YmluX2ZhY3RvcnNbUUlOREVYX1JBTkdFXSA9IHsKPiArICAgICAg IDY0LCA2NCwgNjQsIDY0LCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAo+ICsgICAgICAgODAsIDgw LCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCj4gKyAgICAgICA4MCwgODAsIDgwLCA4 MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKPiArICAgICAgIDgwLCA4MCwgODAsIDgwLCA4MCwg ODAsIDgwLCA4MCwgODAsIDgwLAo+ICsgICAgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAs IDgwLCA4MCwgODAsCj4gKyAgICAgICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgw LCA4MCwKPiArICAgICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAo+ ICsgICAgICAgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCj4gKyAgICAg ICA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwKPiArICAgICAgIDgwLCA4 MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLAo+ICsgICAgICAgODAsIDgwLCA4MCwg ODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsCj4gKyAgICAgICA4MCwgODAsIDgwLCA4MCwgODAs IDgwLCA4MCwgODAsIDgwLCA4MCwKPiArICAgICAgIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgw LCA4MAo+ICt9Owo+ICsKPiArLyogSW50cmEgMTZ4MTYgbW9kZSB0cmVlIHBlbmFsdHkgdmFsdWVz ICovCj4gK3N0YXRpYyBzMzIgaW50cmFfMTZfdHJlZV9wZW5hbHR5W10gPSB7Cj4gKyAgICAgICAz MDUsIDg0MSwgOTE0LCAxMDgyCj4gK307Cj4gKwo+ICsvKiBJbnRyYSA0eDQgbW9kZSB0cmVlIHBl bmFsdHkgdmFsdWVzICovCj4gK3N0YXRpYyBzMzIgaW50cmFfNF90cmVlX3BlbmFsdHlbXSA9IHsK PiArICAgICAgIDI4MCwgNjIyLCA4MzIsIDExNzcsIDEyNDAsIDEzNDEsIDEwODUsIDEyNTksIDEz NTcsIDE0OTUKPiArfTsKPiArCj4gKwo+ICtpbnQzMl90IGNvbnN0IG9mZnNldF90YmxbXSA9IHsK PiArICAgICAgIC0xLCAtMSwgLTEsICAwLCAgMSwgIDIsIC0xLCAgMywgIDQsIC0xLCAgNSwgIDYs IC0xLCAgNywgIDgsIC0xLAo+ICsgICAgICAgOSwgMTAsIC0xLCAxMSwgMTIsIDEzLCAxNCwgMTUs IC0xLCAxNiwgMTcsIC0xLCAxOCwgMTksIC0xLCAyMCwKPiArICAgICAgIDIxLCAtMSwgMjIsIDIz LCAtMSwgMjQsIDI1LCAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAtMSwgMzEsIDMyLAo+ICsgICAg ICAgLTEsIDMzLCAzNCwgLTEsIDM1LCAzNiwgLTEsIDM3LCAzOCwgLTEsIDM5LCA0MCwgLTEsIDQx LCA0MiwgNDMsCj4gKyAgICAgICA0NCwgNDUsIC0xLCA0NiwgNDcsIC0xLCA0OCwgNDksIC0xLCA1 MCwgNTEsIC0xLCA1MiwgNTMsIC0xLCA1NCwKPiArICAgICAgIDU1LCAtMSwgNTYsIDU3LCAtMSwg LTEsIC0xLCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LAo+ICsgICAgICAgNjcs IDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwg ODIsCj4gKyAgICAgICA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMs IDk0LCA5NSwgOTYsIDk3LCA5OCwKPiArICAgICAgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEw NCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LAo+ICsg ICAgICAgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAx MjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAo+ICsgICAgICAgMTMxLCAxMzIsIDEzMywgMTM0 LCAxMzUsIDEzNiwgMTM3LCAxMzgsIC0xLCAtMSwgLTEsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQz LAo+ICsgICAgICAgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1Miwg MTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAo+ICsgICAgICAgMTYwLCAxNjEsIDE2 MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMs IDE3NCwgMTc1LAo+ICsgICAgICAgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAx ODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLAo+ICsgICAgICAgMTky LCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywg MjA0LCAyMDUsIDIwNiwgMjA3LAo+ICsgICAgICAgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIx MywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOQo+ICt9Owo+ICsKPiArLyogfnJvdW5kKCgy KigyK2V4cCgoeCsyMikvMzkpKSArICgyK2V4cCgoeCsxNSkvMzIpKSkvMykgKi8KPiArc3RhdGlj IHMzMiB3ZWlnaHRbUUlOREVYX1JBTkdFXSA9IHsKPiArICAgICAgIDQsICA0LCAgNCwgIDQsICA0 LCAgNCwgIDQsICA0LCAgNCwgIDQsCj4gKyAgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA1 LCAgNSwgIDUsICA1LAo+ICsgICAgICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2 LCAgNiwKPiArICAgICAgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsCj4g KyAgICAgICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LAo+ICsgICAgICAg OCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwKPiArICAgICAgIDEwLCAxMSwg MTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLAo+ICsgICAgICAgMTQsIDE0LCAxNCwgMTQs IDE1LCAxNSwgMTUsIDE2LCAxNiwgMTcsCj4gKyAgICAgICAxNywgMTgsIDE4LCAxOSwgMTksIDIw LCAyMCwgMjAsIDIxLCAyMiwKPiArICAgICAgIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAy NywgMjgsIDI4LAo+ICsgICAgICAgMjksIDMwLCAzMSwgMzIsIDMyLCAzMywgMzQsIDM1LCAzNiwg MzcsCj4gKyAgICAgICAzOCwgMzksIDQwLCA0MSwgNDIsIDQ0LCA0NCwgNDYsIDQ3LCA0OCwKPiAr ICAgICAgIDUwLCA1MSwgNTIsIDU0LCA1NSwgNTcsIDU4LCA2MQo+ICt9Owo+ICsKPiArc3RydWN0 IHRyZWUgewo+ICsgICAgICAgczMyIHZhbHVlOyAgICAgICAvKiBCaXRzIGRlc2NyaWJlIHRoZSBi b29sIHRyZWUgICovCj4gKyAgICAgICBzMzIgbnVtYmVyOyAgICAgIC8qIE51bWJlciwgdmFsaWQg Yml0IGNvdW50IGluIGFib3ZlIHRyZWUgKi8KPiArICAgICAgIHMzMiBpbmRleFs5XTsgICAgLyog UHJvYmFiaWxpdHkgdGFibGUgaW5kZXggKi8KPiArfTsKPiArCj4gKy8qIE1vdGlvbiB2ZWN0b3Ig dHJlZSAqLwo+ICtzdGF0aWMgc3RydWN0IHRyZWUgbXZfdHJlZVtdID0gewo+ICsgICAgICAgeyAw LCAzLCB7IDAsIDEsIDIgfSB9LCAgICAgICAgLyogbXZfMCAwMDAgKi8KPiArICAgICAgIHsgMSwg MywgeyAwLCAxLCAyIH0gfSwgICAgICAgIC8qIG12XzEgMDAxICovCj4gKyAgICAgICB7IDIsIDMs IHsgMCwgMSwgMyB9IH0sICAgICAgICAvKiBtdl8yIDAxMCAqLwo+ICsgICAgICAgeyAzLCAzLCB7 IDAsIDEsIDMgfSB9LCAgICAgICAgLyogbXZfMyAwMTEgKi8KPiArICAgICAgIHsgNCwgMywgeyAw LCA0LCA1IH0gfSwgICAgICAgIC8qIG12XzQgMTAwICovCj4gKyAgICAgICB7IDUsIDMsIHsgMCwg NCwgNSB9IH0sICAgICAgICAvKiBtdl81IDEwMSAqLwo+ICsgICAgICAgeyA2LCAzLCB7IDAsIDQs IDYgfSB9LCAgICAgICAgLyogbXZfNiAxMTAgKi8KPiArICAgICAgIHsgNywgMywgeyAwLCA0LCA2 IH0gfSwgICAgICAgIC8qIG12XzcgMTExICovCj4gK307Cj4gKwo+ICsvKiBJZiBwcm9iYWJpbGl0 eSBiZWluZyB6ZXJvIGlzIHAsIHRoZW4gYXZlcmFnZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGVu Y29kZSAwCj4gKyAqIGlzIGxvZzIoMS9wKSwgdG8gZW5jb2RlIDEgaXMgbG9nMigxLygxLXApKS4K PiArICoKPiArICogRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyB6ZXJv IGlzIDAuNQo+ICsgKiBiaW4gPSAwIC0+IGF2ZXJhZ2UgYml0cyB1c2VkIGlzIGxvZzIoMS8wLjUp ICAgICAgPSAxIGJpdHMvYmluCj4gKyAqIGJpbiA9IDEgLT4gYXZlcmFnZSBiaXRzIHVzZWQgaXMg bG9nMigxLygxIC0gMC41KSA9IDEgYml0cy9iaW4KPiArICoKPiArICogRm9yIGV4YW1wbGUsIGlm IHRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyB6ZXJvIGlzIDAuOTUKPiArICogYmluID0gMCAtPiBh dmVyYWdlIGJpdHMgdXNlZCBpcyBsb2cyKDEvMC45NSkgICAgICA9IDAuMDc0IGJpdHMvYmluCj4g KyAqIGJpbiA9IDEgLT4gYXZlcmFnZSBiaXRzIHVzZWQgaXMgbG9nMigxLygxIC0gMC45NSkgPSA0 LjMyMSBiaXRzL2Jpbgo+ICsgKgo+ICsgKiBUaGUgY29zdFtwXSBpcyBhdmVyYWdlIG51bWJlciBv ZiBiaXRzIHVzZWQgdG8gZW5jb2RlIDAgaWYgdGhlIHByb2JhYmlsaXR5IGlzCj4gKyAqIHAgLyAy NTYsIHNjYWxlZCBieSBhIG1hZ2ljIG51bWJlciAyNTYsCj4gKyAqIGkuZS4sIGNvc3RbcF0gPSBy b3VuZChsb2cyKDI1NiAvIHApICogMjU2KS4KPiArICovCj4gK3N0YXRpYyBjb25zdCBzMzIgdnA4 X3Byb2JfY29zdFtdID0gewo+ICsgICAgICAgMjA0OCwgMjA0OCwgMTc5MiwgMTY0MiwgMTUzNiwg MTQ1NCwgMTM4NiwgMTMyOSwgMTI4MCwgMTIzNiwKPiArICAgICAgIDExOTgsIDExNjIsIDExMzAs IDExMDEsIDEwNzMsIDEwNDgsIDEwMjQsIDEwMDIsICA5ODAsICA5NjEsCj4gKyAgICAgICA5NDIs ICA5MjQsICA5MDYsICA4OTAsICA4NzQsICA4NTksICA4NDUsICA4MzEsICA4MTcsICA4MDQsCj4g KyAgICAgICA3OTIsICA3ODAsICA3NjgsICA3NTcsICA3NDYsICA3MzUsICA3MjQsICA3MTQsICA3 MDUsICA2OTUsCj4gKyAgICAgICA2ODYsICA2NzYsICA2NjgsICA2NTksICA2NTAsICA2NDIsICA2 MzQsICA2MjYsICA2MTgsICA2MTEsCj4gKyAgICAgICA2MDMsICA1OTYsICA1ODksICA1ODIsICA1 NzUsICA1NjgsICA1NjEsICA1NTUsICA1NDgsICA1NDIsCj4gKyAgICAgICA1MzYsICA1MzAsICA1 MjQsICA1MTgsICA1MTIsICA1MDYsICA1MDEsICA0OTUsICA0OTAsICA0ODQsCj4gKyAgICAgICA0 NzksICA0NzQsICA0NjgsICA0NjMsICA0NTgsICA0NTMsICA0NDksICA0NDQsICA0MzksICA0MzQs Cj4gKyAgICAgICA0MzAsICA0MjUsICA0MjAsICA0MTYsICA0MTIsICA0MDcsICA0MDMsICAzOTks ICAzOTQsICAzOTAsCj4gKyAgICAgICAzODYsICAzODIsICAzNzgsICAzNzQsICAzNzAsICAzNjYs ICAzNjIsICAzNTgsICAzNTUsICAzNTEsCj4gKyAgICAgICAzNDcsICAzNDMsICAzNDAsICAzMzYs ICAzMzMsICAzMjksICAzMjYsICAzMjIsICAzMTksICAzMTUsCj4gKyAgICAgICAzMTIsICAzMDks ICAzMDUsICAzMDIsICAyOTksICAyOTYsICAyOTIsICAyODksICAyODYsICAyODMsCj4gKyAgICAg ICAyODAsICAyNzcsICAyNzQsICAyNzEsICAyNjgsICAyNjUsICAyNjIsICAyNTksICAyNTYsICAy NTMsCj4gKyAgICAgICAyNTAsICAyNDcsICAyNDUsICAyNDIsICAyMzksICAyMzYsICAyMzQsICAy MzEsICAyMjgsICAyMjYsCj4gKyAgICAgICAyMjMsICAyMjAsICAyMTgsICAyMTUsICAyMTIsICAy MTAsICAyMDcsICAyMDUsICAyMDIsICAyMDAsCj4gKyAgICAgICAxOTcsICAxOTUsICAxOTMsICAx OTAsICAxODgsICAxODUsICAxODMsICAxODEsICAxNzgsICAxNzYsCj4gKyAgICAgICAxNzQsICAx NzEsICAxNjksICAxNjcsICAxNjQsICAxNjIsICAxNjAsICAxNTgsICAxNTYsICAxNTMsCj4gKyAg ICAgICAxNTEsICAxNDksICAxNDcsICAxNDUsICAxNDMsICAxNDAsICAxMzgsICAxMzYsICAxMzQs ICAxMzIsCj4gKyAgICAgICAxMzAsICAxMjgsICAxMjYsICAxMjQsICAxMjIsICAxMjAsICAxMTgs ICAxMTYsICAxMTQsICAxMTIsCj4gKyAgICAgICAxMTAsICAxMDgsICAxMDYsICAxMDQsICAxMDIs ICAxMDEsICAgOTksICAgOTcsICAgOTUsICAgOTMsCj4gKyAgICAgICA5MSwgICA4OSwgICA4Nywg ICA4NiwgICA4NCwgICA4MiwgICA4MCwgICA3OCwgICA3NywgICA3NSwKPiArICAgICAgIDczLCAg IDcxLCAgIDcwLCAgIDY4LCAgIDY2LCAgIDY0LCAgIDYzLCAgIDYxLCAgIDU5LCAgIDU4LAo+ICsg ICAgICAgNTYsICAgNTQsICAgNTMsICAgNTEsICAgNDksICAgNDgsICAgNDYsICAgNDQsICAgNDMs ICAgNDEsCj4gKyAgICAgICA0MCwgICAzOCwgICAzNiwgICAzNSwgICAzMywgICAzMiwgICAzMCwg ICAyOCwgICAyNywgICAyNSwKPiArICAgICAgIDI0LCAgIDIyLCAgIDIxLCAgIDE5LCAgIDE4LCAg IDE2LCAgIDE1LCAgIDEzLCAgIDEyLCAgIDEwLAo+ICsgICAgICAgOSwgICAgNywgICAgNiwgICAg NCwgICAgMywgICAgMQo+ICt9Owo+ICsKPiArLyogQXBwcm94aW1hdGUgYml0IGNvc3Qgb2YgYmlu IGF0IGdpdmVuIHByb2JhYmlsaXR5IHByb2IgKi8KPiArI2RlZmluZSBDT1NUX0JPT0wocHJvYiwg YmluKSAgIHZwOF9wcm9iX2Nvc3RbKGJpbikgPyAyNTUgLSAocHJvYikgOiAocHJvYildCj4gKwo+ ICt1aW50MzJfdCBjb25zdCBjb2VmZl91cGRhdGVfcHJvYls0XVs4XVszXVsxMV0gPSB7Cj4gKyAg ICAgICB7Cj4gKyAgICAgICAgICAgICAgIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAg ICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxNzYsIDI0NiwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgezIyMywgMjQxLCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjQ5LCAyNTMsIDI1MywgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7 Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjQ0LCAyNTIsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjM0 LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgIHsyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAg ICAgICAgICAgICAgICB7MjU1LCAyNDYsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMzksIDI1MywgMjU0LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgezI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAg IHsyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0s Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1MSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsg ICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjUzLCAy NTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAg ICAgICAgICAgICAgICB7MjUxLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU0LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAg IH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTQsIDI1MywgMjU1LCAyNTQs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAg IHsyNTAsIDI1NSwgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0s Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAg ICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAg ICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LAo+ICsgICAgICAgfSwgewo+ICsgICAg ICAgICAgICAgICB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezIxNywgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAg ICAgICAgICB7MjI1LCAyNTIsIDI0MSwgMjUzLCAyNTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1 LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMzQsIDI1MCwgMjQxLCAyNTAsIDI1 MywgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsK PiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMjMs IDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgezIzOCwgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI0OSwgMjU0LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAg ICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAg ezI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwK PiArICAgICAgICAgICAgICAgICAgICAgICB7MjQ3LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAg ICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTMsIDI1 NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAg fSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ezI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwK PiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgezI1NSwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjUwLCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAg ICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAy NTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwK PiArICAgICAgICAgICAgICAgfSwKPiArICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgewo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsxODYsIDI1MSwgMjUwLCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezIzNCwg MjUxLCAyNDQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAg ICAgICAgICAgICAgICAgICAgICB7MjUxLCAyNTEsIDI0MywgMjUzLCAyNTQsIDI1NSwgMjU0LCAy NTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAg ICAgICAgICAgICAgezI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjM2LCAyNTMsIDI1NCwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHsyNTEsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTQsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAg ICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NCwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgezI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU0LCAyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9 LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAg ICAgICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAg ICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAy NTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAg ICAgICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1 LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAg ICAgIH0sCj4gKyAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgIHsKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjQ4LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTAsIDI1NCwgMjUyLCAyNTQs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgezI0OCwgMjU0LCAyNDksIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsy NTUsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgezI0NiwgMjUzLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjUyLCAy NTQsIDI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAg ICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU0LCAyNTIs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjQ4LCAyNTQsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTMsIDI1NSwgMjU0LCAyNTQs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgIH0s IHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsy NDUsIDI1MSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgezI1MywgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAg ICAgICAgICAgICAgICAgIHsyNTUsIDI1MSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1MiwgMjUzLCAyNTQs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgezI1NSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjQ5LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsy NTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4g KyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTUs IDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgIHsyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwg MjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1NSwgMjU1LCAyNTUs IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSwKPiArICAgICAgICAgICAg ICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgezI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1 fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9LAo+ICsgICAgICAgICAgICAgICB9LAo+ICsgICAg ICAgfSwKPiArfTsKPiArCj4gK3VpbnQzMl90IGNvbnN0IG12X3VwZGF0ZV9wcm9iWzJdWzE5XSA9 IHsKPiArICAgICAgIHsKPiArICAgICAgICAgICAgICAgMjM3LCAyNDYsIDI1MywgMjUzLCAyNTQs IDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LAo+ICsgICAgICAgICAgICAgICAyNTQsIDI1NCwgMjU0 LCAyNTQsIDI1MCwgMjUwLCAyNTIsIDI1NCwgMjU0Cj4gKyAgICAgICB9LCB7Cj4gKyAgICAgICAg ICAgICAgIDIzMSwgMjQzLCAyNDUsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwK PiArICAgICAgICAgICAgICAgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTEsIDI1MSwgMjU0LCAyNTQs IDI1NAo+ICsgICAgICAgfQo+ICt9Owo+ICsKPiArdWludDhfdCBjb25zdCBkZWZhdWx0X3Byb2Jf c2tpcF9mYWxzZVsxMjhdID0gewo+ICsgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsCj4gKyAgICAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUs IDI1NSwKPiArICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAo+ ICsgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCj4gKyAgICAg ICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKPiArICAgICAgIDI1NSwg MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAo+ICsgICAgICAgMjU1LCAyNTUsIDI1 NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCj4gKyAgICAgICAyNTEsIDI0OCwgMjQ0LCAyNDAs IDIzNiwgMjMyLCAyMjksIDIyNSwKPiArICAgICAgIDIyMSwgMjE3LCAyMTMsIDIwOCwgMjA0LCAx OTksIDE5NCwgMTkwLAo+ICsgICAgICAgMTg3LCAxODMsIDE3OSwgMTc1LCAxNzIsIDE2OCwgMTY0 LCAxNjAsCj4gKyAgICAgICAxNTcsIDE1MywgMTQ5LCAxNDUsIDE0MiwgMTM4LCAxMzQsIDEzMCwK PiArICAgICAgIDEyNywgMTI0LCAxMjAsIDExNywgMTE0LCAxMTAsIDEwNywgMTA0LAo+ICsgICAg ICAgMTAxLCA5OCwgIDk1LCAgOTIsICA4OSwgIDg2LCAgODMsIDgwLAo+ICsgICAgICAgNzcsICA3 NCwgIDcxLCAgNjgsICA2NSwgIDYyLCAgNTksIDU2LAo+ICsgICAgICAgNTMsICA1MCwgIDQ3LCAg NDQsICA0MSwgIDM4LCAgMzUsIDMyLAo+ICsgICAgICAgMzAsICAyOCwgIDI2LCAgMjQsICAyMiwg IDIwLCAgMTgsIDE2LAo+ICt9Owo+ICsKPiAraW50MzJfdCBjb25zdCB5X21vZGVfcHJvYls0XSA9 IHsKPiArICAgICAgIDExMiwgODYsIDE0MCwgMzcKPiArfTsKPiArCj4gK2ludDMyX3QgY29uc3Qg dXZfbW9kZV9wcm9iWzNdID0gewo+ICsgICAgICAgMTYyLCAxMDEsIDIwNAo+ICt9Owo+ICsKPiAr dWludDMyX3QgY29uc3QgZGVmYXVsdF9wcm9iX2NvZWZmWzRdWzhdWzNdWzExXSA9IHsKPiArICAg ICAgIHsKPiArICAgICAgICAgICAgICAgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxMjgs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgezEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTI4LCAxMjgs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAg ICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI1MywgMTM2LCAyNTQsIDI1 NSwgMjI4LCAyMTksIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAg ICAgICAgICB7MTg5LCAxMjksIDI0MiwgMjU1LCAyMjcsIDIxMywgMjU1LCAyMTksIDEyOCwgMTI4 LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxMDYsIDEyNiwgMjI3LCAyNTIsIDIx NCwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsK PiArICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAgOTgsIDI0OCwgMjU1LCAyMzYsIDIyNiwg MjU1LCAyNTUsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxODEs IDEzMywgMjM4LCAyNTQsIDIyMSwgMjM0LCAyNTUsIDE1NCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgeyA3OCwgMTM0LCAyMDIsIDI0NywgMTk4LCAxODAsIDI1NSwg MjE5LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsgIDEsIDE4NSwgMjQ5LCAyNTUsIDI0MywgMjU1LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezE4NCwgMTUwLCAyNDcsIDI1 NSwgMjM2LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAg ICAgICAgICB7IDc3LCAxMTAsIDIxNiwgMjU1LCAyMzYsIDIzMCwgMTI4LCAxMjgsIDEyOCwgMTI4 LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAg eyAgMSwgMTAxLCAyNTEsIDI1NSwgMjQxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwK PiArICAgICAgICAgICAgICAgICAgICAgICB7MTcwLCAxMzksIDI0MSwgMjUyLCAyMzYsIDIwOSwg MjU1LCAyNTUsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgMzcs IDExNiwgMTk2LCAyNDMsIDIyOCwgMjU1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAg ICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAyMDQsIDI1 NCwgMjU1LCAyNDUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyMDcsIDE2MCwgMjUwLCAyNTUsIDIzOCwgMTI4LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezEwMiwgMTAzLCAyMzEsIDI1 NSwgMjExLCAxNzEsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAg fSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDE1MiwgMjUyLCAyNTUsIDI0MCwg MjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ezE3NywgMTM1LCAyNDMsIDI1NSwgMjM0LCAyMjUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwK PiArICAgICAgICAgICAgICAgICAgICAgICB7IDgwLCAxMjksIDIxMSwgMjU1LCAxOTQsIDIyNCwg MTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgeyAgMSwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjQ2LCAgIDEsIDI1 NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHsyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sCj4gKyAgICAgICB9LCB7Cj4gKyAgICAg ICAgICAgICAgIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTk4LCAgMzUsIDIzNywgMjIz LCAxOTMsIDE4NywgMTYyLCAxNjAsIDE0NSwgMTU1LCAgNjJ9LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHsxMzEsICA0NSwgMTk4LCAyMjEsIDE3MiwgMTc2LCAyMjAsIDE1NywgMjUyLCAyMjEs ICAgMX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyA2OCwgIDQ3LCAxNDYsIDIwOCwgMTQ5 LCAxNjcsIDIyMSwgMTYyLCAyNTUsIDIyMywgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDE0OSwgMjQxLCAyNTUsIDIyMSwgMjI0LCAy NTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezE4NCwg MTQxLCAyMzQsIDI1MywgMjIyLCAyMjAsIDI1NSwgMTk5LCAxMjgsIDEyOCwgMTI4fSwKPiArICAg ICAgICAgICAgICAgICAgICAgICB7IDgxLCAgOTksIDE4MSwgMjQyLCAxNzYsIDE5MCwgMjQ5LCAy MDIsIDI1NSwgMjU1LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAg ICAgICAgICAgICAgeyAgMSwgMTI5LCAyMzIsIDI1MywgMjE0LCAxOTcsIDI0MiwgMTk2LCAyNTUs IDI1NSwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7IDk5LCAxMjEsIDIxMCwgMjUw LCAyMDEsIDE5OCwgMjU1LCAyMDIsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHsgMjMsICA5MSwgMTYzLCAyNDIsIDE3MCwgMTg3LCAyNDcsIDIxMCwgMjU1LCAyNTUs IDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7 ICAxLCAyMDAsIDI0NiwgMjU1LCAyMzQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsxMDksIDE3OCwgMjQxLCAyNTUsIDIzMSwgMjQ1LCAy NTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyA0NCwg MTMwLCAyMDEsIDI1MywgMjA1LCAxOTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4fSwKPiArICAg ICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDEzMiwgMjM5 LCAyNTEsIDIxOSwgMjA5LCAyNTUsIDE2NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgeyA5NCwgMTM2LCAyMjUsIDI1MSwgMjE4LCAxOTAsIDI1NSwgMjU1LCAxMjgs IDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7IDIyLCAxMDAsIDE3NCwgMjQ1 LCAxODYsIDE2MSwgMjU1LCAxOTksIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9 LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMTgyLCAyNDksIDI1NSwgMjMyLCAy MzUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MTI0LCAxNDMsIDI0MSwgMjU1LCAyMjcsIDIzNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIHsgMzUsICA3NywgMTgxLCAyNTEsIDE5MywgMjExLCAy NTUsIDIwNSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAg ICAgICAgICAgICAgICAgICB7ICAxLCAxNTcsIDI0NywgMjU1LCAyMzYsIDIzMSwgMjU1LCAyNTUs IDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxMjEsIDE0MSwgMjM1 LCAyNTUsIDIyNSwgMjI3LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgeyA0NSwgIDk5LCAxODgsIDI1MSwgMTk1LCAyMTcsIDI1NSwgMjI0LCAxMjgs IDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAg ICAgIHsgIDEsICAgMSwgMjUxLCAyNTUsIDIxMywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEy OH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezIwMywgICAxLCAyNDgsIDI1NSwgMjU1LCAx MjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7 MTM3LCAgIDEsIDE3NywgMjU1LCAyMjQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ ICsgICAgICAgICAgICAgICB9LAo+ICsgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICB7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgezI1MywgICA5LCAyNDgsIDI1MSwgMjA3LCAyMDgsIDI1 NSwgMTkyLCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTc1LCAg MTMsIDIyNCwgMjQzLCAxOTMsIDE4NSwgMjQ5LCAxOTgsIDI1NSwgMjU1LCAxMjh9LAo+ICsgICAg ICAgICAgICAgICAgICAgICAgIHsgNzMsICAxNywgMTcxLCAyMjEsIDE2MSwgMTc5LCAyMzYsIDE2 NywgMjU1LCAyMzQsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAg ICAgICAgICAgICB7ICAxLCAgOTUsIDI0NywgMjUzLCAyMTIsIDE4MywgMjU1LCAyNTUsIDEyOCwg MTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMzksICA5MCwgMjQ0LCAyNTAs IDIxMSwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgezE1NSwgIDc3LCAxOTUsIDI0OCwgMTg4LCAxOTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwg MTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsg IDEsICAyNCwgMjM5LCAyNTEsIDIxOCwgMjE5LCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOH0sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgezIwMSwgIDUxLCAyMTksIDI1NSwgMTk2LCAxODYsIDEy OCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7IDY5LCAg NDYsIDE5MCwgMjM5LCAyMDEsIDIxOCwgMjU1LCAyMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAg ICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMTkxLCAyNTEs IDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjIzLCAxNjUsIDI0OSwgMjU1LCAyMTMsIDI1NSwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxNDEsIDEyNCwgMjQ4LCAyNTUs IDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0s IHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAgMTYsIDI0OCwgMjU1LCAyNTUsIDEy OCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsx OTAsICAzNiwgMjMwLCAyNTUsIDIzNiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgezE0OSwgICAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEy OCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAg ICAgICAgICAgICAgICAgIHsgIDEsIDIyNiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezI0NywgMTkyLCAyNTUs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAg ICAgICAgICAgICB7MjQwLCAxMjgsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgeyAgMSwgMTM0LCAyNTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4 fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MjEzLCAgNjIsIDI1MCwgMjU1LCAyNTUsIDEy OCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsg NTUsICA5MywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4g KyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTI4LCAxMjgs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgIHsxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwg MTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezEyOCwgMTI4LCAxMjgs IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAg ICAgfSwKPiArICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgewo+ICsgICAgICAgICAgICAg ICAgICAgICAgIHsyMDIsICAyNCwgMjEzLCAyMzUsIDE4NiwgMTkxLCAyMjAsIDE2MCwgMjQwLCAx NzUsIDI1NX0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezEyNiwgIDM4LCAxODIsIDIzMiwg MTY5LCAxODQsIDIyOCwgMTc0LCAyNTUsIDE4NywgMTI4fSwKPiArICAgICAgICAgICAgICAgICAg ICAgICB7IDYxLCAgNDYsIDEzOCwgMjE5LCAxNTEsIDE3OCwgMjQwLCAxNzAsIDI1NSwgMjE2LCAx Mjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAg MSwgMTEyLCAyMzAsIDI1MCwgMTk5LCAxOTEsIDI0NywgMTU5LCAyNTUsIDI1NSwgMTI4fSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICB7MTY2LCAxMDksIDIyOCwgMjUyLCAyMTEsIDIxNSwgMjU1 LCAxNzQsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgMzksICA3 NywgMTYyLCAyMzIsIDE3MiwgMTgwLCAyNDUsIDE3OCwgMjU1LCAyNTUsIDEyOH0sCj4gKyAgICAg ICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAgNTIsIDIyMCwg MjQ2LCAxOTgsIDE5OSwgMjQ5LCAyMjAsIDI1NSwgMjU1LCAxMjh9LAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIHsxMjQsICA3NCwgMTkxLCAyNDMsIDE4MywgMTkzLCAyNTAsIDIyMSwgMjU1LCAy NTUsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAyNCwgIDcxLCAxMzAsIDIxOSwg MTU0LCAxNzAsIDI0MywgMTgyLCAyNTUsIDI1NSwgMTI4fSwKPiArICAgICAgICAgICAgICAgfSwg ewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDE4MiwgMjI1LCAyNDksIDIxOSwgMjQw LCAyNTUsIDIyNCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgezE0 OSwgMTUwLCAyMjYsIDI1MiwgMjE2LCAyMDUsIDI1NSwgMTcxLCAxMjgsIDEyOCwgMTI4fSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICB7IDI4LCAxMDgsIDE3MCwgMjQyLCAxODMsIDE5NCwgMjU0 LCAyMjMsIDI1NSwgMjU1LCAxMjh9LAo+ICsgICAgICAgICAgICAgICB9LCB7Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgeyAgMSwgIDgxLCAyMzAsIDI1MiwgMjA0LCAyMDMsIDI1NSwgMTkyLCAx MjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7MTIzLCAxMDIsIDIwOSwg MjQ3LCAxODgsIDE5NiwgMjU1LCAyMzMsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIHsgMjAsICA5NSwgMTUzLCAyNDMsIDE2NCwgMTczLCAyNTUsIDIwMywgMTI4LCAx MjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgICAgICAg ICB7ICAxLCAyMjIsIDI0OCwgMjU1LCAyMTYsIDIxMywgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9 LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsxNjgsIDE3NSwgMjQ2LCAyNTIsIDIzNSwgMjA1 LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyA0 NywgMTE2LCAyMTUsIDI1NSwgMjExLCAyMTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4fSwKPiAr ICAgICAgICAgICAgICAgfSwgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDEyMSwg MjM2LCAyNTMsIDIxMiwgMjE0LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgezE0MSwgIDg0LCAyMTMsIDI1MiwgMjAxLCAyMDIsIDI1NSwgMjE5LCAx MjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAgICB7IDQyLCAgODAsIDE2MCwg MjQwLCAxNjIsIDE4NSwgMjU1LCAyMDUsIDEyOCwgMTI4LCAxMjh9LAo+ICsgICAgICAgICAgICAg ICB9LCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgICAxLCAyNTUsIDEyOCwgMTI4 LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4fSwKPiArICAgICAgICAgICAgICAgICAgICAg ICB7MjQ0LCAgIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjh9 LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHsyMzgsICAgMSwgMjU1LCAxMjgsIDEyOCwgMTI4 LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH0sCj4gKyAgICAgICAgICAgICAgIH0sCj4gKyAgICAg ICB9Cj4gK307Cj4gKwo+ICt1aW50MzJfdCBjb25zdCBkZWZhdWx0X3Byb2JfbXZbMl1bMTldID0g ewo+ICsgICAgICAgewo+ICsgICAgICAgICAgICAgICAxNjIsIDEyOCwgMjI1LCAxNDYsIDE3Miwg MTQ3LCAyMTQsICAzOSwgMTU2LCAxMjgsCj4gKyAgICAgICAgICAgICAgIDEyOSwgMTMyLCAgNzUs IDE0NSwgMTc4LCAyMDYsIDIzOSwgMjU0LCAyNTQsCj4gKyAgICAgICB9LCB7Cj4gKyAgICAgICAg ICAgICAgIDE2NCwgMTI4LCAyMDQsIDE3MCwgMTE5LCAyMzUsIDE0MCwgMjMwLCAyMjgsIDEyOCwK PiArICAgICAgICAgICAgICAgMTMwLCAxMzAsICA3NCwgMTQ4LCAxODAsIDIwMywgMjM2LCAyNTQs IDI1NCwKPiArICAgICAgIH0sCj4gK307Cj4gKwo+ICtzdHJ1Y3QgaGFudHJvX3ZwOF9lbmNfY3Ry bF9idWYgewo+ICsgICAgICAgdTMyIGh3X2hkcl9zaXplOwo+ICsgICAgICAgdTMyIGRjdF9zaXpl Owo+ICsgICAgICAgdTggcmVzZXJ2ZWRbMTAxNl07Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5l IGJvb2wgaXNfaW50cmEoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiArewo+ICsgICAgICAgcmV0 dXJuIGN0eC0+dnA4X2VuYy5pc19pbnRyYTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBzaXpl X3QgZnJhbWVfdGFnX3NpemUoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPiArewo+ICsgICAgICAg cmV0dXJuIGlzX2ludHJhKGN0eCkgPyAxMCA6IDM7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJv Y2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9jb2VmZl9wcm9iKHN0cnVjdCBoYW50cm9fY3R4ICpj dHgpCj4gK3sKPiArICAgICAgIHN0cnVjdCBoYW50cm9fYm9vbGVuYyAqZSA9ICZjdHgtPnZwOF9l bmMuYm9vbGVuYzsKPiArICAgICAgIHN0cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgKmVudHJvcHkg PSAmY3R4LT52cDhfZW5jLmVudHJvcHk7Cj4gKwo+ICsgICAgICAgaW50IGksIGosIGssIGw7Cj4g KyAgICAgICB1aW50MzJfdCBwcm9iLCBuZXcsIG9sZDsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAw OyBpIDwgNDsgaSsrKSB7Cj4gKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKysp IHsKPiArICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgMTE7IGwrKykg ewo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iID0gY29lZmZf dXBkYXRlX3Byb2JbaV1bal1ba11bbF07Cj4gKwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBvbGQgPSBlbnRyb3B5LT5jb2VmZl9wcm9iX29sZFtpXVtqXVtrXVtsXTsK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ID0gZW50cm9weS0+ Y29lZmZfcHJvYltpXVtqXVtrXVtsXTsKPiArCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGlmIChuZXcgPT0gb2xkKSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfYm9vbChlLCBwcm9i LCAwKTsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW50cm9f Ym9vbGVuY193cml0ZV9ib29sKGUsIHByb2IsIDEpOwo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBuZXcs IDgpOwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB9Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgfQo+ ICsgICAgICAgICAgICAgICB9Cj4gKyAgICAgICB9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJv Y2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9tdl9wcm9iKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgp Cj4gK3sKPiArICAgICAgIHN0cnVjdCBoYW50cm9fYm9vbGVuYyAqZSA9ICZjdHgtPnZwOF9lbmMu Ym9vbGVuYzsKPiArICAgICAgIHN0cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgKmVudHJvcHkgPSAm Y3R4LT52cDhfZW5jLmVudHJvcHk7Cj4gKwo+ICsgICAgICAgaW50IGksIGo7Cj4gKyAgICAgICB1 aW50MzJfdCBwcm9iLCBuZXcsIG9sZDsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsg aSsrKSB7Cj4gKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxOTsgaisrKSB7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgcHJvYiA9IG12X3VwZGF0ZV9wcm9iW2ldW2pdOwo+ICsgICAg ICAgICAgICAgICAgICAgICAgIG9sZCA9IGVudHJvcHktPm12X3Byb2Jfb2xkW2ldW2pdOwo+ICsg ICAgICAgICAgICAgICAgICAgICAgIG5ldyA9IGVudHJvcHktPm12X3Byb2JbaV1bal07Cj4gKwo+ ICsgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgPT0gb2xkKSB7Cj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9ib29sKGUsIHByb2IsIDAp Owo+ICsgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9ib29sKGUsIHByb2IsIDEpOwo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUs IG5ldyA+PiAxLCA3KTsKPiArICAgICAgICAgICAgICAgICAgICAgICB9Cj4gKyAgICAgICAgICAg ICAgIH0KPiArICAgICAgIH0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcm9ja2NoaXBfdnB1Ml92 cDhfZW5jX3dyaXRlX2ZpbHRlcl9sZXZlbF9kZWx0YShzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+ ICt7Cj4gKyAgICAgICBzdHJ1Y3QgaGFudHJvX2Jvb2xlbmMgKmUgPSAmY3R4LT52cDhfZW5jLmJv b2xlbmM7Cj4gKyAgICAgICBpbnQzMl90IGksIHRtcDsKPiArICAgICAgIHVpbnQ4X3QgIHVwZGF0 ZSA9IDA7Cj4gKyAgICAgICBpbnQzMl90IG1vZGVfdXBkYXRlWzRdOwo+ICsgICAgICAgaW50MzJf dCByZWZfdXBkYXRlWzRdOwo+ICsKPiArICAgICAgIGlmIChpc19pbnRyYShjdHgpKSB7Cj4gKyAg ICAgICAgICAgICAgIG1lbXNldChjdHgtPnZwOF9lbmMub2xkX21vZGVfZGVsdGEsIDAsIHNpemVv ZihjdHgtPnZwOF9lbmMub2xkX21vZGVfZGVsdGEpKTsKPiArICAgICAgICAgICAgICAgbWVtc2V0 KGN0eC0+dnA4X2VuYy5vbGRfcmVmX2RlbHRhLCAwLCBzaXplb2YoY3R4LT52cDhfZW5jLm9sZF9y ZWZfZGVsdGEpKTsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsg aSsrKSB7Cj4gKyAgICAgICAgICAgICAgIG1vZGVfdXBkYXRlW2ldID0gY3R4LT52cDhfZW5jLm1v ZGVfZGVsdGFbaV0gIT0gY3R4LT52cDhfZW5jLm9sZF9tb2RlX2RlbHRhW2ldOwo+ICsgICAgICAg ICAgICAgICByZWZfdXBkYXRlW2ldID0gY3R4LT52cDhfZW5jLnJlZl9kZWx0YVtpXSAhPSBjdHgt PnZwOF9lbmMub2xkX3JlZl9kZWx0YVtpXTsKPiArICAgICAgICAgICAgICAgaWYgKG1vZGVfdXBk YXRlW2ldIHx8IHJlZl91cGRhdGVbaV0pCj4gKyAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRl ID0gMTsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBpZiAoIWN0eC0+dnA4X2VuYy5yZWZyZXNo X2VudHJvcHlfcHJvYnMpCj4gKyAgICAgICAgICAgICAgIHVwZGF0ZSA9IDE7Cj4gKwo+ICsgICAg ICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIHVwZGF0ZSwgMSk7Cj4gKyAgICAgICBpZiAo IXVwZGF0ZSkKPiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ICsKPiArICAgICAgIGZvciAoaSA9 IDA7IGkgPCA0OyBpKyspIHsKPiArICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVf bGl0KGUsIHJlZl91cGRhdGVbaV0sIDEpOwo+ICsgICAgICAgICAgICAgICBpZiAocmVmX3VwZGF0 ZVtpXSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGN0eC0+dnA4X2VuYy5yZWZf ZGVsdGFbaV07Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVf bGl0KGUsIGFicyh0bXApLCA2KTsKPiArICAgICAgICAgICAgICAgICAgICAgICBoYW50cm9fYm9v bGVuY193cml0ZV9saXQoZSwgdG1wIDwgMCwgMSk7Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAg ICAgIH0KPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Cj4gKyAgICAgICAg ICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBtb2RlX3VwZGF0ZVtpXSwgMSk7Cj4g KyAgICAgICAgICAgICAgIGlmIChtb2RlX3VwZGF0ZVtpXSkgewo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHRtcCA9IGN0eC0+dnA4X2VuYy5tb2RlX2RlbHRhW2ldOwo+ICsgICAgICAgICAgICAg ICAgICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBhYnModG1wKSwgNik7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIHRtcCA8IDAs IDEpOwo+ICsgICAgICAgICAgICAgICB9Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgbWVtY3B5 KGN0eC0+dnA4X2VuYy5vbGRfbW9kZV9kZWx0YSwgY3R4LT52cDhfZW5jLm1vZGVfZGVsdGEsCj4g KyAgICAgICAgICAgICAgc2l6ZW9mKGN0eC0+dnA4X2VuYy5vbGRfbW9kZV9kZWx0YSkpOwo+ICsg ICAgICAgbWVtY3B5KGN0eC0+dnA4X2VuYy5vbGRfcmVmX2RlbHRhLCBjdHgtPnZwOF9lbmMucmVm X2RlbHRhLAo+ICsgICAgICAgICAgICAgIHNpemVvZihjdHgtPnZwOF9lbmMub2xkX3JlZl9kZWx0 YSkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCByb2NrY2hpcF92cHUyX3ZwOF9lbmNfd3JpdGVf aGVhZGVyKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIHUzMiBxcCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2N0cmxfdnA4X2VuY29k ZV9wYXJhbXMgKnBhcmFtcykKPiArewo+ICsgICAgICAgc3RydWN0IGhhbnRyb19ib29sZW5jICpl ID0gJmN0eC0+dnA4X2VuYy5ib29sZW5jOwo+ICsgICAgICAgc3RydWN0IHZiMl92NGwyX2J1ZmZl ciAqZHN0X2J1ZiA9IGhhbnRyb19nZXRfZHN0X2J1ZihjdHgpOwo+ICsgICAgICAgdm9pZCAqdmFk ZHIgPSB2YjJfcGxhbmVfdmFkZHIoJmRzdF9idWYtPnZiMl9idWYsIDApOwo+ICsKPiArICAgICAg IGN0eC0+dnA4X2VuYy5mcmFtZV90YWcgPSB2YWRkcjsKPiArICAgICAgIG1lbXNldChjdHgtPnZw OF9lbmMuZnJhbWVfdGFnLCAwLCBzaXplb2YoKmN0eC0+dnA4X2VuYy5mcmFtZV90YWcpKTsKPiAr ICAgICAgIGN0eC0+dnA4X2VuYy5mcmFtZV90YWctPnRhZ1swXSB8PSAoMSA8PCAxKTsgICAgIC8q IHZlcnNpb24gMSAqLwo+ICsgICAgICAgaWYgKGN0eC0+dnA4X2VuYy5zaG93X2ZyYW1lKQo+ICsg ICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFnLT50YWdbMF0gfD0gKDEgPDwgNCk7 Cj4gKyAgICAgICAvKiBmaXJzdCBwYXJ0aXRpb24gc2l6ZSBpcyBrbm93biBvbmx5IGFmdGVyIGVu Y29kaW5nICovCj4gKwo+ICsgICAgICAgaWYgKGlzX2ludHJhKGN0eCkpIHsKPiArICAgICAgICAg ICAgICAgY3R4LT52cDhfZW5jLmZyYW1lX3RhZy0+bWFnaWNbMF0gPSAweDlkOwo+ICsgICAgICAg ICAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFnLT5tYWdpY1sxXSA9IDB4MDE7Cj4gKyAgICAg ICAgICAgICAgIGN0eC0+dnA4X2VuYy5mcmFtZV90YWctPm1hZ2ljWzJdID0gMHgyYTsKPiArCj4g KyAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5mcmFtZV90YWctPndpZHRoWzBdID0gY3R4LT5z cmNfZm10LndpZHRoICYgMHhmZjsKPiArICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLmZyYW1l X3RhZy0+d2lkdGhbMV0gPSAoY3R4LT5zcmNfZm10LndpZHRoID4+IDgpICYgMHhmZjsKPiArCj4g KyAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5mcmFtZV90YWctPmhlaWdodFswXSA9IGN0eC0+ c3JjX2ZtdC5oZWlnaHQgJiAweGZmOwo+ICsgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuZnJh bWVfdGFnLT5oZWlnaHRbMV0gPSAoY3R4LT5zcmNfZm10LmhlaWdodCA+PiA4KSAmIDB4ZmY7Cj4g KyAgICAgICB9IGVsc2Ugewo+ICsgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFn LT50YWdbMF0gfD0gMHgxOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIGhhbnRyb19ib29sZW5j X2luaXQoZSwgdmFkZHIgKyBmcmFtZV90YWdfc2l6ZShjdHgpKTsKPiArCj4gKyAgICAgICBpZiAo aXNfaW50cmEoY3R4KSkgewo+ICsgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9s aXQoZSwgcGFyYW1zLT5jb2xvcl9zcGFjZSwgMSk7Cj4gKyAgICAgICAgICAgICAgIGhhbnRyb19i b29sZW5jX3dyaXRlX2xpdChlLCBwYXJhbXMtPmNsYW1waW5nX3R5cGUsIDEpOwo+ICsgICAgICAg fQo+ICsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCAhIShwYXJhbXMtPmZs YWdzICYgVjRMMl9WUDhfRlJBTUVfRkxBR19TRUdNRU5UX0VOQUJMRUQpLCAxKTsKPiArCj4gKyAg ICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgcGFyYW1zLT5sb29wX2ZpbHRlcl90eXBl LCAxKTsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBwYXJhbXMtPmxvb3Bf ZmlsdGVyX2xldmVsLCA2KTsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBw YXJhbXMtPnNoYXJwbmVzc19sZXZlbCwgMyk7Cj4gKyAgICAgICBoYW50cm9fYm9vbGVuY193cml0 ZV9saXQoZSwgISEocGFyYW1zLT5mbGFncyAmIFY0TDJfVlA4X0ZSQU1FX0ZMQUdfTE9PUF9GSUxU RVJfQURKX0VOQUJMRUQpLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwo+ ICsgICAgICAgaWYgKHBhcmFtcy0+ZmxhZ3MgJiBWNEwyX1ZQOF9GUkFNRV9GTEFHX0xPT1BfRklM VEVSX0FESl9FTkFCTEVEKQo+ICsgICAgICAgICAgICAgICByb2NrY2hpcF92cHUyX3ZwOF9lbmNf d3JpdGVfZmlsdGVyX2xldmVsX2RlbHRhKGN0eCk7Cj4gKwo+ICsgICAgICAgaGFudHJvX2Jvb2xl bmNfd3JpdGVfbGl0KGUsIHBhcmFtcy0+bG9nMl9uYnJfb2ZfZGN0X3BhcnRpdGlvbnMsIDIpOwo+ ICsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCBxcCwgNyk7Cj4gKwo+ICsg ICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDEpOwo+ICsgICAgICAgaGFudHJv X2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDEpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3Jp dGVfbGl0KGUsIDAsIDEpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAs IDEpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDEpOwo+ICsKPiAr ICAgICAgIGlmICghaXNfaW50cmEoY3R4KSkgewo+ICsgICAgICAgICAgICAgICBoYW50cm9fYm9v bGVuY193cml0ZV9saXQoZSwgMCwgMSk7IC8qIHJlZnJlc2ggZ29sZGVuICovCj4gKyAgICAgICAg ICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xpdChlLCAwLCAxKTsgLyogcmVmcmVzaCBhbHQg Ki8KPiArICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDIpOyAv KiBjb3B5IHRvIGdvbGRlbiAqLwo+ICsgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0 ZV9saXQoZSwgMCwgMik7IC8qIGNvcHkgdG8gYWx0ICovCj4gKyAgICAgICAgICAgICAgIGhhbnRy b19ib29sZW5jX3dyaXRlX2xpdChlLCAwLCAxKTsgLyogc2lnbiBiaWFzIGdvbGRlbiAqLwo+ICsg ICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgMCwgMSk7IC8qIHNpZ24g YmlhcyBhbHQgKi8KPiArICAgICAgICAgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUs IGN0eC0+dnA4X2VuYy5yZWZyZXNoX2VudHJvcHlfcHJvYnMsIDEpOwo+ICsgICAgICAgICAgICAg ICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgMSwgMSk7Cj4gKyAgICAgICB9IGVsc2Ugewo+ ICsgICAgICAgICAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgY3R4LT52cDhfZW5j LnJlZnJlc2hfZW50cm9weV9wcm9icywgMSk7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcm9j a2NoaXBfdnB1Ml92cDhfZW5jX3dyaXRlX2NvZWZmX3Byb2IoY3R4KTsKPiArCj4gKyAgICAgICBo YW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgMSwgMSk7Cj4gKyAgICAgICBoYW50cm9fYm9vbGVu Y193cml0ZV9saXQoZSwgY3R4LT52cDhfZW5jLnByb2Jfc2tpcF9mYWxzZSwgOCk7Cj4gKwo+ICsg ICAgICAgaWYgKGlzX2ludHJhKGN0eCkpCj4gKyAgICAgICAgICAgICAgIHJldHVybjsKPiArCj4g KyAgICAgICBoYW50cm9fYm9vbGVuY193cml0ZV9saXQoZSwgY3R4LT52cDhfZW5jLnByb2JfaW50 cmEsIDgpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIGN0eC0+dnA4X2Vu Yy5wcm9iX2xhc3QsIDgpOwo+ICsgICAgICAgaGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIGN0 eC0+dnA4X2VuYy5wcm9iX2dmLCA4KTsKPiArICAgICAgIGhhbnRyb19ib29sZW5jX3dyaXRlX2xp dChlLCAwLCAxKTsgLyogaW50cmEgMTZ4MTYgcHJvYiB1cGRhdGUgZmxhZyAqLwo+ICsgICAgICAg aGFudHJvX2Jvb2xlbmNfd3JpdGVfbGl0KGUsIDAsIDEpOyAvKiBpbnRyYSBjaHJvbWEgcHJvYiB1 cGRhdGUgZmxhZyAqLwo+ICsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9t dl9wcm9iKGN0eCk7Cj4gK30KPiArCj4gK3N0YXRpYyB1aW50MzJfdCBjYWxjX212cHJvYih1aW50 MzJfdCBsZWZ0LCB1aW50MzJfdCByaWdodCwgdWludDMyX3QgcHJvYikKPiArewo+ICsgICAgICAg dWludDMyX3QgcDsKPiArCj4gKyAgICAgICBpZiAobGVmdCArIHJpZ2h0KSB7Cj4gKyAgICAgICAg ICAgICAgIHAgPSAobGVmdCAqIDI1NSkgLyAobGVmdCArIHJpZ2h0KTsKPiArICAgICAgICAgICAg ICAgcCAmPSAtMjsKPiArICAgICAgICAgICAgICAgaWYgKCFwKQo+ICsgICAgICAgICAgICAgICAg ICAgICAgIHAgPSAxOwo+ICsgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAgICAgcCA9IHBy b2I7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcmV0dXJuIHA7Cj4gK30KPiArCj4gK3N0YXRp YyB1aW50MzJfdCB1cGRhdGVfcHJvYih1aW50MzJfdCBwcm9iLCB1aW50MzJfdCBsZWZ0LCB1aW50 MzJfdCByaWdodCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX3By b2IsIHVpbnQzMl90IG5ld19wcm9iLCB1aW50MzJfdCBmaXhlZCkKPiArewo+ICsgICAgICAgaW50 MzJfdCB1LCBzOwo+ICsKPiArICAgICAgIHUgPSAoaW50MzJfdClmaXhlZCArICgodnA4X3Byb2Jf Y29zdFsyNTUgLSBwcm9iXSAtIHZwOF9wcm9iX2Nvc3RbcHJvYl0pID4+IDgpOwo+ICsgICAgICAg cyA9ICgoaW50MzJfdClsZWZ0ICogKHZwOF9wcm9iX2Nvc3Rbb2xkX3Byb2JdIC0gdnA4X3Byb2Jf Y29zdFtuZXdfcHJvYl0pICsKPiArICAgICAgICAgICAgICAgKGludDMyX3QpcmlnaHQgKgo+ICsg ICAgICAgICAgICAgICAodnA4X3Byb2JfY29zdFsyNTUgLSBvbGRfcHJvYl0gLSB2cDhfcHJvYl9j b3N0WzI1NSAtIG5ld19wcm9iXSkpID4+IDg7Cj4gKwo+ICsgICAgICAgcmV0dXJuIChzID4gdSk7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY191cGRhdGVfZW50 cm9weShzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgaGFudHJv X3ZwOF9lbnRyb3B5ICplbnRyb3B5ID0gJmN0eC0+dnA4X2VuYy5lbnRyb3B5Owo+ICsgICAgICAg dWludDE2X3QgKnBfY250ID0gKHVpbnQxNl90ICopY3R4LT52cDhfZW5jLnByaXZfZHN0LmNwdTsK PiArCj4gKyAgICAgICBpbnQzMl90IGksIGosIGssIGw7Cj4gKwo+ICsgICAgICAgdWludDMyX3Qg cCwgbGVmdCwgcmlnaHQ7Cj4gKyAgICAgICB1aW50MzJfdCBvbGRfcCwgdXBkX3AgPSAwOwo+ICsK PiArICAgICAgIHVpbnQzMl90IHR5cGU7Cj4gKyAgICAgICB1aW50MzJfdCBicmFuY2hfY250WzJd Owo+ICsgICAgICAgdWludDE2X3QgKnBfdG1wID0gTlVMTDsKPiArCj4gKyAgICAgICBpZiAoIWN0 eC0+dnA4X2VuYy5yZWZyZXNoX2VudHJvcHlfcHJvYnMgfHwgaXNfaW50cmEoY3R4KSkgewo+ICsg ICAgICAgICAgICAgICBtZW1jcHkoZW50cm9weS0+Y29lZmZfcHJvYiwgZGVmYXVsdF9wcm9iX2Nv ZWZmLCBzaXplb2YoZGVmYXVsdF9wcm9iX2NvZWZmKSk7Cj4gKyAgICAgICAgICAgICAgIG1lbWNw eShlbnRyb3B5LT5tdl9wcm9iLCBkZWZhdWx0X3Byb2JfbXYsIHNpemVvZihkZWZhdWx0X3Byb2Jf bXYpKTsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBtZW1jcHkoZW50cm9weS0+Y29lZmZfcHJv Yl9vbGQsIGVudHJvcHktPmNvZWZmX3Byb2IsIHNpemVvZihlbnRyb3B5LT5jb2VmZl9wcm9iKSk7 Cj4gKyAgICAgICBpZiAoY3R4LT52cDhfZW5jLmZyYW1lX2NvdW50ZXIgPT0gMCB8fCAhY3R4LT52 cDhfZW5jLmxhc3RfaW50cmEpCj4gKyAgICAgICAgICAgICAgIG1lbWNweShlbnRyb3B5LT5tdl9w cm9iX29sZCwgZW50cm9weS0+bXZfcHJvYiwgc2l6ZW9mKGVudHJvcHktPm12X3Byb2IpKTsKPiAr Cj4gKyAgICAgICBpZiAoIWN0eC0+dnA4X2VuYy5mcmFtZV9jb3VudGVyKQo+ICsgICAgICAgICAg ICAgICByZXR1cm47Cj4gKwo+ICsgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewo+ICsg ICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNzsgaisrKSB7Cj4gKyAgICAgICAgICAgICAg ICAgICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykgewo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW50MzJfdCB0bXAsIGlpOwo+ICsKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHRtcCA9IGkgKiA3ICogMyArIGogKiAzICsgazsKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHRtcCArPSAyICogNCAqIDcgKiAzOwo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgaWkgPSBvZmZzZXRfdGJsW3RtcF07Cj4gKwo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmlnaHQgPSBpaSA+PSAwID8gcF9jbnRbaWldIDogMDsKPiArCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAyOyBsLS07KSB7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9wID0gZW50cm9weS0+Y29l ZmZfcHJvYltpXVtqXVtrXVtsXTsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgb2xkX3AgPSBjb2VmZl91cGRhdGVfcHJvYltpXVtqXVtrXVtsXTsKPiArCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCAtPSA0ICogNyAqIDM7Cj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpID0gb2Zmc2V0X3RibFt0bXBd Owo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaWkgPj0g MCA/IHBfY250W2lpXSA6IDA7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGlmIChsZWZ0ICsgcmlnaHQpIHsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwID0gKChsZWZ0ICogMjU2KSArICgobGVmdCArIHJpZ2h0KSA+PiAx KSkgLwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAobGVmdCArIHJpZ2h0KTsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBpZiAocCA+IDI1NSkKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAyNTU7Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcCA9IG9sZF9wOwo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpZiAodXBkYXRlX3Byb2IodXBkX3AsIGxlZnQsIHJpZ2h0LCBvbGRfcCwgcCwgOCkp Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9w eS0+Y29lZmZfcHJvYltpXVtqXVtrXVtsXSA9IHA7Cj4gKwo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByaWdodCArPSBsZWZ0Owo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfQo+ICsgICAgICAgICAgICAgICAgICAgICAgIH0KPiArICAgICAgICAgICAg ICAgfQo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHBfdG1wID0gcF9jbnQgKyBWUDhfUFJPQl9D T1VOVF9NVl9PRkZTRVQ7Cj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Cj4gKyAg ICAgICAgICAgICAgIGxlZnQgID0gKnBfdG1wKys7Cj4gKyAgICAgICAgICAgICAgIHJpZ2h0ID0g KnBfdG1wKys7Cj4gKwo+ICsgICAgICAgICAgICAgICBwID0gY2FsY19tdnByb2IobGVmdCwgcmln aHQsIGVudHJvcHktPm12X3Byb2Jfb2xkW2ldWzBdKTsKPiArCj4gKyAgICAgICAgICAgICAgIGlm ICh1cGRhdGVfcHJvYihtdl91cGRhdGVfcHJvYltpXVswXSwgbGVmdCwgcmlnaHQsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5tdl9wcm9iX29sZFtpXVswXSwgcCwg NikpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weS0+bXZfcHJvYltpXVswXSA9IHA7 Cj4gKwo+ICsgICAgICAgICAgICAgICByaWdodCArPSBsZWZ0Owo+ICsgICAgICAgICAgICAgICBs ZWZ0ID0gKnBfdG1wKys7Cj4gKyAgICAgICAgICAgICAgIHJpZ2h0IC09IGxlZnQgLSBwX3RtcFsw XTsKPiArCj4gKyAgICAgICAgICAgICAgIHAgPSBjYWxjX212cHJvYihsZWZ0LCByaWdodCwgZW50 cm9weS0+bXZfcHJvYl9vbGRbaV1bMV0pOwo+ICsgICAgICAgICAgICAgICBpZiAodXBkYXRlX3By b2IobXZfdXBkYXRlX3Byb2JbaV1bMV0sIGxlZnQsIHJpZ2h0LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZW50cm9weS0+bXZfcHJvYl9vbGRbaV1bMV0sIHAsIDYpKQo+ICsgICAg ICAgICAgICAgICAgICAgICAgIGVudHJvcHktPm12X3Byb2JbaV1bMV0gPSBwOwo+ICsKPiArICAg ICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgewo+ICsgICAgICAgICAgICAgICAg ICAgICAgIGxlZnQgPSAqcF90bXArKzsKPiArICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9 ICpwX3RtcCsrOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIHAgPSBjYWxjX212cHJvYihsZWZ0 LCByaWdodCwgZW50cm9weS0+bXZfcHJvYl9vbGRbaV1bNCArIGpdKTsKPiArICAgICAgICAgICAg ICAgICAgICAgICBpZiAodXBkYXRlX3Byb2IobXZfdXBkYXRlX3Byb2JbaV1bNCArIGpdLCBsZWZ0 LCByaWdodCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9w eS0+bXZfcHJvYl9vbGRbaV1bNCArIGpdLCBwLCA2KSkKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGVudHJvcHktPm12X3Byb2JbaV1bNCArIGpdID0gcDsKPiArICAgICAgICAgICAg ICAgICAgICAgICBicmFuY2hfY250W2pdID0gbGVmdCArIHJpZ2h0Owo+ICsgICAgICAgICAgICAg ICB9Cj4gKwo+ICsgICAgICAgICAgICAgICBwID0gY2FsY19tdnByb2IoYnJhbmNoX2NudFswXSwg YnJhbmNoX2NudFsxXSwgZW50cm9weS0+bXZfcHJvYl9vbGRbaV1bM10pOwo+ICsgICAgICAgICAg ICAgICBpZiAodXBkYXRlX3Byb2IobXZfdXBkYXRlX3Byb2JbaV1bM10sIGJyYW5jaF9jbnRbMF0s IGJyYW5jaF9jbnRbMV0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5 LT5tdl9wcm9iX29sZFtpXVszXSwgcCwgNikpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgZW50 cm9weS0+bXZfcHJvYltpXVszXSA9IHA7Cj4gKwo+ICsgICAgICAgICAgICAgICB0eXBlID0gYnJh bmNoX2NudFswXSArIGJyYW5jaF9jbnRbMV07Cj4gKwo+ICsgICAgICAgICAgICAgICBmb3IgKGog PSAwOyBqIDwgMjsgaisrKSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9ICpwX3Rt cCsrOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gKnBfdG1wKys7Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgcCA9IGNhbGNfbXZwcm9iKGxlZnQsIHJpZ2h0LCBlbnRyb3B5LT5t dl9wcm9iX29sZFtpXVs3ICsgal0pOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRh dGVfcHJvYihtdl91cGRhdGVfcHJvYltpXVs3ICsgal0sIGxlZnQsIHJpZ2h0LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5tdl9wcm9iX29sZFtpXVs3 ICsgal0sIHAsIDYpKQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weS0+ bXZfcHJvYltpXVs3ICsgal0gPSBwOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaF9j bnRbal0gPSBsZWZ0ICsgcmlnaHQ7Cj4gKyAgICAgICAgICAgICAgIH0KPiArCj4gKyAgICAgICAg ICAgICAgIHAgPSBjYWxjX212cHJvYihicmFuY2hfY250WzBdLCBicmFuY2hfY250WzFdLCBlbnRy b3B5LT5tdl9wcm9iX29sZFtpXVs2XSk7Cj4gKyAgICAgICAgICAgICAgIGlmICh1cGRhdGVfcHJv Yihtdl91cGRhdGVfcHJvYltpXVs2XSwgYnJhbmNoX2NudFswXSwgYnJhbmNoX2NudFsxXSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJvcHktPm12X3Byb2Jfb2xkW2ldWzZd LCBwLCA2KSkKPiArICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5tdl9wcm9iW2ldWzZd ID0gcDsKPiArCj4gKyAgICAgICAgICAgICAgIHAgPSBjYWxjX212cHJvYih0eXBlLCBicmFuY2hf Y250WzBdICsgYnJhbmNoX2NudFsxXSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGVudHJvcHktPm12X3Byb2Jfb2xkW2ldWzJdKTsKPiArICAgICAgICAgICAgICAgaWYgKHVwZGF0 ZV9wcm9iKG12X3VwZGF0ZV9wcm9iW2ldWzJdLCB0eXBlLCBicmFuY2hfY250WzBdICsgYnJhbmNo X2NudFsxXSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJvcHktPm12X3By b2Jfb2xkW2ldWzJdLCBwLCA2KSkKPiArICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5t dl9wcm9iW2ldWzJdID0gcDsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBtZW1jcHkoZW50cm9w eS0+eV9tb2RlX3Byb2IsIHlfbW9kZV9wcm9iLCBzaXplb2YoeV9tb2RlX3Byb2IpKTsKPiArICAg ICAgIG1lbWNweShlbnRyb3B5LT51dl9tb2RlX3Byb2IsIHV2X21vZGVfcHJvYiwgc2l6ZW9mKHV2 X21vZGVfcHJvYikpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGludCBjb2VmZl9wcm9iX2lk eChpbnQgaW5kZXgpCj4gK3sKPiArICAgICAgIHJldHVybiAoaW5kZXggLyA4KSAqIDggKyA3IC0g KGluZGV4ICUgOCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3ZwdTJfdnA4X2Vu Y193cml0ZV9lbnRyb3B5KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gK3sKPiArICAgICAgIHN0 cnVjdCBoYW50cm9fdnA4X2VudHJvcHkgKmVudHJvcHkgPSAmY3R4LT52cDhfZW5jLmVudHJvcHk7 Cj4gKyAgICAgICB1aW50OF90ICplbnRyb3B5X3RhYmxlID0gY3R4LT52cDhfZW5jLnByaXZfc3Jj LmNwdTsKPiArICAgICAgIGludCBpbmRleCwgaSwgaiwgaywgbDsKPiArCj4gKyAgICAgICBtZW1z ZXQoZW50cm9weV90YWJsZSwgMCwgNTYpOwo+ICsgICAgICAgZW50cm9weV90YWJsZVs3XSA9IGN0 eC0+dnA4X2VuYy5wcm9iX3NraXBfZmFsc2U7Cj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzZdID0g Y3R4LT52cDhfZW5jLnByb2JfaW50cmE7Cj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzVdID0gY3R4 LT52cDhfZW5jLnByb2JfbGFzdDsKPiArICAgICAgIGVudHJvcHlfdGFibGVbNF0gPSBjdHgtPnZw OF9lbmMucHJvYl9nZjsKPiArICAgICAgIGVudHJvcHlfdGFibGVbM10gPSAwOyAvKiBzZWdtZW50 X3Byb2JbMF07ICovCj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzJdID0gMDsgLyogc2VnbWVudF9w cm9iWzFdOyAqLwo+ICsgICAgICAgZW50cm9weV90YWJsZVsxXSA9IDA7IC8qIHNlZ21lbnRfcHJv YlsyXTsgKi8KPiArCj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzE1XSA9IGVudHJvcHktPnlfbW9k ZV9wcm9iWzBdOwo+ICsgICAgICAgZW50cm9weV90YWJsZVsxNF0gPSBlbnRyb3B5LT55X21vZGVf cHJvYlsxXTsKPiArICAgICAgIGVudHJvcHlfdGFibGVbMTNdID0gZW50cm9weS0+eV9tb2RlX3By b2JbMl07Cj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzEyXSA9IGVudHJvcHktPnlfbW9kZV9wcm9i WzNdOwo+ICsgICAgICAgZW50cm9weV90YWJsZVsxMV0gPSBlbnRyb3B5LT51dl9tb2RlX3Byb2Jb MF07Cj4gKyAgICAgICBlbnRyb3B5X3RhYmxlWzEwXSA9IGVudHJvcHktPnV2X21vZGVfcHJvYlsx XTsKPiArICAgICAgIGVudHJvcHlfdGFibGVbOV0gPSBlbnRyb3B5LT51dl9tb2RlX3Byb2JbMl07 Cj4gKwo+ICsgICAgICAgZW50cm9weV90YWJsZVsyM10gPSBlbnRyb3B5LT5tdl9wcm9iWzFdWzBd Owo+ICsgICAgICAgZW50cm9weV90YWJsZVsyMl0gPSBlbnRyb3B5LT5tdl9wcm9iWzBdWzBdOwo+ ICsgICAgICAgZW50cm9weV90YWJsZVsyMV0gPSBlbnRyb3B5LT5tdl9wcm9iWzFdWzFdOwo+ICsg ICAgICAgZW50cm9weV90YWJsZVsyMF0gPSBlbnRyb3B5LT5tdl9wcm9iWzBdWzFdOwo+ICsgICAg ICAgZW50cm9weV90YWJsZVsxOV0gPSBlbnRyb3B5LT5tdl9wcm9iWzFdWzE3XTsKPiArICAgICAg IGVudHJvcHlfdGFibGVbMThdID0gZW50cm9weS0+bXZfcHJvYlsxXVsxOF07Cj4gKyAgICAgICBl bnRyb3B5X3RhYmxlWzE3XSA9IGVudHJvcHktPm12X3Byb2JbMF1bMTddOwo+ICsgICAgICAgZW50 cm9weV90YWJsZVsxNl0gPSBlbnRyb3B5LT5tdl9wcm9iWzBdWzE4XTsKPiArCj4gKyAgICAgICBm b3IgKGkgPSAwOyBpIDwgODsgKytpKQo+ICsgICAgICAgICAgICAgICBlbnRyb3B5X3RhYmxlWzI0 ICsgNyAtIGldID0gZW50cm9weS0+bXZfcHJvYlsxXVs5ICsgaV07Cj4gKwo+ICsgICAgICAgZm9y IChpID0gMDsgaSA8IDg7ICsraSkKPiArICAgICAgICAgICAgICAgZW50cm9weV90YWJsZVszMiAr IDcgLSBpXSA9IGVudHJvcHktPm12X3Byb2JbMF1bOSArIGldOwo+ICsKPiArICAgICAgIGZvciAo aSA9IDA7IGkgPCA3OyArK2kpCj4gKyAgICAgICAgICAgICAgIGVudHJvcHlfdGFibGVbNDAgKyA3 IC0gaV0gPSBlbnRyb3B5LT5tdl9wcm9iWzFdWzIgKyBpXTsKPiArCj4gKyAgICAgICBmb3IgKGkg PSAwOyBpIDwgNzsgKytpKQo+ICsgICAgICAgICAgICAgICBlbnRyb3B5X3RhYmxlWzQ4ICsgNyAt IGldID0gZW50cm9weS0+bXZfcHJvYlswXVsyICsgaV07Cj4gKwo+ICsgICAgICAgaW5kZXggPSA1 NjsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQo+ICsgICAgICAgICAgICAg ICBmb3IgKGogPSAwOyBqIDwgODsgKytqKQo+ICsgICAgICAgICAgICAgICAgICAgICAgIGZvciAo ayA9IDA7IGsgPCAzOyArK2spIHsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZv ciAobCA9IDA7IGwgPCAzOyArK2wpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGVudHJvcHlfdGFibGVbY29lZmZfcHJvYl9pZHgoaW5kZXgrKyldID0KPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5LT5jb2VmZl9w cm9iW2ldW2pdW2tdW2xdOwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9w eV90YWJsZVtjb2VmZl9wcm9iX2lkeChpbmRleCsrKV0gPSAwOwo+ICsgICAgICAgICAgICAgICAg ICAgICAgIH0KPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQo+ICsgICAgICAg ICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgKytqKQo+ICsgICAgICAgICAgICAgICAgICAgICAg IGZvciAoayA9IDA7IGsgPCAzOyArK2spIHsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGZvciAobCA9IDQ7IGwgPCAxMTsgKytsKQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBlbnRyb3B5X3RhYmxlW2NvZWZmX3Byb2JfaWR4KGluZGV4KyspXSA9Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weS0+ Y29lZmZfcHJvYltpXVtqXVtrXVtsXTsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGVudHJvcHlfdGFibGVbY29lZmZfcHJvYl9pZHgoaW5kZXgrKyldID0KPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weS0+Y29lZmZfcHJvYltpXVtqXVtrXVsz XTsKPiArICAgICAgICAgICAgICAgICAgICAgICB9Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUg c2l6ZV90IHN3X2hkcl9zaXplKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4gK3sKPiArICAgICAg IHJldHVybiBjdHgtPnZwOF9lbmMuYm9vbGVuYy5ieXRlc193cml0dGVuICsgZnJhbWVfdGFnX3Np emUoY3R4KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1MzIgZW5jX2luX2ltZ19jdHJsKHN0 cnVjdCBoYW50cm9fY3R4ICpjdHgsIHUzMiBxcCkKPiArewo+ICsgICAgICAgdW5zaWduZWQgaW50 IG92ZXJmaWxsX3IsIG92ZXJmaWxsX2I7Cj4gKwo+ICsgICAgICAgLyoKPiArICAgICAgICAqIFRo ZSBoYXJkd2FyZSBuZWVkcyBvbmx5IHRoZSB2YWx1ZSBmb3IgbHVtYSBwbGFuZSwgYmVjYXVzZQo+ ICsgICAgICAgICogdmFsdWVzIG9mIG90aGVyIHBsYW5lcyBhcmUgY2FsY3VsYXRlZCBpbnRlcm5h bGx5IGJhc2VkIG9uCj4gKyAgICAgICAgKiBmb3JtYXQgc2V0dGluZy4KPiArICAgICAgICAqLwo+ ICsgICAgICAgb3ZlcmZpbGxfciA9IGN0eC0+c3JjX2ZtdC53aWR0aCAtIGN0eC0+ZHN0X2ZtdC53 aWR0aDsKPiArICAgICAgIG92ZXJmaWxsX2IgPSBjdHgtPnNyY19mbXQuaGVpZ2h0IC0gY3R4LT5k c3RfZm10LmhlaWdodDsKPiArCj4gKyAgICAgICByZXR1cm4gVkVQVV9SRUdfU1RSRUFNX1NUQVJU X09GRlNFVCgwKSB8Cj4gKyAgICAgICAgICAgICAgIFZFUFVfUkVHX0lOX0lNR19DVFJMX09WUkZM Ul9ENChvdmVyZmlsbF9yIC8gNCkgfAo+ICsgICAgICAgICAgICAgICBWRVBVX1JFR19JTl9JTUdf Q1RSTF9PVlJGTEIob3ZlcmZpbGxfYikgfAo+ICsgICAgICAgICAgICAgICBWRVBVX1JFR19TS0lQ X01BQ1JPQkxPQ0tfUEVOQUxUWShxcCA+PSAxMDAgPyAoMyAqIHFwIC8gNCkgOiAwKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQKPiArcm9ja2NoaXBfdnB1Ml92cDhfZW5jX3NldF9idWZmZXJzKHN0 cnVjdCBoYW50cm9fZGV2ICp2cHUsIHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIHUzMiBxcCwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY3RybF92cDhfZW5j b2RlX3BhcmFtcyAqcGFyYW1zKQo+ICt7Cj4gKyAgICAgICBjb25zdCB1MzIgc3JjX2FkZHJfcmVn c1tdID0geyBWRVBVX1JFR19BRERSX0lOX1BMQU5FXzAsCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBWRVBVX1JFR19BRERSX0lOX1BMQU5FXzEsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBWRVBVX1JFR19BRERSX0lOX1BMQU5FXzIgfTsKPiAr ICAgICAgIHN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnNyY19idWYsICpkc3RfYnVmOwo+ICsgICAg ICAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnNyY19mbXQgPSAmY3R4LT5zcmNfZm10 Owo+ICsgICAgICAgc2l6ZV90IGx1bWFfc2l6ZTsKPiArICAgICAgIGRtYV9hZGRyX3QgZHN0X2Rt YTsKPiArICAgICAgIHNpemVfdCBkc3Rfc2l6ZTsKPiArICAgICAgIGludCBpLCByZWZfaWR4Owo+ ICsKPiArICAgICAgIHNyY19idWYgPSBoYW50cm9fZ2V0X3NyY19idWYoY3R4KTsKPiArICAgICAg IGRzdF9idWYgPSBoYW50cm9fZ2V0X2RzdF9idWYoY3R4KTsKPiArCj4gKyAgICAgICBsdW1hX3Np emUgPSBoYW50cm9fcm91bmRlZF9sdW1hX3NpemUoY3R4LT5zcmNfZm10LndpZHRoLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c3JjX2ZtdC5oZWln aHQpOwo+ICsKPiArICAgICAgIGRzdF9kbWEgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRk cigmZHN0X2J1Zi0+dmIyX2J1ZiwgMCk7Cj4gKyAgICAgICBkc3Rfc2l6ZSA9IHZiMl9wbGFuZV9z aXplKCZkc3RfYnVmLT52YjJfYnVmLCAwKTsKPiArCj4gKyAgICAgICAvKgo+ICsgICAgICAgICog V2UgYXNzdW1lIGhlcmUgdGhhdCAxLzEwIG9mIHRoZSBidWZmZXIgaXMgZW5vdWdoIGZvciBoZWFk ZXJzLgo+ICsgICAgICAgICogRENUIHBhcnRpdGlvbiB3aWxsIGJlIHBsYWNlZCBpbiByZW1haW5p bmcgOS8xMCBvZiB0aGUgYnVmZmVyLgo+ICsgICAgICAgICovCj4gKyAgICAgICBjdHgtPnZwOF9l bmMuZXN0aW1hdGVkX2hkcl9zaXplID0gcm91bmRfdXAoZHN0X3NpemUgLyAxMCwgOCk7Cj4gKwo+ ICsgICAgICAgLyogRGVzdGluYXRpb24gYnVmZmVyLiAqLwo+ICsgICAgICAgLyoKPiArICAgICAg ICAqIFdlICJhYnVzZWQiIHRoZSBmaXJzdCBwb3J0aW9uIG9mIHRoaXMgMS8xMCBvZiB0aGUgYnVm ZmVyIHdoZW4gZ2VuZXJhdGluZwo+ICsgICAgICAgICogdGhlIGZyYW1lIHRhZyBhbmQgY29tcHJl c3NlZCBoZWFkZXIsIHNvIFRPRE86IHZlcmlmeSB0aGF0IHRoZSAxLzEwIGNhbiBob2xkIGJvdGgg dGhlCj4gKyAgICAgICAgKiBjb21wcmVzc2VkIGhlYWRlciBhbmQgdGhlICJleHRlbmRlZCBoZWFk ZXIiIGdlbmVyYXRlZCBpbiBody4KPiArICAgICAgICAqLwo+ICsgICAgICAgdmVwdV93cml0ZV9y ZWxheGVkKHZwdSwgZHN0X2RtYSArIHJvdW5kX3VwKHN3X2hkcl9zaXplKGN0eCksIDgpLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgIFZFUFVfUkVHX0FERFJfT1VUUFVUX1NUUkVBTSk7Cj4g KyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBkc3RfZG1hICsgY3R4LT52cDhfZW5jLmVz dGltYXRlZF9oZHJfc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICBWRVBVX1JFR19B RERSX1ZQOF9EQ1RfUEFSVCgwKSk7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBk c3Rfc2l6ZSAtIGN0eC0+dnA4X2VuYy5lc3RpbWF0ZWRfaGRyX3NpemUsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgVkVQVV9SRUdfU1RSX0JVRl9MSU1JVCk7Cj4gKwo+ICsgICAgICAgLyog QXV4aWxpYXJ5IGJ1ZmZlcnMuICovCj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBj dHgtPnZwOF9lbmMuY3RybF9idWYuZG1hLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIFZF UFVfUkVHX0FERFJfT1VUUFVUX0NUUkwpOwo+ICsgICAgICAgbWVtc2V0KGN0eC0+dnA4X2VuYy5j dHJsX2J1Zi5jcHUsIDAsIGN0eC0+dnA4X2VuYy5jdHJsX2J1Zi5zaXplKTsKPiArICAgICAgIHZl cHVfd3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+dnA4X2VuYy5tdl9idWYuZG1hLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgIFZFUFVfUkVHX0FERFJfTVZfT1VUKTsKPiArICAgICAgIHZlcHVf d3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+dnA4X2VuYy5wcml2X2RzdC5kbWEsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgVkVQVV9SRUdfQUREUl9WUDhfUFJPQl9DTlQpOwo+ICsgICAgICAg bWVtc2V0KGN0eC0+dnA4X2VuYy5wcml2X2RzdC5jcHUsIDAsIGN0eC0+dnA4X2VuYy5wcml2X2Rz dC5zaXplKTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+dnA4X2VuYy5w cml2X3NyYy5kbWEsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkVQVV9SRUdfQUREUl9D QUJBQ19UQkwpOwo+ICsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9lbnRy b3B5KGN0eCk7Cj4gKwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgY3R4LT52cDhf ZW5jLnByaXZfc3JjLmRtYSArIDE1MSAqIDgsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg VkVQVV9SRUdfQUREUl9WUDhfU0VHX01BUCk7Cj4gKwo+ICsgICAgICAgLyogUmVmZXJlbmNlIGJ1 ZmZlcnMuICovCj4gKyAgICAgICBzd2l0Y2ggKHBhcmFtcy0+cmVmZXJlbmNlX3R5cGUpIHsKPiAr ICAgICAgIGNhc2UgVjRMMl9WUDhfRlJBTUVfUkVGX0xBU1Q6Cj4gKyAgICAgICAgICAgICAgIHJl Zl9pZHggPSBjdHgtPnZwOF9lbmMubGFzdF9yZWY7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ ICsgICAgICAgY2FzZSBWNEwyX1ZQOF9GUkFNRV9SRUZfR09MREVOOgo+ICsgICAgICAgICAgICAg ICByZWZfaWR4ID0gY3R4LT52cDhfZW5jLmdvbGRlbl9yZWY7Cj4gKyAgICAgICAgICAgICAgIGJy ZWFrOwo+ICsgICAgICAgY2FzZSBWNEwyX1ZQOF9GUkFNRV9SRUZfQUxUOgo+ICsgICAgICAgICAg ICAgICByZWZfaWR4ID0gY3R4LT52cDhfZW5jLmFsdF9yZWY7Cj4gKyAgICAgICAgICAgICAgIGJy ZWFrOwo+ICsgICAgICAgfQo+ICsgICAgICAgaWYgKHJlZl9pZHggPCAwKQo+ICsgICAgICAgICAg ICAgICByZWZfaWR4ID0gMDsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+ dnA4X2VuYy5yZWZfZnJhbWVzW3JlZl9pZHhdLmRtYSwgVkVQVV9SRUdfQUREUl9SRUZfTFVNQSk7 Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBjdHgtPnZwOF9lbmMucmVmX2ZyYW1l c1tyZWZfaWR4XS5kbWEgKyBsdW1hX3NpemUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg VkVQVV9SRUdfQUREUl9SRUZfQ0hST01BKTsKPiArCj4gKyAgICAgICAvKiBSZWNvbnN0cnVjdGlv biBidWZmZXJzLiAqLwo+ICsgICAgICAgY3R4LT52cDhfZW5jLnJlY29uc3RydWN0ZWQgPSAgY3R4 LT52cDhfZW5jLmZpcnN0X2ZyZWU7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBj dHgtPnZwOF9lbmMucmVmX2ZyYW1lc1tjdHgtPnZwOF9lbmMucmVjb25zdHJ1Y3RlZF0uZG1hLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUFVfUkVHX0FERFJfUkVDX0xVTUEpOwo+ICsg ICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgY3R4LT52cDhfZW5jLnJlZl9mcmFtZXNbY3R4 LT52cDhfZW5jLnJlY29uc3RydWN0ZWRdLmRtYSArIGx1bWFfc2l6ZSwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICBWRVBVX1JFR19BRERSX1JFQ19DSFJPTUEpOwo+ICsKPiArICAgICAgIC8q IFNvdXJjZSBidWZmZXIuICovCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2ZtdC0+bnVt X3BsYW5lczsgKytpKQo+ICsgICAgICAgICAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmIyX2RtYV9jb250aWdfcGxhbmVf ZG1hX2FkZHIoJnNyY19idWYtPnZiMl9idWYsIGkpICsKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNyY19idWYtPnZiMl9idWYucGxhbmVzW2ldLmRhdGFfb2Zmc2V0LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FkZHJfcmVnc1tpXSk7Cj4gKwo+ ICsgICAgICAgLyogU291cmNlIHBhcmFtZXRlcnMuICovCj4gKyAgICAgICB2ZXB1X3dyaXRlX3Jl bGF4ZWQodnB1LCBlbmNfaW5faW1nX2N0cmwoY3R4LCBxcCksCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgVkVQVV9SRUdfRU5DX09WRVJfRklMTF9TVFJNX09GRlNFVCk7Cj4gK30KPiArCj4g K3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY29tcHV0ZV9maWx0ZXJfbGV2ZWwoaW50MzJfdCBxcCkK PiArewo+ICsgICAgICAgcmV0dXJuIGNsYW1wKChxcCAqIDY0KSAvIDEyOCArIDgsIDAsIDYzKTsK PiArfQo+ICsKPiArc3RhdGljIHMzMiBjb3N0X3RyZWUoc3RydWN0IHRyZWUgKnRyZWUsIGNvbnN0 IHMzMiAqcHJvYikKPiArewo+ICsgICAgICAgczMyIHZhbHVlID0gdHJlZS0+dmFsdWU7Cj4gKyAg ICAgICBzMzIgbnVtYmVyID0gdHJlZS0+bnVtYmVyOwo+ICsgICAgICAgczMyICppbmRleCA9IHRy ZWUtPmluZGV4Owo+ICsgICAgICAgczMyIGJpdF9jb3N0ID0gMDsKPiArCj4gKyAgICAgICB3aGls ZSAobnVtYmVyLS0pCj4gKyAgICAgICAgICAgICAgIGJpdF9jb3N0ICs9IENPU1RfQk9PTChwcm9i WyppbmRleCsrXSwgKHZhbHVlID4+IG51bWJlcikgJiAxKTsKPiArCj4gKyAgICAgICByZXR1cm4g Yml0X2Nvc3Q7Cj4gK30KPiArCj4gK3N0YXRpYyBzMzIgY29zdF9tdihzMzIgbXZkLCBjb25zdCBz MzIgKm12X3Byb2IpCj4gK3sKPiArICAgICAgIHMzMiBpLCB0bXAsIGJpdF9jb3N0ID0gMDsKPiAr Cj4gKyAgICAgICB0bXAgPSBhYnMobXZkID4+IDEpOwo+ICsKPiArICAgICAgIC8qIFNob3J0IFRy ZWUgKi8KPiArICAgICAgIGlmICh0bXAgPCA4KSB7Cj4gKyAgICAgICAgICAgICAgIGJpdF9jb3N0 ICs9IENPU1RfQk9PTChtdl9wcm9iWzBdLCAwKTsKPiArICAgICAgICAgICAgICAgYml0X2Nvc3Qg Kz0gY29zdF90cmVlKCZtdl90cmVlW3RtcF0sIG12X3Byb2IgKyAyKTsKPiArICAgICAgICAgICAg ICAgaWYgKCF0bXApCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdF9jb3N0Owo+ ICsKPiArICAgICAgICAgICAgICAgLyogU2lnbiAqLwo+ICsgICAgICAgICAgICAgICBiaXRfY29z dCArPSBDT1NUX0JPT0wobXZfcHJvYlsxXSwgbXZkIDwgMCk7Cj4gKyAgICAgICAgICAgICAgIHJl dHVybiBiaXRfY29zdDsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICAvKiBMb25nIFRyZWUgKi8K PiArICAgICAgIGJpdF9jb3N0ICs9IENPU1RfQk9PTChtdl9wcm9iWzBdLCAxKTsKPiArCj4gKyAg ICAgICAvKiBCaXRzIDAsIDEsIDIgKi8KPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKysp Cj4gKyAgICAgICAgICAgICAgIGJpdF9jb3N0ICs9IENPU1RfQk9PTChtdl9wcm9iWzkgKyBpXSwg KHRtcCA+PiBpKSAmIDEpOwo+ICsKPiArICAgICAgIC8qIEJpdHMgOSwgOCwgNywgNiwgNSwgNCAq Lwo+ICsgICAgICAgZm9yIChpID0gOTsgaSA+IDM7IGktLSkKPiArICAgICAgICAgICAgICAgYml0 X2Nvc3QgKz0gQ09TVF9CT09MKG12X3Byb2JbOSArIGldLCAodG1wID4+IGkpICYgMSk7Cj4gKwo+ ICsgICAgICAgLyoKPiArICAgICAgICAqIEJpdCAzOiBpZiBBQlMobXZkKSA8IDgsIGl0IGlzIGNv ZGVkIHdpdGggc2hvcnQgdHJlZSwgc28gaWYgaGVyZQo+ICsgICAgICAgICogQUJTKG12ZCkgPD0g MTUsIGJpdCAzIG11c3QgYmUgb25lIChiZWNhdXNlIGhlcmUgd2UgY29kZSB2YWx1ZXMKPiArICAg ICAgICAqIDgsLi4uLDE1KSBhbmQgaXMgbm90IGV4cGxpY2l0bHkgY29kZWQuCj4gKyAgICAgICAg Ki8KPiArICAgICAgIGlmICh0bXAgPiAxNSkKPiArICAgICAgICAgICAgICAgYml0X2Nvc3QgKz0g Q09TVF9CT09MKG12X3Byb2JbOSArIDNdLCAodG1wID4+IDMpICYgMSk7Cj4gKwo+ICsgICAgICAg LyogU2lnbiAqLwo+ICsgICAgICAgYml0X2Nvc3QgKz0gQ09TVF9CT09MKG12X3Byb2JbMV0sIG12 ZCA8IDApOwo+ICsKPiArICAgICAgIHJldHVybiBiaXRfY29zdDsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgcm9ja2NoaXBfdnB1Ml92cDhfZW5jX3NldF9wYXJhbXMoc3RydWN0IGhhbnRyb19kZXYg KnZwdSwgc3RydWN0IGhhbnRyb19jdHggKmN0eCwgdTMyIHFwLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2N0cmxfdnA4X2VuY29kZV9w YXJhbXMgKnBhcmFtcykKPiArewo+ICsgICAgICAgc3RydWN0IGhhbnRyb192cDhfZW50cm9weSAq ZW50cm9weSA9ICZjdHgtPnZwOF9lbmMuZW50cm9weTsKPiArICAgICAgIGludCBpOwo+ICsgICAg ICAgdW5zaWduZWQgaW50IG1iX3dpZHRoID0gTUJfV0lEVEgoY3R4LT5zcmNfZm10LndpZHRoKTsK PiArICAgICAgIHVuc2lnbmVkIGludCBtYl9oZWlnaHQgPSBNQl9IRUlHSFQoY3R4LT5zcmNfZm10 LmhlaWdodCk7Cj4gKyAgICAgICB1MzIgZGVxOwo+ICsgICAgICAgdTMyIHRtcDsKPiArICAgICAg IHUzMiByZWc7Cj4gKyAgICAgICBzMzIgaW50ZXJfZmF2b3I7Cj4gKwo+ICsgICAgICAgcmVnID0g VkVQVV9SRUdfT1VUUFVUX1NXQVAzMgo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX09VVFBV VF9TV0FQMTYKPiArICAgICAgICAgICAgICAgfCBWRVBVX1JFR19PVVRQVVRfU1dBUDgKPiArICAg ICAgICAgICAgICAgfCBWRVBVX1JFR19JTlBVVF9TV0FQOAo+ICsgICAgICAgICAgICAgICB8IFZF UFVfUkVHX0lOUFVUX1NXQVAxNgo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0lOUFVUX1NX QVAzMjsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfREFU QV9FTkRJQU4pOwo+ICsKPiArICAgICAgIHJlZyA9IFZFUFVfUkVHX1NJWkVfVEFCTEVfUFJFU0VO VAo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0lOX0lNR19DVFJMX0ZNVChjdHgtPnZwdV9z cmNfZm10LT5lbmNfZm10KQo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0lOX0lNR19ST1RB VEVfTU9ERSgwKTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9S RUdfRU5DX0NUUkwxKTsKPiArCj4gKyAgICAgICByZWcgPSBWRVBVX1JFR19JTlRFUlJVUFRfVElN RU9VVF9FTgo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX01WX1dSSVRFX0VOOwo+ICsgICAg ICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19JTlRFUlJVUFQpOwo+ICsK PiArICAgICAgIHJlZyA9IFZFUFVfUkVHX0lOX0lNR19DSFJPTUFfT0ZGU0VUKDApCj4gKyAgICAg ICAgICAgICAgIHwgVkVQVV9SRUdfSU5fSU1HX0xVTUFfT0ZGU0VUKDApCj4gKyAgICAgICAgICAg ICAgIHwgVkVQVV9SRUdfSU5fSU1HX0NUUkxfUk9XX0xFTihtYl93aWR0aCAqIDE2KTsKPiArICAg ICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfSU5QVVRfTFVNQV9JTkZP KTsKPiArCj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCAwLCBWRVBVX1JFR19TVFJf SERSX1JFTV9NU0IpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgMCwgVkVQVV9S RUdfU1RSX0hEUl9SRU1fTFNCKTsKPiArCj4gKyAgICAgICByZWcgPSAwOwo+ICsgICAgICAgaWYg KG1iX3dpZHRoICogbWJfaGVpZ2h0ID4gTUFYX01CX0NPVU5UX1RPX0RJU0FCTEVfUVVBUlRFUl9Q SVhFTF9NVikKPiArICAgICAgICAgICAgICAgcmVnID0gVkVQVV9SRUdfRElTQUJMRV9RVUFSVEVS X1BJWEVMX01WOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX0VOVFJPUFlfQ09ESU5HX01PREU7 Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsIFZFUFVfUkVHX0VOQ19DVFJM MCk7Cj4gKwo+ICsgICAgICAgaW50ZXJfZmF2b3IgPSAxMjggLSBjdHgtPnZwOF9lbmMucHJvYl9p bnRyYTsKPiArICAgICAgIGlmIChpbnRlcl9mYXZvciA+PSAwKQo+ICsgICAgICAgICAgICAgICBp bnRlcl9mYXZvciA9IG1heCgwLCAoaW50MzJfdCkocXAgKiAyIC0gNDApKTsKPiArCj4gKyAgICAg ICByZWcgPSBWRVBVX1JFR19JTlRSQTE2WDE2X01PREUocXAgKiAxMDI0IC8gMTI4KQo+ICsgICAg ICAgICAgICAgICB8IFZFUFVfUkVHX0lOVEVSX01PREUoaW50ZXJfZmF2b3IpOwo+ICsgICAgICAg dmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19JTlRSQV9JTlRFUl9NT0RFKTsK PiArCj4gKyAgICAgICByZWcgPSBWRVBVX1JFR18xTVZfUEVOQUxUWSg2MCAvIDIgKiAzMikKPiAr ICAgICAgICAgICAgICAgfCBWRVBVX1JFR19RTVZfUEVOQUxUWSg4KQo+ICsgICAgICAgICAgICAg ICB8IFZFUFVfUkVHXzRNVl9QRU5BTFRZKDY0IC8gMik7Cj4gKyAgICAgICBpZiAobWJfd2lkdGgg KiBtYl9oZWlnaHQgPCBNQVhfTUJfQ09VTlRfVE9fRElTQUJMRV9TUExJVF9NVikKPiArICAgICAg ICAgICAgICAgcmVnIHw9IFZFUFVfUkVHX1NQTElUX01WX01PREVfRU47Cj4gKyAgICAgICB2ZXB1 X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsIFZFUFVfUkVHX01WX1BFTkFMVFkpOwo+ICsKPiArICAg ICAgIHJlZyA9IFZFUFVfUkVHX01WX1BFTkFMVFlfMTZYOF84WDE2KAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIG1pbigxMDIzLCBzcGxpdF9wZW5hbHR5W3FwXSAvIDIpKQo+ICsgICAgICAgICAg ICAgICB8IFZFUFVfUkVHX01WX1BFTkFMVFlfOFg4KAo+ICsgICAgICAgICAgICAgICAgICAgICAg IG1pbigxMDIzLCAoMiAqIHNwbGl0X3BlbmFsdHlbcXBdICsgNDApIC8gNCkpCj4gKyAgICAgICAg ICAgICAgIHwgVkVQVV9SRUdfTVZfUEVOQUxUWV84WDRfNFg4KDB4M2ZmKTsKPiArICAgICAgIC8q IG5vIDh4NCBvciA0eDggYmxvY2sgZGVmaW5lIGluIHZwOCAqLwo+ICsgICAgICAgdmVwdV93cml0 ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19FTkNfQ1RSTDQpOwo+ICsKPiArICAgICAgIHJl ZyA9IFZFUFVfUkVHX1BFTkFMVFlfNFg0TVYobWluKDUxMSwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICg4ICogc3BsaXRfcGVuYWx0eVtxcF0gKyA1MDApIC8gMTYp KQo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX1pFUk9fTVZfRkFWT1JfRDIoMCk7Cj4gKyAg ICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsIFZFUFVfUkVHX01WQ19SRUxBVEUpOwo+ ICsKPiArICAgICAgIC8qIGluaXRpYWxpemUgcXVhbnQgdGFibGUgZm9yIHNlZ21lbnQwICovCj4g KyAgICAgICBkZXEgPSBkY19xX2xvb2t1cFtxcF07Cj4gKyAgICAgICByZWcgPSBWRVBVX1JFR19W UDhfU0VHMF9RVVRfRENfWTEobWluKCgxIDw8IDE2KSAvIGRlcSwgMHgzRkZGdSkpOwo+ICsgICAg ICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9TRUcwX1pCSU5fRENfWTEoKChxemJpbl9mYWN0b3JzW3Fw XSAqIGRlcSkgKyA2NCkgPj4KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDcpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9TRUcwX1JORF9EQ19ZMSgo cXJvdW5kaW5nX2ZhY3RvcnNbcXBdICogZGVxKSA+PiA3KTsKPiArICAgICAgIHZlcHVfd3JpdGVf cmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfVlA4X1NFRzBfUVVBTlRfRENfWTEpOwo+ICsKPiAr ICAgICAgIGRlcSA9IGFjX3FfbG9va3VwW3FwXTsKPiArICAgICAgIHJlZyA9IFZFUFVfUkVHX1ZQ OF9TRUcwX1FVVF9BQ19ZMShtaW4oKDEgPDwgMTYpIC8gZGVxLCAweDNGRkZ1KSk7Cj4gKyAgICAg ICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBfWkJJTl9BQ19ZMSgoKHF6YmluX2ZhY3RvcnNbcXBd ICogZGVxKSArIDY0KSA+Pgo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgNyk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBfUk5EX0FDX1kxKChx cm91bmRpbmdfZmFjdG9yc1txcF0gKiBkZXEpID4+IDcpOwo+ICsgICAgICAgdmVwdV93cml0ZV9y ZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19WUDhfU0VHMF9RVUFOVF9BQ19ZMSk7Cj4gKwo+ICsg ICAgICAgZGVxID0gZGNfcV9sb29rdXBbcXBdICogMjsKPiArICAgICAgIHJlZyA9IFZFUFVfUkVH X1ZQOF9TRUcwX1FVVF9EQ19ZMihtaW4oKDEgPDwgMTYpIC8gZGVxLCAweDNGRkZ1KSk7Cj4gKyAg ICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBfWkJJTl9EQ19ZMigocXpiaW5fZmFjdG9yc1tx cF0gKiBkZXEgKyA2NCkgPj4KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDcpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9TRUcwX1JORF9EQ19ZMigo cXJvdW5kaW5nX2ZhY3RvcnNbcXBdICogZGVxKSA+PiA3KTsKPiArICAgICAgIHZlcHVfd3JpdGVf cmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfVlA4X1NFRzBfUVVBTlRfRENfWTIpOwo+ICsKPiAr ICAgICAgIGRlcSA9IG1heChhY19xX2xvb2t1cFtxcF0gKiAxNTUgLyAxMDAsIDgpOwo+ICsgICAg ICAgcmVnID0gVkVQVV9SRUdfVlA4X1NFRzBfUVVUX0FDX1kyKG1pbigoMSA8PCAxNikgLyBkZXEs IDB4M0ZGRnUpKTsKPiArICAgICAgIHJlZyB8PSBWRVBVX1JFR19WUDhfU0VHMF9aQklOX0FDX1ky KChxemJpbl9mYWN0b3JzW3FwXSAqIGRlcSArIDY0KSA+Pgo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgNyk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4 X1NFRzBfUk5EX0FDX1kyKChxcm91bmRpbmdfZmFjdG9yc1txcF0gKiBkZXEpID4+IDcpOwo+ICsg ICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19WUDhfU0VHMF9RVUFO VF9BQ19ZMik7Cj4gKwo+ICsgICAgICAgZGVxID0gbWluKGRjX3FfbG9va3VwW3FwXSwgMTMyKTsK PiArICAgICAgIHJlZyA9IFZFUFVfUkVHX1ZQOF9TRUcwX1FVVF9EQ19DSFIobWluKCgxIDw8IDE2 KSAvIGRlcSwgMHgzRkZGdSkpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9TRUcwX1pC SU5fRENfQ0hSKChxemJpbl9mYWN0b3JzW3FwXSAqIGRlcSArIDY0KSA+Pgo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcpOwo+ICsgICAgICAgcmVnIHw9IFZF UFVfUkVHX1ZQOF9TRUcwX1JORF9EQ19DSFIoKHFyb3VuZGluZ19mYWN0b3JzW3FwXSAqIGRlcSkg Pj4gNyk7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsIFZFUFVfUkVHX1ZQ OF9TRUcwX1FVQU5UX0RDX0NIUik7Cj4gKwo+ICsgICAgICAgZGVxID0gYWNfcV9sb29rdXBbcXBd Owo+ICsgICAgICAgcmVnID0gVkVQVV9SRUdfVlA4X1NFRzBfUVVUX0FDX0NIUihtaW4oKDEgPDwg MTYpIC8gZGVxLCAweDNGRkZ1KSk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBf WkJJTl9BQ19DSFIoKHF6YmluX2ZhY3RvcnNbcXBdICogZGVxICsgNjQpID4+Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyk7Cj4gKyAgICAgICByZWcgfD0g VkVQVV9SRUdfVlA4X1NFRzBfUk5EX0FDX0NIUigocXJvdW5kaW5nX2ZhY3RvcnNbcXBdICogZGVx KSA+PiA3KTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdf VlA4X1NFRzBfUVVBTlRfQUNfQ0hSKTsKPiArCj4gKyAgICAgICByZWcgPSBWRVBVX1JFR19WUDhf TVZfUkVGX0lEWDEocGFyYW1zLT5yZWZlcmVuY2VfdHlwZSk7Cj4gKyAgICAgICByZWcgfD0gVkVQ VV9SRUdfVlA4X1NFRzBfRFFVVF9EQ19ZMShkY19xX2xvb2t1cFtxcF0pOwo+ICsgICAgICAgcmVn IHw9IFZFUFVfUkVHX1ZQOF9TRUcwX0RRVVRfQUNfWTEoYWNfcV9sb29rdXBbcXBdKTsKPiArICAg ICAgIHJlZyB8PSBWRVBVX1JFR19WUDhfU0VHMF9EUVVUX0RDX1kyKGRjX3FfbG9va3VwW3FwXSAq IDIpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JFR19WUDhf U0VHMF9RVUFOVF9EUVVUKTsKPiArCj4gKyAgICAgICByZWcgPSBWRVBVX1JFR19WUDhfTVZfUkVG X0lEWDIoMCk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X1NFRzBfRFFVVF9EQ19DSFIo bWluKGRjX3FfbG9va3VwW3FwXSwgMTMyKSk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4 X1NFRzBfRFFVVF9BQ19DSFIoYWNfcV9sb29rdXBbcXBdKTsKPiArICAgICAgIHJlZyB8PSBWRVBV X1JFR19WUDhfU0VHMF9EUVVUX0FDX1kyKG1heChhY19xX2xvb2t1cFtxcF0gKiAxNTUgLyAxMDAs IDgpKTsKPiArICAgICAgIGlmIChpc19pbnRyYShjdHgpKQo+ICsgICAgICAgICAgICAgICByZWcg fD0gVkVQVV9SRUdfVlA4X1NFR01FTlRfTUFQX1VQREFURTsKPiArICAgICAgIHZlcHVfd3JpdGVf cmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfVlA4X1NFRzBfUVVBTlRfRFFVVF8xKTsKPiArICAg ICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIGN0eC0+dnA4X2VuYy5ib29sZW5jLmJvdHRvbSwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICBWRVBVX1JFR19WUDhfQk9PTF9FTkNfVkFMVUUp Owo+ICsKPiArICAgICAgIHJlZyA9IFZFUFVfUkVHX1ZQOF9EQ1RfUEFSVElUSU9OX0NOVCgwKTsK PiArICAgICAgIHJlZyB8PSBWRVBVX1JFR19WUDhfRklMVEVSX0xFVkVMKGNvbXB1dGVfZmlsdGVy X2xldmVsKHFwKSk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdfVlA4X0ZJTFRFUl9TSEFSUE5F U1MocGFyYW1zLT5zaGFycG5lc3NfbGV2ZWwpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQ OF9aRVJPX01WX1BFTkFMVFlfRk9SX1JFRjIoMCk7Cj4gKyAgICAgICByZWcgfD0gVkVQVV9SRUdf VlA4X0JPT0xfRU5DX1ZBTFVFX0JJVFMoMjQgLSBjdHgtPnZwOF9lbmMuYm9vbGVuYy5iaXRfY291 bnQpOwo+ICsgICAgICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9CT09MX0VOQ19SQU5HRShjdHgtPnZw OF9lbmMuYm9vbGVuYy5yYW5nZSk7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCBy ZWcsIFZFUFVfUkVHX1ZQOF9FTkNfQ1RSTDIpOwo+ICsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVs YXhlZCh2cHUsIDB4ZmZmZmZmZmYsIFZFUFVfUkVHX1JPSTEpOwo+ICsgICAgICAgdmVwdV93cml0 ZV9yZWxheGVkKHZwdSwgMHhmZmZmZmZmZiwgVkVQVV9SRUdfUk9JMik7Cj4gKyAgICAgICB2ZXB1 X3dyaXRlX3JlbGF4ZWQodnB1LCAwLCBWRVBVX1JFR19TVEFCSUxJWkFUSU9OX09VVFBVVCk7Cj4g KyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCAweDk2MmI0Yzg1LCBWRVBVX1JFR19SR0Iy WVVWX0NPTlZFUlNJT05fQ09FRjEpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwg MHg5MDkwMWQ1MCwgVkVQVV9SRUdfUkdCMllVVl9DT05WRVJTSU9OX0NPRUYyKTsKPiArICAgICAg IHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIDB4MDAwMGI2OTQsIFZFUFVfUkVHX1JHQjJZVVZfQ09O VkVSU0lPTl9DT0VGMyk7Cj4gKyAgICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCAwLCBWRVBV X1JFR19SR0JfTUFTS19NU0IpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgMCwg VkVQVV9SRUdfQ0lSX0lOVFJBX0NUUkwpOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZw dSwgMHhmZmZmZmZmZiwgVkVQVV9SRUdfSU5UUkFfQVJFQV9DVFJMKTsKPiArCj4gKyAgICAgICAv KiBJbnRyYSA0eDQgbW9kZSAqLwo+ICsgICAgICAgdG1wID0gcXAgKiAyICsgODsKPiArICAgICAg IGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKPiArICAgICAgICAgICAgICAgcmVnID0gVkVQVV9S RUdfVlA4X0lOVFJBXzRYNF9QRU5BTFRZXzAKPiArICAgICAgICAgICAgICAgICAgICAgICAoKGlu dHJhXzRfdHJlZV9wZW5hbHR5W2kgKiAyXSAqIHRtcCkgPj4gOCk7Cj4gKyAgICAgICAgICAgICAg IHJlZyB8PSBWRVBVX1JFR19WUDhfSU5UUkFfNHg0X1BFTkFMVFlfMQo+ICsgICAgICAgICAgICAg ICAgICAgICAgICgoaW50cmFfNF90cmVlX3BlbmFsdHlbaSAqIDIgKyAxXSAqIHRtcCkgPj4gOCk7 Cj4gKyAgICAgICAgICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUFVfUkVHX1ZQOF9JTlRSQV80WDRfUEVOQUxU WShpKSk7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgLyogSW50cmEgMTZ4MTYgbW9kZSAqLwo+ ICsgICAgICAgdG1wID0gcXAgKiAyICsgNjQ7Cj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsg aSsrKSB7Cj4gKyAgICAgICAgICAgICAgIHJlZyA9IFZFUFVfUkVHX1ZQOF9JTlRSQV8xNlgxNl9Q RU5BTFRZXzAKPiArICAgICAgICAgICAgICAgICAgICAgICAoKGludHJhXzE2X3RyZWVfcGVuYWx0 eVsyICogaV0gKiB0bXApID4+IDgpOwo+ICsgICAgICAgICAgICAgICByZWcgfD0gVkVQVV9SRUdf VlA4X0lOVFJBXzE2WDE2X1BFTkFMVFlfMQo+ICsgICAgICAgICAgICAgICAgICAgICAgICgoaW50 cmFfMTZfdHJlZV9wZW5hbHR5WzIgKiBpICsgMV0gKiB0bXApID4+IDgpOwo+ICsgICAgICAgICAg ICAgICB2ZXB1X3dyaXRlX3JlbGF4ZWQodnB1LCByZWcsCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBWRVBVX1JFR19WUDhfSU5UUkFfMTZYMTZfUEVOQUxUWShpKSk7Cj4gKyAg ICAgICB9Cj4gKwo+ICsgICAgICAgcmVnID0gVkVQVV9SRUdfVlA4X0xGX1JFRl9ERUxUQV9JTlRS QV9NQihjdHgtPnZwOF9lbmMucmVmX2RlbHRhW1JFRl9ERUxUQV9JTlRSQV9NQl0pOwo+ICsgICAg ICAgcmVnIHw9IFZFUFVfUkVHX1ZQOF9MRl9NT0RFX0RFTFRBX0JQUkVEKGN0eC0+dnA4X2VuYy5t b2RlX2RlbHRhW01PREVfREVMVEFfQlBSRURdKTsKPiArICAgICAgIHJlZyB8PSBWRVBVX1JFR19W UDhfSU5URVJfVFlQRV9CSVRfQ09TVCgwKTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2 cHUsIHJlZywgVkVQVV9SRUdfVlA4X0NPTlRST0wpOwo+ICsKPiArICAgICAgIHJlZyA9IFZFUFVf UkVHX1ZQOF9MRl9SRUZfREVMVEFfQUxUX1JFRihjdHgtPnZwOF9lbmMucmVmX2RlbHRhW1JFRl9E RUxUQV9BTFRfUkVGXSkKPiArICAgICAgICAgICAgICAgfCBWRVBVX1JFR19WUDhfTEZfUkVGX0RF TFRBX0xBU1RfUkVGKGN0eC0+dnA4X2VuYy5yZWZfZGVsdGFbUkVGX0RFTFRBX0xBU1RfUkVGXSkK PiArICAgICAgICAgICAgICAgfCBWRVBVX1JFR19WUDhfTEZfUkVGX0RFTFRBX0dPTERFTihjdHgt PnZwOF9lbmMucmVmX2RlbHRhW1JFRl9ERUxUQV9HT0xERU5dKTsKPiArICAgICAgIHZlcHVfd3Jp dGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfVlA4X0xPT1BfRklMVEVSX1JFRl9ERUxUQSk7 Cj4gKwo+ICsgICAgICAgcmVnID0gVkVQVV9SRUdfVlA4X0xGX01PREVfREVMVEFfU1BMSVRNVihj dHgtPnZwOF9lbmMubW9kZV9kZWx0YVtNT0RFX0RFTFRBX1NQTElUTVZdKQo+ICsgICAgICAgICAg ICAgICB8IFZFUFVfUkVHX1ZQOF9MRl9NT0RFX0RFTFRBX1pFUk9NVihjdHgtPnZwOF9lbmMubW9k ZV9kZWx0YVtNT0RFX0RFTFRBX1pFUk9NVl0pCj4gKyAgICAgICAgICAgICAgIHwgVkVQVV9SRUdf VlA4X0xGX01PREVfREVMVEFfTkVXTVYoY3R4LT52cDhfZW5jLm1vZGVfZGVsdGFbTU9ERV9ERUxU QV9ORVdNVl0pOwo+ICsgICAgICAgdmVwdV93cml0ZV9yZWxheGVkKHZwdSwgcmVnLCBWRVBVX1JF R19WUDhfTE9PUF9GSUxURVJfTU9ERV9ERUxUQSk7Cj4gKwo+ICsgICAgICAgZm9yIChpID0gMDsg aSA8IDEyODsgaSArPSA0KSB7Cj4gKyAgICAgICAgICAgICAgIHUzMiB4Owo+ICsgICAgICAgICAg ICAgICB1MzIgeTsKPiArCj4gKyAgICAgICAgICAgICAgIHJlZyA9IFZFUFVfUkVHX0RNVl9QRU5B TFRZX1RBQkxFX0JJVChpICogMiwgMyk7Cj4gKyAgICAgICAgICAgICAgIHJlZyB8PSBWRVBVX1JF R19ETVZfUEVOQUxUWV9UQUJMRV9CSVQoKGkgKyAxKSAqIDIsIDIpOwo+ICsgICAgICAgICAgICAg ICByZWcgfD0gVkVQVV9SRUdfRE1WX1BFTkFMVFlfVEFCTEVfQklUKChpICsgMikgKiAyLCAxKTsK PiArICAgICAgICAgICAgICAgcmVnIHw9IFZFUFVfUkVHX0RNVl9QRU5BTFRZX1RBQkxFX0JJVCgo aSArIDMpICogMiwgMCk7Cj4gKyAgICAgICAgICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUs IHJlZywgVkVQVV9SRUdfRE1WX1BFTkFMVFlfVEJMKGkgLyA0KSk7Cj4gKwo+ICsgICAgICAgICAg ICAgICB5ID0gY29zdF9tdihpICogMiwgZW50cm9weS0+bXZfcHJvYlswXSk7ICAgICAgICAvKiBt diB5ICovCj4gKyAgICAgICAgICAgICAgIHggPSBjb3N0X212KGkgKiAyLCBlbnRyb3B5LT5tdl9w cm9iWzFdKTsgICAgICAgIC8qIG12IHggKi8KPiArCj4gKyAgICAgICAgICAgICAgIHJlZyA9IFZF UFVfUkVHX0RNVl9RX1BJWEVMX1BFTkFMVFlfVEFCTEVfQklUKAo+ICsgICAgICAgICAgICAgICAg ICAgICAgIG1pbigyNTV1LCAoeSArIHggKyAxKSAvIDIgKiB3ZWlnaHRbcXBdID4+IDgpLCAzKTsK PiArCj4gKyAgICAgICAgICAgICAgIHkgPSBjb3N0X212KChpICsgMSkgKiAyLCBlbnRyb3B5LT5t dl9wcm9iWzBdKTsgLyogbXYgeSAqLwo+ICsgICAgICAgICAgICAgICB4ID0gY29zdF9tdigoaSAr IDEpICogMiwgZW50cm9weS0+bXZfcHJvYlsxXSk7IC8qIG12IHggKi8KPiArICAgICAgICAgICAg ICAgcmVnIHw9IFZFUFVfUkVHX0RNVl9RX1BJWEVMX1BFTkFMVFlfVEFCTEVfQklUKAo+ICsgICAg ICAgICAgICAgICAgICAgICAgIG1pbigyNTV1LCAoeSArIHggKyAxKSAvIDIgKiB3ZWlnaHRbcXBd ID4+IDgpLCAyKTsKPiArCj4gKyAgICAgICAgICAgICAgIHkgPSBjb3N0X212KChpICsgMikgKiAy LCBlbnRyb3B5LT5tdl9wcm9iWzBdKTsgLyogbXYgeSAqLwo+ICsgICAgICAgICAgICAgICB4ID0g Y29zdF9tdigoaSArIDIpICogMiwgZW50cm9weS0+bXZfcHJvYlsxXSk7IC8qIG12IHggKi8KPiAr ICAgICAgICAgICAgICAgcmVnIHw9IFZFUFVfUkVHX0RNVl9RX1BJWEVMX1BFTkFMVFlfVEFCTEVf QklUKAo+ICsgICAgICAgICAgICAgICAgICAgICAgIG1pbigyNTV1LCAoeSArIHggKyAxKSAvIDIg KiB3ZWlnaHRbcXBdID4+IDgpLCAxKTsKPiArCj4gKyAgICAgICAgICAgICAgIHkgPSBjb3N0X212 KChpICsgMykgKiAyLCBlbnRyb3B5LT5tdl9wcm9iWzBdKTsgLyogbXYgeSAqLwo+ICsgICAgICAg ICAgICAgICB4ID0gY29zdF9tdigoaSArIDMpICogMiwgZW50cm9weS0+bXZfcHJvYlsxXSk7IC8q IG12IHggKi8KPiArICAgICAgICAgICAgICAgcmVnIHw9IFZFUFVfUkVHX0RNVl9RX1BJWEVMX1BF TkFMVFlfVEFCTEVfQklUKAo+ICsgICAgICAgICAgICAgICAgICAgICAgIG1pbigyNTV1LCAoeSAr IHggKyAxKSAvIDIgKiB3ZWlnaHRbcXBdID4+IDgpLCAwKTsKPiArCj4gKyAgICAgICAgICAgICAg IHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFZFUFVfUkVHX0RNVl9RX1BJWEVMX1BFTkFMVFlfVEJMKGkgLyA0KSk7Cj4gKyAg ICAgICB9Cj4gK30KPiArCj4gK2ludCByb2NrY2hpcF92cHUyX3ZwOF9lbmNfcnVuKHN0cnVjdCBo YW50cm9fY3R4ICpjdHgpCj4gK3sKPiArICAgICAgIHN0cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBj dHgtPmRldjsKPiArICAgICAgIHN0cnVjdCB2NGwyX2N0cmxfdnA4X2VuY29kZV9wYXJhbXMgKnBh cmFtczsKPiArICAgICAgIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmw7Cj4gKyAgICAgICB1MzIgcmVn LCBxcDsKPiArICAgICAgIGludCBpOwo+ICsKPiArICAgICAgIGhhbnRyb19zdGFydF9wcmVwYXJl X3J1bihjdHgpOwo+ICsKPiArICAgICAgIHBhcmFtcyA9IGhhbnRyb19nZXRfY3RybChjdHgsIFY0 TDJfQ0lEX1NUQVRFTEVTU19WUDhfRU5DT0RFX1BBUkFNUyk7Cj4gKyAgICAgICBpZiAoV0FSTl9P TighcGFyYW1zKSkKPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsgICAg ICAgaWYgKHBhcmFtcy0+ZmxhZ3MgJiBWNEwyX1ZQOF9GUkFNRV9GTEFHX1NFR01FTlRfRU5BQkxF RCkKPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsgICAgICAgY3R4LT52 cDhfZW5jLmlzX2ludHJhID0gcGFyYW1zLT5mcmFtZV90eXBlID09IFY0TDJfVlA4X0ZSQU1FX1RZ UEVfS0VZRlJBTUU7Cj4gKwo+ICsgICAgICAgaWYgKGlzX2ludHJhKGN0eCkpIHsKPiArICAgICAg ICAgICAgICAgaWYgKHBhcmFtcy0+bG9vcF9maWx0ZXJfbGV2ZWwgIT0gMjYpCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gKyAgICAgICB9IGVsc2Ugewo+ICsgICAg ICAgICAgICAgICBpZiAocGFyYW1zLT5sb29wX2ZpbHRlcl9sZXZlbCAhPSAxMikKPiArICAgICAg ICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiArICAgICAgIH0KPiArCj4gKyAgICAg ICBjdHJsID0gdjRsMl9jdHJsX2ZpbmQoJmN0eC0+Y3RybF9oYW5kbGVyLCBWNEwyX0NJRF9TVEFU RUxFU1NfVlA4X0VOQ09ERV9RUCk7Cj4gKyAgICAgICBpZiAoV0FSTl9PTighY3RybCkpCj4gKyAg ICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ICsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5z aG93X2ZyYW1lID0gcGFyYW1zLT5mbGFncyAmIFY0TDJfVlA4X0ZSQU1FX0ZMQUdfU0hPV0ZSQU1F Owo+ICsgICAgICAgY3R4LT52cDhfZW5jLnJlZnJlc2hfZ29sZGVuX2ZyYW1lID0gcGFyYW1zLT5m bGFncyAmIFY0TDJfVlA4X0ZSQU1FX0ZMQUdfR09MREVOX1JFRlJFU0g7Cj4gKyAgICAgICBjdHgt PnZwOF9lbmMucmVmcmVzaF9hbHRlcm5hdGVfZnJhbWUgPSBwYXJhbXMtPmZsYWdzICYgVjRMMl9W UDhfRlJBTUVfRkxBR19BTFRSRUZfUkVGUkVTSDsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5yZWZy ZXNoX2VudHJvcHlfcHJvYnMgPQo+ICsgICAgICAgICAgICAgICBwYXJhbXMtPmZsYWdzICYgVjRM Ml9WUDhfRlJBTUVfRkxBR19SRUZSRVNIX0VOVFJPUFlfUFJPQlM7Cj4gKyAgICAgICBjdHgtPnZw OF9lbmMuY29weV9idWZmZXJfdG9fZ29sZGVuID0gcGFyYW1zLT5jb3B5X2J1ZmZlcl90b19nb2xk ZW47Cj4gKyAgICAgICBjdHgtPnZwOF9lbmMuY29weV9idWZmZXJfdG9fYWx0ZXJuYXRlID0gcGFy YW1zLT5jb3B5X2J1ZmZlcl90b19hbHRlcm5hdGU7Cj4gKyAgICAgICBjdHgtPnZwOF9lbmMucHJv Yl9pbnRyYSA9IHBhcmFtcy0+cHJvYl9pbnRyYTsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5wcm9i X2xhc3QgPSBwYXJhbXMtPnByb2JfbGFzdDsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5wcm9iX2dm ID0gcGFyYW1zLT5wcm9iX2dmOwo+ICsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY191 cGRhdGVfZW50cm9weShjdHgpOwo+ICsKPiArICAgICAgIHFwID0gKmN0cmwtPnBfY3VyLnBfczMy Owo+ICsgICAgICAgY3R4LT52cDhfZW5jLnByb2Jfc2tpcF9mYWxzZSA9IGRlZmF1bHRfcHJvYl9z a2lwX2ZhbHNlW3FwXTsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY193cml0ZV9oZWFk ZXIoY3R4LCBxcCwgcGFyYW1zKTsKPiArCj4gKyAgICAgICAvKgo+ICsgICAgICAgICogUHJvZ3Jh bSB0aGUgaGFyZHdhcmUuCj4gKyAgICAgICAgKi8KPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhl ZCh2cHUsIFZFUFVfUkVHX0VOQ09ERV9GT1JNQVRfVlA4LCBWRVBVX1JFR19FTkNPREVfU1RBUlQp Owo+ICsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY19zZXRfcGFyYW1zKHZwdSwgY3R4 LCBxcCwgcGFyYW1zKTsKPiArICAgICAgIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY19zZXRfYnVmZmVy cyh2cHUsIGN0eCwgcXAsIHBhcmFtcyk7Cj4gKwo+ICsgICAgICAgcmVnID0gVkVQVV9SRUdfQVhJ X0NUUkxfUkVBRF9JRCgwKQo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0FYSV9DVFJMX1dS SVRFX0lEKDApCj4gKyAgICAgICAgICAgICAgIHwgVkVQVV9SRUdfQVhJX0NUUkxfQlVSU1RfTEVO KDE2KQo+ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0FYSV9DVFJMX0lOQ1JFTUVOVF9NT0RF KDApCj4gKyAgICAgICAgICAgICAgIHwgVkVQVV9SRUdfQVhJX0NUUkxfQklSU1RfRElTQ0FSRCgw KTsKPiArICAgICAgIHZlcHVfd3JpdGVfcmVsYXhlZCh2cHUsIHJlZywgVkVQVV9SRUdfQVhJX0NU UkwpOwo+ICsKPiArICAgICAgIC8qIFN0YXJ0IHRoZSBoYXJkd2FyZS4gKi8KPiArICAgICAgIHJl ZyA9IFZFUFVfUkVHX01CX0hFSUdIVChNQl9IRUlHSFQoY3R4LT5zcmNfZm10LmhlaWdodCkpCj4g KyAgICAgICAgICAgICAgIHwgVkVQVV9SRUdfTUJfV0lEVEgoTUJfV0lEVEgoY3R4LT5zcmNfZm10 LndpZHRoKSkKPiArICAgICAgICAgICAgICAgfCBWRVBVX1JFR19FTkNPREVfRk9STUFUX1ZQOAo+ ICsgICAgICAgICAgICAgICB8IFZFUFVfUkVHX0VOQ09ERV9FTkFCTEU7Cj4gKwo+ICsgICAgICAg aWYgKGlzX2ludHJhKGN0eCkpCj4gKyAgICAgICAgICAgICAgIHJlZyB8PSBWRVBVX1JFR19GUkFN RV9UWVBFX0lOVFJBOwo+ICsgICAgICAgZWxzZQo+ICsgICAgICAgICAgICAgICByZWcgfD0gVkVQ VV9SRUdfRlJBTUVfVFlQRV9JTlRFUjsKPiArCj4gKyAgICAgICAvKiBLaWNrIHRoZSB3YXRjaGRv ZyBhbmQgc3RhcnQgZW5jb2RpbmcgKi8KPiArICAgICAgIGhhbnRyb19lbmRfcHJlcGFyZV9ydW4o Y3R4KTsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTg0OyArK2kpCj4gKyAgICAgICAg ICAgICAgIHZlcHVfcmVhZCh2cHUsIGkgKiA0KTsKPiArCj4gKyAgICAgICB2ZXB1X3dyaXRlKHZw dSwgcmVnLCBWRVBVX1JFR19FTkNPREVfU1RBUlQpOwo+ICsKPiArICAgICAgIHJldHVybiAwOwo+ ICt9Cj4gKwo+ICt2b2lkIHJvY2tjaGlwX3ZwdTJfdnA4X2VuY19kb25lKHN0cnVjdCBoYW50cm9f Y3R4ICpjdHgpCj4gK3sKPiArICAgICAgIHN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKmRzdF9idWY7 Cj4gKyAgICAgICBzdHJ1Y3QgaGFudHJvX3ZwOF9lbmNfY3RybF9idWYgKmN0cmxfYnVmID0gY3R4 LT52cDhfZW5jLmN0cmxfYnVmLmNwdTsKPiArICAgICAgIGludCBwYXJ0MV9zeiA9IGN0eC0+dnA4 X2VuYy5ib29sZW5jLmJ5dGVzX3dyaXR0ZW4gKyBjdHJsX2J1Zi0+aHdfaGRyX3NpemU7Cj4gKyAg ICAgICB2b2lkICpkc3QgPSBjdHgtPnZwOF9lbmMuZnJhbWVfdGFnOwo+ICsgICAgICAgaW50IG9s ZF9nID0gY3R4LT52cDhfZW5jLmdvbGRlbl9yZWYsIG9sZF9hID0gY3R4LT52cDhfZW5jLmFsdF9y ZWY7Cj4gKyAgICAgICBpbnQgaTsKPiArCj4gKyAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFn LT50YWdbMF0gfD0gKChwYXJ0MV9zeiA8PCA1KSAmIDB4ZmYpOwo+ICsgICAgICAgY3R4LT52cDhf ZW5jLmZyYW1lX3RhZy0+dGFnWzFdID0gKChwYXJ0MV9zeiA8PCA1KSA+PiA4KSAmIDB4ZmY7Cj4g KyAgICAgICBjdHgtPnZwOF9lbmMuZnJhbWVfdGFnLT50YWdbMl0gPSAoKHBhcnQxX3N6IDw8IDUp ID4+IDE2KSAmIDB4ZmY7Cj4gKwo+ICsgICAgICAgZHN0X2J1ZiA9IGhhbnRyb19nZXRfZHN0X2J1 ZihjdHgpOwo+ICsKPiArICAgICAgIC8qIGFzc2VtYmxlIGRzdCBmcmFtZSAqLwo+ICsgICAgICAg dmIyX3NldF9wbGFuZV9wYXlsb2FkKCZkc3RfYnVmLT52YjJfYnVmLCAwLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN3X2hkcl9zaXplKGN0eCkgKyBjdHJsX2J1Zi0+aHdfaGRyX3Np emUgKyBjdHJsX2J1Zi0+ZGN0X3NpemUpOwo+ICsKPiArICAgICAgIG1lbW1vdmUoZHN0ICsgc3df aGRyX3NpemUoY3R4KSwgZHN0ICsgcm91bmRfdXAoc3dfaGRyX3NpemUoY3R4KSwgOCksIGN0cmxf YnVmLT5od19oZHJfc2l6ZSk7Cj4gKyAgICAgICBtZW1tb3ZlKGRzdCArIHN3X2hkcl9zaXplKGN0 eCkgKyBjdHJsX2J1Zi0+aHdfaGRyX3NpemUsCj4gKyAgICAgICAgICAgICAgIGRzdCArIGN0eC0+ dnA4X2VuYy5lc3RpbWF0ZWRfaGRyX3NpemUsIGN0cmxfYnVmLT5kY3Rfc2l6ZSk7Cj4gKwo+ICsg ICAgICAgLyogY3VycmVudGx5IHJlY29uc3RydWN0ZWQgZnJhbWUgYmVjYW1lcyBsYXN0IHJlZiAq Lwo+ICsgICAgICAgaGFudHJvX3ZwOF9jbHJfYml0KCZjdHgtPnZwOF9lbmMsIFZQOF9CSVRfTEFT VCwgY3R4LT52cDhfZW5jLmxhc3RfcmVmKTsKPiArICAgICAgIGN0eC0+dnA4X2VuYy5sYXN0X3Jl ZiA9IGN0eC0+dnA4X2VuYy5yZWNvbnN0cnVjdGVkOwo+ICsgICAgICAgaGFudHJvX3ZwOF9zZXRf Yml0KCZjdHgtPnZwOF9lbmMsIFZQOF9CSVRfTEFTVCwgY3R4LT52cDhfZW5jLmxhc3RfcmVmKTsK PiArCj4gKyAgICAgICAvKiBhZnRlciB1cGRhdGUgKHBvdGVudGlhbGx5KSBuZXcgc2xvdHMgd2ls bCBiZSB1c2VkICovCj4gKyAgICAgICBoYW50cm9fdnA4X2Nscl9iaXQoJmN0eC0+dnA4X2VuYywg VlA4X0JJVF9HT0xERU4sIG9sZF9nKTsKPiArICAgICAgIGhhbnRyb192cDhfY2xyX2JpdCgmY3R4 LT52cDhfZW5jLCBWUDhfQklUX0FMVCwgb2xkX2EpOwo+ICsKPiArICAgICAgIC8qIFZQOCBzcGVj LCBzZWN0aW9uIDkuNy4gUmVmcmVzaCBHb2xkZW4gRnJhbWUgYW5kIEFsdHJlZiBGcmFtZSAqLwo+ ICsgICAgICAgaWYgKGlzX2ludHJhKGN0eCkpIHsKPiArICAgICAgICAgICAgICAgY3R4LT52cDhf ZW5jLmdvbGRlbl9yZWYgPSBjdHgtPnZwOF9lbmMubGFzdF9yZWY7Cj4gKyAgICAgICAgICAgICAg IGN0eC0+dnA4X2VuYy5hbHRfcmVmID0gY3R4LT52cDhfZW5jLmxhc3RfcmVmOwo+ICsgICAgICAg fSBlbHNlIHsKPiArICAgICAgICAgICAgICAgaWYgKGN0eC0+dnA4X2VuYy5yZWZyZXNoX2dvbGRl bl9mcmFtZSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5nb2xkZW5f cmVmID0gY3R4LT52cDhfZW5jLmxhc3RfcmVmOwo+ICsgICAgICAgICAgICAgICB9IGVsc2UgaWYg KGN0eC0+dnA4X2VuYy5jb3B5X2J1ZmZlcl90b19nb2xkZW4pIHsKPiArICAgICAgICAgICAgICAg ICAgICAgICBzd2l0Y2ggKGN0eC0+dnA4X2VuYy5jb3B5X2J1ZmZlcl90b19nb2xkZW4pIHsKPiAr ICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfVlA4X0ZSQU1FX0dPTERFTl9LRUVQOgo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICAgICAgICAg ICAgICAgICAgY2FzZSBWNEwyX1ZQOF9GUkFNRV9HT0xERU5fTEFTVEZSQU1FOgo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLmdvbGRlbl9yZWYgPSBjdHgtPnZw OF9lbmMubGFzdF9yZWY7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK PiArICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFY0TDJfVlA4X0ZSQU1FX0dPTERFTl9BTFRS RUY6Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuZ29sZGVu X3JlZiA9IG9sZF9hOwo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgfQo+ICsgICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAg ICAgICAgICAgICBpZiAoY3R4LT52cDhfZW5jLnJlZnJlc2hfYWx0ZXJuYXRlX2ZyYW1lKSB7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLmFsdF9yZWYgPSBjdHgtPnZwOF9l bmMubGFzdF9yZWY7Cj4gKyAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4LT52cDhfZW5jLmNv cHlfYnVmZmVyX3RvX2FsdGVybmF0ZSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHN3aXRj aCAoY3R4LT52cDhfZW5jLmNvcHlfYnVmZmVyX3RvX2FsdGVybmF0ZSkgewo+ICsgICAgICAgICAg ICAgICAgICAgICAgIGNhc2UgVjRMMl9WUDhfRlJBTUVfQUxUUkVGX0tFRVA6Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgICAgICAgICAgICAgICAgICBj YXNlIFY0TDJfVlA4X0ZSQU1FX0FMVFJFRl9MQVNURlJBTUU6Cj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjdHgtPnZwOF9lbmMuYWx0X3JlZiA9IGN0eC0+dnA4X2VuYy5sYXN0X3Jl ZjsKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgICAg ICAgICAgICAgICAgIGNhc2UgVjRMMl9WUDhfRlJBTUVfQUxUUkVGX0dPTERFTjoKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dnA4X2VuYy5hbHRfcmVmID0gb2xkX2c7Cj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgICAgICAgICAg ICAgICAgICB9Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAgICAgIH0KPiArCj4gKyAgICAgICAv KiBtYXJrIHVwZGF0ZWQgZ29sZGVuIGFuZCBhbHQgc2xvdHMgdXNlZCAqLwo+ICsgICAgICAgaGFu dHJvX3ZwOF9zZXRfYml0KCZjdHgtPnZwOF9lbmMsIFZQOF9CSVRfR09MREVOLCBjdHgtPnZwOF9l bmMuZ29sZGVuX3JlZik7Cj4gKyAgICAgICBoYW50cm9fdnA4X3NldF9iaXQoJmN0eC0+dnA4X2Vu YywgVlA4X0JJVF9BTFQsIGN0eC0+dnA4X2VuYy5hbHRfcmVmKTsKPiArCj4gKyAgICAgICAvKiBm aW5kIGZpcnN0IGZyZWUgc2xvdCBhZnRlciB1cGRhdGVzICovCj4gKyAgICAgICBmb3IgKGkgPSAw OyBpIDwgQVJSQVlfU0laRShjdHgtPnZwOF9lbmMucmVmX2JpdG1hcHMpOyArK2kpCj4gKyAgICAg ICAgICAgICAgIGlmICghY3R4LT52cDhfZW5jLnJlZl9iaXRtYXBzW2ldKSB7Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgY3R4LT52cDhfZW5jLmZpcnN0X2ZyZWUgPSBpOwo+ICsgICAgICAgICAg ICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgICAgICAgICB9Cj4gKyAgICAgICBXQVJOX09O KGkgPj0gNCk7Cj4gKwo+ICsgICAgICAgY3R4LT52cDhfZW5jLmxhc3RfaW50cmEgPSBpc19pbnRy YShjdHgpOwo+ICsgICAgICAgKytjdHgtPnZwOF9lbmMuZnJhbWVfY291bnRlcjsKPiArfQo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tjaGlwX3Zw dTJfcmVncy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9yb2NrY2hpcF92 cHUyX3JlZ3MuaAo+IGluZGV4IDQ5ZTQwODg5NTQ1Yi4uYjY4ODgyOTY1NzcwIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1Ml9yZWdz LmgKPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tjaGlwX3Zw dTJfcmVncy5oCj4gQEAgLTI1OCw2ICsyNTgsNyBAQAo+ICAjZGVmaW5lICAgICBWRVBVX1JFR19G UkFNRV9UWVBFX0lOVEVSICAgICAgICAgICAgICAgICAgKDB4MCA8PCA2KQo+ICAjZGVmaW5lICAg ICBWRVBVX1JFR19GUkFNRV9UWVBFX0lOVFJBICAgICAgICAgICAgICAgICAgKDB4MSA8PCA2KQo+ ICAjZGVmaW5lICAgICBWRVBVX1JFR19GUkFNRV9UWVBFX01WQ0lOVEVSICAgICAgICAgICAgICAg KDB4MiA8PCA2KQo+ICsjZGVmaW5lICAgICBWRVBVX1JFR19FTkNPREVfRk9STUFUX1ZQOCAgICAg ICAgICAgICAgICAgKDB4MSA8PCA0KSAgICAgIC8qIHVuZG9jdW1lbnRlZCAqLwo+ICAjZGVmaW5l ICAgICBWRVBVX1JFR19FTkNPREVfRk9STUFUX0pQRUcgICAgICAgICAgICAgICAgICAgICAgICAo MHgyIDw8IDQpCj4gICNkZWZpbmUgICAgIFZFUFVfUkVHX0VOQ09ERV9GT1JNQVRfSDI2NCAgICAg ICAgICAgICAgICAgICAgICAgICgweDMgPDwgNCkKPiAgI2RlZmluZSAgICAgVkVQVV9SRUdfRU5D T0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEJJVCgwKQo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tjaGlwX3ZwdV9ody5jIGIvZHJpdmVy cy9tZWRpYS9wbGF0Zm9ybS92ZXJpc2lsaWNvbi9yb2NrY2hpcF92cHVfaHcuYwo+IGluZGV4IDhk ZTZmZDJlOGVlZi4uMDY3MWYxNjA5YWM0IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxh dGZvcm0vdmVyaXNpbGljb24vcm9ja2NoaXBfdnB1X2h3LmMKPiArKysgYi9kcml2ZXJzL21lZGlh L3BsYXRmb3JtL3ZlcmlzaWxpY29uL3JvY2tjaGlwX3ZwdV9ody5jCj4gQEAgLTU2LDYgKzU2LDE5 IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGFudHJvX2ZtdCByb2NrY2hpcF92cHVfZW5jX2ZtdHNb XSA9IHsKPiAgICAgICAgICAgICAgICAgICAgICAgICAuc3RlcF9oZWlnaHQgPSBNQl9ESU0sCj4g ICAgICAgICAgICAgICAgIH0sCj4gICAgICAgICB9LAo+ICsgICAgICAgewo+ICsgICAgICAgICAg ICAgICAuZm91cmNjID0gVjRMMl9QSVhfRk1UX1ZQOF9GUkFNRSwKPiArICAgICAgICAgICAgICAg LmNvZGVjX21vZGUgPSBIQU5UUk9fTU9ERV9WUDhfRU5DLAo+ICsgICAgICAgICAgICAgICAubWF4 X2RlcHRoID0gMiwKPiArICAgICAgICAgICAgICAgLmZybXNpemUgPSB7Cj4gKyAgICAgICAgICAg ICAgICAgICAgICAgLm1pbl93aWR0aCA9IDk2LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIC5t YXhfd2lkdGggPSAxOTIwLAo+ICsgICAgICAgICAgICAgICAgICAgICAgIC5zdGVwX3dpZHRoID0g TUJfRElNLAo+ICsgICAgICAgICAgICAgICAgICAgICAgIC5taW5faGVpZ2h0ID0gOTYsCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgLm1heF9oZWlnaHQgPSAxMDg4LAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIC5zdGVwX2hlaWdodCA9IE1CX0RJTSwKPiArICAgICAgICAgICAgICAgfSwKPiAr ICAgICAgIH0sCj4gIH07Cj4KPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBoYW50cm9fZm10IHJvY2tj aGlwX3ZwdTFfcG9zdHByb2NfZm10c1tdID0gewo+IEBAIC0zNTAsNiArMzYzLDcgQEAgc3RhdGlj IGludCByb2NrY2hpcF92cHVfaHdfaW5pdChzdHJ1Y3QgaGFudHJvX2RldiAqdnB1KQo+ICB7Cj4g ICAgICAgICAvKiBCdW1wIEFDTEsgdG8gbWF4LiBwb3NzaWJsZSBmcmVxLiB0byBpbXByb3ZlIHBl cmZvcm1hbmNlLiAqLwo+ICAgICAgICAgY2xrX3NldF9yYXRlKHZwdS0+Y2xvY2tzWzBdLmNsaywg UkszMjg4X0FDTEtfTUFYX0ZSRVEpOwo+ICsKPiAgICAgICAgIHJldHVybiAwOwo+ICB9Cj4KPiBA QCAtNDg4LDYgKzUwMiwxMyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGhhbnRyb19jb2RlY19vcHMg cmszMzk5X3ZwdV9jb2RlY19vcHNbXSA9IHsKPiAgICAgICAgICAgICAgICAgLmluaXQgPSBoYW50 cm9fdnA4X2RlY19pbml0LAo+ICAgICAgICAgICAgICAgICAuZXhpdCA9IGhhbnRyb192cDhfZGVj X2V4aXQsCj4gICAgICAgICB9LAo+ICsgICAgICAgW0hBTlRST19NT0RFX1ZQOF9FTkNdID0gewo+ ICsgICAgICAgICAgICAgICAucnVuID0gcm9ja2NoaXBfdnB1Ml92cDhfZW5jX3J1biwKPiArICAg ICAgICAgICAgICAgLnJlc2V0ID0gcm9ja2NoaXBfdnB1Ml9lbmNfcmVzZXQsCj4gKyAgICAgICAg ICAgICAgIC5pbml0ID0gaGFudHJvX3ZwOF9lbmNfaW5pdCwKPiArICAgICAgICAgICAgICAgLmRv bmUgPSByb2NrY2hpcF92cHUyX3ZwOF9lbmNfZG9uZSwKPiArICAgICAgICAgICAgICAgLmV4aXQg PSBoYW50cm9fdnA4X2VuY19leGl0LAo+ICsgICAgICAgfSwKPiAgfTsKPgo+ICBzdGF0aWMgY29u c3Qgc3RydWN0IGhhbnRyb19jb2RlY19vcHMgcmszNTY4X3ZlcHVfY29kZWNfb3BzW10gPSB7Cj4g QEAgLTYyNiw3ICs2NDcsNyBAQCBjb25zdCBzdHJ1Y3QgaGFudHJvX3ZhcmlhbnQgcmszMzk5X3Zw dV92YXJpYW50ID0gewo+ICAgICAgICAgLmRlY19mbXRzID0gcmszMzk5X3ZwdV9kZWNfZm10cywK PiAgICAgICAgIC5udW1fZGVjX2ZtdHMgPSBBUlJBWV9TSVpFKHJrMzM5OV92cHVfZGVjX2ZtdHMp LAo+ICAgICAgICAgLmNvZGVjID0gSEFOVFJPX0pQRUdfRU5DT0RFUiB8IEhBTlRST19NUEVHMl9E RUNPREVSIHwKPiAtICAgICAgICAgICAgICAgIEhBTlRST19WUDhfREVDT0RFUiwKPiArICAgICAg ICAgICAgICAgIEhBTlRST19WUDhfREVDT0RFUiB8IEhBTlRST19WUDhfRU5DT0RFUiwKPiAgICAg ICAgIC5jb2RlY19vcHMgPSByazMzOTlfdnB1X2NvZGVjX29wcywKPiAgICAgICAgIC5pcnFzID0g cm9ja2NoaXBfdnB1Ml9pcnFzLAo+ICAgICAgICAgLm51bV9pcnFzID0gQVJSQVlfU0laRShyb2Nr Y2hpcF92cHUyX2lycXMpLAo+IC0tCj4gMi4yNS4xCj4KCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cmxp bnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK