3

I have gizmoB that takes a camera as input. GizmoB lives in GizmoA which also takes a camera as input. I want gizmoB to be able to access the camera via an expression. However nothing I do quite seems to work. The XML-script might better explain it.

Basically Camera -> GizmoA -> GizmoB.

Thanks for your help. Maybe I'm going at this the wrong way, it's been a while since I have used Nuke and Python.

#! C:/Program Files/Nuke10.0v3/nuke-10.0.3.dll -nx
version 10.0 v3
define_window_layout_xml {<?xml version="1.0" encoding="UTF-8"?>
<layout version="1.0">
    <window x="0" y="0" w="1920" h="848" screen="0">
        <splitter orientation="1">
            <split size="40"/>
            <dock id="" hideTitles="1" activePageId="Toolbar.1">
                <page id="Toolbar.1"/>
            </dock>
            <split size="1241" stretch="1"/>
            <splitter orientation="2">
                <split size="287"/>
                <dock id="" activePageId="Viewer.2">
                    <page id="Viewer.2"/>
                    <page id="Viewer.1"/>
                </dock>
                <split size="495"/>
                <dock id="" activePageId="DAG.2">
                    <page id="DAG.1"/>
                    <page id="Curve Editor.1"/>
                    <page id="DopeSheet.1"/>
                    <page id="DAG.2"/>
                </dock>
            </splitter>
            <split size="615"/>
            <dock id="" activePageId="Properties.1" focus="true">
                <page id="Properties.1"/>
            </dock>
        </splitter>
    </window>
</layout>
}
Root {
 inputs 0
 name Q:/data/test.nk
 title "sq2600 s1 - nuke_scripts.nk"
 frame 2
 last_frame 96
 lock_range true
 colorManagement Nuke
 views {
  {LFT ""}
  {RGT ""}
 }
 addUserKnob {20 User}
 addUserKnob {1 lt_res}
 lt_res "\$\{a_res\}"
 addUserKnob {1 mp_res}
 mp_res 1
 addUserKnob {1 fx_res}
 fx_res "\$\{a_res\}"
 addUserKnob {1 mpaint_res +INVISIBLE}
 addUserKnob {1 lighting_res +INVISIBLE}
 addUserKnob {4 deptMode l "Choose a department mode:" M {none "Image Finaling" Layout Lighting FX}}
}
Camera2 {
 inputs 0
 read_from_file true
 rot_order XYZ
 translate {2.836216927 8.794775009 13.20492458}
 rotate {-17.39999962 22.20000076 7.170989063e-014}
 focal 35
 haperture 35.99992752
 vaperture 23.99995222
 near 0.1000000015
 far 25
 file camera1.fbx
 fbx_node_name {{7} "Producer Perspective" "Producer Top" "Producer Bottom" "Producer Front" "Producer Back" "Producer Right" "Producer Left" camera1}
 name Camera1
 xpos 1333
 ypos 5163
}
set N5363c00 [stack 0]
Read {
 inputs 0
 file ../images/test.%04d.exr
 format "1024 768 0 0 1024 768 1 "
 last 96
 origlast 96
 origset true
 name Read1
 xpos 1156
 ypos 5213
}
set N3ac68800 [stack 0]
Group {
 inputs 2
 name GizmoC
 label "(\[value space_transform])"
 selected true
 xpos 1449
 ypos 5282
 addUserKnob {20 SpaceTransform}
 addUserKnob {26 info l "" +STARTLINE T "Connect camera for transformation"}
 addUserKnob {26 ""}
 addUserKnob {41 in l input T Shuffle1.in}
 addUserKnob {4 data_type l "data type" M {"normal vectors" "point positions"}}
 data_type "point positions"
 addUserKnob {4 space_transform l "space transform" M {"cam to world" "world to cam" ""}}
 space_transform "world to cam"
 addUserKnob {41 out l output T ShuffleCopy1.out2}
 addUserKnob {26 ""}
}
 Input {
  inputs 0
  name cam
  xpos 852
  ypos -563
  number 1
 }
 Axis2 {
  name Axis3
  xpos 862
  ypos -489
 }
 NoOp {
  name NoOp1
  label "camera scale"
  xpos 852
  ypos -399
  addUserKnob {20 User}
  addUserKnob {13 scale}
  scale {{"\[value \[topnode parent.input1].scaling.x]"} {"\[value \[topnode parent.input1].scaling.y]"} {"\[value \[topnode parent.input1].scaling.z]"}}
  addUserKnob {7 uniform_scale l "uniform scale"}
  uniform_scale {{"\[value \[topnode parent.input1].uniform_scale]"}}
  addUserKnob {13 total_scale l "total scale"}
  total_scale {{"scale*uniform_scale ? 1/(scale*uniform_scale) : 0"} {"scale*uniform_scale ? 1/(scale*uniform_scale) : 0"} {"scale*uniform_scale ? 1/(scale*uniform_scale) : 0"}}
 }
 Input {
  inputs 0
  name src
  xpos 164
  ypos -564
 }
 Dot {
  name Dot7
  xpos 198
  ypos -482
 }
set N59756400 [stack 0]
 Shuffle {
  in rgb
  alpha black
  out rgb
  name Shuffle1
  label "in: \[value in]"
  xpos 400
  ypos -489
 }
 Dot {
  name Dot1
  xpos 434
  ypos -397
 }
