summaryrefslogtreecommitdiff
authorshihong.zheng <shihong.zheng@amlogic.com>2020-08-11 04:28:36 (GMT)
committer Gan Zhang <gan.zhang@amlogic.com>2020-08-17 05:45:27 (GMT)
commit14c542557e779e2ec2b55df26598b86e38db79cc (patch)
tree5f383b56c1b626173d3a23b1ac2ef924bbc7b7bb
parent8c84a9c10e55f8b6d52c125de9266573d253859c (diff)
downloadmedia_modules-14c542557e779e2ec2b55df26598b86e38db79cc.zip
media_modules-14c542557e779e2ec2b55df26598b86e38db79cc.tar.gz
media_modules-14c542557e779e2ec2b55df26598b86e38db79cc.tar.bz2
mpeg12: fix frame mode interlace data insufficient. [1/1]
PD#SWPL-30096 Problem: decode timeout repeatly when use android raw extractor. cts failed. interlace mpeg12 two slices in two packets. Solution: add data request status send more chunk for decode when data insufficient. ucode gerrit id: 120436 ucode commit id: 713286 ucode change id: I517c3 Verify: ah212 Change-Id: Ieeb93c93290ab8b6fcf31b30ea63dddcf01cf47b Signed-off-by: shihong.zheng <shihong.zheng@amlogic.com>
Diffstat
-rw-r--r--drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c149
-rw-r--r--firmware/video_ucode.bin292
2 files changed, 258 insertions, 183 deletions
diff --git a/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c b/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c
index 8a0bb19..ef45eb8 100644
--- a/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c
+++ b/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c
@@ -160,6 +160,18 @@ enum {
FRAME_REPEAT_BOT,
FRAME_REPEAT_NONE
};
+
+/*Send by AV_SCRATCH_9*/
+#define MPEG12_PIC_DONE 1
+#define MPEG12_DATA_EMPTY 2
+#define MPEG12_SEQ_END 3
+#define MPEG12_DATA_REQUEST 4
+
+/*Send by AV_SCRATCH_G*/
+#define MPEG12_V4L2_INFO_NOTIFY 1
+/*Send by AV_SCRATCH_J*/
+#define MPEG12_USERDATA_DONE 0x8000
+
#define DEC_RESULT_NONE 0
#define DEC_RESULT_DONE 1
#define DEC_RESULT_AGAIN 2
@@ -173,15 +185,6 @@ enum {
#define DECODE_ID(hw) (hw_to_vdec(hw)->id)
#define DECODE_STOP_POS AV_SCRATCH_K
-static struct vframe_s *vmpeg_vf_peek(void *);
-static struct vframe_s *vmpeg_vf_get(void *);
-static void vmpeg_vf_put(struct vframe_s *, void *);
-static int vmpeg_vf_states(struct vframe_states *states, void *);
-static int vmpeg_event_cb(int type, void *data, void *private_data);
-static int notify_v4l_eos(struct vdec_s *vdec);
-
-
-
struct mmpeg2_userdata_record_t {
struct userdata_meta_info_t meta_info;
u32 rec_start;
@@ -334,6 +337,13 @@ static int vmpeg12_hw_ctx_restore(struct vdec_mpeg12_hw_s *hw);
static void reset_process_time(struct vdec_mpeg12_hw_s *hw);
static void vmpeg12_canvas_init(struct vdec_mpeg12_hw_s *hw);
static void flush_output(struct vdec_mpeg12_hw_s *hw);
+static struct vframe_s *vmpeg_vf_peek(void *);
+static struct vframe_s *vmpeg_vf_get(void *);
+static void vmpeg_vf_put(struct vframe_s *, void *);
+static int vmpeg_vf_states(struct vframe_states *states, void *);
+static int vmpeg_event_cb(int type, void *data, void *private_data);
+static int notify_v4l_eos(struct vdec_s *vdec);
+static void start_process_time_set(struct vdec_mpeg12_hw_s *hw);
static int debug_enable;
/*static struct work_struct userdata_push_work;*/
@@ -505,7 +515,6 @@ static int vmpeg12_v4l_alloc_buff_config_canvas(struct vdec_mpeg12_hw_s *hw, int
return 0;
}
-
static unsigned int vmpeg12_get_buf_num(struct vdec_mpeg12_hw_s *hw)
{
unsigned int buf_num = DECODE_BUFFER_NUM_DEF;
@@ -1294,7 +1303,8 @@ static void vmmpeg2_reset_userdata_fifo(struct vdec_s *vdec, int bInit)
if (hw) {
mutex_lock(&hw->userdata_mutex);
- pr_info("vmh264_reset_userdata_fifo: bInit: %d, ri: %d, wi: %d\n",
+ pr_info("%s: bInit: %d, ri: %d, wi: %d\n",
+ __func__,
bInit,
hw->userdata_info.read_index,
hw->userdata_info.write_index);
@@ -1860,24 +1870,38 @@ static irqreturn_t vmpeg12_isr_thread_fn(struct vdec_s *vdec, int irq)
}
reg = READ_VREG(AV_SCRATCH_J);
- if (reg & (1<<16)) {
+ if (reg & (1 << 16)) {
vdec_schedule_work(&hw->userdata_push_work);
return IRQ_HANDLED;
}
reg = READ_VREG(MREG_BUFFEROUT);
- if (reg == 2) {
+ if (reg == MPEG12_DATA_REQUEST) {
+ debug_print(DECODE_ID(hw), PRINT_FLAG_RUN_FLOW,
+ "%s: data request, bcnt=%x\n",
+ __func__, READ_VREG(VIFF_BIT_CNT));
+ if (vdec_frame_based(vdec)) {
+ reset_process_time(hw);
+ hw->dec_result = DEC_RESULT_GET_DATA;
+ vdec_schedule_work(&hw->work);
+ }
+ } else if (reg == MPEG12_DATA_EMPTY) {
/*timeout when decoding next frame*/
debug_print(DECODE_ID(hw), PRINT_FLAG_VLD_DETAIL,
- "mmpeg12: lack data, lvl=%x ctrl=%x bcnt=%x\n",
+ "%s: Insufficient data, lvl=%x ctrl=%x bcnt=%x\n",
+ __func__,
READ_VREG(VLD_MEM_VIFIFO_LEVEL),
READ_VREG(VLD_MEM_VIFIFO_CONTROL),
READ_VREG(VIFF_BIT_CNT));
-
if (vdec_frame_based(vdec)) {
- /* vmpeg12_save_hw_context(hw); */
- reset_process_time(hw);
- hw->dec_result = DEC_RESULT_DONE;
+ u32 bitcnt = READ_VREG(VIFF_BIT_CNT);
+ if (bitcnt < 32) {
+ reset_process_time(hw);
+ hw->dec_result = DEC_RESULT_GET_DATA;
+ } else {
+ userdata_pushed_drop(hw);
+ hw->dec_result = DEC_RESULT_DONE;
+ }
vdec_schedule_work(&hw->work);
} else {
hw->dec_result = DEC_RESULT_AGAIN;
@@ -1886,7 +1910,7 @@ static irqreturn_t vmpeg12_isr_thread_fn(struct vdec_s *vdec, int irq)
reset_process_time(hw);
}
return IRQ_HANDLED;
- } else {
+ } else { /* MPEG12_PIC_DONE, MPEG12_SEQ_END */
reset_process_time(hw);
info = READ_VREG(MREG_PIC_INFO);
@@ -2135,6 +2159,8 @@ static int notify_v4l_eos(struct vdec_s *vdec)
static void vmpeg12_work_implement(struct vdec_mpeg12_hw_s *hw,
struct vdec_s *vdec, int from)
{
+ int r;
+
if (hw->dec_result != DEC_RESULT_DONE)
debug_print(DECODE_ID(hw), PRINT_FLAG_RUN_FLOW,
"%s, result=%d, status=%d\n", __func__,
@@ -2173,6 +2199,39 @@ static void vmpeg12_work_implement(struct vdec_mpeg12_hw_s *hw,
vdec_vframe_dirty(vdec, hw->chunk);
hw->chunk = NULL;
vdec_clean_input(vdec);
+
+ r = vdec_prepare_input(vdec, &hw->chunk);
+ if (r < 0) {
+ hw->input_empty++;
+ reset_process_time(hw);
+ hw->dec_result = DEC_RESULT_GET_DATA;
+ debug_print(DECODE_ID(hw), PRINT_FLAG_DEC_DETAIL,
+ "%s: Insufficient data, get data retry\n", __func__);
+ vdec_schedule_work(&hw->work);
+ return;
+ }
+ hw->input_empty = 0;
+ if (vdec_frame_based(vdec) && (hw->chunk != NULL)) {
+ r = hw->chunk->size +
+ (hw->chunk->offset & (VDEC_FIFO_ALIGN - 1));
+ WRITE_VREG(VIFF_BIT_CNT, r * 8);
+ if (vdec->mvfrm)
+ vdec->mvfrm->frame_size += hw->chunk->size;
+ }
+ debug_print(DECODE_ID(hw), PRINT_FLAG_VDEC_STATUS,
+ "%s: %x %x %x size %d, bitcnt %d\n",
+ __func__,
+ READ_VREG(VLD_MEM_VIFIFO_LEVEL),
+ READ_VREG(VLD_MEM_VIFIFO_WP),
+ READ_VREG(VLD_MEM_VIFIFO_RP),
+ r, READ_VREG(VIFF_BIT_CNT));
+ vdec_enable_input(vdec);
+ hw->dec_result = DEC_RESULT_NONE;
+ hw->last_vld_level = 0;
+ start_process_time_set(hw);
+ hw->init_flag = 1;
+ mod_timer(&hw->check_timer, jiffies + CHECK_INTERVAL);
+ WRITE_VREG(MREG_BUFFEROUT, 0);
return;
} else if (hw->dec_result == DEC_RESULT_FORCE_EXIT) {
debug_print(DECODE_ID(hw), PRINT_FLAG_ERROR,
@@ -2612,7 +2671,8 @@ static void reset_process_time(struct vdec_mpeg12_hw_s *hw)
max_process_time[DECODE_ID(hw)] = process_time;
}
}
-static void start_process_time(struct vdec_mpeg12_hw_s *hw)
+
+static void start_process_time_set(struct vdec_mpeg12_hw_s *hw)
{
if ((hw->refs[1] != -1) && (hw->refs[0] == -1))
hw->decode_timeout_count = 1;
@@ -2620,6 +2680,7 @@ static void start_process_time(struct vdec_mpeg12_hw_s *hw)
hw->decode_timeout_count = 10;
hw->start_process_time = jiffies;
}
+
static void timeout_process(struct vdec_mpeg12_hw_s *hw)
{
struct vdec_s *vdec = hw_to_vdec(hw);
@@ -2690,7 +2751,7 @@ static void check_timer_func(unsigned long arg)
static int vmpeg12_hw_ctx_restore(struct vdec_mpeg12_hw_s *hw)
{
- u32 index, i;
+ u32 index = -1, i;
struct aml_vcodec_ctx * v4l2_ctx = hw->v4l2_ctx;
index = find_free_buffer(hw);
@@ -3068,6 +3129,15 @@ void (*callback)(struct vdec_s *, void *),
return;
}
+ hw->input_empty = 0;
+ if ((vdec_frame_based(vdec)) &&
+ (hw->chunk != NULL)) {
+ size = hw->chunk->size +
+ (hw->chunk->offset & (VDEC_FIFO_ALIGN - 1));
+ WRITE_VREG(VIFF_BIT_CNT, size * 8);
+ if (vdec->mvfrm)
+ vdec->mvfrm->frame_size = hw->chunk->size;
+ }
if (vdec_frame_based(vdec) && !vdec_secure(vdec)) {
/* HW needs padding (NAL start) for frame ending */
char* tail = (char *)hw->chunk->block->start_virt;
@@ -3080,7 +3150,7 @@ void (*callback)(struct vdec_s *, void *),
codec_mm_dma_flush(tail, 4, DMA_TO_DEVICE);
}
- if (vdec_frame_based(vdec) && debug_enable) {
+ if (vdec_frame_based(vdec) && debug_enable && !vdec_secure(vdec)) {
u8 *data = NULL;
if (hw->chunk)
debug_print(DECODE_ID(hw), PRINT_FLAG_RUN_FLOW,
@@ -3107,42 +3177,32 @@ void (*callback)(struct vdec_s *, void *),
if (debug_enable & PRINT_FRAMEBASE_DATA
) {
int jj;
-
+ debug_print(DECODE_ID(hw), PRINT_FRAMEBASE_DATA,
+ "frame data:\n");
for (jj = 0; jj < size; jj++) {
if ((jj & 0xf) == 0)
- debug_print(DECODE_ID(hw),
- PRINT_FRAMEBASE_DATA,
- "%06x:", jj);
- debug_print(DECODE_ID(hw),
- PRINT_FRAMEBASE_DATA,
- "%02x ", data[jj]);
+ pr_info("%06x:", jj);
+ pr_info("%02x ", data[jj]);
if (((jj + 1) & 0xf) == 0)
- debug_print(DECODE_ID(hw),
- PRINT_FRAMEBASE_DATA,
- "\n");
+ pr_info("\n");
}
+ pr_info("\n");
}
if (!hw->chunk->block->is_mapped)
codec_mm_unmap_phyaddr(data);
- } else
+ } else {
debug_print(DECODE_ID(hw), PRINT_FLAG_VDEC_STATUS,
- "%s: %x %x %x %x %x size 0x%x\n",
+ "%s: %x %x %x %x %x size 0x%x, bitcnt %d\n",
__func__,
READ_VREG(VLD_MEM_VIFIFO_LEVEL),
READ_VREG(VLD_MEM_VIFIFO_WP),
READ_VREG(VLD_MEM_VIFIFO_RP),
STBUF_READ(&vdec->vbuf, get_rp),
STBUF_READ(&vdec->vbuf, get_wp),
- size);
-
- if (vdec->mvfrm && hw->chunk)
- vdec->mvfrm->frame_size = hw->chunk->size;
-
- hw->input_empty = 0;
- vdec_enable_input(vdec);
+ size, READ_VREG(VIFF_BIT_CNT));
+ }
- hw->dec_result = DEC_RESULT_NONE;
if (vdec->mc_loaded) {
/*firmware have load before,
and not changes to another.
@@ -3161,6 +3221,7 @@ void (*callback)(struct vdec_s *, void *),
vdec->mc_loaded = 1;
vdec->mc_type = VFORMAT_MPEG12;
}
+
if (vmpeg12_hw_ctx_restore(hw) < 0) {
hw->dec_result = DEC_RESULT_ERROR;
debug_print(DECODE_ID(hw), PRINT_FLAG_ERROR,
@@ -3169,9 +3230,11 @@ void (*callback)(struct vdec_s *, void *),
return;
}
/*wmb();*/
+ hw->dec_result = DEC_RESULT_NONE;
hw->stat |= STAT_MC_LOAD;
+ vdec_enable_input(vdec);
hw->last_vld_level = 0;
- start_process_time(hw);
+ start_process_time_set(hw);
if (vdec->mvfrm)
vdec->mvfrm->hw_decode_start = local_clock();
amvdec_start();
diff --git a/firmware/video_ucode.bin b/firmware/video_ucode.bin
index a36e3d7..2499e5e 100644
--- a/firmware/video_ucode.bin
+++ b/firmware/video_ucode.bin
@@ -1,4 +1,4 @@
-עR.<HK|UK 2w?Աprh c2*ufʙ
+,T# -W{RU<-Deڨ&h6cΰ7JfwܒT7t0t[ioi@ebaz ^Zt-@0H J݅FF)'xt[O6'KdWTagmg@x
 @
I`
@@ -494,7 +494,7 @@ An+,w A
2 ?2
x 3
-
+
 @
@@ -932,7 +932,7 @@ An+,w A
2 ?2
x 3
-
+
 @
@@ -1365,7 +1365,7 @@ An+,w A
2 ?2
x 3
-
+
 @
@@ -1805,7 +1805,7 @@ An+,w A
2 ?2
x 3
-
+

@x
Ȁ
@@ -1819,7 +1819,7 @@ H
H
@p
6 
-@
+@

%
x
@@ -1830,7 +1830,7 @@ H
H

x
-@
+@
 @
I`
x `
@@ -2319,7 +2319,7 @@ HCP HCX "@Ir
C C @ Ir
C
C 3
-C C B LCH
+C C B LCH
 @
I`
x `
@@ -2807,7 +2807,7 @@ HCP HCX "@Ir
C C @ Ir
C
C 3
-C C B LCH
+C C B LCH
 @
I`
x `
@@ -3295,7 +3295,7 @@ HCP HCX "@Ir
C C @ Ir
C
C 3
-C C B LCH
+C C B LCH
I
v
G
@@ -3388,7 +3388,7 @@ U
T%H @ID
T%H @ID
T%H @ID
-U
+U
I@
v
G
@@ -3490,7 +3490,7 @@ U
T%H @ID
T%H @ID
T%H @ID
-U
+U
I@
v
@@ -3587,7 +3587,7 @@ U
T%H @ID
T%H @ID
T%H @ID
-U
+U
I
v
@@ -3693,7 +3693,7 @@ U
T%H @ID
T%H @ID
T%H @ID
-U
+U
x
B<
@@ -4247,14 +4247,14 @@ I
G 
-G"@ @@ # A
+G"@ @@ # A
-
+
x
B<
@@ -4814,7 +4814,7 @@ I
G  @C # 
-G"@ ? # @A
+G"@ ? # @A
x
B<
@@ -5362,7 +5362,7 @@ I
G 
-G"@ @@ # A
+G"@ @@ # A
x
B<
@@ -5912,10 +5912,10 @@ I
G 
-G"@ @@ # A
+G"@ @@ # A
-
+
I !
`xI@ C
     @
@@ -6313,7 +6313,7 @@ EG
EŅ "  
EG
ņ
-EŇ " 
+EŇ " 
I !
`iI@ C
     @
@@ -6685,7 +6685,7 @@ EŇ@x
EG
ł
EŃ@
-`
+`
I !
`xI@ C
     @
@@ -7057,7 +7057,7 @@ EŇ@x
EG
ł
EŃ@
-`
+`
I !
`iI@ C
     @
@@ -7455,7 +7455,7 @@ EG
EŅ "  
EG
ņ
-EŇ " 
+EŇ " 
I !
`xI@ C
     @
@@ -7827,7 +7827,7 @@ EŇ@x
EG
ł
EŃ@
-`
+`
I !
`xI@ C
     @
@@ -8225,7 +8225,7 @@ EG
EŅ "  
EG
ņ
-EŇ " 
+EŇ " 
x

@@ -8407,7 +8407,7 @@ n
J` 
-J` 
+J` 
@@ -8605,7 +8605,7 @@ n
J` 
-J` 
+J` 
+@+
@@ -9090,7 +9090,7 @@ C@
B
B
-@
+@
+@+
@@ -9576,7 +9576,7 @@ C@
B
B
-@
+@

@@ -9875,7 +9875,7 @@ G
 *C(I(
,J@($ ,*F ( ) ("L(h ! ( 튂( (
,J@ ($ ("Lh ! ( 튂(  ,
-("Lh ! ( 튂( 
+("Lh ! ( 튂( 

@@ -10173,26 +10173,26 @@ G
 *C(I(
,J@($ ,*F ( ) ("L(h ! ( 튂( (
,J@ ($ ("Lh ! ( 튂(  ,
-("Lh ! ( 튂( 
+("Lh ! ( 튂( 

-
+
-
+
-:x
+:x
G @a
@x
-x
+@x


, 

-
+

-@
+@

!
@@ -10205,48 +10205,48 @@ J 
G$
`
-
+

@I
-
+
o
-I@Ip v Gv v Gw  p v Gv v Gw  
+I@Ip v Gv v Gw  p v Gv v Gw  
-
+
-k@W @\
-
+k@W @a
+

r
-H
-
+H
+
@I
 `

G `
-
+x
 G`HR@
`"@
-
-
+
+
 b

2 x
-B 
- 
-
+B 
+ 
+


-
+

-
+
A
@a

-
+

@@ -10256,7 +10256,7 @@ G `
@I ^ G \ G Z 
-I
+I
@@ -10272,39 +10272,45 @@ Q RIc P PCII G  B 

G LI B HbBx   a  t
-
+x
+ >
+
+ L
+
+
+<x
-@_
+_
GIǁ a
O
I@I

-
+
-
+
>
@x
- &
-
+ 
+
x QL FLBL
-@Lr@ǁ
+@Lr@ǁ
?I H
I HR
I  Ix  I  I  
L
H2X
- 
+ 
-
+
@@ -10323,9 +10329,9 @@ H2X

I
A@_`
-T@ GL ~ 
-U
-
+T@ GL ~ 
+U
+
A@
@@ -10362,28 +10368,28 @@ E===  E DL>L
D@ @
-@x HR& b@I"@J@Hb
+@x HR& b@I"@J@Hb
-
+

-
+
-
+
-:x
+:x
G @a
@x
-x
+


, 

-
+

-
+

!
@@ -10396,48 +10402,48 @@ J 
G$
`
-
+

@I
-
+
o
-I@Ip v Gv v Gw  p v Gv v Gw  
+I@Ip v Gv v Gw  p v Gv v Gw  
-
+
-k@W _
-
+k@W d
+

r
-H
-
+H
+
@I
 `

G `
-x
+@x
 G`HR@
`"@
-
-
+
+
 b

2 x
-B 
- 
-
+B 
+ 
+


-
+

-
+
A
@a

-
+

@@ -10447,7 +10453,7 @@ G `
@I ^ G \ G Z 
-I
+I
@@ -10463,25 +10469,31 @@ Q RIc P PCII G  B 

G LI B HbBx   a  t
-
+x
+ >
+
+ L
+
+
+?x
-b
+@c
GIǁ a
O
I@I

-
+
-
+
>
@x
- &
-
+ 
+
x QL FLBL
-@Lr@ǁ
+@Lr@ǁ
?I H
I HR
I  Ix  I  I  
@@ -10490,14 +10502,14 @@ I@I
H2X
  IH

-
+
-
+
@@ -10516,9 +10528,9 @@ H2X

I
A@_`
-T@ GL @~ 
-U
-
+T@ GL @~ 
+U
+
A@
@@ -10555,9 +10567,9 @@ E===  E DL>L
D@ @
-@x HR& b@I"@J@Hb
+@x HR& b@I"@J@Hb
-
+
G+
%
@@ -10849,7 +10861,7 @@ G
@
!
G
-
+
y
G@,
%
@@ -11167,7 +11179,7 @@ G
 *C(I(
,J@($ ,*F ( ) ("L(h ! ( 튂( (
,J@ ($ ("Lh ! ( 튂(  ,
-("Lh ! ( 튂( 
+("Lh ! ( 튂( 
y
G@,
%
@@ -11485,7 +11497,7 @@ G
 *C(I(
,J@($ ,*F ( ) ("L(h ! ( 튂( (
,J@ ($ ("Lh ! ( 튂(  ,
-("Lh ! ( 튂( 
+("Lh ! ( 튂( 
G+
%
@@ -11777,7 +11789,7 @@ G
@
!
G
-
+
x
`
x
@@ -11992,7 +12004,7 @@ E 
-
+
x
`
x
@@ -12207,7 +12219,7 @@ E 
-
+
x
`
x
@@ -12429,7 +12441,7 @@ E 
-
+
 @
I`
@@ -12819,7 +12831,7 @@ H
*AL+CLh j@
j
-
+
 @
I`
@x `
@@ -13209,7 +13221,7 @@ H
*AL+CLh j@
j
-
+
 @
I`
/y `
@@ -13658,7 +13670,7 @@ H
*AL+CLh j@
j
-
+
 @
I`
@x `
@@ -14042,7 +14054,7 @@ H
*AL+CLh j@
j
-
+
3
 
@@ -14877,7 +14889,7 @@ q 
@

-: 1
+: 1
3
 
@@ -15713,7 +15725,7 @@ q 
@

-: 1
+: 1
@ `
@@ -16362,7 +16374,7 @@ J2 x 
0
`
-
+
@ `
@@ -17011,7 +17023,7 @@ J2 x 
0
`
-
+
@x
@ `
@x
@@ -17658,7 +17670,7 @@ J2 x 
0
`
-
+

x
@@ -18193,7 +18205,7 @@ H$`
JI
JI'@BH
-
+

x
@x
@@ -18726,7 +18738,7 @@ H$`
'
-
+

x
@@ -19246,7 +19258,7 @@ H$`
'
-
+

x
@x
@@ -19777,7 +19789,7 @@ H$`
JI
JI'@BH
-
+

x
@@ -20312,7 +20324,7 @@ H$`
JI
JI'@BH
-
+
x
x
@@ -20849,7 +20861,7 @@ H$`
JI
JI'@BH
-A
+A

x
@@ -21384,7 +21396,7 @@ H$`
JI
JI'@BH
-
+
@x
@@ -21991,7 +22003,7 @@ H
-
+
+@+@
@@ -22315,7 +22327,7 @@ a . AB+@+@
-J`  JJ` 
+J`  JJ` 
+@+@
@@ -22637,7 +22649,7 @@ a . AB+@+@
-J`  JJ` 
+J`  JJ` 
+@+@
@@ -22959,7 +22971,7 @@ a . AB+@+@
-J`  JJ` 
+J`  JJ` 
+@+@
@@ -23278,7 +23290,7 @@ a . AB+@+@
-J`  JJ` 
+J`  JJ` 
+@+@
@@ -23600,7 +23612,7 @@ a . AB+@+@
-J`  JJ` 
+J`  JJ` 
+@+@
@@ -23925,7 +23937,7 @@ a . AB+@+@
-J`  JJ` 
+J`  JJ` 
FL  CL R@ 
I`
x `
@@ -24153,7 +24165,7 @@ E===  E DL>L
D@ @
-x HR& b@I"@J@Hb
+x HR& b@I"@J@Hb
FL  CL R@ 
I`
x `
@@ -24379,4 +24391,4 @@ E===  E DL>L
D@ @
-x HR& b@I"@J@Hb
+x HR& b@I"@J@Hb