DIRECTORY PrincOps, PrincOpsUtils, Buttons, ViewerOps, CKViewerPanel, CKViewerButtons, MessageWindow, Basics, Real, Process, Terminal, InterminalBackdoor; CKViewerOpsImpl: CEDAR PROGRAM IMPORTS PrincOpsUtils, Buttons, Terminal, InterminalBackdoor, Basics, Real, Process, MessageWindow, CKViewerButtons, ViewerOps EXPORTS CKViewerButtons, CKViewerPanel = BEGIN OPEN MW: MessageWindow; CKViewer: TYPE = CKViewerButtons.CKViewer; CKViewerState: TYPE = CKViewerButtons.CKViewerState; terminal: Terminal.Virtual ~ InterminalBackdoor.terminal; sym: BOOLEAN _ FALSE; bbspace: PrincOps.BBTableSpace; bb: PrincOps.BBptr; grayword: CARDINAL _ 0; bitmapB: Terminal.FrameBuffer _ NIL; lbpp,lbppB: CARDINAL _ 0; -- log (base 2) bits per pixel bpp,bppB: CARDINAL _ 0; -- bits per pixel full: BOOLEAN _ FALSE; ashow,bshow: BOOLEAN _ TRUE; splat: BOOLEAN _ TRUE; cornerSize: CARDINAL _ 4; cornerColor: CARDINAL _ 8; Triple: TYPE = RECORD[r,g,b: [0..256)]; testmap: ARRAY[0..8] OF Triple _ [ [255,255,255], -- white [255,255, 0], -- yellow [ 0,255,255], -- cyan [ 0,255, 0], -- green [255, 0,255], -- magenta [255, 0, 0], -- red [ 0, 0,255], -- blue [127,127,127], -- gray (background) [ 0, 0, 0] -- black ]; black: [0..8] = 8; --testmap[8] is black gray: [0..8] = 7; --testmap[8] is gray white: [0..8] = 0; --testmap[0] is white Diag: PROC [] = { Bham: PROC [fx,fy,lx,ly: INTEGER, color: [0..8]] = { yt: REAL; xx, xi: INTEGER; yy, yi: INTEGER; dx: INTEGER _ lx-fx; dy: INTEGER _ ly-fy; IF dy>dx OR dx<=0 OR dy<=0 THEN ERROR; FOR xi IN [0..dx) DO yt _ (Real.Float[dy]/Real.Float[dx])*Real.Float[xi]; yi _ Real.FixI[yt+0.5]; xx_fx+xi; yy_fy+yi; TestRect[xx,yy,1,1,color]; TestRect[iWidth-xx,yy,1,1,color]; TestRect[xx,iHeight-yy,1,1,color]; TestRect[iWidth-xx,iHeight-yy,1,1,color]; ENDLOOP; }; iWidth: INTEGER _ terminal.colorWidth; iHeight: INTEGER _ terminal.colorHeight; deltaX: INTEGER _ iWidth/40; deltaY: INTEGER _ (deltaX*iHeight)/iWidth; xi: INTEGER _ 0; yi: INTEGER _ 0; IF full THEN Positive[] ELSE { FOR i: CARDINAL IN[0..9) DO Terminal.SetColor[vt: terminal, aChannelValue: i, red: testmap[i].r, green: testmap[i].g, blue: testmap[i].b]; ENDLOOP; SetShowButtons[TRUE,FALSE,FALSE]; }; TestRect[0,0,terminal.colorWidth,terminal.colorHeight,black]; --black background FOR n: INTEGER _ 0, n+1 UNTIL xi >=iWidth DO Bham[fx: xi, fy: 0, lx: iWidth-1, ly: iHeight-n*deltaY, color: white]; xi_xi+deltaX; ENDLOOP; }; ShowTPat: PROC = { x: CARDINAL = 60; h: CARDINAL = 60; w: CARDINAL = 50; gap: CARDINAL = 15; IF full THEN Positive[] ELSE { FOR i: CARDINAL IN[0..9) DO Terminal.SetColor[vt: terminal, aChannelValue: i, red: testmap[i].r, green: testmap[i].g, blue: testmap[i].b]; ENDLOOP; SetShowButtons[TRUE,FALSE,FALSE]; }; TestRect[0,0,terminal.colorWidth,terminal.colorHeight,gray]; { s: CARDINAL = cornerSize; c: CARDINAL = cornerColor; -- color TestRect[0,0,s,s,c]; TestRect[terminal.colorWidth-s,0,s,s,c]; TestRect[0,terminal.colorHeight-s,s,s,c]; TestRect[terminal.colorWidth-s,terminal.colorHeight-s,s,s,c]; }; FOR i: CARDINAL IN[0..8) DO r,g,b: [0..256); r _ (i MOD 2)*255; g _ ((i/2) MOD 2)*255; b _ ((i/4) MOD 2)*255; TestRect[4,i*h+10,x,h-20,i+1]; ENDLOOP; FOR i: CARDINAL IN[0..8) DO r,g,b: [0..256); r _ (i MOD 2)*255; g _ ((i/2) MOD 2)*255; b _ ((i/4) MOD 2)*255; TestRect[x+i*w+gap,0,w-gap,8*h,i+1]; ENDLOOP; }; TestRect: PROC[x,y,w,h: CARDINAL, i: [0..8]] = { IF NOT (x terminal.colorWidth DO TestRect[xx, 0, vThick, terminal.colorHeight, white]; ENDLOOP; FOR v: CARDINAL _ 0, v+vStep UNTIL v > terminal.colorHeight DO TestRect[0, v, terminal.colorWidth, hThick ,white]; ENDLOOP; }; ShowBig: PROCEDURE [big: BOOLEAN, color: {red, green, blue}] = { r,g,b: CARDINAL; rectheight: CARDINAL _ terminal.colorHeight/16; --sixteen rectangles cInc: CARDINAL _ IF big THEN 20B ELSE 1; maxIntensity: CARDINAL _ IF full THEN 400B ELSE (Basics.BITSHIFT[1,bpp]); groupSize: CARDINAL _ MAX[16/maxIntensity,1]; groupIndex: CARDINAL _ 16/groupSize; IF NOT full THEN SetShowButtons[TRUE,FALSE,FALSE] ELSE SetShowButtons[TRUE,TRUE,TRUE]; FOR gI: CARDINAL IN [0..groupIndex) DO inten: CARDINAL _ gI*cInc; SELECT color FROM red => {r_inten; b_g_0}; green => {g_inten; b_r_0}; blue => {b_inten; r_g_0}; ENDCASE => ERROR; IF full THEN { Terminal.SetRedMap[terminal, gI, r]; Terminal.SetGreenMap[terminal, gI, g]; Terminal.SetBlueMap[terminal, gI, b]; } ELSE Terminal.SetColor[vt: terminal, aChannelValue: gI, red: r, green: g, blue: b]; FOR x: CARDINAL IN [0..groupSize) DO nextRect: CARDINAL _ gI*groupSize + x; Rect[0,nextRect*rectheight,terminal.colorWidth,rectheight, gI]; ENDLOOP; ENDLOOP; }; ShowBigRed: PROCEDURE [big: BOOLEAN] = { ShowBig[big, red]; }; ShowBigGreen: PROCEDURE [big: BOOLEAN] = { ShowBig[big, green]; }; ShowBigBlue: PROCEDURE [big: BOOLEAN] = { ShowBig[big, blue]; }; ShowCBars: PROCEDURE = { graywidth: CARDINAL _ terminal.colorWidth/128; --this must integer divide evenly grayheight: CARDINAL _ terminal.colorHeight/2; --this must integer divide evenly cbarwidth: CARDINAL _ (terminal.colorWidth)/9; --this may truncate cbarheight: CARDINAL _ terminal.colorHeight/2; --this must integer divide evenly IF full THEN HalfPositive[] ELSE { --set up gray map k: CARDINAL _ (Basics.BITSHIFT[1,bpp])/2; -- half the number of pixel values FOR n: CARDINAL IN [0..k) DO Terminal.SetColor[vt: terminal, aChannelValue: n+200B, red: n*2, green: n*2, blue: n*2]; --use top half of colormap. Only makes sense for 8 BPP ENDLOOP; }; FOR i: CARDINAL IN[0..9) DO --set up color bars IF full THEN {Terminal.SetRedMap[terminal, i,testmap[i].r]; Terminal.SetGreenMap[terminal, i,testmap[i].g]; Terminal.SetBlueMap[terminal, i,testmap[i].b];} ELSE Terminal.SetColor[vt: terminal, aChannelValue: i, red: testmap[i].r, green: testmap[i].g, blue: testmap[i].b] ENDLOOP; FOR x: CARDINAL IN [0..128) DO --gray wedge Rect[x*graywidth, 0, graywidth, grayheight, x+128]; ENDLOOP; FOR x: CARDINAL IN [0..8] DO --colorbars Rect[x*cbarwidth, cbarheight, cbarwidth, cbarheight, x]; ENDLOOP; SetShowButtons[TRUE,full,full]; }; NextRoll: PROCEDURE [] = { OPEN Terminal; r,g,b,r0,g0,b0: [0..256); IF full THEN { r0_GetRedMap[terminal, 0]; g0_GetGreenMap[terminal, 0]; b0_GetBlueMap[terminal, 0]; FOR i: CARDINAL IN[0..255) DO r _ GetRedMap[terminal, i+1]; g _ GetGreenMap[terminal, i+1]; b _ GetBlueMap[terminal, i+1]; SetRedMap[terminal, i,r]; SetGreenMap[terminal, i,g]; SetBlueMap[terminal, i,b]; ENDLOOP; SetRedMap[terminal, 255,r0]; SetGreenMap[terminal, 255,g0]; SetBlueMap[terminal, 255,b0]; } ELSE { [r0,g0,b0] _ Terminal.GetColor[vt: terminal, aChannelValue: 0]; FOR i: CARDINAL IN[0..255) DO [r,g,b] _ Terminal.GetColor[vt: terminal, aChannelValue: i+1]; Terminal.SetColor[terminal,i,0,r,g,b]; ENDLOOP; Terminal.SetColor[terminal,255,0,r0,g0,b0]; }; Wait[100]; }; NextScramble: PROCEDURE [] = { SetUpColors[]; Wait[200]; }; background: INTEGER _ 0; -- initially black ClearScreen: PROCEDURE = { IF NOT full THEN { Terminal.SetColor[terminal, 0, 0, background, background, background]; SetGray[0] } ELSE {Terminal.SetGreenMap[terminal, 0,0]; Terminal.SetBlueMap[terminal, 0,0]; Terminal.SetRedMap[terminal, 0,0];}; Rectangle[lx: 0, ty: 0, rx: terminal.colorWidth, by: terminal.colorHeight, fn: null, clear: TRUE]; }; Wait: PROCEDURE[millisecs: CARDINAL] = INLINE { Process.Pause[Process.MsecToTicks[millisecs]] }; defaultSeed: CARDINAL = 27183; numCalls: INTEGER = 3; a: ARRAY [0..55] OF CARDINAL; p: INTEGER [0..55]; InitRandom: PUBLIC PROC[seed: INTEGER] RETURNS[INTEGER] = { minSeed: CARDINAL = LAST[CARDINAL]/10; g, gPrev, gSave: CARDINAL; IF seed<=0 THEN seed _ defaultSeed; WHILE seed max THEN ERROR; intervalLen _ max - min + 1; --is 0 when min=0, max=LAST[CARDINAL] IF intervalLen = 0 THEN RETURN[Random[]]; DO r, rem: CARDINAL; p _ p-1; IF p=0 THEN { RandomGen[]; p _ 55 }; r _ a[p]; rem _ r MOD intervalLen; IF (r - rem) > LOOPHOLE[-LOOPHOLE[intervalLen,INTEGER],CARDINAL] THEN LOOP; RETURN[min + rem]; ENDLOOP; };--Choose SetLogBitsPerPixel: PROC[n: [0..4)] RETURNS[BOOLEAN] = { b: CARDINAL _ Basics.BITSHIFT[1,n]; mode: Terminal.ColorMode _ [FALSE,b,1]; IF NOT Terminal.LegalColorMode[terminal, mode] THEN { mode.bitsPerPixelChannelB _ 0; IF NOT Terminal.LegalColorMode[terminal, mode] THEN RETURN[FALSE]; }; []_Terminal.SetColorMode[terminal, mode]; Terminal.TurnOnColorDisplay[terminal]; lbpp _ n; bpp _ b; full _ FALSE; lbppB _ 0; bppB _ 1; SetShowButtons[TRUE, TRUE, FALSE]; bitmapB _ terminal.GetColorFrameBufferB[]; ClearScreen[]; SetUpColors[]; RETURN[TRUE]; }; Set24BitsPerPixel: PROC = { mode: Terminal.ColorMode _ [TRUE,0,0]; IF NOT Terminal.LegalColorMode[terminal, mode] THEN RETURN; Process.SetPriority[Process.priorityNormal]; []_Terminal.SetColorMode[terminal, mode]; Terminal.TurnOnColorDisplay[terminal]; lbpp _ 0; bpp _ 0; full _ TRUE; SetShowButtons[TRUE, TRUE, FALSE]; bitmapB _ NIL; ClearScreen[]; SetUpColors[]; Process.SetPriority[Process.priorityBackground]; }; Go: PUBLIC PROC [ckViewer: CKViewer] = { [] _ InitRandom[0]; public _ ckViewer; SELECT TRUE FROM SetLogBitsPerPixel[3] => NULL; SetLogBitsPerPixel[2] => NULL; ENDCASE => { MW.Append[message: "NO COLOR DISPLAY !!", clearFirst: TRUE]; MW.Blink[]; RETURN; }; Process.SetPriority[Process.priorityBackground]; DO IF ckViewer.state.quit THEN { ClearScreen; ViewerOps.DestroyViewer[ckViewer.container]; []_Terminal.SetColorBitmapState[vt: terminal, newState: none, newMode: Terminal.GetColorMode[terminal], newVisibility: none]; EXIT; }; IF ckViewer.state.testingPanel THEN LOOP; --turned off by FinalizeTest IF ckViewer.state.bpp=1 AND bpp#1 THEN { [] _ SetLogBitsPerPixel[0]; SetSplat[] }; IF ckViewer.state.bpp=2 AND bpp#2 THEN { [] _ SetLogBitsPerPixel[1]; SetSplat[] }; IF ckViewer.state.bpp=4 AND bpp#4 THEN { [] _ SetLogBitsPerPixel[2]; SetSplat[] }; IF ckViewer.state.bpp=8 AND bpp#8 THEN { [] _ SetLogBitsPerPixel[3]; SetSplat[] }; IF ckViewer.state.bpp=24 AND NOT full THEN { Set24BitsPerPixel[]; SetSplat[] }; IF ckViewer.state.aToggle THEN { SetShowButtons[NOT ashow, bshow,FALSE]; ckViewer.state.aToggle _ FALSE}; IF ckViewer.state.bToggle THEN { SetShowButtons[ashow, NOT bshow,FALSE]; ckViewer.state.bToggle _ FALSE}; IF ckViewer.state.random THEN { sym _ FALSE; SetSplat[]; ClearScreen[]; ckViewer.state.random _ FALSE; }; IF ckViewer.state.symmetric THEN { sym _ TRUE; SetSplat[]; ClearScreen[]; ckViewer.state.symmetric _ FALSE}; IF NOT ckViewer.state.freeze THEN { ckViewer.state.roll _ ckViewer.state.scramble _ FALSE; --only TRUE when frozen SELECT TRUE FROM ckViewer.state.testPattern => { splat _ FALSE; ShowTPat[]; ckViewer.state.testPattern _ FALSE; }; ckViewer.state.cbars => {ShowCBars[]; splat _ ckViewer.state.cbars _ FALSE}; ckViewer.state.converge => {ShowConverge[]; splat _ ckViewer.state.converge _ FALSE}; ckViewer.state.diag => {Diag[]; splat _ ckViewer.state.diag _ FALSE}; ckViewer.state.bigRed => {ShowBigRed[big: TRUE]; splat _ ckViewer.state.bigRed _ FALSE}; ckViewer.state.bigGreen => {ShowBigGreen[big: TRUE]; splat _ ckViewer.state.bigGreen _ FALSE}; ckViewer.state.bigBlue => {ShowBigBlue[big: TRUE]; splat _ ckViewer.state.bigBlue _ FALSE}; ckViewer.state.smallRed => {ShowBigRed[big: FALSE]; splat _ ckViewer.state.smallRed _ FALSE}; ckViewer.state.smallGreen => {ShowBigGreen[big: FALSE]; splat _ ckViewer.state.smallGreen _ FALSE}; ckViewer.state.smallBlue => {ShowBigBlue[big: FALSE]; splat _ ckViewer.state.smallBlue _ FALSE}; ENDCASE => IF splat THEN RandomSplat[ckViewer]; } ELSE { SELECT TRUE FROM ckViewer.state.scramble => NextScramble[]; ckViewer.state.roll => NextRoll[]; ENDCASE => NULL; }; ENDLOOP; }; SetSplat: PROCEDURE [] = { splat _ TRUE; SetShowButtons[ashow,bshow,FALSE]; CKViewerButtons.SetStaticButtons[public, IF sym THEN public.buttons.symmetricButton ELSE public.buttons.randomButton] }; SetShowButtons: PROCEDURE [a, b, c: BOOL] = { vis: Terminal.ChannelsVisible; ashow_a; bshow_b; vis _ SELECT TRUE FROM a AND b => all, a AND NOT b => aOnly, NOT a AND b => bOnly, NOT a AND NOT b => none, ENDCASE => ERROR; Terminal.SetVisibility[vt: terminal, visibility: vis]; Buttons.SetDisplayStyle[public.buttons.aChanButtton, IF ashow THEN $WhiteOnBlack ELSE $BlackOnWhite]; Buttons.SetDisplayStyle[public.buttons.bChanButton, IF bshow THEN $WhiteOnBlack ELSE $BlackOnWhite]; }; SetUpPanelTest: PUBLIC PROCEDURE [ckViewer: CKViewer] = { ckViewer.state.testingPanel _ TRUE; Wait[2000]; --stupid synchronizer so main loop in Go will quit messing with screen ClearScreen []; --FILL FIFOS WITH Zeroes Terminal.SetVisibility[vt: terminal, visibility: all]; --so when ChannelOn glitches nothing bad will happen Wait[36]; --be sure both a and b actually show SetShowButtons[ashow,bshow,TRUE]; --restore ashow/bshow }; public: CKViewer _ NIL; TRUSTED { bb _ InitBB[@bbspace] }; END. ΐCKViewerOpsImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Last edited by Ken Pier, February 16, 1984 2:05:54 pm PST Doug Wyatt, May 1, 1985 10:03:53 am PDT Rick Beach, February 17, 1986 4:58:56 pm PST draw a set of diagonal lines draw a line from (fx,fy) to (lx,ly) gray background four corners various colors at left edge a bunch of stripes bitmap A bitmap B Constant definitions (meanings described in InitRandom below) Module state Holds 55 random cardinals, to be returned by Random. (A[0] is wasted to make the code generator produce better array accesses.) a[1..p-1] has not yet been returned by Random; p is [1..55] except within Random. Procedures The parameter seed determines the sequence generated by procedure Random below. If seed=0, a default seed value is used to determine the starting point of the sequence; if seed>0, seed is scaled if necessary and then used; if seed<0, a seed value is derived from the system clock. In any case, the seed value actually used (after scaling) is the integer value returned. Now scale the seed into the proper range (no log routine available...) Seed can't be too big since LAST[INTEGER] < LAST[CARDINAL]*(9/10) The array a is initialized by placing seed in a[55], and scattering the values (-1)**(i-1) * (F(i) - seed*F(i-1)) MOD maxRand, 0 ˜Pšžœžœ žœ ž˜,KšœF˜FKšœ ˜ Kšžœ˜—Kšœ˜—K˜š‘œžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜šžœžœ žœ˜šžœžœžœž˜Kšœn˜nKšžœ˜—Kšœžœžœžœ˜!K˜—Kšœ™Kšœ<˜Kšœžœ ˜Kšœžœ ˜K˜?K˜?Kšžœžœžœžœ˜Kšœ™Kšœžœ%˜GKšœ#˜#K˜!K˜K˜K˜Kšœžœ˜Kšœ™Kšœžœ)žœ˜SKšœ#˜#K˜*K˜K˜K˜Kšœžœ˜K˜K˜—š‘œžœ žœ.žœ˜TKšœžœ˜Kšœžœ žœ ˜)K˜?Kšœžœ-žœ˜WKšœ#˜#K˜)Kšœžœ ˜#K˜K˜Kšœžœ˜K˜K˜—K˜K˜š ‘ œžœžœ&žœžœ˜_šžœžœ˜K˜Kšžœžœ žœ<˜VK˜"K˜—šžœ˜Kš œžœžœžœ žœ˜1K˜"Kš žœžœ žœžœžœ˜@K˜—K˜K˜—š ‘ œžœžœ%žœžœžœ˜gKšœžœ žœ ˜+Kš œžœžœžœžœ ˜/K˜?Kšœžœ.žœ˜XKšœ#˜#K˜ Kšœžœ˜*K˜Kšœ˜Kšœžœ˜K˜K˜—š‘ œž œ˜/Kšœ žœ˜(Kšœ žœ˜)Kšœ žœ˜Kšœžœ˜Kšœžœžœžœ˜DK˜K˜šžœžœ˜ K˜K˜K˜K˜K˜"K˜ K˜"K˜ K˜"K˜$Kšœ˜—šžœ˜K˜K˜K˜K˜K˜"Kšœ˜—šžœ žœžœ˜K˜K˜K˜K˜K˜K˜—Kšžœžœ   ˜3Kšœ˜K˜—š‘ œž œ˜Kšœžœ˜,Kšœžœ˜*Kšœžœ˜,Kšœžœ˜*K˜šžœžœ žœ˜šžœžœžœž˜Kšœn˜nKšžœ˜—Kšœžœžœžœ˜!K˜—Kšœ> ˜Pšžœžœžœž˜@Kšœ5˜5Kšžœ˜—šžœžœžœž˜>Kšœ3˜3Kšžœ˜—K˜—K˜š‘œž œžœ ˜@Kšœžœ˜Kšœ žœ ˜DKš œžœžœžœžœ˜(Kš œžœžœžœžœ žœ ˜IKšœ žœžœ˜-Kšœ žœ˜$Kšžœžœžœžœžœžœžœžœžœžœ˜VK˜šžœžœžœž˜'Kšœžœ ˜šžœž˜Kšœ˜Kšœ˜Kšœ˜Kšžœžœ˜—šžœžœ˜Kšœ$˜$Kšœ&˜&Kšœ%˜%Kšœ˜—KšžœO˜Sšžœžœžœž˜%Kšœ žœ˜&Kšœ?˜?Kšžœ˜—Kšžœ˜—K˜—K˜K˜š‘ œž œžœ˜(Kšœ˜Kšœ˜—K˜š‘ œž œžœ˜*Kšœ˜Kšœ˜—K˜š‘ œž œžœ˜)Kšœ˜Kšœ˜—K˜K˜š‘ œž œ˜Kšœ žœ !˜PKšœ žœ "˜PKšœ žœ ˜BKšœ žœ !˜PK˜šžœžœžœ ˜4Kšœžœ žœ  "˜Lšžœžœžœž˜KšœY 7˜Kšžœ˜—K˜—š žœžœžœžœ ˜/Kšžœžœ˜›Kšžœn˜rKšžœ˜—š žœžœžœ žœ  ˜,K˜3Kšžœ˜—š žœžœžœžœ  ˜)Kšœ8˜8Kšžœ˜—Kšœžœ ˜Kšœ˜—K˜š‘œž œ˜Kšžœ ˜K˜šžœžœ˜KšœS˜Sšžœžœžœ ž˜Kšœ]˜]KšœQ˜QKšžœ˜—KšœZ˜ZK˜—šžœ˜Kšœ?˜?šžœžœžœ ž˜Kšœ>˜>Kšœ&˜&Kšžœ˜—Kšœ+˜+K˜—K˜ Kšœ˜—K˜š‘ œž œ˜K˜Kšœ˜—K˜Kšœ žœ ˜+K˜š‘ œž œ˜šžœžœžœ˜KšœF˜FK˜ —Kšžœo˜sKšœ\žœ˜bK˜K˜—š‘œž œ žœžœ˜/K˜0K˜Kšœ=™=K˜Kšœ žœ ˜Kšœ žœ˜K˜K˜Kšœ ™ K˜šœžœ žœžœ˜KšœP™PKšœ.™.—šœžœ ˜KšœQ™QK˜K˜—Kšœ ™ K˜š ‘ œžœžœžœžœžœ˜;KšœO™OKšœN™NKšœR™RKšœR™RKšœ.™.K˜Kšœ žœžœžœ˜&Kšœžœ˜K˜Kšžœ žœ˜#KšœF™FKšžœžœžœ˜,KšœA™AKšœN™NK˜Kšœ7™7K˜KšœN™NKšœL™LKšœ™K˜K˜K˜šžœžœžœ ž˜Kšœ žœ˜K˜/—Kšžœ˜šžœž˜K˜ —Kšžœ˜KšœH™HK˜Kšžœ˜ —Kšœ  ˜K˜K˜š ‘œžœžœžœžœžœ˜0K˜Kšžœžœ˜'Kšžœ˜ —Kšœ ˜ K˜K˜š‘ œžœžœ˜KšœO™OKšœQ™QKšœ?™?šžœžœžœ žœ˜K˜—Kšžœ˜šžœžœžœ žœ˜K˜—Kšžœ˜—Kšœ  ˜ K˜K˜š ‘œžœžœ žœžœž œ˜KKšœ žœ˜Kšžœ žœžœ˜Kšœ %˜BKšžœžœžœ ˜)šž˜KšœV™VKšœU™UKšœZ™ZKšœ;™;Kšœžœ˜Kšœ™K˜Kšžœžœ˜'K˜ Kšœžœ ˜Kšžœ žœžœ žœžœžœžœ˜KKšžœ ˜—Kšžœ˜—Kšœ ˜ K˜—š‘œžœ žœžœ˜8Kšœžœ žœ˜#Kšœžœ˜'šžœžœ)žœ˜5Kšœ˜Kš žœžœ)žœžœžœ˜BK˜—Kšœ)˜)Kšœ&˜&Kšœžœ˜ K˜Kšœžœžœžœ˜"Kšœ*˜*K˜K˜K˜Kšžœžœ˜ K˜K˜—š‘œžœ˜Kšœžœ˜&Kšžœžœ)žœžœ˜;Kšœ,˜,Kšœ)˜)Kšœ&˜&Kšœžœ˜Kšœžœžœžœ˜"Kšœ žœ˜Kšœ˜K˜Kšœ0˜0K˜K˜—š‘œžœžœ˜(Kšœ˜Kšœ˜K™&K™'šžœžœž˜Kšœžœ˜Kšœžœ˜šžœ˜ Kšžœ4žœ˜Kšœ˜—KšœEžœ˜LKšœNžœ˜UKšœ>žœ˜EKšœ*žœ#žœ˜XKšœ.žœ%žœ˜^Kšœ,žœ$žœ˜[Kšœ,žœ%žœ˜]Kšœ0žœ'žœ˜cKšœ.žœ&žœ˜`Kšžœžœžœ˜/—Kšœ˜—šžœ˜šžœžœž˜Kšœ*˜*Kšœ"˜"Kšžœžœ˜—K˜—Kšžœ˜—˜K˜——š‘œž œ˜Kšœžœžœ˜0Kšœ)žœžœ žœ˜uK˜—K˜š‘œž œ žœ˜-Kšœ˜Kšœ˜šœžœžœž˜Kšœžœ ˜Kšœžœžœ ˜Kšžœžœ ˜Kšžœžœžœ ˜Kšžœžœ˜K˜—Kšœ6˜6Kšœ5žœžœžœ˜eKšœ4žœžœžœ˜dK˜—K˜š‘œžœž œ˜:Kšœžœ˜#Kšœ  F˜RKšœ ˜(Kšœ7 4˜kKšœ  $˜.Kšœžœ ˜7Kšœ˜—K˜Kšœžœ˜K˜Kšžœ˜"—K˜K˜Kšžœ˜—…—Lτom