set N529ffc00 [stack 0]
 Dot {
  name Dot2
  xpos 666
  ypos -397
 }
 Add {
  channels rgb
  value {{-parent.Axis3.world_matrix.3} {-parent.Axis3.world_matrix.7} {-parent.Axis3.world_matrix.11} 0}
  name Add1
  label "inverse translation"
  xpos 632
  ypos -246
  disable {{!parent.data_type}}
 }
 ColorMatrix {
  matrix {
      {{"parent.Axis3.world_matrix.0 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.1 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.2 * parent.NoOp1.total_scale.z"}}
      {{"parent.Axis3.world_matrix.4 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.5 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.6 * parent.NoOp1.total_scale.z"}}
      {{"parent.Axis3.world_matrix.8 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.9 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.10 * parent.NoOp1.total_scale.z"}}
    }
  invert true
  name ColorMatrix3
  label "world to cam"
  xpos 632
  ypos -184
  disable {{hasError}}
 }
 Dot {
  name Dot3
  xpos 666
  ypos -77
 }
push $N529ffc00
 ColorMatrix {
  matrix {
      {{"parent.Axis3.world_matrix.0 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.1 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.2 * parent.NoOp1.total_scale.z"}}
      {{"parent.Axis3.world_matrix.4 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.5 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.6 * parent.NoOp1.total_scale.z"}}
      {{"parent.Axis3.world_matrix.8 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.9 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.10 * parent.NoOp1.total_scale.z"}}
    }
  name ColorMatrix2
  label "cam to world"
  xpos 400
  ypos -310
  disable {{hasError}}
 }
 Add {
  channels rgb
  value {{parent.Axis3.world_matrix.3} {parent.Axis3.world_matrix.7} {parent.Axis3.world_matrix.11} 0}
  name Add5
  label translation
  xpos 400
  ypos -246
  disable {{!parent.data_type}}
 }
 Switch {
  inputs 2
  which {{parent.space_transform}}
  name Switch1
  label transform
  xpos 400
  ypos -84
 }
push $N59756400
 ShuffleCopy {
  inputs 2
  alpha alpha2
  black red
  white green
  red2 blue
  green2 alpha
  out2 rgb
  name ShuffleCopy1
  label "out: \[value out2]"
  xpos 164
  ypos -84
  disable {{"!(NoOp1.total_scale.x && NoOp1.total_scale.y && NoOp1.total_scale.z && \[exists parent.input0])"}}
 }
 Output {
  name Output1
  xpos 164
  ypos 9
 }
end_group
Viewer {
 frame_range 1-96
 name Viewer1
 xpos 1449
 ypos 5211
}
push $N5363c00
push $N3ac68800
push 0
Group {
 inputs 3
 name gizmoA
 tile_color 0x5f5f5fff
 note_font "Bitstream Vera Sans"
 note_font_size 14
 note_font_color 0xfefefeff
 xpos 1156
 ypos 5380
}
 Output {
  inputs 0
  name Output
  xpos -1040
  ypos -504
 }
 Input {
  inputs 0
  name shot_cam
  label "\[value number]"
  xpos -901
  ypos -930
  number 2
 }
 Input {
  inputs 0
  name position
  label "\[value number]"
  xpos -1116
  ypos -935
  number 1
 }
 Group {
  inputs 2
  name GizmoB
  label "(\[value space_transform])"
  selected true
  xpos -958
  ypos -826
  addUserKnob {20 SpaceTransform}
  addUserKnob {26 info l "" +STARTLINE T "Connect camera for transformation"}
  addUserKnob {26 ""}
  addUserKnob {41 in l input T Shuffle1.in}
  addUserKnob {4 data_type l "data type" M {"normal vectors" "point positions"}}
  data_type "point positions"
  addUserKnob {4 space_transform l "space transform" M {"cam to world" "world to cam" ""}}
  space_transform "world to cam"
  addUserKnob {41 out l output T ShuffleCopy1.out2}
  addUserKnob {26 ""}
 }
  Input {
   inputs 0
   name cam
   xpos 852
   ypos -563
   number 1
  }
  Axis2 {
   name Axis3
   xpos 862
   ypos -489
  }
  NoOp {
   name NoOp1
   label "camera scale"
   xpos 852
   ypos -399
   addUserKnob {20 User}
   addUserKnob {13 scale}
   scale {{"\[value \[topnode parent.input1].scaling.x]"} {"\[value \[topnode parent.input1].scaling.y]"} {"\[value \[topnode parent.input1].scaling.z]"}}
   addUserKnob {7 uniform_scale l "uniform scale"}
   uniform_scale {{"\[value \[topnode parent.input1].uniform_scale]"}}
   addUserKnob {13 total_scale l "total scale"}
   total_scale {{"scale*uniform_scale ? 1/(scale*uniform_scale) : 0"} {"scale*uniform_scale ? 1/(scale*uniform_scale) : 0"} {"scale*uniform_scale ? 1/(scale*uniform_scale) : 0"}}
  }
  Input {
   inputs 0
   name src
   xpos 164
   ypos -564
  }
  Dot {
   name Dot7
   xpos 198
   ypos -482
  }
set N374e8c00 [stack 0]
  Shuffle {
   in rgb
   alpha black
   out rgb
   name Shuffle1
   label "in: \[value in]"
   xpos 400
   ypos -489
  }
  Dot {
   name Dot1
   xpos 434
   ypos -397
  }
