[Insight-users] Why MultiResolutionPyramidImageFilter does not produce right image?

Lydia Ng lng at insightful.com
Thu, 5 Feb 2004 11:22:22 -0800


This is a multi-part message in MIME format.

------_=_NextPart_001_01C3EC1D.61781D0D
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi Sean:

You can set the schedule directly on the pyramid objects themselves (see
attached example code).

---------------
For example, you can set the starting shrink factors:
unsigned int sf[ImageDimension];=20
 sf[0] =3D 8; sf[1] =3D 8;
 registrator->GetFixedImagePyramid()->SetStartingShrinkFactors(sf);

---------------
Or set the whole schedule:
 =20
 // You must first set the number of levels of the pyramid to match
 // that of the registrator
  registrator->GetMovingImagePyramid()->SetNumberOfLevels(
   registrator->GetNumberOfLevels() );

 // Get a copy of the default schedule for modification
 ScheduleType schedule =3D =
registrator->GetMovingImagePyramid()->GetSchedule();

 // Modify the schedule
 schedule.Fill( 2 );

 // Set the schedule
 registrator->GetMovingImagePyramid()->SetSchedule( schedule );


BTW: The SetFixedImagePyramid and SetMovingImagePyramid are implemented.

- Lydia

-----Original Message-----
From: Zhiyong Xie [mailto:zyxie98 at yahoo.com]=20
Sent: Thursday, February 05, 2004 8:51 AM
To: Lydia Ng
Cc: insight-users at itk.org
Subject: RE: [Insight-users] Why MultiResolutionPyramidImageFilter does =
not
produce right image?

Lydia:
=A0
In MultiResolutionPDEDeformableRegistration, it seems we cannot set the
schedule
of image pyramid (which is provide by SetSchedule method in
MultiResolutionPyramidImageFilter ).=A0=A0It will be convenient if we =
can set
different shrink
factor for=A0each dimensions and for each image (fixed and moving) =
through
MultiResolutionPDEDeformableRegistration. I am not sure whether
we can do it in current implmentation. otherwise, it will be nice if the =
code
can be
modified=A0by implementing=A0method SetFixedImagePyramid and
SetMovingImagePyramid,
as well as a little change in GenerateData, where moving and fixed =
images can
be=20
retrived from image pyramid instead of creating pyramid form image, if =
the
pyramid=20
have already been set.
=A0
Thanks
=A0
Sean
=A0

Lydia Ng <lng at insightful.com> wrote:
Hi Fucang,

I think the filter requires the output pixel type to be floating point. =
Could
you try it out as an experiment?

- Lydia

> -----Original Message-----
> From: Fucang Jia [mailto:jiafucang at hotmail.com]
> Sent: Wednesday, November 19, 2003 1:17 AM
> To: insight-users at itk.org
> Subject: [Insight-users] Why MultiResolutionPyramidImageFilter does =
not
> produce right image?
>=20
> Hi, everyone,
>=20
> I am using ITK 1.4 and want to do some experiments based on
> MultiResolutionPyramid. But the following program does not give =
correct
> images. It does produce 8 images, but the first level image is all =
zeros.
> So
> the error spreads to the next level images. Is there some error in =
this
> program?
>=20
> Thanks a lot!
>=20
> Fucang
>=20
>=20
> =
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> int main(int argc, char *argv[] )
> {
>=20
>=20
> if(argc<2)
> {
> std::cerr<<ARGV[0]<<" Input2DImage?<<std::endl;
> return -1;
> }
>=20
> typedef unsigned short PixelType;
> const unsigned short Dimension =3D 2;
>=20
> typedef itk::Image InputImageType;
> typedef itk::Image OutputImageType;
> typedef itk::ImageFileReader ReaderType;
> typedef itk::ImageFileWriter WriterType;
> typedef
> itk::MultiResolutionPyramidImageFilter
> PyramidType;
> ReaderType::Pointer reader =3D ReaderType::New();
> WriterType::Pointer writer =3D WriterType::New();
> PyramidType::Pointer pyramid =3D PyramidType::New();
>=20
>=20
> reader->SetFileName(argv[1]);
> reader->Update();
>=20
> pyramid->SetInput( reader->GetOutput() );
>=20
> unsigned int numLevels;
> itk::Vector factors;
>=20
> numLevels =3D 8;
> factors[0] =3D 256; factors[1] =3D 256;
>=20
> pyramid->SetNumberOfLevels( numLevels );
> pyramid->SetStartingShrinkFactors( 256 );
> pyramid->Print( std::cout );
>=20
> pyramid->Update();
>=20
> for (int i=3D0;i<NUMLEVELS;I++)
> {
> char str[4096];
> sprintf(str,"test_%d.png",i);
> writer->SetFileName(str);
> writer->SetInput(pyramid->GetOutput(i));
> writer->Update();
> }
>=20
> return 0;
> }
>=20
> _________________________________________________________________
> The new MSN 8: advanced junk mail protection and 2 months FREE*
> http://join.msn.com/?page=FEatures/junkmail
>=20
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
_______________________________________________
Insight-users mailing list
Insight-users at itk.org
http://www.itk.org/mailman/listinfo/insight-users

