NUKE выражение ссылки камеры верхнего уровня - PullRequest
0 голосов
/ 16 октября 2018

У меня есть gizmoB, который принимает камеру в качестве входа.GizmoB живет в GizmoA, которая также использует камеру для ввода.Я хочу, чтобы gizmoB мог получить доступ к камере через выражение.Однако ничто из того, что я делаю, не работает.XML-скрипт может лучше объяснить это.

В основном Camera -> GizmoA -> GizmoB.

Спасибо за вашу помощь.Может быть, я поступаю неправильно, прошло уже много времени с тех пор, как я использовал Nuke и 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

1 Ответ

0 голосов
/ 30 января 2019

Для этого сценария я отключил параметр read from fbx file, а затем вручную анимировал Camera1.

Патрик. Я вижу, вы включили инверсию значений в ColorMatrix1 и ColorMatrix3, что приводит кошибки, если у вас есть нули внутри матрицы RGB (потому что все три основных диагональных значения ваших ColorMatrix узлов равны 0).

enter image description here

Вы написали выражение внутри узла NoOp1 (это выражение влияет на узел ColorMatrix):

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

Само выражение в порядке * , но значения по умолчанию scale иuniform scale свойства не могут быть 0 - они должны быть +1 (подходящие для видимого спектра RGB) или даже -1 (подходящие для невидимого спектра PP - отрицательные значения цвета довольно обычны в NUKE, особенно для такого рендерингапроходит как Точка Позиции).Таким образом, ваше условное выражение, основанное на тернарном операторе для свойства total scale в узле NoOp1, неверно:

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

Таким образом, ваше выражение должно быть, как минимум, следующим:

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

Даже если if-statement не работает, вы получите значение по умолчанию 1 для масштабирования в else-statement.

Значения в scale и uniform scale ручках равны 0потому что вы должны назначить правильное имя входа для верхнего узла (синтаксис самого выражения TCL также в порядке):

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

[value [topnode parent.Camera1].uniform_scale]

или:

[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]

Кроме того, я 'Мы заметили, что у вас есть ошибки в обоих выражениях в узлах Switch1 и Switch2.Выражение внутри узла Switch1 выглядит следующим образом:

parent.space_transform                                 // NO 'space_transform' HERE

Но, как вы можете видеть, это выражение также приводит к ошибке (я не вижу никакого свойства space_transform в вашем скрипте NUKEвообще):

enter image description here

Итак, я исправил все вышеперечисленные ошибки и теперь скрипт отлично работает .

Воспроизвести эту последовательность GIF, щелкнув ее .

enter image description here

Я могу поделиться только зашифрованным XMLкод рабочего скрипта.Так что для чтения вам понадобится The Foundry NUKE 11.3v1 Non-Commercial Edition .Вот мой код (скопируйте и вставьте эту очень длинную строку):

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=:

Надеюсь, это поможет.

...