[インデックス 17921] ファイルの概要
このコミットは、Go言語のアセンブラである cmd/5a
(ARM), cmd/6a
(x86), cmd/8a
(ARM64) において、共通のリンカライブラリである liblink
を使用するように変更を加えるものです。具体的には、各アセンブラのヘッダファイル (a.h
, y.tab.h
)、字句解析器 (lex.c
)、および構文解析器 (a.y
, y.tab.c
) に大幅な修正が加えられています。これにより、アセンブラのコード生成部分が liblink
の共通インターフェースを利用するようになり、将来的なリンカの改善に向けた準備が行われています。
コミット
commit f7aaa553daf41f006bbc2c96d062e661be0c3501
Author: Russ Cox <rsc@golang.org>
Date: Sun Dec 8 22:49:56 2013 -0500
cmd/5a, cmd/6a, cmd/8a: use liblink
Preparation for golang.org/s/go13linker work.
This CL does not build by itself. It depends on 35740044
and 35790044 and will be submitted at the same time.
R=iant
CC=golang-dev
https://golang.org/cl/35830043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f7aaa553daf41f006bbc2c96d062e661be0c3501
元コミット内容
cmd/5a, cmd/6a, cmd/8a: use liblink
Preparation for golang.org/s/go13linker work.
This CL does not build by itself. It depends on 35740044
and 35790044 and will be submitted at the same time.
R=iant
CC=golang-dev
https://golang.org/cl/35830043
変更の背景
このコミットは、Go 1.3 リンカの抜本的な見直し("Go 1.3 Linker Overhaul")に向けた準備の一環として行われました。当時のGoツールチェインにおいて、リンカはビルドと実行のパフォーマンスボトルネックの一つとして認識されており、その改善が急務でした。
Goリンカは、元々Plan 9のツールチェインから継承されたもので、その設計には改善の余地がありました。このオーバーホール計画では、リンカを2つの異なる部分に分割し、その一部をGo言語で記述する可能性も検討されていました。
また、この変更は、Goツールチェイン全体(コンパイラ、アセンブラ、リンカを含む)をC言語からGo言語へ移行するという、より広範な取り組みの一部でもありました。この移行は、Go 1.5のブートストラップ計画として知られており、Go 1.4がそれ以降のGoバージョンをビルドするために必要となるというブートストラップの課題も伴いました。
このコミットは、アセンブラがリンカと連携する方法を標準化し、共通の liblink
ライブラリを使用することで、将来のリンカのアーキテクチャ変更を容易にすることを目的としています。
前提知識の解説
- アセンブラ (Assembler): アセンブリ言語で書かれたソースコードを、機械が直接実行できる機械語(オブジェクトコード)に変換するプログラムです。Go言語のツールチェインでは、
cmd/5a
(ARM),cmd/6a
(x86),cmd/8a
(ARM64) がそれぞれ異なるアーキテクチャ向けのアセンブラとして機能します。 - リンカ (Linker): アセンブラによって生成された複数のオブジェクトファイルやライブラリを結合し、実行可能なプログラムを生成するプログラムです。リンカは、異なるオブジェクトファイル間で参照されるシンボル(関数や変数など)を解決し、最終的な実行ファイルのメモリレイアウトを決定します。
liblink
: Go言語のツールチェインにおける共通のリンカライブラリです。このライブラリは、リンカのコア機能やデータ構造をカプセル化し、異なるアセンブラやコンパイラが共通のインターフェースを通じてリンカと連携できるように設計されています。これにより、リンカのロジックの一元化と再利用が促進されます。- Bison/Yacc: Bison(GNU Bison)は、Yacc(Yet Another Compiler Compiler)と互換性のあるパーサジェネレータです。これらは、文法規則を記述したファイル(通常
.y
拡張子)から、C言語などのソースコード(通常y.tab.c
)を生成します。生成されたコードは、字句解析器(lexer)からのトークンストリームを解析し、構文木を構築したり、特定のアクションを実行したりします。 - 字句解析器 (Lexer/Scanner): ソースコードを読み込み、意味のある最小単位(トークン)に分割するプログラムです。通常、Flex(GNU Flex)などのツールで生成されます。このコミットでは、
lex.c
ファイルが字句解析に関連する変更を受けています。 Gen
構造体とAddr
構造体: 変更前のコードでは、アセンブラのコード生成においてGen
構造体が汎用的なアドレスやオペランドの情報を表現するために使用されていました。このコミットでは、liblink
の導入に伴い、よりリンカの内部表現に近いAddr
構造体(link.h
で定義される)に置き換えられています。Addr
は、Goのリンカが命令のオペランドやアドレスを表現するために使用する標準的なデータ構造です。nullgen
: 多くのコンパイラやアセンブラで、初期化されていない、または無効な汎用的なアドレス/オペランドを表すために使用されるグローバル変数です。このコミットでは、Gen
型からAddr
型に変更されています。ctxt
(Context):liblink
の操作に必要なコンテキスト情報を保持する構造体です。リンカの初期化、診断メッセージの出力、シンボルルックアップなど、様々なリンカ関連の操作がこのコンテキストを通じて行われます。
技術的詳細
このコミットの主要な技術的変更点は、各アセンブラ (5a
, 6a
, 8a
) が独自のコード生成ロジックから liblink
の共通インターフェースへと移行することです。
-
liblink
のインクルード:src/cmd/*/a.h
ファイルに<link.h>
がインクルードされるようになりました。これは、liblink
で定義されている共通のデータ構造や関数を使用するための変更です。Gen
構造体が削除され、代わりにAddr
構造体が使用されるようになりました。これは、アセンブラ内部のオペランド表現がliblink
の標準的なAddr
構造体に統一されたことを意味します。nullgen
の型がGen
からAddr
に変更されています。
-
字句解析器 (
lex.c
) の変更:main
関数内でctxt = linknew(&linkarm);
のようにliblink
のコンテキストが初期化されるようになりました。これにより、アセンブラはliblink
の機能を利用できるようになります。ctxt->diag = yyerror;
の設定により、liblink
からの診断メッセージがアセンブラの既存のエラー報告メカニズム (yyerror
) にフックされます。- アセンブル処理のパスが変更されました。以前は
pass = 1; yyparse();
とpass = 2; yyparse();
のように2回のパースを明示的に行っていましたが、for(pass = 1; pass <= 2; pass++)
ループ内でパースを行う形に変更されました。 outhist()
関数が削除され、代わりにlinkouthist(ctxt, &obuf);
が呼び出されるようになりました。これは、履歴情報の出力もliblink
の共通機能に委譲されたことを示します。linkwritefuncs(ctxt, &obuf);
の呼び出しが追加され、関数情報の書き込みもliblink
経由で行われるようになりました。cinit
関数からGen
構造体に関連する初期化コードが削除され、nullgen
の初期化もAddr
型に合わせて簡素化されました。zname
およびzaddr
関数が削除されました。これらの関数は、オブジェクトファイルにシンボルやアドレス情報を書き込むためのアセンブラ固有のロジックでしたが、liblink
がこれらの処理を共通で提供するため不要になりました。outcode
関数のシグネチャがGen*
からAddr*
に変更されました。これは、コード生成の際にliblink
のAddr
構造体を使用することを意味します。
-
構文解析器 (
a.y
,y.tab.c
) の変更:a.y
ファイルでは、Bison/Yaccの型定義において、%type <gen>
が%type <addr>
に変更されました。これにより、構文解析器が生成するセマンティック値の型がGen
からAddr
に統一されます。y.tab.c
はBisonによって生成されるファイルであり、a.y
の変更が直接反映されます。このファイルでは、Gen
構造体への参照がAddr
構造体への参照に置き換えられ、Gen
構造体のフィールド(例:sval
,dval
)へのアクセスがAddr
構造体の共用体 (u.sval
,u.dval
) を介して行われるようになりました。- 特に、
name
ルールにおけるシンボルルックアップがlinklookup(ctxt, $1->name, 0)
やlinklookup(ctxt, $1->name, 1)
のようにliblink
の関数を使用するように変更されました。これは、シンボル解決のロジックがliblink
に集約されたことを示します。
これらの変更により、各アセンブラは個別のコード生成およびオブジェクトファイル書き出しロジックを持つのではなく、liblink
という共通の抽象化レイヤーを通じてリンカと連携するようになりました。これにより、リンカの内部実装が変更されても、アセンブラ側の変更を最小限に抑えることが可能になり、ツールチェイン全体の保守性と拡張性が向上します。
コアとなるコードの変更箇所
src/cmd/5a/a.h
(および 6a/a.h
, 8a/a.h
)
--- a/src/cmd/5a/a.h
+++ b/src/cmd/5a/a.h
@@ -29,6 +29,7 @@
// THE SOFTWARE.
#include <bio.h>
+#include <link.h>
#include "../5l/5.out.h"
#ifndef EXTERN
@@ -43,9 +44,7 @@
#define ungetc ccungetc
typedef struct Sym Sym;
-typedef struct Gen Gen;
typedef struct Io Io;
-typedef struct Hist Hist;
#define MAXALIGN 7
#define FPCHIP 1
@@ -88,33 +87,6 @@ struct Io
};
#define I ((Io*)0)
-EXTERN struct
-{
- Sym* sym;
- short type;
-} h[NSYM];
-
-struct Gen
-{
- Sym* sym;
- int32 offset;
- int32 offset2;
- short type;
- short reg;
- short name;
- double dval;
- char sval[8];
-};
-
-struct Hist
-{
- Hist* link;
- char* name;
- int32 line;
- int32 offset;
-};
-#define H ((Hist*)0)
-
enum
{
CLAST,
@@ -129,9 +101,7 @@ EXTERN char debug[256];
EXTERN Sym* hash[NHASH];
EXTERN char** Dlist;
EXTERN int nDlist;
-EXTERN Hist* ehist;
EXTERN int newflag;
-EXTERN Hist* hist;
EXTERN char* hunk;
EXTERN char** include;
EXTERN Io* iofree;
@@ -142,10 +112,9 @@ EXTERN int nerrors;
EXTERN int32 nhunk;
EXTERN int ninclude;
EXTERN int32 nsymb;
-EXTERN Gen nullgen;
+EXTERN Addr nullgen;
EXTERN char* outfile;
EXTERN int pass;
-EXTERN char* pathname;
EXTERN int32 pc;
EXTERN int peekc;
EXTERN int32 stmtline;
@@ -155,6 +124,7 @@ EXTERN int thechar;
EXTERN char* thestring;
EXTERN int32 thunk;
EXTERN Biobuf obuf;
+EXTERN Link* ctxt;
void* alloc(int32);
void* allocn(void*, int32, int32);
@@ -174,11 +144,8 @@ int escchar(int);
void cinit(void);
void pinit(char*);
void cclean(void);
-int isreg(Gen*);
-void outcode(int, int, Gen*, int, Gen*);
-void zname(char*, int, int);
-void zaddr(Gen*, int);
-void ieeedtod(Ieee*, double);
+int isreg(Addr*);
+void outcode(int, int, Addr*, int, Addr*);
int filbuf(void);
Sym* getsym(void);
void domacro(void);
@@ -190,7 +157,6 @@ void maclin(void);
void macprag(void);
void macif(int);
void macend(void);
-void outhist(void);
void dodefine(char*);
void prfile(int32);
void linehist(char*, int);
src/cmd/5a/lex.c
(および 6a/lex.c
, 8a/lex.c
)
--- a/src/cmd/5a/lex.c
+++ b/src/cmd/5a/lex.c
@@ -59,6 +59,8 @@
thechar = '5';
thestring = "arm";
+ ctxt = linknew(&linkarm);
+ ctxt->diag = yyerror;
ensuresymb(NSYMB);
memset(debug, 0, sizeof(debug));
@@ -90,10 +92,15 @@
p = ARGF();
setinclude(p);
break;
+\
case 't':
thechar = 't';
thestring = "thumb";
break;
+\
+ case 'S':
+ ctxt->debugasm++;
+ break;
} ARGEND
if(*argv == 0) {
print("usage: %ca [-options] file.s\n", thechar);
@@ -143,30 +150,23 @@
errorexit();
}
Binit(&obuf, of, OWRITE);
-\
-\tpass = 1;\
-\tpinit(file);\
-\
Bprint(&obuf, "go object %s %s %s\n", getgoos(), thestring, getgoversion());
+\tBprint(&obuf, "\n!\n");
-\tfor(i=0; i<nDlist; i++)\
-\t\tdodefine(Dlist[i]);\
-\tyyparse();\
-\tif(nerrors) {\
+\tfor(pass = 1; pass <= 2; pass++) {
+\t\tpinit(file);
+\t\tfor(i=0; i<nDlist; i++)
+\t\t\tdodefine(Dlist[i]);
+\t\tyyparse();
\tcclean();
-\t\treturn nerrors;\
+\t\tif(nerrors)
+\t\t\treturn nerrors;
}
-\tBprint(&obuf, "\n!\n");
-\
-\tpass = 2;\
-\touthist();
-\tpinit(file);\
-\tfor(i=0; i<nDlist; i++)\
-\t\tdodefine(Dlist[i]);\
-\tyyparse();
-\tcclean();
-\treturn nerrors;\
+\tlinkouthist(ctxt, &obuf);
+\tlinkwritefuncs(ctxt, &obuf);
+\tBflush(&obuf);
+\treturn 0;
}
struct
@@ -426,15 +426,9 @@
Sym *s;
int i;
-\tnullgen.sym = S;\
-\tnullgen.offset = 0;\
nullgen.type = D_NONE;\
nullgen.name = D_NONE;\
nullgen.reg = NREG;\
-\tif(FPCHIP)\
-\t\tnullgen.dval = 0;\
-\tfor(i=0; i<sizeof(nullgen.sval); i++)\
-\t\tnullgen.sval[i] = 0;\
nerrors = 0;
iostack = I;
@@ -448,13 +442,6 @@
s->type = itab[i].type;
s->value = itab[i].value;
}
-\
-\tpathname = allocn(pathname, 0, 100);\
-\tif(getwd(pathname, 99) == 0) {\
-\t\tpathname = allocn(pathname, 100, 900);\
-\t\tif(getwd(pathname, 999) == 0)\
-\t\t\tstrcpy(pathname, "/???");\
-\t}\
}
void
@@ -466,81 +453,7 @@
}
int
-isreg(Gen *g)
+isreg(Addr *g)
{
USED(g);
@@ -478,154 +441,27 @@
void
cclean(void)
{
-\
outcode(AEND, Always, &nullgen, NREG, &nullgen);
-\tBflush(&obuf);\
-}
-\
-void
-zname(char *n, int t, int s)
-{
-\
-\tBPUTC(&obuf, ANAME);\
-\tBPUTC(&obuf, t);\t/* type */
-\tBPUTC(&obuf, s);\t/* sym */
-\twhile(*n) {\
-\t\tBPUTC(&obuf, *n);\
-\t\tn++;\
-\t}\
-\tBPUTC(&obuf, 0);\
-}
-\
-void
-zaddr(Gen *a, int s)
-{
-\tint32 l;\
-\tint i;\
-\tchar *n;\
-\tIeee e;\
-\
-\tBPUTC(&obuf, a->type);\
-\tBPUTC(&obuf, a->reg);\
-\tBPUTC(&obuf, s);\
-\tBPUTC(&obuf, a->name);\
-\tBPUTC(&obuf, 0);\
-\tswitch(a->type) {\
-\tdefault:\
-\t\tprint("unknown type %d\n", a->type);\
-\t\texits("arg");\
-\
-\tcase D_NONE:\
-\tcase D_REG:\
-\tcase D_FREG:\
-\tcase D_PSR:\
-\tcase D_FPCR:\
-\t\tbreak;\
-\
-\tcase D_REGREG:\
-\tcase D_REGREG2:\
-\t\tBPUTC(&obuf, a->offset);\
-\t\tbreak;\
-\
-\tcase D_CONST2:\
-\t\tl = a->offset2;\
-\t\tBPUTLE4(&obuf, l);\
-\t\t// fall through\
-\tcase D_OREG:\
-\tcase D_CONST:\
-\tcase D_BRANCH:\
-\tcase D_SHIFT:\
-\t\tl = a->offset;\
-\t\tBPUTLE4(&obuf, l);\
-\t\tbreak;\
-\
-\tcase D_SCONST:\
-\t\tn = a->sval;\
-\t\tfor(i=0; i<NSNAME; i++) {\
-\t\t\tBPUTC(&obuf, *n);\
-\t\t\tn++;\
-\t\t}\
-\t\tbreak;\
-\
-\tcase D_FCONST:\
-\t\tieeedtod(&e, a->dval);\
-\t\tBPUTLE4(&obuf, e.l);\
-\t\tBPUTLE4(&obuf, e.h);\
-\t\tbreak;\
-\t}\
}
static int bcode[] =
@@ -573,11 +486,13 @@
ANOP,
};
+static Prog *lastpc;
+
void
-outcode(int a, int scond, Gen *g1, int reg, Gen *g2)
+outcode(int a, int scond, Addr *g1, int reg, Addr *g2)
{
-\tint sf, st, t;\
-\tSym *s;\
+\tProg *p;\
+\tPlist *pl;\
/* hack to make B.NE etc. work: turn it into the corresponding conditional */
if(a == AB){
@@ -587,154 +502,27 @@
if(pass == 1)
goto out;
-jackpot:\
-\tsf = 0;\
-\ts = g1->sym;\
-\twhile(s != S) {\
-\t\tsf = s->sym;\
-\t\tif(sf < 0 || sf >= NSYM)\
-\t\t\tsf = 0;\
-\t\tt = g1->name;\
-\t\tif(h[sf].type == t)\
-\t\tif(h[sf].sym == s)\
-\t\t\tbreak;\
-\t\tzname(s->name, t, sym);\
-\t\ts->sym = sym;\
-\t\th[sym].sym = s;\
-\t\th[sym].type = t;\
-\t\tsf = sym;\
-\t\tsym++;\
-\t\tif(sym >= NSYM)\
-\t\t\tsym = 1;\
-\t\tbreak;\
-\t}\
-\tst = 0;\
-\ts = g2->sym;\
-\twhile(s != S) {\
-\t\tst = s->sym;\
-\t\tif(st < 0 || st >= NSYM)\
-\t\t\tst = 0;\
-\t\tt = g2->name;\
-\t\tif(h[st].type == t)\
-\t\tif(h[st].sym == s)\
-\t\t\tbreak;\
-\t\tzname(s->name, t, sym);\
-\t\ts->sym = sym;\
-\t\th[sym].sym = s;\
-\t\th[sym].type = t;\
-\t\tst = sym;\
-\t\tsym++;
-\t\tif(sym >= NSYM)\
-\t\t\tsym = 1;\
-\t\tif(st == sf)\
-\t\t\tgoto jackpot;\
-\t\tbreak;\
-\t}\
-\tBPUTC(&obuf, a);\
-\tBPUTC(&obuf, scond);\
-\tBPUTC(&obuf, reg);\
-\tBPUTLE4(&obuf, stmtline);\
-\tzaddr(g1, sf);\
-\tzaddr(g2, st);\
+\t
+\tp = malloc(sizeof *p);\
+\tmemset(p, 0, sizeof *p);\
+\tp->as = a;\
+\tp->lineno = stmtline;\
+\tp->scond = scond;\
+\tp->from = *g1;\
+\tp->reg = reg;\
+\tp->to = *g2;\
+\
+\tif(lastpc == nil) {
+\t\tpl = linknewplist(ctxt);\
+\t\tpl->firstpc = p;\
+\t} else
+\t\tlastpc->link = p;\
+\tlastpc = p;\t
out:\
if(a != AGLOBL && a != ADATA)
pc++;
}
-\
-void
-outhist(void)
-{
-\tGen g;\
-\tHist *h;\
-\tchar *p, *q, *op, c;\
-\tint n;\
- char *tofree;\
- static int first = 1;\
- static char *goroot, *goroot_final;\
-
- if(first) {
- // Decide whether we need to rewrite paths from $GOROOT to $GOROOT_FINAL.\
- first = 0;\
- goroot = getenv("GOROOT");\
- goroot_final = getenv("GOROOT_FINAL");\
- if(goroot == nil)\
- goroot = "";\
- if(goroot_final == nil)\
- goroot_final = goroot;\
- if(strcmp(goroot, goroot_final) == 0) {\
- goroot = nil;\
- goroot_final = nil;\
- }\
- }\
-
- tofree = nil;\
-\tg = nullgen;\
-\tc = '/';\
-\tfor(h = hist; h != H; h = h->link) {\
-\t\tp = h->name;\
- \tif(p != nil && goroot != nil) {\
- \t\tn = strlen(goroot);\
- \t\tif(strncmp(p, goroot, strlen(goroot)) == 0 && p[n] == '/') {\
- \t\t\ttofree = smprint("%s%s", goroot_final, p+n);\
- \t\t\tp = tofree;\
- \t\t}\
- \t}\
-\t\top = 0;\
-\t\tif(systemtype(Windows) && p && p[1] == ':'){\
-\t\t\tc = p[2];\
-\t\t} else if(p && p[0] != c && h->offset == 0 && pathname){\
-\t\t\tif(systemtype(Windows) && pathname[1] == ':') {\
-\t\t\t\top = p;\
-\t\t\t\tp = pathname;\
-\t\t\t\tc = p[2];\
-\t\t\t} else if(pathname[0] == c){\
-\t\t\t\top = p;\
-\t\t\t\tp = pathname;\
-\t\t\t}\
-\t\t}\
-\t\twhile(p) {\
-\t\t\tq = strchr(p, c);\
-\t\t\tif(q) {\
-\t\t\t\tn = q-p;\
-\t\t\t\tif(n == 0){\
-\t\t\t\t\tn = 1;\t/* leading "/" */\
-\t\t\t\t\t*p = '/';\t/* don't emit "\" on windows */\
-\t\t\t\t}\
-\t\t\t\tq++;\
-\t\t\t} else {\
-\t\t\t\tn = strlen(p);\
-\t\t\t\tq = 0;\
-\t\t\t}\
-\t\t\tif(n) {\
-\t\t\t\tBPUTC(&obuf, ANAME);\
-\t\t\t\tBPUTC(&obuf, D_FILE);\t/* type */\
-\t\t\t\tBPUTC(&obuf, 1);\t/* sym */\
-\t\t\t\tBPUTC(&obuf, '<');\
-\t\t\t\tBwrite(&obuf, p, n);\
-\t\t\t\tBPUTC(&obuf, 0);\
-\t\t\t}\
-\t\t\tp = q;\
-\t\t\tif(p == 0 && op) {\
-\t\t\t\tp = op;\
-\t\t\t\top = 0;\
-\t\t\t}\
-\t\t}\
-\t\tg.offset = h->offset;\
-\
-\t\tBPUTC(&obuf, AHISTORY);\
-\t\tBPUTC(&obuf, Always);\
-\t\tBPUTC(&obuf, 0);\
-\t\tBPUTLE4(&obuf, h->line);\
-\t\tzaddr(&nullgen, 0);\
-\t\tzaddr(&g, 0);\
-\
-\t\tif(tofree) {\
-\t\t\tfree(tofree);\
-\t\t\ttofree = nil;\
-\t\t}\
-\t}\
-}
-\
#include "../cc/lexbody"
#include "../cc/macbody"
src/cmd/5a/a.y
(および 6a/a.y
, 8a/a.y
)
--- a/src/cmd/5a/a.y
+++ b/src/cmd/5a/a.y
@@ -41,7 +41,7 @@
int32 lval;
double dval;
char sval[8];
-\tGen gen;
+\tLAddr addr;
}
%left '|'
%left '^'
@@ -62,8 +62,8 @@
%token <sym> LNAME LLAB LVAR
%type <lval> con expr oexpr pointer offset sreg spreg creg
%type <lval> rcon cond reglist
-%type <gen> gen rel reg regreg freg shift fcon frcon
-%type <gen> imm ximm name oreg ireg nireg ioreg imsr
+%type <addr> gen rel reg regreg freg shift fcon frcon
+%type <addr> imm ximm name oreg ireg nireg ioreg imsr
%%
prog:
| prog
@@ -175,7 +175,7 @@
*/
| LTYPE8 cond ioreg ',' '[' reglist ']'
{
-\t\tGen g;
+\t\tLAddr g;
\t\tg = nullgen;
\t\tg.type = D_CONST;
@@ -184,7 +184,7 @@
}
| LTYPE8 cond '[' reglist ']' ',' ioreg
{
-\t\tGen g;
+\t\tLAddr g;
\t\tg = nullgen;
\t\tg.type = D_CONST;
@@ -279,7 +279,7 @@
*/
| LTYPEJ cond con ',' expr ',' spreg ',' creg ',' creg oexpr
{
-\t\tGen g;
+\t\tLAddr g;
\t\tg = nullgen;
\t\tg.type = D_CONST;
@@ -377,14 +377,12 @@
\tif(pass == 2)
\t\tyyerror("undefined label: %s", $1->name);
\t$$.type = D_BRANCH;
-\t\t$$.sym = $1;
\t$$.offset = $2;
}
| LLAB offset
{
\t$$ = nullgen;
\t$$.type = D_BRANCH;
-\t\t$$.sym = $1;
\t$$.offset = $1->value + $2;
}
@@ -408,7 +406,7 @@
{
\t$$ = nullgen;
\t$$.type = D_SCONST;
-\t\tmemcpy($$.sval, $2, sizeof($$.sval));
+\t\tmemcpy($$.u.sval, $2, sizeof($$.u.sval));
}
|\tfcon
@@ -417,13 +415,13 @@
{
\t$$ = nullgen;
\t$$.type = D_FCONST;
-\t\t$$.dval = $2;
+\t\t$$.u.dval = $2;
}
| '$' '-' LFCONST
{
\t$$ = nullgen;
\t$$.type = D_FCONST;
-\t\t$$.dval = -$3;
+\t\t$$.u.dval = -$3;
}
reglist:
@@ -635,7 +633,7 @@
\t$$ = nullgen;
\t$$.type = D_OREG;
\t$$.name = $3;
-\t\t$$.sym = S;
+\t\t$$.sym = nil;
\t$$.offset = $1;
}
| LNAME offset '(' pointer ')'
@@ -643,7 +641,7 @@
\t$$ = nullgen;
\t$$.type = D_OREG;
\t$$.name = $4;
-\t\t$$.sym = $1;
+\t\t$$.sym = linklookup(ctxt, $1->name, 0);
\t$$.offset = $2;
}
| LNAME '<' '>' offset '(' LSB ')'
@@ -651,7 +649,7 @@
\t$$ = nullgen;
\t$$.type = D_OREG;
\t$$.name = D_STATIC;
-\t\t$$.sym = $1;
+\t\t$$.sym = linklookup(ctxt, $1->name, 1);
\t$$.offset = $4;
}
コアとなるコードの解説
ヘッダファイルの変更 (src/cmd/*/a.h
)
#include <link.h>
:liblink
の主要なヘッダファイルがインクルードされるようになりました。これにより、liblink
が提供するデータ型や関数がアセンブラから利用可能になります。typedef struct Gen Gen;
の削除とtypedef struct Hist Hist;
の削除: 以前のアセンブラ固有のGen
構造体とHist
構造体が削除されました。これらはliblink
のAddr
構造体や共通の履歴管理メカニズムに置き換えられます。EXTERN Addr nullgen;
:nullgen
の型がGen
からAddr
に変更されました。これは、アセンブラがliblink
のアドレス表現を使用することを示します。EXTERN Link* ctxt;
:liblink
のコンテキストを保持するポインタctxt
が追加されました。このポインタを通じて、アセンブラはリンカの機能にアクセスします。outcode
関数のシグネチャ変更:void outcode(int, int, Gen*, int, Gen*);
がvoid outcode(int, int, Addr*, int, Addr*);
に変更されました。これは、命令のオペランドがGen
型からAddr
型に統一されたことを意味します。zname
,zaddr
,outhist
関数の削除: これらの関数は、オブジェクトファイルへのシンボル名、アドレス、履歴情報の書き込みをアセンブラが独自に行うためのものでしたが、liblink
がこれらの機能を共通で提供するため、不要になりました。
字句解析器の変更 (src/cmd/*/lex.c
)
ctxt = linknew(&linkarm);
およびctxt->diag = yyerror;
:main
関数内でliblink
のコンテキストが初期化され、エラー報告関数がyyerror
に設定されます。これにより、liblink
がアセンブラのエラー処理と統合されます。- アセンブルパスの変更: 以前は2回の
yyparse()
呼び出しでパス1とパス2を明示的に実行していましたが、for(pass = 1; pass <= 2; pass++)
ループ内でyyparse()
を呼び出す形に変更されました。これにより、パスの管理がより構造化されました。 linkouthist(ctxt, &obuf);
とlinkwritefuncs(ctxt, &obuf);
: 以前outhist()
が行っていた履歴情報の出力と、関数情報の書き込みがliblink
の共通関数に置き換えられました。これにより、オブジェクトファイルのフォーマットと書き込みロジックがliblink
に集約されます。zname
やzaddr
の削除に伴う関連コードの削除:cclean
関数からBflush(&obuf);
が削除され、zname
やzaddr
の呼び出しもなくなりました。これは、オブジェクトファイルの最終的な書き出しがliblink
のlinkwritefuncs
に委譲されたためです。
構文解析器の変更 (src/cmd/*/a.y
)
%type <gen>
から%type <addr>
への変更: Bison/Yaccのセマンティック値の型がGen
からAddr
に変更されました。これにより、構文解析器が生成する中間表現がliblink
のAddr
構造体に準拠するようになります。$$.sym = $1;
の削除(rel
ルール内): 以前は分岐命令のターゲットシンボルを直接Gen
構造体に格納していましたが、liblink
のAddr
構造体ではシンボル解決が異なる方法で行われるため、この直接的な代入が不要になりました。memcpy($$.sval, $2, sizeof($$.sval));
からmemcpy($$.u.sval, $2, sizeof($$.u.sval));
への変更:Addr
構造体は共用体 (union u
) を使用して異なる型の値を格納するため、文字列値 (sval
) へのアクセスがu.sval
を介して行われるようになりました。同様に、浮動小数点値 (dval
) もu.dval
を介してアクセスされます。$$.sym = S;
から$$.sym = nil;
へ、およびlinklookup(ctxt, $1->name, 0);
やlinklookup(ctxt, $1->name, 1);
の導入:name
ルールにおいて、シンボルへの参照がliblink
のlinklookup
関数を通じて行われるようになりました。これは、シンボルテーブルの管理とルックアップがliblink
に一元化されたことを意味します。linklookup
は、与えられたシンボル名に対応するSym
ポインタをliblink
のコンテキスト (ctxt
) から取得します。
これらの変更は、Goのアセンブラが liblink
という共通のリンカライブラリに依存することで、ツールチェイン全体の整合性を高め、将来的なリンカの機能拡張や最適化を容易にするための重要なステップです。
関連リンク
- Go 1.3 Linker Overhaul: https://golang.org/s/go13linker
- Go 1.5 Bootstrap Plan: [https://docs.google.com/document/d/1D1-J2_s_gQ8_0-n_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b