set N25e1bc00 [stack 0]
  Dot {
   name Dot2
   xpos 666
   ypos -397
  }
  Add {
   channels rgb
   value {{-parent.Axis3.world_matrix.3} {-parent.Axis3.world_matrix.7} {-parent.Axis3.world_matrix.11} 0}
   name Add1
   label "inverse translation"
   xpos 632
   ypos -246
   disable {{!parent.data_type}}
  }
  ColorMatrix {
   matrix {
       {{"parent.Axis3.world_matrix.0 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.1 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.2 * parent.NoOp1.total_scale.z"}}
       {{"parent.Axis3.world_matrix.4 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.5 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.6 * parent.NoOp1.total_scale.z"}}
       {{"parent.Axis3.world_matrix.8 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.9 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.10 * parent.NoOp1.total_scale.z"}}
     }
   invert true
   name ColorMatrix3
   label "world to cam"
   xpos 632
   ypos -184
   disable {{hasError}}
  }
  Dot {
   name Dot3
   xpos 666
   ypos -77
  }
push $N25e1bc00
  ColorMatrix {
   matrix {
       {{"parent.Axis3.world_matrix.0 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.1 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.2 * parent.NoOp1.total_scale.z"}}
       {{"parent.Axis3.world_matrix.4 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.5 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.6 * parent.NoOp1.total_scale.z"}}
       {{"parent.Axis3.world_matrix.8 * parent.NoOp1.total_scale.x"} {"parent.Axis3.world_matrix.9 * parent.NoOp1.total_scale.y"} {"parent.Axis3.world_matrix.10 * parent.NoOp1.total_scale.z"}}
     }
   name ColorMatrix2
   label "cam to world"
   xpos 400
   ypos -310
   disable {{hasError}}
  }
  Add {
   channels rgb
   value {{parent.Axis3.world_matrix.3} {parent.Axis3.world_matrix.7} {parent.Axis3.world_matrix.11} 0}
   name Add5
   label translation
   xpos 400
   ypos -246
   disable {{!parent.data_type}}
  }
  Switch {
   inputs 2
   which {{parent.space_transform}}
   name Switch1
   label transform
   xpos 400
   ypos -84
  }
push $N374e8c00
  ShuffleCopy {
   inputs 2
   alpha alpha2
   black red
   white green
   red2 blue
   green2 alpha
   out2 rgb
   name ShuffleCopy1
   label "out: \[value out2]"
   xpos 164
   ypos -84
   disable {{"!(NoOp1.total_scale.x && NoOp1.total_scale.y && NoOp1.total_scale.z && \[exists parent.input0])"}}
  }
  Output {
   name Output1
   xpos 164
   ypos 9
  }
 end_group
end_group
Andy Jazz
  • 49,178
  • 17
  • 136
  • 220

1 Answers1

0

For this script I turned off read from fbx file option and then manually animated a Camera1.

Patrick, I see you turned on an inversion of values in ColorMatrix1 and ColorMatrix3 which leads to errors in case you have zeros inside RGB matrix (because all three main diagonal values of your ColorMatrix nodes equal to 0).

enter image description here

You've written an expression inside NoOp1 node (this expression affects ColorMatrix node):

parent.Axis3.world_matrix.0 * parent.NoOp1.total_scale.x

The expression itself is OK but the default values of scale and uniform scale properties can't be 0 – they must be +1 (suitable for visible RGB spectrum) or even -1 (suitable for invisible PP spectrum – negative color values are quite usual in NUKE, especially for such render passes as Point Position). Thus, your conditional expression based on ternary operator for total scale property in NoOp1 node is incorrect:

scale * uniform_scale ? 1/(scale * uniform_scale) : 0    // INCORRECT EXPRESSION  

So your expression must be, at least, like the following:

scale * uniform_scale ? abs(1/(scale * uniform_scale)) : 1

Even if if-statement doesn't work you'll get default 1 value for scaling in else-statement.

The values in scale and uniform scale knobs equal to 0 because you should assign the right name of an input for top node (the syntax of TCL-expression itself is also OK):

[value [topnode parent.Camera1].scaling.x]
[value [topnode parent.Camera1].scaling.y]
[value [topnode parent.Camera1].scaling.z]

[value [topnode parent.Camera1].uniform_scale]

or:

[value [topnode parent.input1].scaling.x]    // Axis node has 'input0' and 'input1'
[value [topnode parent.input1].scaling.y]
[value [topnode parent.input1].scaling.y]

[value [topnode parent.input1].uniform_scale]

Also, I've noticed that you have errors in both expressions in Switch1 and Switch2 nodes. The expression inside Switch1 node looks like this:

parent.space_transform                                 // NO 'space_transform' HERE

