Adding JS API - isHighContrast

This commit is contained in:
Hassan DRAGA 2024-06-25 17:31:14 -04:00
parent d0b013ccda
commit 88cd5f3774
3 changed files with 460 additions and 376 deletions

View File

@ -1692,396 +1692,441 @@ unsigned char webui_javascript_bridge[] = {
0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6e, 0x2e, 0x74,
0x72, 0x69, 0x6d, 0x28, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74,
0x68, 0x69, 0x73, 0x5b, 0x66, 0x6e, 0x5d, 0x20, 0x3d, 0x20,
0x28, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20,
0x3d, 0x3e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61,
0x6c, 0x6c, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x2e, 0x2e, 0x2e,
0x61, 0x72, 0x67, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x77, 0x69,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
0x66, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x21, 0x3d, 0x3d, 0x20,
0x22, 0x5f, 0x77, 0x65, 0x62, 0x75, 0x69, 0x5f, 0x63, 0x6f,
0x72, 0x65, 0x5f, 0x61, 0x70, 0x69, 0x22, 0x29, 0x20, 0x7b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x66, 0x6e,
0x5d, 0x20, 0x3d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x61, 0x72,
0x67, 0x73, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x74, 0x68, 0x69,
0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x6e, 0x2c,
0x20, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x3b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70,
0x65, 0x6f, 0x66, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
0x5b, 0x66, 0x6e, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22,
0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22,
0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69,
0x6e, 0x64, 0x6f, 0x77, 0x5b, 0x66, 0x6e, 0x5d, 0x20, 0x3d,
0x3d, 0x3d, 0x20, 0x22, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69,
0x6e, 0x65, 0x64, 0x22, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5b, 0x66, 0x6e, 0x5d,
0x20, 0x3d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67,
0x73, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x74, 0x68, 0x69, 0x73,
0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x6e, 0x2c, 0x20,
0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x3b, 0x0a,
0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29,
0x20, 0x3d, 0x3e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63,
0x61, 0x6c, 0x6c, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x2e, 0x2e,
0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a,
0x20, 0x20, 0x23, 0x63, 0x61, 0x6c, 0x6c, 0x50, 0x72, 0x6f,
0x6d, 0x69, 0x73, 0x65, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x2e,
0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x74, 0x68, 0x69, 0x73,
0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20,
0x7d, 0x0a, 0x20, 0x20, 0x23, 0x63, 0x61, 0x6c, 0x6c, 0x50,
0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x28, 0x66, 0x6e, 0x2c,
0x20, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20,
0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x74, 0x68,
0x69, 0x73, 0x2e, 0x23, 0x63, 0x61, 0x6c, 0x6c, 0x50, 0x72,
0x6f, 0x6d, 0x69, 0x73, 0x65, 0x49, 0x44, 0x5b, 0x30, 0x5d,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73,
0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x20, 0x3d,
0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x74, 0x6f, 0x55,
0x69, 0x6e, 0x74, 0x31, 0x36, 0x28, 0x74, 0x68, 0x69, 0x73,
0x2e, 0x23, 0x63, 0x61, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d,
0x69, 0x73, 0x65, 0x49, 0x44, 0x5b, 0x30, 0x5d, 0x3b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20,
0x63, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x20, 0x3d, 0x20, 0x74,
0x68, 0x69, 0x73, 0x2e, 0x23, 0x74, 0x6f, 0x55, 0x69, 0x6e,
0x74, 0x31, 0x36, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23,
0x63, 0x61, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73,
0x65, 0x49, 0x44, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x72, 0x67,
0x73, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x20, 0x3d,
0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28,
0x28, 0x61, 0x72, 0x67, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x72,
0x67, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x6f, 0x62, 0x6a,
0x65, 0x63, 0x74, 0x22, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x2e, 0x6c, 0x65, 0x6e,
0x67, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a,
0x69, 0x73, 0x65, 0x49, 0x44, 0x5b, 0x30, 0x5d, 0x29, 0x3b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x61,
0x72, 0x67, 0x73, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73,
0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6d, 0x61,
0x70, 0x28, 0x28, 0x61, 0x72, 0x67, 0x29, 0x20, 0x3d, 0x3e,
0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20,
0x61, 0x72, 0x67, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x6f,
0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x29, 0x20, 0x7b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54,
0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72,
0x28, 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28,
0x61, 0x72, 0x67, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69,
0x6e, 0x67, 0x28, 0x29, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67,
0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x6a,
0x6f, 0x69, 0x6e, 0x28, 0x22, 0x3b, 0x22, 0x29, 0x3b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x72,
0x67, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d,
0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38,
0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x29, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f,
0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x6f, 0x66,
0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x62,
0x75, 0x66, 0x66, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70,
0x65, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x3d,
0x3d, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22,
0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d,
0x20, 0x61, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65,
0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f,
0x64, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f,
0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x2e, 0x74, 0x6f, 0x53,
0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x29, 0x3b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20,
0x74, 0x65, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77,
0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x2e, 0x6c,
0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20,
0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77,
0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64,
0x65, 0x72, 0x28, 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64,
0x65, 0x28, 0x61, 0x72, 0x67, 0x2e, 0x74, 0x6f, 0x53, 0x74,
0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x29, 0x2e, 0x6c, 0x65,
0x6e, 0x67, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29,
0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x3b, 0x22, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20,
0x61, 0x72, 0x67, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73,
0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e,
0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x29, 0x3b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28,
0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20,
0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74,
0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74,
0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x20,
0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63,
0x74, 0x22, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65,
0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20,
0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e,
0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x65, 0x6e,
0x63, 0x6f, 0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x2e, 0x74,
0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73,
0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x6e,
0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72,
0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x56, 0x61,
0x6c, 0x75, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74,
0x68, 0x20, 0x2b, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20,
0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x74, 0x65, 0x6d, 0x70, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x61,
0x72, 0x67, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c,
0x20, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x74, 0x65, 0x6d, 0x70, 0x2e, 0x73, 0x65, 0x74, 0x28,
0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x72,
0x67, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x6c,
0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5b, 0x61,
0x72, 0x67, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e,
0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x62,
0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67,
0x74, 0x68, 0x5d, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x56,
0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x65,
0x6d, 0x70, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77,
0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61,
0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x56, 0x61, 0x6c, 0x75,
0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20,
0x2b, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x6c,
0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65,
0x6d, 0x70, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x61, 0x72, 0x67,
0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x30,
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74,
0x65, 0x6d, 0x70, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x62, 0x75,
0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73,
0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e,
0x67, 0x74, 0x68, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5b, 0x61, 0x72, 0x67,
0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x6c, 0x65,
0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x62, 0x75, 0x66,
0x66, 0x65, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
0x5d, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x56, 0x61, 0x6c,
0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x6d, 0x70,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b,
0x79, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b,
0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x28,
0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e,
0x73, 0x74, 0x20, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x63, 0x6b,
0x65, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55,
0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28,
0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f,
0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74,
0x50, 0x75, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x61,
0x74, 0x61, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74,
0x20, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74,
0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e,
0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x70, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74,
0x68, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c,
0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x63,
0x6b, 0x65, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x70, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x63, 0x6b,
0x65, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x64, 0x61, 0x74,
0x61, 0x2c, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e,
0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65,
0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x63,
0x6b, 0x65, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6c, 0x65, 0x6e,
0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61,
0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x50,
0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x28,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x29, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x50, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x64,
0x61, 0x74, 0x61, 0x2c, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65,
0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63,
0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x50,
0x61, 0x63, 0x6b, 0x65, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x28, 0x6e,
0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72,
0x72, 0x61, 0x79, 0x28, 0x5b, 0x74, 0x68, 0x69, 0x73, 0x2e,
0x23, 0x57, 0x45, 0x42, 0x55, 0x49, 0x5f, 0x53, 0x49, 0x47,
0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5d, 0x29, 0x29, 0x3b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65,
0x74, 0x50, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x65, 0x77, 0x20,
0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79,
0x28, 0x5b, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c,
0x20, 0x30, 0x5d, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x73,
0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74,
0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x5b, 0x30, 0x2c,
0x20, 0x30, 0x5d, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x73,
0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74,
0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x5b, 0x74, 0x68,
0x69, 0x73, 0x2e, 0x23, 0x43, 0x4d, 0x44, 0x5f, 0x43, 0x41,
0x4c, 0x4c, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x5d, 0x29, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b,
0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x65, 0x77,
0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61,
0x79, 0x28, 0x5b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x57,
0x45, 0x42, 0x55, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41,
0x54, 0x55, 0x52, 0x45, 0x5d, 0x29, 0x29, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x50,
0x75, 0x73, 0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69,
0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x5b,
0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30,
0x5d, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70,
0x61, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x28,
0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41,
0x72, 0x72, 0x61, 0x79, 0x28, 0x5b, 0x30, 0x2c, 0x20, 0x30,
0x5d, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70,
0x61, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x28,
0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41,
0x72, 0x72, 0x61, 0x79, 0x28, 0x5b, 0x74, 0x68, 0x69, 0x73,
0x2e, 0x23, 0x43, 0x4d, 0x44, 0x5f, 0x43, 0x41, 0x4c, 0x4c,
0x5f, 0x46, 0x55, 0x4e, 0x43, 0x5d, 0x29, 0x29, 0x3b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74,
0x50, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x54,
0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72,
0x28, 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28,
0x66, 0x6e, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68,
0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38,
0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x5b, 0x30, 0x5d, 0x29,
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63,
0x6b, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x65,
0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f,
0x64, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f,
0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x4c, 0x65, 0x6e,
0x67, 0x74, 0x68, 0x73, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20,
0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64,
0x65, 0x72, 0x28, 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64,
0x65, 0x28, 0x66, 0x6e, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75,
0x73, 0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e,
0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x5b, 0x30,
0x5d, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70,
0x61, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x73, 0x68, 0x28,
0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41,
0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x56,
0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x29, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x61,
0x64, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x28, 0x70, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73,
0x2e, 0x23, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x74,
0x68, 0x69, 0x73, 0x2e, 0x23, 0x50, 0x52, 0x4f, 0x54, 0x4f,
0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
0x2e, 0x23, 0x61, 0x64, 0x64, 0x49, 0x44, 0x28, 0x70, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c,
0x49, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23,
0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x49,
0x44, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x50,
0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x28, 0x28, 0x72, 0x65,
0x73, 0x6f, 0x6c, 0x76, 0x65, 0x29, 0x20, 0x3d, 0x3e, 0x20,
0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68,
0x69, 0x73, 0x2e, 0x23, 0x63, 0x61, 0x6c, 0x6c, 0x50, 0x72,
0x6f, 0x6d, 0x69, 0x73, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c,
0x76, 0x65, 0x5b, 0x63, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x5d,
0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68,
0x69, 0x73, 0x2e, 0x23, 0x73, 0x65, 0x6e, 0x64, 0x44, 0x61,
0x74, 0x61, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a,
0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x2d,
0x2d, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x41,
0x50, 0x49, 0x73, 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x0a, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x20, 0x20,
0x2a, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x20, 0x62,
0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x66, 0x75, 0x6e,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72,
0x61, 0x6d, 0x20, 0x66, 0x6e, 0x20, 0x2d, 0x20, 0x62, 0x69,
0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72,
0x61, 0x6d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2d, 0x20,
0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65,
0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74,
0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,
0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x72, 0x65, 0x74, 0x75,
0x72, 0x6e, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x63,
0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x73, 0x74,
0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20,
0x40, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x2d,
0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73,
0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x77,
0x65, 0x62, 0x75, 0x69, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28,
0x22, 0x6d, 0x79, 0x49, 0x44, 0x22, 0x2c, 0x20, 0x31, 0x32,
0x33, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x22,
0x48, 0x69, 0x22, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55,
0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e,
0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x65, 0x6e,
0x63, 0x6f, 0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x4c,
0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x29, 0x29, 0x3b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74,
0x50, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55,
0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28,
0x5b, 0x30, 0x78, 0x34, 0x32, 0x2c, 0x20, 0x30, 0x78, 0x34,
0x33, 0x2c, 0x20, 0x30, 0x78, 0x34, 0x34, 0x5d, 0x29, 0x29,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x61,
0x73, 0x79, 0x6e, 0x63, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28,
0x66, 0x6e, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67,
0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
0x66, 0x20, 0x28, 0x21, 0x66, 0x6e, 0x29, 0x20, 0x72, 0x65,
0x5b, 0x30, 0x5d, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x73,
0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74,
0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67,
0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x29, 0x3b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e,
0x23, 0x61, 0x64, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x28,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x68,
0x69, 0x73, 0x2e, 0x23, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c,
0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x50, 0x52, 0x4f,
0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x4f, 0x4b, 0x45,
0x4e, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68,
0x69, 0x73, 0x2e, 0x23, 0x61, 0x64, 0x64, 0x49, 0x44, 0x28,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x20, 0x63, 0x61,
0x6c, 0x6c, 0x49, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73,
0x2e, 0x23, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c,
0x5f, 0x49, 0x44, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77,
0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x28, 0x28,
0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x29, 0x20, 0x3d,
0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x63, 0x61, 0x6c, 0x6c,
0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x52, 0x65, 0x73,
0x6f, 0x6c, 0x76, 0x65, 0x5b, 0x63, 0x61, 0x6c, 0x6c, 0x49,
0x64, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c,
0x76, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x73, 0x65, 0x6e, 0x64,
0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65,
0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x61, 0x73,
0x79, 0x6e, 0x63, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x6f,
0x72, 0x65, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x2e, 0x2e, 0x2e,
0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74,
0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x22,
0x5f, 0x5f, 0x77, 0x65, 0x62, 0x75, 0x69, 0x5f, 0x63, 0x6f,
0x72, 0x65, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x5f, 0x22, 0x2c,
0x20, 0x66, 0x6e, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x61, 0x72,
0x67, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20,
0x20, 0x2f, 0x2f, 0x20, 0x2d, 0x2d, 0x20, 0x50, 0x75, 0x62,
0x6c, 0x69, 0x63, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x20, 0x20, 0x2f, 0x2a,
0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x43, 0x61, 0x6c,
0x6c, 0x20, 0x61, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6e,
0x20, 0x2d, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67,
0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x64, 0x61,
0x74, 0x61, 0x20, 0x2d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20,
0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64,
0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61,
0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20,
0x40, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x20,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f,
0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b,
0x65, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61,
0x63, 0x6b, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a,
0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x65, 0x78, 0x61, 0x6d,
0x70, 0x6c, 0x65, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x73,
0x74, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x77,
0x61, 0x69, 0x74, 0x20, 0x77, 0x65, 0x62, 0x75, 0x69, 0x2e,
0x63, 0x61, 0x6c, 0x6c, 0x28, 0x22, 0x6d, 0x79, 0x49, 0x44,
0x22, 0x2c, 0x20, 0x31, 0x32, 0x33, 0x2c, 0x20, 0x74, 0x72,
0x75, 0x65, 0x2c, 0x20, 0x22, 0x48, 0x69, 0x22, 0x2c, 0x20,
0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41,
0x72, 0x72, 0x61, 0x79, 0x28, 0x5b, 0x30, 0x78, 0x34, 0x32,
0x2c, 0x20, 0x30, 0x78, 0x34, 0x33, 0x2c, 0x20, 0x30, 0x78,
0x34, 0x34, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x2f, 0x0a, 0x20, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20,
0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x2e,
0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x66,
0x6e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x72, 0x65,
0x6a, 0x65, 0x63, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x53,
0x79, 0x6e, 0x74, 0x61, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72,
0x28, 0x22, 0x4e, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69,
0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73,
0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x22,
0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66,
0x20, 0x28, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x77,
0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x20, 0x72,
0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x72, 0x6f, 0x6d,
0x69, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74,
0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72,
0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65,
0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63,
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x29,
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
0x28, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x68, 0x61,
0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x26, 0x26,
0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x62, 0x69,
0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x69, 0x6e, 0x63,
0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x60, 0x24, 0x7b, 0x74,
0x68, 0x69, 0x73, 0x2e, 0x23, 0x77, 0x69, 0x6e, 0x4e, 0x75,
0x6d, 0x7d, 0x2f, 0x24, 0x7b, 0x66, 0x6e, 0x7d, 0x60, 0x29,
0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69,
0x73, 0x65, 0x2e, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x28,
0x6e, 0x65, 0x77, 0x20, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78,
0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4e, 0x6f, 0x20,
0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61,
0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76,
0x69, 0x64, 0x65, 0x64, 0x22, 0x29, 0x29, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, 0x68,
0x69, 0x73, 0x2e, 0x23, 0x77, 0x73, 0x53, 0x74, 0x61, 0x74,
0x75, 0x73, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x72,
0x65, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x20,
0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62,
0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x69, 0x73, 0x20,
0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
0x74, 0x65, 0x64, 0x22, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, 0x68, 0x69,
0x73, 0x2e, 0x23, 0x68, 0x61, 0x73, 0x45, 0x76, 0x65, 0x6e,
0x74, 0x73, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69,
0x73, 0x2e, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x4c, 0x69, 0x73,
0x74, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73,
0x28, 0x60, 0x24, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23,
0x77, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x7d, 0x2f, 0x24, 0x7b,
0x66, 0x6e, 0x7d, 0x60, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x72, 0x65,
0x6a, 0x65, 0x63, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x52,
0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x72,
0x72, 0x6f, 0x72, 0x28, 0x60, 0x4e, 0x6f, 0x20, 0x62, 0x69,
0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20,
0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
0x22, 0x24, 0x7b, 0x66, 0x6e, 0x7d, 0x22, 0x60, 0x29, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28,
0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x6c, 0x6f, 0x67, 0x29,
0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c,
0x6f, 0x67, 0x28, 0x60, 0x57, 0x65, 0x62, 0x55, 0x49, 0x20,
0x2d, 0x3e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67,
0x20, 0x5b, 0x24, 0x7b, 0x66, 0x6e, 0x7d, 0x28, 0x2e, 0x2e,
0x2e, 0x29, 0x5d, 0x60, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77,
0x61, 0x69, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23,
0x63, 0x61, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73,
0x65, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x61,
0x72, 0x67, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66,
0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20,
0x21, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e,
0x67, 0x22, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
0x20, 0x22, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a,
0x20, 0x20, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x72,
0x20, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74,
0x65, 0x20, 0x77, 0x65, 0x62, 0x75, 0x69, 0x20, 0x64, 0x65,
0x62, 0x75, 0x67, 0x20, 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e,
0x67, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x0a, 0x20, 0x20, 0x20,
0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x73,
0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x2d, 0x20, 0x6c, 0x6f,
0x67, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x74,
0x6f, 0x20, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x2f, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x74, 0x4c, 0x6f, 0x67,
0x67, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75,
0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29,
0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63,
0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67,
0x28, 0x22, 0x57, 0x65, 0x62, 0x55, 0x49, 0x20, 0x2d, 0x3e,
0x20, 0x4c, 0x6f, 0x67, 0x20, 0x45, 0x6e, 0x61, 0x62, 0x6c,
0x65, 0x64, 0x2e, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x6c,
0x6f, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73,
0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f,
0x67, 0x28, 0x22, 0x57, 0x65, 0x62, 0x55, 0x49, 0x20, 0x2d,
0x3e, 0x20, 0x4c, 0x6f, 0x67, 0x20, 0x44, 0x69, 0x73, 0x61,
0x62, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x29, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e,
0x23, 0x6c, 0x6f, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c,
0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0x0a,
0x20, 0x20, 0x20, 0x2a, 0x20, 0x45, 0x6e, 0x63, 0x6f, 0x64,
0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, 0x6e, 0x74,
0x6f, 0x20, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x20, 0x73,
0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72,
0x61, 0x6d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2d, 0x20,
0x74, 0x65, 0x78, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
0x67, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20,
0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x64, 0x61, 0x74,
0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x74, 0x6f, 0x61,
0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20,
0x7d, 0x0a, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x20,
0x20, 0x2a, 0x20, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20,
0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x20, 0x73, 0x74, 0x72,
0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74,
0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x0a, 0x20,
0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d,
0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2d, 0x20, 0x62, 0x61,
0x73, 0x65, 0x36, 0x34, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
0x67, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20,
0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x64, 0x61, 0x74,
0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x74, 0x6f, 0x62,
0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20,
0x7d, 0x0a, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x20,
0x20, 0x2a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x61, 0x20, 0x63,
0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x6f,
0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x65,
0x76, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6c, 0x69, 0x6b, 0x65,
0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x64,
0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x0a,
0x20, 0x20, 0x20, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20,
0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x61, 0x6c,
0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x63, 0x61,
0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x66, 0x75, 0x6e,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x6d, 0x79, 0x43,
0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x29,
0x60, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x65, 0x78,
0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x2d, 0x20, 0x77, 0x65,
0x62, 0x75, 0x69, 0x2e, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65,
0x6e, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b,
0x28, 0x28, 0x65, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x69,
0x66, 0x28, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x77, 0x65, 0x62,
0x75, 0x69, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43,
0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x29, 0x7b,
0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x7d, 0x29, 0x3b, 0x0a,
0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x73, 0x65,
0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6c, 0x6c,
0x62, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x62,
0x61, 0x63, 0x6b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x65, 0x76, 0x65,
0x6e, 0x74, 0x73, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63,
0x6b, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61,
0x63, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20,
0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x43,
0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x55, 0x49,
0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
0x20, 0x62, 0x61, 0x63, 0x6b, 0x2d, 0x65, 0x6e, 0x64, 0x2e,
0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x20, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x62,
0x79, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e,
0x67, 0x20, 0x60, 0x77, 0x65, 0x62, 0x75, 0x69, 0x2e, 0x6a,
0x73, 0x60, 0x20, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c,
0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74,
0x68, 0x65, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x2e, 0x0a, 0x20,
0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60,
0x4e, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67,
0x20, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64,
0x20, 0x66, 0x6f, 0x72, 0x20, 0x22, 0x24, 0x7b, 0x66, 0x6e,
0x7d, 0x22, 0x60, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e,
0x23, 0x6c, 0x6f, 0x67, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73,
0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x57,
0x65, 0x62, 0x55, 0x49, 0x20, 0x2d, 0x3e, 0x20, 0x43, 0x61,
0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x24, 0x7b, 0x66,
0x6e, 0x7d, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x5d, 0x60, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73,
0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x74,
0x68, 0x69, 0x73, 0x2e, 0x23, 0x63, 0x61, 0x6c, 0x6c, 0x50,
0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x28, 0x66, 0x6e, 0x2c,
0x20, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x3b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74,
0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x22,
0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x72,
0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x3b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b,
0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x2f, 0x2a, 0x2a,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x41, 0x63, 0x74, 0x69,
0x76, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x61, 0x63,
0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x77, 0x65, 0x62,
0x75, 0x69, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6c,
0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20,
0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61,
0x72, 0x61, 0x6d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x73, 0x74, 0x61,
0x74, 0x75, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x73,
0x65, 0x74, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x28,
0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x20, 0x7b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74,
0x61, 0x74, 0x75, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c,
0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x57, 0x65, 0x62,
0x55, 0x49, 0x20, 0x2d, 0x3e, 0x20, 0x4c, 0x6f, 0x67, 0x20,
0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x29,
0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68,
0x69, 0x73, 0x2e, 0x23, 0x6c, 0x6f, 0x67, 0x20, 0x3d, 0x20,
0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f,
0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x57, 0x65,
0x62, 0x55, 0x49, 0x20, 0x2d, 0x3e, 0x20, 0x4c, 0x6f, 0x67,
0x20, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e,
0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x6c, 0x6f, 0x67, 0x20,
0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20,
0x20, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20,
0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x65, 0x78,
0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x62, 0x61, 0x73,
0x65, 0x36, 0x34, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x64, 0x61,
0x74, 0x61, 0x20, 0x2d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20,
0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20,
0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64,
0x65, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
0x20, 0x62, 0x74, 0x6f, 0x61, 0x28, 0x64, 0x61, 0x74, 0x61,
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x2f,
0x2a, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x44, 0x65,
0x63, 0x6f, 0x64, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x36,
0x34, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69,
0x6e, 0x74, 0x6f, 0x20, 0x74, 0x65, 0x78, 0x74, 0x0a, 0x20,
0x20, 0x20, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x40,
0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x20, 0x42,
0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x60, 0x74, 0x72,
0x75, 0x65, 0x60, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e,
0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20,
0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x69, 0x73, 0x43, 0x6f, 0x6e,
0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x28, 0x29, 0x20, 0x7b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x77, 0x73,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3b, 0x0a, 0x20, 0x20,
0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x64, 0x61, 0x74, 0x61,
0x20, 0x2d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x20,
0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20,
0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64,
0x65, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
0x20, 0x61, 0x74, 0x6f, 0x62, 0x28, 0x64, 0x61, 0x74, 0x61,
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x2f,
0x2a, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x53, 0x65,
0x74, 0x20, 0x61, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61,
0x63, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x63, 0x65,
0x69, 0x76, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73,
0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e,
0x65, 0x63, 0x74, 0x2f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e,
0x6e, 0x65, 0x63, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x0a,
0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61,
0x6d, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b,
0x20, 0x2d, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63,
0x6b, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x20, 0x60, 0x6d, 0x79, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61,
0x63, 0x6b, 0x28, 0x65, 0x29, 0x60, 0x0a, 0x20, 0x20, 0x20,
0x2a, 0x20, 0x40, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
0x20, 0x2d, 0x20, 0x77, 0x65, 0x62, 0x75, 0x69, 0x2e, 0x73,
0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6c,
0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x28, 0x65, 0x29, 0x20,
0x3d, 0x3e, 0x20, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x20, 0x3d,
0x3d, 0x20, 0x77, 0x65, 0x62, 0x75, 0x69, 0x2e, 0x65, 0x76,
0x65, 0x6e, 0x74, 0x2e, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43,
0x54, 0x45, 0x44, 0x29, 0x7b, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
0x7d, 0x7d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x2f,
0x0a, 0x20, 0x20, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e,
0x74, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28,
0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x20,
0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73,
0x2e, 0x23, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x61,
0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x63,
0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3b, 0x0a, 0x20,
0x20, 0x7d, 0x0a, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0x0a, 0x20,
0x20, 0x20, 0x2a, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20,
0x69, 0x66, 0x20, 0x55, 0x49, 0x20, 0x69, 0x73, 0x20, 0x63,
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74,
0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b,
0x2d, 0x65, 0x6e, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20,
0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x69, 0x73, 0x20, 0x64,
0x6f, 0x6e, 0x65, 0x20, 0x62, 0x79, 0x20, 0x69, 0x6e, 0x63,
0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x60, 0x77, 0x65,
0x62, 0x75, 0x69, 0x2e, 0x6a, 0x73, 0x60, 0x20, 0x76, 0x69,
0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65,
0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x54,
0x4d, 0x4c, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x0a, 0x20,
0x20, 0x20, 0x2a, 0x20, 0x40, 0x72, 0x65, 0x74, 0x75, 0x72,
0x6e, 0x20, 0x2d, 0x20, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
0x6e, 0x20, 0x60, 0x74, 0x72, 0x75, 0x65, 0x60, 0x20, 0x69,
0x66, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65,
0x64, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20,
0x69, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65,
0x64, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69,
0x73, 0x2e, 0x23, 0x77, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75,
0x73, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x2f,
0x2a, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x47, 0x65,
0x74, 0x20, 0x4f, 0x53, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20,
0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x70,
0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x2a,
0x20, 0x40, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d,
0x20, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x60,
0x54, 0x72, 0x75, 0x65, 0x60, 0x20, 0x69, 0x66, 0x20, 0x4f,
0x53, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67,
0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x74,
0x72, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x65,
0x0a, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x61,
0x73, 0x79, 0x6e, 0x63, 0x20, 0x69, 0x73, 0x48, 0x69, 0x67,
0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x28,
0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f,
0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74,
0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c,
0x43, 0x6f, 0x72, 0x65, 0x28, 0x22, 0x68, 0x69, 0x67, 0x68,
0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x22,
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x23, 0x6c, 0x6f, 0x67,
0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e,
0x6c, 0x6f, 0x67, 0x28, 0x60, 0x43, 0x6f, 0x72, 0x65, 0x20,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x20,
0x5b, 0x24, 0x7b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x7d, 0x5d, 0x60, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20,
0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x61, 0x64, 0x64, 0x45, 0x76,
0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65,
0x72, 0x28, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2c, 0x20,

View File

@ -592,9 +592,11 @@ class WebuiBridge {
if (bind.trim()) {
const fn = bind.replace(`${this.#winNum}/`, '');
if (fn.trim()) {
this[fn] = (...args: DataTypes[]) => this.call(fn, ...args);
if (typeof (window as any)[fn] === 'undefined') {
(window as any)[fn] = (...args: string[]) => this.call(fn, ...args);
if (fn !== '_webui_core_api') {
this[fn] = (...args: DataTypes[]) => this.call(fn, ...args);
if (typeof (window as any)[fn] === 'undefined') {
(window as any)[fn] = (...args: string[]) => this.call(fn, ...args);
}
}
}
}
@ -660,6 +662,9 @@ class WebuiBridge {
this.#sendData(packet);
});
}
async callCore(fn: string, ...args: DataTypes[]): Promise<DataTypes> {
return this.call('__webui_core_api__', fn, ...args);
}
// -- Public APIs --------------------------
/**
* Call a backend function
@ -735,6 +740,17 @@ class WebuiBridge {
isConnected(): boolean {
return (this.#wsStatus);
}
/**
* Get OS high contrast preference.
*
* @return - Boolean `True` if OS is using high contrast theme
*/
async isHighContrast(): Promise<boolean> {
// Call a core function and wait for response
const response = await this.callCore("high_contrast") as boolean;
if (this.#log) console.log(`Core Response: [${response}]`);
return response;
}
}
// Export
type webui = WebuiBridge;

View File

@ -532,6 +532,7 @@ static bool _webui_open_url_native(const char* url);
static bool _webui_is_valid_url(const char* url);
static bool _webui_port_is_used(size_t port_num);
static char* _webui_str_dup(const char* src);
static void _webui_bridge_api_handler(webui_event_t* e);
// WebView
#ifdef _WIN32
// Microsoft Windows
@ -849,10 +850,13 @@ size_t webui_new_window_id(size_t window_number) {
// Generate a random token
win->token = _webui_generate_random_uint32();
// Auto bind JavaScript-Bridge Core API Handler
webui_bind(window_number, "__webui_core_api__", _webui_bridge_api_handler);
#ifdef WEBUI_LOG
printf("[User] webui_new_window_id() -> New window #%zu @ 0x%p\n", window_number, win);
printf("[User] webui_new_window_id() -> New window Token 0x%08X (%"
PRIu32 ")\n", win->token, win->token);
printf("[User] webui_new_window_id() -> New window Token 0x%08X (%" PRIu32 ")\n",
win->token, win->token);
#endif
return window_number;
@ -10203,3 +10207,22 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
WEBUI_THREAD_RETURN
}
#endif
static void _webui_bridge_api_handler(webui_event_t* e) {
#ifdef WEBUI_LOG
printf("[Core]\t\t_webui_bridge_api_handler()\n");
#endif
// This function gets called by `webui.js` to reach
// an internal core API. This is not a public user API.
const char* api_name = webui_get_string(e);
#ifdef WEBUI_LOG
printf("[Core]\t\t_webui_bridge_api_handler() -> api_name: [%s]\n", api_name);
#endif
if (strcmp(api_name, "high_contrast") == 0) {
webui_return_bool(e, webui_is_high_contrast());
}
}