Do you Yahoo!?
Yahoo! Finance: Get your refund fast by filing online

------_=_NextPart_001_01C3EC1D.61781D0D
Content-Type: application/octet-stream;
	name="itkMultiResolutionPDEDeformableRegistrationTest.cxx"
Content-Transfer-Encoding: base64
Content-Description: itkMultiResolutionPDEDeformableRegistrationTest.cxx
Content-Disposition: attachment;
	filename="itkMultiResolutionPDEDeformableRegistrationTest.cxx"

Lyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09DQoNCiAgUHJvZ3JhbTogICBJbnNpZ2h0IFNlZ21lbnRhdGlvbiAm
IFJlZ2lzdHJhdGlvbiBUb29sa2l0DQogIE1vZHVsZTogICAgJFJDU2ZpbGU6IGl0a011bHRpUmVz
b2x1dGlvblBERURlZm9ybWFibGVSZWdpc3RyYXRpb25UZXN0LmN4eCx2ICQNCiAgTGFuZ3VhZ2U6
ICBDKysNCiAgRGF0ZTogICAgICAkRGF0ZTogMjAwNC8wMS8xMSAwODozNTo1OCAkDQogIFZlcnNp
b246ICAgJFJldmlzaW9uOiAxLjE5ICQNCg0KICBDb3B5cmlnaHQgKGMpIEluc2lnaHQgU29mdHdh
cmUgQ29uc29ydGl1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAgU2VlIElUS0NvcHlyaWdodC50
eHQgb3IgaHR0cDovL3d3dy5pdGsub3JnL0hUTUwvQ29weXJpZ2h0Lmh0bSBmb3IgZGV0YWlscy4N
Cg0KICAgICBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gDQogICAgIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgDQogICAgIFBVUlBPU0UuICBTZWUgdGhl
IGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ki8NCiNpZiBkZWZpbmVkKF9NU0NfVkVSKQ0KI3ByYWdtYSB3YXJuaW5nICggZGlz
YWJsZSA6IDQ3ODYgKQ0KI2VuZGlmDQojaW5jbHVkZSAiaXRrTXVsdGlSZXNvbHV0aW9uUERFRGVm
b3JtYWJsZVJlZ2lzdHJhdGlvbi5oIg0KI2luY2x1ZGUgIml0a0luZGV4LmgiDQojaW5jbHVkZSAi
aXRrSW1hZ2VSZWdpb25JdGVyYXRvcldpdGhJbmRleC5oIg0KI2luY2x1ZGUgIml0a1dhcnBJbWFn
ZUZpbHRlci5oIg0KI2luY2x1ZGUgIml0a05lYXJlc3ROZWlnaGJvckludGVycG9sYXRlSW1hZ2VG
dW5jdGlvbi5oIg0KI2luY2x1ZGUgIml0a0NvbW1hbmQuaCINCiNpbmNsdWRlICJ2bmwvdm5sX21h
dGguaCINCg0KI2luY2x1ZGUgIml0a0ltYWdlRmlsZVdyaXRlci5oIg0KDQojaW5jbHVkZSA8aW9z
dHJlYW0+DQojaW5jbHVkZSA8c3RyaW5nPg0KDQpuYW1lc3BhY2UNCnsNCiAgDQovLyBUaGUgZm9s
bG93aW5nIGNsYXNzIGlzIHVzZWQgdG8gc3VwcG9ydCBjYWxsYmFja3MNCi8vIG9uIHRoZSBmaWx0
ZXIgaW4gdGhlIHBpcGVsaW5lIHRoYXQgZm9sbG93cyBsYXRlcg0KY2xhc3MgU2hvd1Byb2dyZXNz
UERFT2JqZWN0DQp7DQpwdWJsaWM6DQogIFNob3dQcm9ncmVzc1BERU9iamVjdChpdGs6OlByb2Nl
c3NPYmplY3QqIG8pDQogICAge21fUHJvY2VzcyA9IG87IG1fUHJlZml4PSIiO30NCiAgdm9pZCBT
aG93UHJvZ3Jlc3MoKQ0KICAgIHsNCiAgICBzdGQ6OmNvdXQgPDwgIG1fUHJlZml4IDsNCiAgICBz
dGQ6OmNvdXQgPDwgIlByb2dyZXNzICIgPDwgbV9Qcm9jZXNzLT5HZXRQcm9ncmVzcygpIDw8IHN0
ZDo6ZW5kbDsNCiAgICB9DQogIHZvaWQgU2hvd0l0ZXJhdGlvbigpDQogICAgew0KICAgIHN0ZDo6
Y291dCA8PCAiTmV3IExldmVsIiA8PCBzdGQ6OmVuZGw7DQogICAgfQ0KICBpdGs6OlByb2Nlc3NP
YmplY3Q6OlBvaW50ZXIgbV9Qcm9jZXNzOw0KICBzdGQ6OnN0cmluZyBtX1ByZWZpeDsNCn07DQp9
DQoNCg0KLy8gVGVtcGxhdGUgZnVuY3Rpb24gdG8gZmlsbCBpbiBhbiBpbWFnZSB3aXRoIGEgdmFs
dWUNCnRlbXBsYXRlIDxjbGFzcyBUSW1hZ2U+DQp2b2lkDQpGaWxsSW1hZ2UoDQpUSW1hZ2UgKiBp
bWFnZSwNCnR5cGVuYW1lIFRJbWFnZTo6UGl4ZWxUeXBlIHZhbHVlICkNCnsNCg0KIHR5cGVkZWYg
aXRrOjpJbWFnZVJlZ2lvbkl0ZXJhdG9yV2l0aEluZGV4PFRJbWFnZT4gSXRlcmF0b3I7DQogSXRl
cmF0b3IgaXQoIGltYWdlLCBpbWFnZS0+R2V0QnVmZmVyZWRSZWdpb24oKSApOw0KIGl0LkJlZ2lu
KCk7DQogICAgDQogZm9yKCA7ICFpdC5Jc0F0RW5kKCk7ICsraXQgKQ0KICB7DQogICBpdC5TZXQo
IHZhbHVlICk7DQogIH0NCg0KfQ0KDQoNCi8vIFRlbXBsYXRlIGZ1bmN0aW9uIHRvIGZpbGwgaW4g
YW4gaW1hZ2Ugd2l0aCBhIGNpcmNsZS4NCnRlbXBsYXRlIDxjbGFzcyBUSW1hZ2U+DQp2b2lkDQpG
aWxsV2l0aENpcmNsZSgNClRJbWFnZSAqIGltYWdlLA0KZG91YmxlICogY2VudGVyLA0KZG91Ymxl
IHJhZGl1cywNCnR5cGVuYW1lIFRJbWFnZTo6UGl4ZWxUeXBlIGZvcmVnbmQsDQp0eXBlbmFtZSBU
SW1hZ2U6OlBpeGVsVHlwZSBiYWNrZ25kICkNCnsNCg0KIHR5cGVkZWYgaXRrOjpJbWFnZVJlZ2lv
bkl0ZXJhdG9yV2l0aEluZGV4PFRJbWFnZT4gSXRlcmF0b3I7DQogSXRlcmF0b3IgaXQoIGltYWdl
LCBpbWFnZS0+R2V0QnVmZmVyZWRSZWdpb24oKSApOw0KIGl0LkJlZ2luKCk7DQogICAgDQogdHlw
ZW5hbWUgVEltYWdlOjpJbmRleFR5cGUgaW5kZXg7DQogZG91YmxlIHIyID0gdm5sX21hdGhfc3Fy
KCByYWRpdXMgKTsNCg0KIGZvciggOyAhaXQuSXNBdEVuZCgpOyArK2l0ICkNCiAgew0KICAgIGlu
ZGV4ID0gaXQuR2V0SW5kZXgoKTsNCiAgICBkb3VibGUgZGlzdGFuY2UgPSAwOw0KICAgIGZvcigg
dW5zaWduZWQgaW50IGogPSAwOyBqIDwgVEltYWdlOjpJbWFnZURpbWVuc2lvbjsgaisrICkNCiAg
ICAgIHsNCiAgICAgIGRpc3RhbmNlICs9IHZubF9tYXRoX3NxcigoZG91YmxlKSBpbmRleFtqXSAt
IGNlbnRlcltqXSk7DQogICAgICB9DQogICAgaWYoIGRpc3RhbmNlIDw9IHIyICkgaXQuU2V0KCBm
b3JlZ25kICk7DQogICAgZWxzZSBpdC5TZXQoIGJhY2tnbmQgKTsgDQogIH0NCg0KfQ0KDQoNCi8v
IFRlbXBsYXRlIGZ1bmN0aW9uIHRvIGNvcHkgaW1hZ2UgcmVnaW9ucw0KdGVtcGxhdGUgPGNsYXNz
IFRJbWFnZT4NCnZvaWQNCkNvcHlJbWFnZUJ1ZmZlcigNClRJbWFnZSAqaW5wdXQsDQpUSW1hZ2Ug
Km91dHB1dCApDQp7DQogIHR5cGVkZWYgaXRrOjpJbWFnZVJlZ2lvbkl0ZXJhdG9yV2l0aEluZGV4
PFRJbWFnZT4gSXRlcmF0b3I7DQogIEl0ZXJhdG9yIGluSXQoIGlucHV0LCBvdXRwdXQtPkdldEJ1
ZmZlcmVkUmVnaW9uKCkgKTsNCiAgSXRlcmF0b3Igb3V0SXQoIG91dHB1dCwgb3V0cHV0LT5HZXRC
dWZmZXJlZFJlZ2lvbigpICk7DQogIGZvciggOyAhaW5JdC5Jc0F0RW5kKCk7ICsraW5JdCwgKytv
dXRJdCApDQogICAgew0KICAgIG91dEl0LlNldCggaW5JdC5HZXQoKSApOw0KICAgIH0NCg0KfQ0K
DQppbnQgbWFpbihpbnQsIGNoYXIqIFtdICkNCnsNCg0KICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIg
UGl4ZWxUeXBlOw0KICBlbnVtIHtJbWFnZURpbWVuc2lvbiA9IDJ9Ow0KICB0eXBlZGVmIGl0azo6
SW1hZ2U8UGl4ZWxUeXBlLEltYWdlRGltZW5zaW9uPiBJbWFnZVR5cGU7ICANCiAgdHlwZWRlZiBp
dGs6OlZlY3RvcjxmbG9hdCxJbWFnZURpbWVuc2lvbj4gVmVjdG9yVHlwZTsNCiAgdHlwZWRlZiBp
dGs6OkltYWdlPFZlY3RvclR5cGUsSW1hZ2VEaW1lbnNpb24+IEZpZWxkVHlwZTsNCiAgdHlwZWRl
ZiBpdGs6OkltYWdlPFZlY3RvclR5cGU6OlZhbHVlVHlwZSxJbWFnZURpbWVuc2lvbj4gRmxvYXRJ
bWFnZVR5cGU7DQogIHR5cGVkZWYgSW1hZ2VUeXBlOjpJbmRleFR5cGUgIEluZGV4VHlwZTsNCiAg
dHlwZWRlZiBJbWFnZVR5cGU6OlNpemVUeXBlICAgU2l6ZVR5cGU7DQogIHR5cGVkZWYgSW1hZ2VU
eXBlOjpSZWdpb25UeXBlIFJlZ2lvblR5cGU7DQoNCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBzdGQ6OmNvdXQgPDwgIkdlbmVy
YXRlIGlucHV0IGltYWdlcyBhbmQgaW5pdGlhbCBmaWVsZCI7DQogIHN0ZDo6Y291dCA8PCBzdGQ6
OmVuZGw7DQoNCiAgU2l6ZVR5cGUgc2l6ZTsNCiAgc2l6ZS5GaWxsKCAyNTYgKTsNCiAgc2l6ZVsx
XSA9IDI1MTsNCg0KICBJbmRleFR5cGUgaW5kZXg7DQogIGluZGV4LkZpbGwoIDAgKTsNCiAgaW5k
ZXhbMF0gPSAzOw0KIA0KICBSZWdpb25UeXBlIHJlZ2lvbjsNCiAgcmVnaW9uLlNldFNpemUoIHNp
emUgKTsNCiAgcmVnaW9uLlNldEluZGV4KCBpbmRleCApOw0KDQogIEltYWdlVHlwZTo6UG9pbnRU
eXBlIG9yaWdpbjsNCiAgb3JpZ2luLkZpbGwoIDAuMCApOw0KICBvcmlnaW5bMF0gPSAwLjg7DQog
IA0KICBJbWFnZVR5cGU6OlNwYWNpbmdUeXBlIHNwYWNpbmc7DQogIHNwYWNpbmcuRmlsbCggMS4w
ICk7DQogIHNwYWNpbmdbMV0gPSAxLjI7DQogIA0KICBJbWFnZVR5cGU6OlBvaW50ZXIgbW92aW5n
ID0gSW1hZ2VUeXBlOjpOZXcoKTsNCiAgSW1hZ2VUeXBlOjpQb2ludGVyIGZpeGVkID0gSW1hZ2VU
eXBlOjpOZXcoKTsNCiAgRmllbGRUeXBlOjpQb2ludGVyIGluaXRGaWVsZCA9IEZpZWxkVHlwZTo6
TmV3KCk7DQoNCiAgbW92aW5nLT5TZXRMYXJnZXN0UG9zc2libGVSZWdpb24oIHJlZ2lvbiApOw0K
ICBtb3ZpbmctPlNldEJ1ZmZlcmVkUmVnaW9uKCByZWdpb24gKTsNCiAgbW92aW5nLT5BbGxvY2F0
ZSgpOw0KICBtb3ZpbmctPlNldE9yaWdpbiggb3JpZ2luICk7DQogIG1vdmluZy0+U2V0U3BhY2lu
Zyggc3BhY2luZyApOw0KDQogIGZpeGVkLT5TZXRMYXJnZXN0UG9zc2libGVSZWdpb24oIHJlZ2lv
biApOw0KICBmaXhlZC0+U2V0QnVmZmVyZWRSZWdpb24oIHJlZ2lvbiApOw0KICBmaXhlZC0+QWxs
b2NhdGUoKTsNCiAgZml4ZWQtPlNldE9yaWdpbiggb3JpZ2luICk7DQogIGZpeGVkLT5TZXRTcGFj
aW5nKCBzcGFjaW5nICk7DQogIA0KICBpbml0RmllbGQtPlNldExhcmdlc3RQb3NzaWJsZVJlZ2lv
biggcmVnaW9uICk7DQogIGluaXRGaWVsZC0+U2V0QnVmZmVyZWRSZWdpb24oIHJlZ2lvbiApOw0K
ICBpbml0RmllbGQtPkFsbG9jYXRlKCk7DQogIGluaXRGaWVsZC0+U2V0T3JpZ2luKCBvcmlnaW4g
KTsNCiAgaW5pdEZpZWxkLT5TZXRTcGFjaW5nKCBzcGFjaW5nICk7DQoNCiAgZG91YmxlIGNlbnRl
cltJbWFnZURpbWVuc2lvbl07DQogIGRvdWJsZSByYWRpdXM7DQogIFBpeGVsVHlwZSBmZ25kID0g
MjUwOw0KICBQaXhlbFR5cGUgYmduZCA9IDE1Ow0KDQogIC8vIGZpbGwgbW92aW5nIHdpdGggY2ly
Y2xlIA0KICBjZW50ZXJbMF0gPSAxMjg7IGNlbnRlclsxXSA9IDEyODsgcmFkaXVzID0gNjA7DQog
IEZpbGxXaXRoQ2lyY2xlPEltYWdlVHlwZT4oIG1vdmluZywgY2VudGVyLCByYWRpdXMsIGZnbmQs
IGJnbmQgKTsNCg0KICAvLyBmaWxsIGZpeGVkIHdpdGggY2lyY2xlDQogIGNlbnRlclswXSA9IDEx
NTsgY2VudGVyWzFdID0gMTIwOyByYWRpdXMgPSA2NTsNCiAgRmlsbFdpdGhDaXJjbGU8SW1hZ2VU
eXBlPiggZml4ZWQsIGNlbnRlciwgcmFkaXVzLCBmZ25kLCBiZ25kICk7DQoNCiAgLy8gZmlsbCBp
bml0aWFsIGRlZm9ybWF0aW9uIHdpdGggemVybyB2ZWN0b3JzDQogIFZlY3RvclR5cGUgemVyb1Zl
YzsNCiAgemVyb1ZlYy5GaWxsKCAwLjAgKTsNCiAgRmlsbEltYWdlPEZpZWxkVHlwZT4oIGluaXRG
aWVsZCwgemVyb1ZlYyApOw0KDQogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBzdGQ6OmNvdXQgPDwgIlJ1biByZWdp
c3RyYXRpb24uIiA8PCBzdGQ6OmVuZGw7DQoNCiAgdHlwZWRlZiBpdGs6Ok11bHRpUmVzb2x1dGlv
blBERURlZm9ybWFibGVSZWdpc3RyYXRpb248SW1hZ2VUeXBlLA0KICAgIEltYWdlVHlwZSwgRmll
bGRUeXBlPiBSZWdpc3RyYXRpb25UeXBlOw0KDQogIFJlZ2lzdHJhdGlvblR5cGU6OlBvaW50ZXIg
cmVnaXN0cmF0b3IgPSBSZWdpc3RyYXRpb25UeXBlOjpOZXcoKTsNCg0KICByZWdpc3RyYXRvci0+
U2V0TW92aW5nSW1hZ2UoIG1vdmluZyApOw0KICByZWdpc3RyYXRvci0+U2V0Rml4ZWRJbWFnZSgg
Zml4ZWQgKTsNCiANCiAgdW5zaWduZWQgaW50IG51bUxldmVsID0gMzsNCiAgdW5zaWduZWQgaW50
IG51bUl0ZXJhdGlvbnNbMTBdOw0KICBudW1JdGVyYXRpb25zWzBdID0gNjQ7DQoNCiAgdW5zaWdu
ZWQgaW50IGlsZXZlbDsNCiAgZm9yKCBpbGV2ZWwgPSAxOyBpbGV2ZWwgPCBudW1MZXZlbDsgaWxl
dmVsKysgKQ0KICAgIHsNCiAgICBudW1JdGVyYXRpb25zW2lsZXZlbF0gPSBudW1JdGVyYXRpb25z
W2lsZXZlbC0xXS8yOw0KICAgIH0NCiAgDQogIHJlZ2lzdHJhdG9yLT5TZXROdW1iZXJPZkxldmVs
cyggbnVtTGV2ZWwgKTsNCiAgcmVnaXN0cmF0b3ItPlNldE51bWJlck9mSXRlcmF0aW9ucyggbnVt
SXRlcmF0aW9ucyApOw0KDQogLy8gcmVnaXN0cmF0b3ItPlByaW50KHN0ZDo6Y291dCk7DQoNCiAv
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogLyogVGhpcyBzZWN0
aW9uIGlsbHVzdHJhdGVzIGhvdyB0byBzZXQgdGhlIHN0YXJ0aW5nIHNocmluayBmYWN0b3JzLg0K
ICAqIEluIHRoaXMgZXhhbXBsZSB3ZSBzZXQgdGhlIHN0YXJ0aW5nIHNocmluayBmYWN0b3JzIG9m
IHRoZSBmaXhlZA0KICAqIHB5cmFtaWQgdG8gYmUgOCBhbmQgdXNlIHRoZSBkZWZhdWx0IHNjaGVk
dWxlIGZvciB0aGUgbW92aW5nIHB5cmFtaWQuKi8NCi8qDQogdW5zaWduZWQgaW50IHNmW0ltYWdl
RGltZW5zaW9uXTsgDQogc2ZbMF0gPSA4OyBzZlsxXSA9IDg7DQogcmVnaXN0cmF0b3ItPkdldEZp
eGVkSW1hZ2VQeXJhbWlkKCktPlNldFN0YXJ0aW5nU2hyaW5rRmFjdG9ycyhzZik7DQoqLw0KIC8q
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KIC8qKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAvKiBUaGlzIHNlY3Rpb24gaWxsdXN0
cmF0ZXMgaG93IHRvIHNldCB0aGUgbXVsdGlyZXNvbHV0aW9uIHNjaGVkdWxlLg0KICAqIEluIHRo
aXMgZXhhbXBsZSB3ZSBzZXQgdGhlIHNjaGVkdWxlIG9mIHRoZSBtb3ZpbmcNCiAgKiBweXJhbWlk
IGFuZCB1c2UgdGhlIGRlZmF1bHQgc2NoZWR1bGUgZm9yIHRoZSBmaXhlZCBweXJhbWlkLiovDQog
DQogdHlwZWRlZiBSZWdpc3RyYXRpb25UeXBlOjpNb3ZpbmdJbWFnZVB5cmFtaWRUeXBlIFB5cmFt
aWRUeXBlOw0KIHR5cGVkZWYgUHlyYW1pZFR5cGU6OlNjaGVkdWxlVHlwZSBTY2hlZHVsZVR5cGU7
DQogIA0KIC8vIFlvdSBtdXN0IGZpcnN0IHNldCB0aGUgbnVtYmVyIG9mIGxldmVscyBvZiB0aGUg
cHlyYW1pZCB0byBtYXRjaA0KIC8vIHRoYXQgb2YgdGhlIHJlZ2lzdHJhdG9yDQogIHJlZ2lzdHJh
dG9yLT5HZXRNb3ZpbmdJbWFnZVB5cmFtaWQoKS0+U2V0TnVtYmVyT2ZMZXZlbHMoDQogICByZWdp
c3RyYXRvci0+R2V0TnVtYmVyT2ZMZXZlbHMoKSApOw0KDQogLy8gR2V0IGEgY29weSBvZiB0aGUg
ZGVmYXVsdCBzY2hlZHVsZSBmb3IgbW9kaWZpY2F0aW9uDQogU2NoZWR1bGVUeXBlIHNjaGVkdWxl
ID0gcmVnaXN0cmF0b3ItPkdldE1vdmluZ0ltYWdlUHlyYW1pZCgpLT5HZXRTY2hlZHVsZSgpOw0K
DQogLy8gTW9kaWZ5IHRoZSBzY2hlZHVsZQ0KIHNjaGVkdWxlLkZpbGwoIDIgKTsNCg0KIC8vIFNl
dCB0aGUgc2NoZWR1bGUNCiByZWdpc3RyYXRvci0+R2V0TW92aW5nSW1hZ2VQeXJhbWlkKCktPlNl
dFNjaGVkdWxlKCBzY2hlZHVsZSApOw0KDQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqLw0KDQoNCiAgdHlwZWRlZiBpdGs6OlNpbXBsZU1lbWJlckNvbW1hbmQ8U2hv
d1Byb2dyZXNzUERFT2JqZWN0PiBDb21tYW5kVHlwZTsNCg0KICBTaG93UHJvZ3Jlc3NQREVPYmpl
Y3QgcHJvZ3Jlc3NXYXRjaChyZWdpc3RyYXRvcik7DQogIENvbW1hbmRUeXBlOjpQb2ludGVyIGNv
bW1hbmQgPSBDb21tYW5kVHlwZTo6TmV3KCk7DQogIGNvbW1hbmQtPlNldENhbGxiYWNrRnVuY3Rp
b24oJnByb2dyZXNzV2F0Y2gsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNob3dQ
cm9ncmVzc1BERU9iamVjdDo6U2hvd0l0ZXJhdGlvbik7DQovLyAgcmVnaXN0cmF0b3ItPkFkZE9i
c2VydmVyKGl0azo6SXRlcmF0aW9uRXZlbnQoKSwgY29tbWFuZCk7DQoNCiAgU2hvd1Byb2dyZXNz
UERFT2JqZWN0IGlubmVyV2F0Y2gocmVnaXN0cmF0b3ItPkdldFJlZ2lzdHJhdGlvbkZpbHRlcigp
ICk7DQogIGlubmVyV2F0Y2gubV9QcmVmaXggPSAiICAgICI7DQogIENvbW1hbmRUeXBlOjpQb2lu
dGVyIGlubmVyQ29tbWFuZCA9IENvbW1hbmRUeXBlOjpOZXcoKTsNCiAgaW5uZXJDb21tYW5kLT5T
ZXRDYWxsYmFja0Z1bmN0aW9uKCZpbm5lcldhdGNoLA0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICZTaG93UHJvZ3Jlc3NQREVPYmplY3Q6OlNob3dQcm9ncmVzcyk7DQovLyAgcmVnaXN0
cmF0b3ItPkdldFJlZ2lzdHJhdGlvbkZpbHRlcigpLT4NCi8vICAgIEFkZE9ic2VydmVyKGl0azo6
UHJvZ3Jlc3NFdmVudCgpLCBpbm5lckNvbW1hbmQpOw0KDQogIHJlZ2lzdHJhdG9yLT5VcGRhdGUo
KTsNCg0KIA0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tDQogIHN0ZDo6Y291dCA8PCAiV2FycCBtb3ZpbmcgaW1hZ2UiIDw8IHN0ZDo6
ZW5kbDsNCg0KICB0eXBlZGVmIGl0azo6V2FycEltYWdlRmlsdGVyPEltYWdlVHlwZSxJbWFnZVR5
cGUsRmllbGRUeXBlPiBXYXJwZXJUeXBlOw0KICBXYXJwZXJUeXBlOjpQb2ludGVyIHdhcnBlciA9
IFdhcnBlclR5cGU6Ok5ldygpOw0KDQogIHR5cGVkZWYgV2FycGVyVHlwZTo6Q29vcmRSZXBUeXBl
IENvb3JkUmVwVHlwZTsNCiAgdHlwZWRlZiBpdGs6Ok5lYXJlc3ROZWlnaGJvckludGVycG9sYXRl
SW1hZ2VGdW5jdGlvbjxJbWFnZVR5cGUsQ29vcmRSZXBUeXBlPg0KICAgIEludGVycG9sYXRvclR5
cGU7DQogIEludGVycG9sYXRvclR5cGU6OlBvaW50ZXIgaW50ZXJwb2xhdG9yID0gSW50ZXJwb2xh
dG9yVHlwZTo6TmV3KCk7DQogIA0KDQogIHdhcnBlci0+U2V0SW5wdXQoIG1vdmluZyApOw0KICB3
YXJwZXItPlNldERlZm9ybWF0aW9uRmllbGQoIHJlZ2lzdHJhdG9yLT5HZXRPdXRwdXQoKSApOw0K
ICB3YXJwZXItPlNldEludGVycG9sYXRvciggaW50ZXJwb2xhdG9yICk7DQogIHdhcnBlci0+U2V0
T3V0cHV0U3BhY2luZyggZml4ZWQtPkdldFNwYWNpbmcoKSApOw0KICB3YXJwZXItPlNldE91dHB1
dE9yaWdpbiggZml4ZWQtPkdldE9yaWdpbigpICk7DQoNCiAgd2FycGVyLT5VcGRhdGUoKTsNCg0K
IC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQ0KDQovLyB1bmNvbW1lbnQgdG8gd3JpdGUgb3V0IGltYWdlcw0KICBzdGQ6OmNvdXQgPDwgIldy
aXRlIGltYWdlcyB0byBmaWxlICIgPDwgc3RkOjplbmRsOw0KICB0eXBlZGVmIGl0azo6SW1hZ2VG
aWxlV3JpdGVyPEltYWdlVHlwZT4gV3JpdGVyVHlwZTsNCiAgV3JpdGVyVHlwZTo6UG9pbnRlciB3
cml0ZXIgPSBXcml0ZXJUeXBlOjpOZXcoKTsNCiAgDQogIHdyaXRlci0+U2V0SW5wdXQoIG1vdmlu
ZyApOw0KICB3cml0ZXItPlNldEZpbGVOYW1lKCAibW92aW5nLnBuZyIgKTsNCiAgd3JpdGVyLT5X
cml0ZSgpOw0KDQogIHdyaXRlci0+U2V0SW5wdXQoIGZpeGVkICk7DQogIHdyaXRlci0+U2V0Rmls
ZU5hbWUoICJmaXhlZC5wbmciICk7DQogIHdyaXRlci0+V3JpdGUoKTsNCg0KICB3cml0ZXItPlNl
dElucHV0KCB3YXJwZXItPkdldE91dHB1dCgpICk7DQogIHdyaXRlci0+U2V0RmlsZU5hbWUoICJ3
YXJwLnBuZyIgKTsNCiAgd3JpdGVyLT5Xcml0ZSgpOw0KIA0KICAvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgc3RkOjpjb3V0IDw8
ICJDb21wYXJlIHdhcnBlZCBtb3ZpbmcgYW5kIGZpeGVkLiIgPDwgc3RkOjplbmRsOw0KDQogIC8v
IGNvbXBhcmUgdGhlIHdhcnAgYW5kIGZpeGVkIGltYWdlcw0KICBpdGs6OkltYWdlUmVnaW9uSXRl
cmF0b3I8SW1hZ2VUeXBlPiBmaXhlZEl0ZXIoIGZpeGVkLA0KICAgICAgZml4ZWQtPkdldEJ1ZmZl
cmVkUmVnaW9uKCkgKTsNCiAgaXRrOjpJbWFnZVJlZ2lvbkl0ZXJhdG9yPEltYWdlVHlwZT4gd2Fy
cGVkSXRlciggd2FycGVyLT5HZXRPdXRwdXQoKSwNCiAgICAgIHdhcnBlci0+R2V0T3V0cHV0KCkt
PkdldEJ1ZmZlcmVkUmVnaW9uKCkgKTsNCg0KICB1bnNpZ25lZCBpbnQgbnVtUGl4ZWxzRGlmZmVy
ZW50ID0gMDsNCiAgd2hpbGUoICFmaXhlZEl0ZXIuSXNBdEVuZCgpICkNCiAgICB7DQogICAgaWYo
IHZubF9tYXRoX2FicyggZml4ZWRJdGVyLkdldCgpIC0gd2FycGVkSXRlci5HZXQoKSApID4gDQog
ICAgICAgIDAuMSAqIHZubF9tYXRoX2FicyggZmduZCAtIGJnbmQgKSApDQogICAgICB7DQogICAg
ICBudW1QaXhlbHNEaWZmZXJlbnQrKzsNCiAgICAgIH0NCiAgICArK2ZpeGVkSXRlcjsNCiAgICAr
K3dhcnBlZEl0ZXI7DQogICAgfQ0KDQogIHN0ZDo6Y291dCA8PCAiTnVtYmVyIG9mIHBpeGVscyBk
aWZmZXJlbnQ6ICIgPDwgbnVtUGl4ZWxzRGlmZmVyZW50OyANCiAgc3RkOjpjb3V0IDw8IHN0ZDo6
ZW5kbDsNCg0KLyoNCiAgaWYoIG51bVBpeGVsc0RpZmZlcmVudCA+IDIwICkNCiAgICB7DQogICAg
c3RkOjpjb3V0IDw8ICJUZXN0IGZhaWxlZCAtIHRvbyBtYW55IHBpeGVscyBkaWZmZXJlbnQuIiA8
PCBzdGQ6OmVuZGw7DQogICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsNCiAgICB9DQoqLw0KDQogIHN0
ZDo6Y291dCA8PCAiRml4ZWQgcHlyYW1pZCBzY2hlZHVsZTogIiA8PCBzdGQ6OmVuZGw7DQogIHN0
ZDo6Y291dCA8PCByZWdpc3RyYXRvci0+R2V0Rml4ZWRJbWFnZVB5cmFtaWQoKS0+R2V0U2NoZWR1
bGUoKSA8PCBzdGQ6OmVuZGw7DQogIHN0ZDo6Y291dCA8PCAiTW92aW5nIHB5cmFtaWQgc2NoZWR1
bGU6ICIgPDwgc3RkOjplbmRsOw0KICBzdGQ6OmNvdXQgPDwgcmVnaXN0cmF0b3ItPkdldE1vdmlu
Z0ltYWdlUHlyYW1pZCgpLT5HZXRTY2hlZHVsZSgpIDw8IHN0ZDo6ZW5kbDsNCg0KLy8gIHN0ZDo6
Y291dCA8PCAiVGVzdCBwYXNzZWQiIDw8IHN0ZDo6ZW5kbDsNCiAgcmV0dXJuIEVYSVRfU1VDQ0VT
UzsNCg0KfQ0K

------_=_NextPart_001_01C3EC1D.61781D0D--