But, as you can see, this expression leads to an error as well (I don't see any space_transform property in your NUKE script at all):

enter image description here

So I fixed all the aforementioned errors and now script perfectly works.

Play this GIF sequence by clicking it.

enter image description here

I can share only encrypted XML code of a working script. So for reading it in you need The Foundry NUKE 11.3v1 Non-commercial Edition. Here's my code (copy-paste this very long string):

Nuke NC mode encrypted text (commercial mode uses plain text)     Qg[dmPBB4Y\H8h8hGFegl_d1o14fK4hX8:9H6ETYjE^K7W6[^S]CWHCF<<STTjcZY9R9W6nWjeX47>A`23OdUB>D<16l4nFd][?OQmGMAa2?:RDV8CRNhV6jYAkc\1^b0d9ZWC7JXAJGY43<_k?8a;AbOmh3Z^IU4LnKLdFo?7nif>XVIJOmbX1F2LK4VaQ07?Fg<YcLW<_:ocje@A32AT]Y9iO@jh<ic3oO8_VQH576G6[3SA]e45LPn=d5<?;l]>J6U4O6KKSGN47V^1Oj4;C;gKf@[M`>:J]WOIfH3A<LYkM?83fPBGXCL718:_nIY8Xe?`7_?2hiQU0jXSY8nI=EgAB`[]YCYmCKo9KDKY?QTBY=:6E5_R[Ra[1AkFa>LLdC\Hic[1fiinmU]1;4dcKMF7bSoInH1Pj71la>=8A<^jBQob2>Y6R1kbLN0R=^O0f`DjNOmn6jDCC5Q>3KY_AlAgAG4Qhbk_1XHL1`h]BlL0Uk;7RCLODK=hd2V0QXiii04G_IQle?J\e6EIIoCenL64li\F>n:7Q_l2Q@L=Ee4j]C`;bHh:m2;[hf:N74lVUe7=Xkj^bG1_M:PZMBi]RQSlHMQWTW?UPAQlIV9BKbb9ABN`]4d[QQ:Ccmn=[BVoJN82@E3]jdE=[3[Xgi8nI@UbTncRmChX4g<=5CnooKBdgSZWjWOdEJW;jR2:Y:9]Y:EM7LEZlRkQH@5;h6iORc09LN[DaAQ25>MO`HJBm6>[B5IDT[0JL6AHchP\j3B_`XLD]kM?2B=74g842GF]B557iQ@LEE;[Jb<0JWKFXdgNK903C^;1GlSA:kRi1W8k:\OWH__c@f[=SBG8M9FOkNAD5\>Clki0lP]`YG4ilR2`IigPK]E^h>IYW95:W8k2OiGChFG?KYPbQ6OiR2APll8<mS0VHdc87_o\KckPIjR`b1JWaf_W?Fn\:AMDGeL9EPS:CXb0>;0WG^a@10gf>`TUlEVdb@Uh8MZ6FTcHa]NDBalEW\YA:]O`H8eNQ=i8@3jT1LmiALF:3QZLQV:i9UMce52Z\8<XO4?HC=RA31`BScn@Y1EJ5^e[XG`nm69HhkAeBXF=[_O6_BdW<>>:7b9`NaUGnUITL9Ig7jh@T9hkE8Y?nmIncfeI7RI`X6e@8ie6@b9^je0Dj[Eg>oeI?RFg6M\h`JO;EZKXlWo`L6X8O\VW>YALO\=caIh6KNK>i8_8X=0XS^T@^H5VNHO`LDkLGhk]JJXn[3j0?9NUYnS`;km8MLf=5i\G=[8BZ>aV9Fgi@I@YS1LBYb<]Wb[9BZ0a^39EHMcUJ\nD;hP>:B6QeJe^N_H@7UWcm1nBXMfnGIkD_600HUmL;iUV@@U5J6X><k7@Qm8EVJWAIMocno>m`36b74LQL:dbcES0KP<nCfMoJaCYQEM;i_T_Jh0TL=^RkC4C<R=a_6haaEDM825XjLgYh8OhBik]GK88EQg?hh\AlRE2LU`JKfiIXXRB;Ag0>:Yjn8_S[GUTB>`l8X@GNN\R<CSkGc[F4`YZG>QUJIh8]C\KR93>QMQKC>PKWngHdEX@K@C89a0FL1>DoT:RSBcc=HhCD`>D_=C_58B^dj?N<B;]]W_nFla]k\AcS>Hnf>nk0oNUFYgMg2dXOL5n>FjV9B12@:@]S]W[=_FQ01jmU^dl\SfG@`J41hMYSbo1gmF]HmM6GnnQi^_]fNnfLiecM60m^i\V>`G\?VUB`4FdZeg8dn[ABOOaFdcT23b2CnSQlfo2Pj^o5Kgj[BlOhlaRV]3f\h^jb1Mc9Gi5]e>^?HiDDBYMd<6AD2E<aRETWcNPJQ]]Io`KB1Wdj]gg=]O]=FF^ak6AbJaJ4k]:XnX14SYoJeRdHDFOU;mV\ao>BY0>@N@YEh:1=nUV46TN67g2E]1lm4RnkhKUiX6`DTaZignFnmO4i:8QXcHVcJj`dHRFcR\lFTMg6PZ??P4?WLRR254c_L:QVG<i=2jNOnT15nF0ae:_10RI9SlF6mC:m;>4g]LDPoMW:[Eo?l7S;dZR8Q9=C>5H`i:QO`6OJHY5O:PhYNfbdYM21XCWidNNjHLCiJeHB\<fL_1?`N@TJCjNlFPbQ]Jbeo0CE:Lfa=XBaXRMS>2AXZkI?dMoDP84BThoa`[HlWZmnPAFifhgdd?DSC2okIJJ2e^WiJ@m5IM@j[:1TQJC<]\P34>>=ZeNCZPcH;h5AU312C4K:Y<4bB3LY3h^9?]jVVW]7\mgo4Ck4fKgA:DA1?4^J=X[cU8j6Y8G]UIT7X4KkHU75N`9l1jFmQ2lleg8<d70WILeWX;5K4OO]<D^D_@X:``<Ggl>[_W>PCABdSh^?;2JQNP@8FN3DjGRbKid6hB0oQ1@6KXM8KW1WYO^F]Ch@?8fGMGh7am=SDK4>9?Ll?\nQ:bX8FVKXZT_gHQbi]>_:;9okH_n=ceGZ?HgnGN]4FZn[7^fZ=kC02lV0BZ79Uh\12C]1NS5FC<4BM=mY6lUiCim^Qd5`9STZ5?4:HaM^=]`c8i8PP\Sn<@T7C`6k7`CkB6KLm57D^oXC[2eB5B_Rfjn>Z@GaAMJhBbDjN0`<HoKjn<aXJKGV4k2K\2Y2E<K_LOF8;`j7o43[2ZM5h<O\L8c_0`4GKDHWNMV4OSWEH4RMnCh\3F=>1O:]kN4SJVYiES?F;JMmV?F7UdcX79@nD<VD563k?D4E>ol\bZiIS6jhM[H3k0J[hHR7Z:>Lbf@F4Q=>B6[KV>f1`BC?HIhVU?\g0U4Lo;G;2GXBe9>6IQQ=OnIma0N8k]hd;Snh44HI[W6]Co`lS_3Y7`2Gj@9e2K@:LcU^<M8HnKV8jgc[b>M:=bjcN8CkBSb1cZUC53bK944bn]mdHP\ThF8d9dGDao:[:Ri0_70<fO8hXR;ee0:HaBD^ZeKHCPaOF1<93WoQcbNa??Aaan]GX_:P^i68R2bccWa>QDVJ\bCY:0O:k6E7a>@VjP=gkgZ=7nNWo=jJ@j^BSdc<F;T96k<ZNNR1F?77DOUM_Z=5:TQ85iFlemgSW?V;Jl=mEXX@PdfgJ2aFJ\HF[BU6TWd;aa@dN:Z\8Hi@>`1Z36YWW?\Y\j[i`O@efo3[c1Lb8[9J6ekde<1BK3@0Y>3eV6M?ChTGn\@U8<gH6]L7g^j8=f7cH@3mK7D@g?99VTNZ]Ti>TZ3@7_TTo_2K[QQ?_WMS6X]F_YZVVf?QoaZK4nj9b0K1f7=KA2`QdFOeC1>2TTceQLnBBShjBbWL_5S;WlKHBOF:GLHkcUTG\3?CQVZh;kc^>o=X6Q9\b:F1cmC?EOZQ:;D8c7g`SSE[UHCe9TU2c;^;BmgXP4`SHZWPBU1R@R7e6XI;MDiSVH9FkWc\^P111cU6cLmBHJP1JY`dU4hdXROX5<>eP5:6YKJRhi>Ad:@n>fQYHEbD47[FUYM67F4O<5E92IO[KVbJ<DI3D66@bao4LS1CiMJm546<V9JaE[FN4Tal1Yn`0DI4ND2Z3Ygk717;VS:nZ9@?GCVHPdOd?oQ>WJlh3<hb@a[0YfG?WHKIHf_cZg?eJcSEj[9W5;ETW;2W2[>30>JEA3S0?@ZVkM:Z?f\b1CK204FM1WC5PYGj==\HHNWkf<M69IKgHW4B\aVK@M_C5li]:k360fFDB@Mi@VRkeMk4<IQf2F;BgWO7YA8AgIV]n?aDPTWTGi@8Lb6Ff6S7gR:WEjWPn^lDaDJeYK\d_YYjn=A4iYlkh`C<P^i`V6LKU32aEF4OOn0_bgMBh:L`EI[3GeP0W:KDIB=2>C\8co7CQB;fjXoD0NbL]ZYn_>iiNZ3kVn6]I\hS@GQP35:[0N?iO6D_:\SB1NbXm6=VQ9Ec>Lh0Y=`m<:;cKT5CDAjd^NCI]0>doHSl^XhOVP5TCZgiA1V]2aNQ\Z]EKgKbR:?X\NndNlmOP^4cZllW8ieVROfkK2:Jd_JTcJBohQ]kcCO9K8C@bL_QbSYQm:X37VRlf?;nMl_\:;o3bkSQj>HUm[6jH@AN1eHQWZSjiKQ>O\Nncje=f]k2HP4oX;ljdU2T=6icAA43EAR=`j:<U\c7JP8NIT_44ZeTdCL9k^0jgZ\\g1IIEGVO;@L@X3fVW?QeGGbG_H6:N4;m_Ol\6nBd90e>M9cEHRWI3:Y6\7MK1BRRACHSfR?ib8lL6A;[OBRSliN\IjMASOKCaH;Ko<HZd:<He]k>R9D8K]PR>f?RGjeb[Dm><UTR_0oS;@^]2mNBOZP`mg@2Qo?ha0e32o]ZMOeg3?Q;bJ0<1k\<h\LEGk5>4n<9VJIlA>9YA?S0UN4<^Ih9e\R[ilH5MhdVnce65eR3HiQ6PWnF_CNJBN:4]bUSDKIeGhVoYVZ;2IM3NT8k^95G^Zn^LadXkP]h:P?;PZ37AP_EMVEPKSgo_MH37^3Z[YmK_IncY>7;Ajb;^D4d`YUIAAbnRL3T_94WHc?IW\Nj]3OiLb707@f?SAV:3]SFo]Y77a53\RSmd2Nb645\Fke^2?T82G:edc3Vi4?kW;WKBgM<R]LLUiAicigX1O^1Mn463@Zd==\nl];>]b1h?Rf28Q[^hPoAAk:LC6PU3nEB=FMcWoN:AMj]Se[C=me9^Zhf:YHZGcEcZ80Ac4G;ZnDOL0bbbC=F5A`9QdPYV2j:e7hCb3G[AS[Q51QBM1MUocTFF4GSB_6P1Qk43L_XPcGed[2W38n?VRhcFNMK9e>O10e^h4nQZD=SNS^V]2eHPNXd;h744`4d;B]KT;KH5f^=oIAZA?`J6abR;HLMFU?8cEgLI=Dn`k>1T\GGTT0oSHQmLPT[7Kf:6;hUMm5WRn4KbOO]^>mne^8CO4:eRDM18KgK0dNYmN[d^n6M7aB:mhiAm20[fSo=\ga8boVjF?DTJ9Z?Bb3;X[ldk0oDfgDAP;B=WLM]oEnbD\^H_YHHKRYhCL_oH;oc3FgVTaFEgCTdmcd]I<S6]^1[m1jZnIa<CbZn;D3EX];c=97:QF0SOega\kej=i7@aSieO=_1Q42Y78n2;NYNTac<cd4;V];KCANUo?jW>Ua8en?W@ZZH4>TS]XI<C_g\08_^W6UI6IkE7DX<[FO5n2S4a@2X2ZcAa76\ZeVFL;jnb82HdP1=m]kRl[^EGkV1F<JPI3ZD^RB\M45YS\6VQ=n2Rj1]]9iQh349mAcHEf0:2\0`M:@RSPSHKio68deTmd=R82YPhcd7l0f:jdi>6WXggTmSM:bZblkKOo89PPMc8oHFXY_=BJK<<g6_E1P8=8UQSlUXX0gXGgL:MY@nn4aO?Wg37l]N]Vck7[R17UTH\KJK:b6T10:Bhj\=SaaZ7OHgUKd31CT52ko4Wm?2iI2VI3D9NGAUA;1ATS_JP1O?VdojAT:5PLlIelBQ<LVnWhaF2Nm^77DhoPPCPe<_Z3_02Ef]2o=JNdDZkH>MAF^aIl5BUG]ZH=\`W`koghEcgke4_<Od2=\jT@SE:FJGa3D[d[Cf>beX6gfT5Tg2VkBj_Z\X[>B;ha=_=\78?o`lB2ocbF82Ad_CMW9LSRV4g;Z[Ci;V7]j7E_S2fTl0A61f2\Dh5<hK\a<\\2A4daiZFJNfM9A0Jhhfd^FSGPOHNlh<\d:dj<@10bN70LmjLG48FLZ>WTN9SgFMgOMlRa@O_D=Z;]=>UR=RHNEAMES?<<A_i^DYl2]9W:334j27iAgkKee=0:mAS\LB;eO44Xg>gema`FXB\JeKdkJjfcMMXQMeWe13GY7CWR>4B65k[nh>QJcZQbUA<Xg\Gnj?[`?gR4NeOS8V@Wi2FVhD8:ZdJ5mTP\5j\WRRdgn]PeX;4<=WQ5TBS?<m:7ZQRBI0E^KiOOF3g:e;kmW=G>KSeFXd:LoXE5=GgMf3HH\icNi[?R4LVCXRK0>11cg0>KiO50N54aTUQn_:keDi=<3\8_E@SUbmYAbU1:J@H:o:A>>ETKE0R69_]eA188HQZaVW[`i0=ck6i=ZPFTF?^7H@efcoddedi9h8am2O215kZVM=[VP6eh27Q[6Uo7O4e4cOg?DK6D@1f>]NTH8YVKjJfabZBVlc=?KB?5Ffc9Wd1<:GVfgDW]CMFFV2mghfmfUB53iG\DP:Qc]mIT>GKQ;AbRZ[B^ck4j60aY>bVh:QPU^O:Lb\`0PMc;4H[H]:hEi_d8[Y@biGDFn7kR=_>PeX_W[JD1`ZEM_fd^LBT>QoDm1B]PSN5fZJgCmL\XYY8TMokje8bij1^PD<eFP6C<9l>2Tn`hj:39DO26gjaC^RT883_WO>8JKZZg_DFodGiBPL4OE^jYn[UkH0QNB<KCSbFTbGda3lk`FbRLUe4=CddKbLAaR6PM>R:c;gXLDQccT0cBN:Z]1Vc[Gf>1J>YF9V`@BEJfgRZb;JQ8?>GgY=M<@Km1XPBfohj@]9eX:JD`>5]Y9:;d@KX9DVT0dM08A@R`A0hHY[lnVXVkaSU5LiJ@EmdQWnl4dFOWV0J4CLOU\<gLJbJOC=Znil19moaVc[acV9D82RmEY^od37TFlnef1KMNASdb;KEFa4MH?IYfchMG6SgG1IH@jfnAWdN2VHU05^`8`fVbAm67WdVUooVP\mE7if<J;dL>SR4^:hRCSi5e>>_ChMfS6Df<U1cJ?b;PYTi4NTcm];UD7<QiN^S8>C2_N[DYh[QT\omlkSO^TfCaJcRLGoYYND;Je0I3TnRPI;]BCFk<KA_93N@Nge?dSK?oGNP;@c_:mIUhYk6X@<YCLlYX4DRX8AR\n:Nl0KF6OlZmmY8YcC7Zb\j2:;IeQ7PBJ<7m<TV[Ra=4<`88B`J8=A5Oh;QUgdZ_416KlioKC@Oa]_oA4]3N`YHjX7omML5SOKeHN0o<URI:2FQ8:_mVTFM:L[L@R66ZL1PPa83:KY]`S0n8ojNBNg@j02nVZFhVA;MJmm4nX5BFXch5L[A5fbdbOXG=U2PGWFR\`KUje`KUBd[TmN1U\lP\\=LO=2B[95QC]2AB\C^NP<E1ToYZ>YV:o=\_XH?9k7Qo1=VSo<hk`]:n0M7bXk3=F06E3`XEN:cWEe36BhIaJTFV8^=N]HBGLP4lNDiiU^F@NBCoO=H2iUOK:\YV8cZhn>>e;3HUG07DY_c@EG^CP7OiblG?2g[gC;?lgJK?TFmD8j0oDj?OXPPoO\oQK>]GEimT=hB>iC;5^73_<I>9<1cj4[\6mkKHcNlQ9k>L9L72?<HNh0G1H\FI@Wd0H;i`[^hHdiCGWSGn8\<iQiDhhJJjWD=\3PO?1mA8880g2RFMNSDLa:4B92BOf>o7P<fC@@XFj4;6CfGSU]=hRcgHWo:U;QM?cd_IKhhD^7_dbc2Jao4FMT`<=SFdO^6gQkg<QoT4=n3UI3HQg\GG@8WhGmZ>ABP7[6QLkRiQ[16a1^MELI0FX4oL2Sm67^I\2a4kP@ESn2e6nLiL0_]VJlk:fmgR[kWGk\GB62lBT2E;TALIO;;@Hfa:JA63QZUS54[EXb@6Xo8U:HIl7=>F^Gk\Z2MfCdA[0F7Bj?nHo?_EgD?015PJ75oC0hkB3jjM536_0O4ocW\TV;=Bmg^Na5fff8@5IN\RLlEDmj\J5NdW1f]8[]MW5T9TZ83_njg5;cBY@jmghhF>d?6L^[KX2TU:cm8a_@hk:1[O9iHZO:Z[kR^N5dO^NZbVYBj]6KV`3MLac:Iih46i^j@m[3V635M6`4YQn`3Cl^`>C:HaG37Sd1im6aTDAVn9E?8YA;HVPe<OIEKiHC0Y36D>9XkjadJj3EgIM;o]ZAikaFYhL5;?>6]>3de6`o[XRRelL:NGF9@^Ph8Wb6CBP>Jb;Sk_B1`68BKQZXALfl=daa:^eEn7VW4Ne5\a^@_`hI_fe8]jkXb=KcQ<jV:cS\XSHiE?>Yg=E7XFhVXU8=6m7h1XB=lV3@=38c8bI_@gMULc8CK:?5V33;^kAA9TK[L<1QjCGae=md5?ZFmdPBYgP\4`VTBV0GZCCdRdBgkY][24LEmgJ843bLOMV9<RR^ooVZ25Sonk@]GmkIJ_KMW<J0ghle3cQZPP1_lCnnfENCbVa[UdcPY>A7C09_4?:`Ui<XB<h^_>f146o9a5KmTC?<jNJ2?a_A8;nj;H6ddgRfcD^`W<b@mVanSJYg^jcmKBkQ2Ta`H4X3Vl?_Zf13XY;8?]gFQj6;K_4J=\95WEFC?:`^TXJX;Lc@kQDXUQak4OjW]=0\fTD]4NR4=U::fHl]i_K>Se:FZ1BU6lY?WVJ5Nf5abDeeM??0KN5:ELgVKM4WO=DjNmgfd1]M;<<fiEEocSJAfJ1]>Dcg_gc6:1K`:<KO9l553fL[9FPQ4cTn\UGLgCIA1;N\IoNmOJ@UblaTg\QVaiLT?heEf]A>;eec5<cn<<3AXIH:>TZo]0llOU_\n8=A0YZB;6O<Jg7ZM]aNPVK69hl]>2BY1XEX2Il_LDhNbc>aTE3>^2=>DG>AIi]85T8fZ>`dI1aW[3CbQlZH[XSgOIkSTAJ4FjgJ11dZ3?Hn<mM3U5I]I7;=00i9A7\;9iGSM^3@mmJW_APnVA4TSEM@CA6T395F?6F023]A:V6PR=dIfJWH[M[ZN5Cn2lWC^?>731GF@PnJf7:]o]f>A0CQi^OmUSHlKh676Yi>l:KcX[l3JUEROAImGE2`7V6BYKj@a^SBOG35dXQ^58MRR]_ZI9WDodYfC[E<k\XDThbh>a`Sbk]aH>S3Z06YUIFfaGEX:VbfWD<QjO1I9n5XJ3UQmBamL7VV052=_HVLTcYgnZ_ngbI7`WUnhG:1VC`OGi1lg7cMSUR^1RJC788\[MG[feW[:h8g^l]PAm^:E4n6HD\5:EWmhTL>K:@bmF99eV\CeTLC3GNO_UkdI8j`g:m11;?GU>a61i][H5=l3Va^^VjlCoL9<llY391Ka8^YYmiiK5n:M<@V>Af=WKmhjIgHAh>9B58]PC<BLn^V>IGcUY@ViFEPW^2[0\R^1@gLF3PhARoVGGFNXT7Am@3id3`9fLgnEjSJI`lidKoU0@_AUW0U9heC8`Tm12[X18@h3VQOS_a@=WA26:aFZ9o:F2BcOg<mK[gL]RCX7lHJb_>5Im;c0mc_?^Ke=lo^Ik_kQlX175Y[5Do_];EOge2aG1oeU>:Zdo=_6h]5k`0;Sd5QK\3dNN;5PS<c`]?gZINfReR8mkf>74>:8ab]KOS@b1CmXYg@47^ebdm=BHG_eTa]FN`M`LP<WRG7QX<ml\>aYH=d8a_71FTgD4_\^kDcCX?_5dWWMg96Y2MP?D1=hke5X7^WiI<P\ie;R6]VKW[6HioSN>i8X:Lh_IjSAKMo[0J9nOnI[`R2RCS;an^>JUGF:QI[f^82m_L_fM75[6]b<ZNeOG6CH=a=YSYX@fVJ3:IL>77S89ilKnJMY6aJd>jAL5nQ3Z=iHRC`RPEPIW9Z28eDN;ik\S@BiiN=MnhJQY\TLVB8SbVka=fD31dT7_Ye3@@g50^LdZ^mRGd0@N@TM1[6WMTfbjo6Ljcf9;Zd`FkF693T6ObP_4J:YGIM]LTRI?hHj?^D;^Ck@4^h_>9:o5H<Vk=9JBdEl[CP>Sk1^I?hlZ\TOFeBdNn`[U\jo1217G5V;93]To6l0?V`B2c9dCLOdi:NNllm12_`0D^Y?8eIPACP:=Y1NY@c6VN\TUgUm84El>D8JKG4cmL^:]lR9@R\d08DKWQ4n2d5l9be0b8LROnjoaWQlm1McV1bhK@Z_O<:H]V[LDi[_OjFEZJ66LQ:0[<>de_5m6n1]ofmV\H9ba1W]\ES4XlRP`S;?c=@7cV7S<K^HVVEGm4:A1ORHBDAl7CRZJLZShZ7j>G7VZZnEAembXCSoIPc=>IfkO_FJdOKUXQaaA8]foY73=MakFlkH5G?:mCbOkI:cQBFP`Fg1U7T4g0A>Qh]:lIe\CTO@;ko;DeSFW44g9lO[leg95fIYP<a6_GZblHRo=?LXcRlWoNI7_<CXBI5an\bH7?MiMNI9jAF<C\`fMm@Y7AbGlaKc2V>GfUUAC8_j9o^Q]U^4f8@g61bS]<M]\cVY67lBlcQ@2F0K0G^:?N:K0b7PlPX\bBYDdkdHU^11LeeClTWUk?7B]>bLkYo]@Ge^g=l<K2gdNIW48Abc6\l8cK57C_o^X\5:ZPFO3il0^L<c5DODV2jGeS4]8I<n[17nP5AcAM?P8XMIcglHJaecmGMAjh?O]78^?\GLfA@5ZFXc\hleWLF\nPfQdLQVA?:HR5C7YK68\>]AOk_Q^f2gBLWb[KJPOU51CL<g2XLJj9f^MPC1CU1dboHPSICdInmFOhZ7HXB^RO2:JWSK]IQF7=fVl50;>n[\7aSZaZaJXW5e@1mJLh_TkAG]Jdmd^J2RX?C2J6^Kf?JF5>Q@jSFnc2SK\:B[Pmg2?lc0]bfM2f3F>J2Z8T<X<[>NLQFgk3[;c6Hl<Pg[Y81<iJKRLMJZoa@]aNROAHXF_OY^Z]R2gg=UZAf8F\l3>bJ<Hb1_?:JHK5gLWGm562lnQ8^7DngehQ_b:0ShOaQ;l4UMUn5BHJJ3O?DX\a4Z9\T5a\^PgR>21_j=Y:Y6_8bjbU[Y\e?NKfeQ1=91lEmLNQPood7P@[kG]3]IAJN[Gc?OOMa[aj<RW=7g7BDNkWi]:o?`i<4L1k?CT>E?WMn?5SkmB_E0f`?DX`^6:BKm[A^KLFgg1]_U`JR^Pj2o\H\g\^=FFNJQ:B07>ZIZAZlH`455@c0J0Eai5KLM>RHBj\>:2Kom3S]\:B9I3EA=@S6>9oNcF^E<kT@6?m^`X=b=gJ@eM\Kb237;CHCH^T`M0;Jfb6Lj[J7m;`5Plj=5?nT4?\cmXb\NnTKB1cM:e@LlM9doYKhae48BXLJoCjGm008NUaiRMT1EM]XCIn\GYHlH`7O7:h0;RAmWfRBU>YYUKT3<L3V4fX\]n7c8SI0A?QF``BMSRoQ>lJYBlViHj_3mNH29b8k17ToWJ6Sch^<G?gLojE;diOJ>6`DkGeYKh22Ron@kbm2eMHPiPLYbH`8\BMdSb44dY?fLjlg^jfdV4I<[0kGAFT2onN][I^iH8Bn^<bZP372I7PH>Lm>h]Fik3^Xj`VDA\PeA^M^T`AESHm>eFfgB4UfC_c<[=m20fZIjHc9RV_eFjQL_4i9:<cE0RCWaKj69hT5O=BPDmWGEl6J`MNUU`ii<79NUEA2VbJ203AEa5VO\_WISlSCMh0IE@R=Mi6fk[l1Q4m6RTJd4:i]JBL2gn1WAIZELQIa44cLV2BSB^=ijGZE0ZbUYckQ]mNJEin@2dA938eBiSKL;^B1`1IHnfQkLZ5SZ_;9[AMD4Ci=:

Hope this helps.

Andy Jazz
  • 49,178
  • 17
  • 136
  • 220