The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2895 lines
147KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2022 - Raw Material Software Limited
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 7 End-User License
  8. Agreement and JUCE Privacy Policy.
  9. End User License Agreement: www.juce.com/juce-7-licence
  10. Privacy Policy: www.juce.com/juce-privacy-policy
  11. Or: You may also use this code under the terms of the GPL v3 (see
  12. www.gnu.org/licenses).
  13. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  14. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  15. DISCLAIMED.
  16. ==============================================================================
  17. */
  18. namespace juce
  19. {
  20. // This byte-code is generated from native/java/com/rmsl/juce/ComponentPeerView.java with min sdk version 16
  21. // See juce_core/native/java/README.txt on how to generate this byte-code.
  22. const uint8 javaComponentPeerView[]
  23. {
  24. 0x1f, 0x8b, 0x08, 0x08, 0x10, 0xaa, 0x6f, 0x64, 0x00, 0x03, 0x4a, 0x61,
  25. 0x76, 0x61, 0x44, 0x65, 0x78, 0x42, 0x79, 0x74, 0x65, 0x43, 0x6f, 0x64,
  26. 0x65, 0x2e, 0x64, 0x65, 0x78, 0x00, 0xa5, 0x7c, 0x0b, 0x7c, 0xd4, 0xc5,
  27. 0xb5, 0xff, 0x99, 0xf9, 0xed, 0x23, 0xd9, 0xbc, 0x36, 0x9b, 0x90, 0x04,
  28. 0x48, 0x60, 0x03, 0xa8, 0x01, 0xf2, 0xe2, 0x9d, 0x98, 0x28, 0x8f, 0xf0,
  29. 0x0a, 0x49, 0x48, 0x20, 0x4b, 0x04, 0x42, 0xab, 0x4b, 0xb2, 0x81, 0xd5,
  30. 0x65, 0x77, 0xb3, 0xbb, 0x09, 0xa0, 0xb6, 0x45, 0xa4, 0xa2, 0xd5, 0x5b,
  31. 0x51, 0xa9, 0xa5, 0x6a, 0xad, 0xf5, 0x55, 0x6d, 0x6d, 0x6f, 0x55, 0x5a,
  32. 0xd1, 0xaa, 0xad, 0xd5, 0x56, 0xab, 0x5e, 0x5f, 0xb5, 0xfe, 0xfd, 0xb7,
  33. 0x5e, 0xaf, 0xda, 0x7a, 0x4b, 0xad, 0x7a, 0x6d, 0xa5, 0x0f, 0x95, 0x5b,
  34. 0xef, 0xf7, 0xcc, 0xcc, 0x6e, 0x7e, 0x21, 0xa1, 0xb6, 0xf7, 0x26, 0x9f,
  35. 0xef, 0xef, 0x9c, 0x99, 0x73, 0xe6, 0x3d, 0x73, 0xce, 0x99, 0xdf, 0x6e,
  36. 0xd2, 0x1f, 0xda, 0xe5, 0xa9, 0x9f, 0xb7, 0x80, 0xb6, 0x2e, 0x4b, 0xdc,
  37. 0xf3, 0xd1, 0xb5, 0x8f, 0x0c, 0xde, 0x7a, 0x49, 0xf7, 0xbe, 0x8f, 0xce,
  38. 0xff, 0xf9, 0xfb, 0xfe, 0x37, 0x4f, 0x5f, 0xfd, 0xd1, 0xc2, 0xe7, 0x9e,
  39. 0xd9, 0xb3, 0x81, 0x28, 0x4e, 0x44, 0xbb, 0x7a, 0xe6, 0xfb, 0xc8, 0xfc,
  40. 0x3c, 0x18, 0x20, 0xfa, 0xa1, 0xd0, 0xf9, 0x2b, 0x81, 0x88, 0x1b, 0x00,
  41. 0xdd, 0x97, 0x45, 0x34, 0x1d, 0xf4, 0x60, 0x1e, 0xd1, 0xcf, 0x41, 0xef,
  42. 0xca, 0x27, 0x82, 0x88, 0x96, 0x4f, 0x20, 0xda, 0xb2, 0x98, 0x68, 0x46,
  43. 0x09, 0xd1, 0x81, 0x3a, 0xa2, 0xab, 0x81, 0x2f, 0x01, 0x87, 0x80, 0xeb,
  44. 0x81, 0x1b, 0x81, 0x9b, 0x81, 0xdb, 0x80, 0x3b, 0x80, 0xef, 0x02, 0x87,
  45. 0x81, 0x07, 0x80, 0x1f, 0x03, 0xcf, 0x03, 0xbf, 0x03, 0xfe, 0x04, 0xfc,
  46. 0x15, 0x38, 0x0e, 0x7c, 0x0c, 0x58, 0xf5, 0xa8, 0x1f, 0xc8, 0x05, 0xbc,
  47. 0xc0, 0x04, 0x60, 0x22, 0x50, 0x0e, 0xf8, 0x81, 0x19, 0x40, 0x0b, 0xb0,
  48. 0x05, 0x38, 0x1b, 0xe8, 0x03, 0xb6, 0x03, 0x11, 0x60, 0x10, 0xd8, 0x09,
  49. 0x5c, 0x00, 0xec, 0x01, 0x3e, 0x0f, 0x5c, 0x0e, 0x1c, 0x00, 0xee, 0x00,
  50. 0x5e, 0x05, 0x3e, 0x00, 0x8a, 0xe7, 0x10, 0xd5, 0x01, 0x9d, 0x40, 0x0c,
  51. 0xb8, 0x0e, 0x38, 0x0c, 0x3c, 0x03, 0xfc, 0x16, 0xb0, 0xe6, 0x12, 0x95,
  52. 0x01, 0xb5, 0xc0, 0x2a, 0x20, 0x08, 0x7c, 0x06, 0xf8, 0x32, 0xf0, 0x30,
  53. 0xf0, 0x4b, 0xe0, 0x5d, 0xc0, 0x9a, 0x87, 0x7a, 0x80, 0x0e, 0x60, 0x00,
  54. 0xd8, 0x0b, 0x7c, 0x1b, 0xf8, 0x31, 0xf0, 0x0a, 0x50, 0x3c, 0x9f, 0x68,
  55. 0x01, 0xb0, 0x1d, 0xb8, 0x01, 0x78, 0x11, 0x70, 0x2c, 0x20, 0x9a, 0x0d,
  56. 0x9c, 0x05, 0x5c, 0x02, 0xdc, 0x07, 0xbc, 0x09, 0x9c, 0xba, 0x90, 0x28,
  57. 0x0a, 0xdc, 0x09, 0xbc, 0x02, 0x7c, 0x0c, 0x4c, 0x5f, 0x84, 0xb1, 0x02,
  58. 0x03, 0xc0, 0xe7, 0x81, 0xaf, 0x01, 0xf7, 0x00, 0x2f, 0x01, 0xc7, 0x81,
  59. 0xc2, 0x06, 0xa2, 0xf9, 0xc0, 0x6a, 0x60, 0x1b, 0x70, 0x01, 0xf0, 0x4d,
  60. 0xe0, 0xa7, 0xc0, 0xbf, 0x03, 0x73, 0x1a, 0x89, 0x96, 0x01, 0x01, 0xe0,
  61. 0x16, 0xe0, 0x2e, 0xe0, 0x1e, 0xe0, 0x51, 0xe0, 0x79, 0xe0, 0x45, 0xe0,
  62. 0x65, 0xe0, 0xdf, 0x81, 0x5f, 0x03, 0x6f, 0x01, 0xef, 0x02, 0x7f, 0x06,
  63. 0x8e, 0x03, 0xd6, 0xe9, 0x44, 0x59, 0x40, 0x1e, 0x50, 0x04, 0x94, 0x01,
  64. 0xe5, 0x40, 0x25, 0x70, 0x1a, 0x50, 0x0b, 0xcc, 0x03, 0x1a, 0x80, 0xc5,
  65. 0xc0, 0x6a, 0x60, 0x2d, 0xd0, 0x0d, 0x6c, 0x02, 0xce, 0x06, 0xfa, 0x80,
  66. 0xf3, 0x80, 0x28, 0x90, 0x04, 0x76, 0x03, 0x9f, 0x05, 0xf6, 0x02, 0x97,
  67. 0x01, 0x57, 0x02, 0xd7, 0x00, 0x87, 0x80, 0x9b, 0x80, 0x6f, 0x00, 0xdf,
  68. 0x02, 0xfe, 0x15, 0xb8, 0x17, 0x78, 0x1c, 0x78, 0x05, 0x38, 0x0a, 0x1c,
  69. 0x03, 0x44, 0x13, 0x51, 0x3e, 0x30, 0x19, 0xa8, 0x02, 0x16, 0x00, 0xcb,
  70. 0x80, 0x4e, 0x60, 0x0b, 0x10, 0x06, 0x86, 0x81, 0xbd, 0xc0, 0x95, 0xc0,
  71. 0xf5, 0xc0, 0x37, 0x80, 0x7b, 0x81, 0x1f, 0x02, 0x4f, 0x01, 0xff, 0x0f,
  72. 0xf8, 0x35, 0xf0, 0x1e, 0xf0, 0x31, 0x30, 0xa1, 0x99, 0xa8, 0x02, 0x98,
  73. 0x05, 0xcc, 0x07, 0x1a, 0x81, 0x00, 0xd0, 0x0b, 0xec, 0x00, 0x76, 0x01,
  74. 0x17, 0x00, 0x5f, 0x04, 0xae, 0x05, 0xee, 0x04, 0xee, 0x06, 0xee, 0x07,
  75. 0x1e, 0x01, 0x7e, 0x0e, 0xfc, 0x0a, 0x78, 0x0b, 0x78, 0x1f, 0xf8, 0x10,
  76. 0xc8, 0x39, 0x03, 0x7b, 0x15, 0x98, 0x05, 0x2c, 0x02, 0x56, 0x01, 0x01,
  77. 0xa0, 0x1f, 0x48, 0x02, 0x97, 0x01, 0x57, 0x03, 0x5f, 0x01, 0xbe, 0x0f,
  78. 0x3c, 0x08, 0xfc, 0x04, 0x78, 0x02, 0x78, 0x01, 0x78, 0x15, 0xf8, 0x35,
  79. 0xf0, 0x0e, 0x70, 0x0c, 0x28, 0x39, 0x13, 0xf3, 0x0e, 0x2c, 0x04, 0xce,
  80. 0x00, 0xda, 0x80, 0x8d, 0x40, 0x10, 0x18, 0x04, 0x3e, 0x03, 0x5c, 0x07,
  81. 0x1c, 0x01, 0x1e, 0x05, 0x5e, 0x04, 0x7e, 0x0f, 0xfc, 0x37, 0x50, 0x84,
  82. 0x73, 0x3a, 0x0d, 0xa8, 0x06, 0x96, 0x02, 0x1b, 0x81, 0x7e, 0x60, 0x10,
  83. 0xf8, 0x1c, 0x70, 0x1d, 0xf0, 0x20, 0xf0, 0x38, 0xf0, 0x06, 0xf0, 0x11,
  84. 0xe0, 0x5d, 0x82, 0x35, 0x06, 0x3a, 0x81, 0x2d, 0xc0, 0x0e, 0x60, 0x2f,
  85. 0x70, 0x00, 0xb8, 0x1e, 0xf8, 0x26, 0xf0, 0x03, 0xe0, 0x67, 0xc0, 0x0b,
  86. 0xc0, 0xaf, 0x80, 0xa3, 0xc0, 0x07, 0x40, 0xee, 0x52, 0xa2, 0x29, 0x40,
  87. 0x2d, 0xb0, 0x04, 0xd8, 0x00, 0x84, 0x80, 0xf3, 0x81, 0xcb, 0x80, 0xaf,
  88. 0x00, 0xf7, 0x01, 0x0f, 0x01, 0x8f, 0x02, 0x3f, 0x05, 0x5e, 0x03, 0xfe,
  89. 0x00, 0x58, 0xcb, 0xb0, 0x1e, 0xc0, 0x0c, 0x60, 0x1e, 0xb0, 0x04, 0xe8,
  90. 0x01, 0xb6, 0x01, 0xbb, 0x80, 0xfd, 0xc0, 0x41, 0xe0, 0x4e, 0xe0, 0x5e,
  91. 0xe0, 0x11, 0xe0, 0x97, 0xc0, 0x6f, 0x80, 0xb7, 0x80, 0x77, 0x80, 0x0f,
  92. 0x80, 0xbf, 0x01, 0x05, 0x2d, 0xe8, 0x07, 0x50, 0x07, 0x34, 0x03, 0xab,
  93. 0x80, 0x0d, 0xc0, 0x76, 0x20, 0x01, 0x9c, 0x0f, 0x5c, 0x02, 0x1c, 0x00,
  94. 0x6e, 0x01, 0x1e, 0x06, 0x7e, 0x06, 0xbc, 0x00, 0xfc, 0x1e, 0xf8, 0x10,
  95. 0x10, 0xcb, 0x31, 0x17, 0x40, 0x09, 0x30, 0x05, 0x98, 0x01, 0x54, 0x03,
  96. 0x75, 0xc0, 0x02, 0x60, 0x29, 0xb0, 0x0a, 0xe8, 0x02, 0x36, 0x01, 0x7d,
  97. 0xc0, 0x20, 0xb0, 0x1b, 0xb8, 0x08, 0xd8, 0x0f, 0x5c, 0x0f, 0x7c, 0x1d,
  98. 0xf8, 0x06, 0xf0, 0x00, 0xf0, 0x2c, 0xf0, 0x3a, 0x70, 0x0c, 0x28, 0x5c,
  99. 0x81, 0x3a, 0x81, 0x45, 0x40, 0x17, 0xb0, 0x11, 0xd8, 0x06, 0xec, 0x04,
  100. 0x3e, 0x0f, 0x1c, 0x00, 0xbe, 0x06, 0xdc, 0x01, 0xdc, 0x03, 0x3c, 0x02,
  101. 0x3c, 0x03, 0xfc, 0x3b, 0xf0, 0x36, 0xf0, 0x11, 0x90, 0x0d, 0x83, 0x5d,
  102. 0x08, 0x4c, 0x02, 0xa6, 0x01, 0xd5, 0xc0, 0x3c, 0xe0, 0x74, 0x60, 0x29,
  103. 0xd0, 0x01, 0x6c, 0x01, 0xfa, 0x80, 0xbd, 0xc0, 0x97, 0x80, 0xeb, 0x80,
  104. 0xaf, 0x02, 0xb7, 0x03, 0x4f, 0x02, 0x47, 0x81, 0x63, 0x80, 0x5c, 0x85,
  105. 0xfa, 0x80, 0x5c, 0x60, 0x12, 0x30, 0x0b, 0xa8, 0x03, 0x16, 0x03, 0x1d,
  106. 0xc0, 0x00, 0x70, 0x21, 0x70, 0x15, 0xf0, 0x35, 0xe0, 0x7e, 0xe0, 0x71,
  107. 0xe0, 0x39, 0xe0, 0xb7, 0x80, 0x63, 0x35, 0xce, 0x12, 0x30, 0x0b, 0x68,
  108. 0x04, 0x56, 0x00, 0x1b, 0x80, 0x3e, 0x20, 0x01, 0xec, 0x06, 0x2e, 0x03,
  109. 0x0e, 0x01, 0x37, 0x01, 0xdf, 0x06, 0x8e, 0x00, 0x2f, 0x00, 0xbf, 0x04,
  110. 0x7e, 0x03, 0xbc, 0x05, 0xe4, 0xb4, 0x12, 0xd5, 0x03, 0x9b, 0x81, 0xbd,
  111. 0xc0, 0xcd, 0xc0, 0x23, 0xc0, 0x1b, 0x80, 0x63, 0x0d, 0xec, 0x25, 0xd0,
  112. 0x06, 0x24, 0x81, 0xdd, 0xc0, 0x45, 0xc0, 0x65, 0xc0, 0x95, 0xc0, 0x57,
  113. 0x80, 0x1b, 0x81, 0x5b, 0x81, 0xc7, 0x81, 0x3f, 0x02, 0xbe, 0x36, 0xac,
  114. 0x17, 0xb0, 0x18, 0x58, 0x06, 0xb4, 0x02, 0xeb, 0x81, 0x8d, 0xc0, 0x39,
  115. 0xc0, 0x20, 0x70, 0x21, 0xf0, 0x45, 0xe0, 0x16, 0xe0, 0x1e, 0xe0, 0x61,
  116. 0xe0, 0x11, 0xe0, 0x71, 0xe0, 0x49, 0xe0, 0x19, 0xe0, 0x05, 0xe0, 0x25,
  117. 0xe0, 0x97, 0xc0, 0xab, 0x40, 0x01, 0x7c, 0x61, 0x21, 0x50, 0x06, 0x54,
  118. 0x01, 0x33, 0x81, 0x59, 0xc0, 0x6c, 0xa0, 0x1a, 0xa8, 0x01, 0x6a, 0x01,
  119. 0xb8, 0x36, 0x82, 0xeb, 0x21, 0xb8, 0x17, 0x82, 0xeb, 0x20, 0xb8, 0x07,
  120. 0x82, 0x3b, 0x20, 0x98, 0x7e, 0x82, 0xa9, 0x27, 0x98, 0x73, 0x82, 0xc9,
  121. 0x26, 0x98, 0x5d, 0x82, 0x99, 0x23, 0x98, 0x25, 0xc2, 0xb1, 0x27, 0x1c,
  122. 0x5f, 0xc2, 0x71, 0x24, 0x1c, 0x2b, 0xc2, 0xf1, 0x20, 0x6c, 0x6b, 0x6a,
  123. 0x61, 0xff, 0x0b, 0xac, 0x30, 0xbe, 0x1a, 0xd3, 0x4e, 0x98, 0x32, 0xc2,
  124. 0xd4, 0x10, 0x86, 0x4a, 0xe8, 0x16, 0xb5, 0x03, 0x1d, 0xc0, 0x5a, 0xa0,
  125. 0x13, 0xe8, 0x02, 0xd6, 0x01, 0xeb, 0x81, 0x6e, 0x00, 0xee, 0x9e, 0x10,
  126. 0x06, 0x50, 0x0f, 0x70, 0x16, 0xb0, 0x11, 0xd8, 0x04, 0x6c, 0x06, 0x7a,
  127. 0x81, 0x2d, 0xc0, 0xa7, 0x80, 0x4f, 0x03, 0x67, 0x03, 0xe7, 0x00, 0x41,
  128. 0x60, 0x2b, 0xd0, 0x07, 0xf4, 0x03, 0xdb, 0x80, 0x1d, 0xc0, 0xa5, 0x1c,
  129. 0x1f, 0x00, 0x5f, 0x02, 0xae, 0x05, 0xbe, 0x4c, 0x7a, 0x5e, 0xd2, 0x3f,
  130. 0xde, 0x34, 0xad, 0xd1, 0x73, 0x25, 0x4c, 0xba, 0xc8, 0xf0, 0x9c, 0x5f,
  131. 0x6c, 0xf8, 0x32, 0xf0, 0x13, 0x0c, 0xef, 0x07, 0x5f, 0x62, 0xf8, 0x2a,
  132. 0xf0, 0xa5, 0x86, 0xaf, 0xb7, 0xf1, 0x0d, 0x36, 0x7e, 0x49, 0x8d, 0x5e,
  133. 0x07, 0x69, 0xea, 0x9f, 0x68, 0x78, 0xae, 0x67, 0x92, 0xe1, 0x57, 0x83,
  134. 0xaf, 0x00, 0x75, 0x19, 0x1d, 0x8e, 0x6d, 0xb2, 0x78, 0x7e, 0x4c, 0x7e,
  135. 0xba, 0xaf, 0xcc, 0x17, 0xda, 0xf8, 0x89, 0x36, 0xbe, 0xc2, 0xf0, 0x95,
  136. 0x86, 0xdf, 0x88, 0xb2, 0xa7, 0x1a, 0xfe, 0x1c, 0x53, 0x8f, 0xdf, 0xa6,
  137. 0x3f, 0xcd, 0xf0, 0x53, 0x0c, 0xcf, 0xe3, 0x9d, 0x61, 0xf8, 0x88, 0xd1,
  138. 0x9f, 0x6e, 0xeb, 0x0f, 0xd7, 0x95, 0x32, 0xf9, 0xa7, 0x99, 0x7c, 0xae,
  139. 0xaf, 0xc6, 0x8c, 0x85, 0x75, 0x78, 0x4f, 0x5d, 0x08, 0x7e, 0x2a, 0xe9,
  140. 0xbd, 0x54, 0x66, 0xf4, 0xe7, 0xdb, 0xda, 0x5a, 0x64, 0xda, 0xf2, 0x1b,
  141. 0x9e, 0xcb, 0x9e, 0x62, 0xf8, 0x7d, 0x35, 0xba, 0x6e, 0xde, 0x6f, 0x57,
  142. 0x98, 0x3a, 0x99, 0x3f, 0x68, 0xea, 0x69, 0x32, 0xf5, 0x4c, 0x35, 0x3c,
  143. 0xd7, 0x3f, 0xcd, 0xf0, 0x37, 0x98, 0xb2, 0xbc, 0x3f, 0xef, 0x30, 0x65,
  144. 0x79, 0x8f, 0x7e, 0xd7, 0x8c, 0x8b, 0xf9, 0x23, 0x35, 0x7a, 0x6f, 0x2c,
  145. 0x31, 0xf5, 0x44, 0x0d, 0xcf, 0xfd, 0x89, 0x19, 0x9e, 0xeb, 0x8c, 0x1b,
  146. 0xfe, 0x47, 0xe0, 0x07, 0x0d, 0xff, 0x34, 0xf8, 0x84, 0xe1, 0xb9, 0xcf,
  147. 0x49, 0xc3, 0xbf, 0x0c, 0x3e, 0x65, 0x78, 0xee, 0xc3, 0x90, 0xe1, 0x8f,
  148. 0x82, 0x1f, 0x36, 0xfc, 0x31, 0xf0, 0xbb, 0x0c, 0x7f, 0x1c, 0xfc, 0x4e,
  149. 0xc3, 0x67, 0xd5, 0x8e, 0xf0, 0x5e, 0xf0, 0xbb, 0xd3, 0x7d, 0x00, 0x7f,
  150. 0x7e, 0xba, 0x2d, 0xf0, 0x9f, 0x33, 0x7c, 0x95, 0x2d, 0xbf, 0xde, 0xc6,
  151. 0x37, 0x80, 0xdf, 0x67, 0xf8, 0x25, 0xb6, 0xfc, 0x76, 0x1b, 0x1f, 0xb0,
  152. 0xf1, 0x5b, 0x6c, 0x3c, 0xcf, 0x4f, 0xba, 0xfe, 0x7e, 0xe4, 0x5f, 0x68,
  153. 0xf8, 0x08, 0xf8, 0x3d, 0x86, 0xdf, 0x05, 0xfe, 0x22, 0xc3, 0xef, 0xb3,
  154. 0x95, 0x3d, 0x68, 0xe3, 0x6f, 0xb0, 0xf1, 0xb7, 0x82, 0xbf, 0x20, 0x5d,
  155. 0x0f, 0xea, 0xbf, 0xd8, 0xf0, 0x77, 0xd9, 0x74, 0x8e, 0x57, 0x8f, 0xf0,
  156. 0xbc, 0x67, 0x3e, 0x9b, 0xae, 0x1f, 0xfc, 0x5e, 0xc3, 0x1f, 0xb6, 0x8d,
  157. 0xfd, 0x47, 0xe0, 0x3f, 0x6f, 0xf8, 0x27, 0x6c, 0xf5, 0xf0, 0xf9, 0xfa,
  158. 0x8c, 0xe1, 0x5f, 0xb4, 0xe5, 0xbf, 0x56, 0x3b, 0x92, 0x7f, 0xd4, 0x56,
  159. 0xcf, 0x31, 0x7b, 0xff, 0x6b, 0x6c, 0xfd, 0x41, 0xfe, 0x25, 0x86, 0x77,
  160. 0xc0, 0x30, 0xee, 0x37, 0x7c, 0x6e, 0xdd, 0x88, 0x4e, 0xb9, 0x8d, 0x9f,
  161. 0x51, 0xa7, 0x6d, 0x0c, 0xdb, 0x3f, 0xfe, 0xb9, 0xcc, 0xf0, 0xbc, 0x7f,
  162. 0xbe, 0x60, 0xf8, 0xea, 0xba, 0x11, 0xbe, 0x01, 0xfc, 0xe5, 0x86, 0x5f,
  163. 0x0e, 0xfe, 0x0a, 0xc3, 0xf3, 0x5e, 0xfa, 0x17, 0xc3, 0xb7, 0x23, 0xff,
  164. 0x8b, 0x86, 0xdf, 0x08, 0xfe, 0x80, 0xe1, 0xfb, 0xc1, 0x5f, 0x69, 0xf8,
  165. 0x88, 0x2d, 0x9f, 0xe7, 0xf6, 0x2a, 0xc3, 0xa7, 0xf8, 0xbe, 0x63, 0xf8,
  166. 0x7d, 0x36, 0x7d, 0x9e, 0x87, 0x34, 0xcf, 0xe3, 0xbd, 0xc6, 0xf0, 0x3c,
  167. 0xc6, 0x3c, 0x58, 0xa8, 0x07, 0x49, 0xd3, 0x5b, 0x61, 0xac, 0xf2, 0x41,
  168. 0xc3, 0xc4, 0xe7, 0x71, 0x1e, 0xdd, 0x6d, 0xa8, 0x5f, 0x30, 0x15, 0x34,
  169. 0xdd, 0xd0, 0x53, 0x0c, 0x3d, 0xd5, 0xd0, 0xd3, 0x0c, 0x9d, 0x29, 0xb4,
  170. 0xfe, 0x42, 0xc1, 0x3e, 0xa7, 0x89, 0x9e, 0x26, 0xa6, 0x85, 0xea, 0x7e,
  171. 0x56, 0x05, 0x2b, 0x71, 0x95, 0xca, 0xaf, 0xa5, 0xef, 0x08, 0xf6, 0x47,
  172. 0x85, 0xf4, 0x30, 0x31, 0xad, 0xa2, 0x47, 0x14, 0xd5, 0xf2, 0x99, 0x46,
  173. 0x3e, 0x0b, 0xf4, 0x26, 0x43, 0x39, 0x3d, 0x1b, 0x3d, 0x5e, 0xa0, 0x68,
  174. 0x35, 0x7d, 0x5d, 0xb0, 0x0f, 0xd3, 0xf2, 0x6a, 0x23, 0xaf, 0x86, 0xe4,
  175. 0x1e, 0xc1, 0xb6, 0x48, 0x52, 0xa5, 0x60, 0x3b, 0x54, 0x49, 0xff, 0x4a,
  176. 0x4c, 0x67, 0xd2, 0x0f, 0x15, 0x4d, 0xe7, 0x57, 0xd3, 0x7c, 0x45, 0x67,
  177. 0x51, 0x8b, 0xa2, 0x4b, 0xe9, 0x1c, 0x45, 0x73, 0x28, 0x24, 0xd8, 0x06,
  178. 0xcd, 0xa7, 0x73, 0xa1, 0xef, 0x44, 0xff, 0x63, 0x82, 0xed, 0x71, 0x1e,
  179. 0xbd, 0x49, 0x4c, 0x67, 0x90, 0x03, 0xe9, 0x6c, 0xb4, 0xc3, 0x76, 0x39,
  180. 0x1b, 0x1e, 0x69, 0x27, 0xd2, 0x1e, 0x58, 0x15, 0x4e, 0xe7, 0x98, 0xfc,
  181. 0x1c, 0xcc, 0xe0, 0x2e, 0xc1, 0xf3, 0xa9, 0xd3, 0x85, 0x68, 0xb7, 0x51,
  182. 0x30, 0xed, 0xa6, 0x41, 0x45, 0x03, 0xb4, 0x07, 0xd4, 0x87, 0x1a, 0xa4,
  183. 0xa1, 0x96, 0xa2, 0x2d, 0xf4, 0x39, 0xc1, 0x3e, 0x66, 0x9d, 0x2a, 0x57,
  184. 0x0a, 0x2f, 0xc8, 0x74, 0x22, 0x4a, 0xfc, 0x45, 0xd1, 0x95, 0x74, 0x9e,
  185. 0x60, 0x7f, 0x51, 0xa3, 0xf2, 0x27, 0xa1, 0xde, 0x5f, 0x2b, 0x7a, 0x0a,
  186. 0x1d, 0x35, 0xe9, 0x0f, 0x0d, 0xcd, 0x82, 0xde, 0x64, 0x23, 0x67, 0xfa,
  187. 0x1b, 0x45, 0x3d, 0xf4, 0xae, 0x49, 0xff, 0xb7, 0xa2, 0x16, 0xfd, 0x4d,
  188. 0x51, 0xdc, 0x35, 0x0c, 0x25, 0x55, 0x4e, 0x50, 0x9e, 0xa1, 0xf9, 0x82,
  189. 0x6d, 0x6e, 0x09, 0x3d, 0x4b, 0x4c, 0x25, 0xfd, 0x41, 0xd1, 0x25, 0x94,
  190. 0x2b, 0xd8, 0x8e, 0x37, 0xab, 0x7e, 0x4c, 0x81, 0x07, 0xee, 0x51, 0xe9,
  191. 0xb3, 0xe9, 0x2c, 0x45, 0xeb, 0x68, 0xb3, 0x60, 0xdb, 0xde, 0x46, 0x87,
  192. 0x49, 0xd3, 0xb8, 0x60, 0x9f, 0xb4, 0x85, 0xe6, 0x08, 0xb6, 0xd5, 0xad,
  193. 0xaa, 0xdc, 0x34, 0x78, 0xc4, 0x15, 0x2a, 0x3d, 0x9b, 0xa2, 0x82, 0x6d,
  194. 0xb5, 0x9e, 0xaf, 0x19, 0x88, 0x14, 0x34, 0x9d, 0x4d, 0x8f, 0x29, 0x9a,
  195. 0x45, 0x6f, 0x19, 0xfa, 0x7b, 0x45, 0xbd, 0xf4, 0x0e, 0xb1, 0x9d, 0xef,
  196. 0xa7, 0xa9, 0x82, 0xe9, 0x6a, 0x4a, 0x28, 0x3a, 0x40, 0x97, 0xa9, 0xfd,
  197. 0xb5, 0x56, 0x95, 0xaf, 0xc2, 0xba, 0x7e, 0x5f, 0xd1, 0xf5, 0xf4, 0x03,
  198. 0x45, 0x67, 0x92, 0x5b, 0xc9, 0x97, 0x53, 0xaf, 0xa2, 0x2b, 0x68, 0x8b,
  199. 0x49, 0x7f, 0x4a, 0x68, 0xbd, 0x4f, 0x2b, 0xba, 0x8c, 0x6e, 0x37, 0xf4,
  200. 0x1b, 0x86, 0xde, 0x61, 0xe8, 0x9d, 0x6a, 0x7f, 0x76, 0xa9, 0xfa, 0x67,
  201. 0x9a, 0xfe, 0xcd, 0xc4, 0xb8, 0x7e, 0xa9, 0xa8, 0xee, 0xd7, 0x4c, 0x3a,
  202. 0x8f, 0x2e, 0x54, 0xfb, 0xb6, 0x53, 0xe9, 0xcd, 0xc2, 0x4a, 0x3e, 0xab,
  203. 0xe8, 0x2c, 0x7a, 0xd9, 0xa4, 0xff, 0xbf, 0xa2, 0x9f, 0xa6, 0xed, 0x6a,
  204. 0x3f, 0xb7, 0x2b, 0xbd, 0xd9, 0xf8, 0x0d, 0xa8, 0x7d, 0xac, 0xcb, 0x55,
  205. 0x23, 0xff, 0x7a, 0x43, 0x6f, 0x50, 0xb4, 0x82, 0xbe, 0x4a, 0x7a, 0x9f,
  206. 0x5f, 0x6e, 0xf6, 0xfb, 0x15, 0x6a, 0xbf, 0xd7, 0x2b, 0x7d, 0xde, 0xf7,
  207. 0xff, 0xa9, 0xa8, 0x9b, 0x7e, 0x6b, 0xd2, 0x7f, 0x34, 0xf4, 0x7d, 0x43,
  208. 0xff, 0xaa, 0xe8, 0xa9, 0xe4, 0x34, 0xe7, 0xc4, 0xa5, 0x68, 0x0f, 0xcd,
  209. 0x56, 0x74, 0x0b, 0xd5, 0x2b, 0x5a, 0x43, 0x17, 0x28, 0x7a, 0x16, 0x5d,
  210. 0xac, 0xce, 0xc5, 0x19, 0xaa, 0xfe, 0x5a, 0x44, 0x59, 0x87, 0x14, 0x75,
  211. 0xd2, 0x57, 0x14, 0x5d, 0x44, 0xd7, 0x29, 0x9a, 0x4b, 0x37, 0x2a, 0xda,
  212. 0x41, 0x5f, 0x53, 0xb4, 0x98, 0x6e, 0x52, 0x74, 0x3b, 0x7d, 0x5d, 0xd1,
  213. 0x69, 0x74, 0xb3, 0xa1, 0xb7, 0x98, 0xf2, 0xb7, 0x2a, 0xba, 0x8d, 0x6e,
  214. 0x53, 0x74, 0x2e, 0xdd, 0xae, 0xe8, 0x69, 0xf4, 0x0d, 0x45, 0x17, 0xd2,
  215. 0x1d, 0x46, 0xef, 0x4e, 0x43, 0xbf, 0xa9, 0xa8, 0x8b, 0xbe, 0x65, 0xd2,
  216. 0x77, 0x29, 0x3a, 0x9b, 0xee, 0x37, 0xf4, 0x51, 0x43, 0x7f, 0xa2, 0xe8,
  217. 0xa7, 0xe8, 0x29, 0x45, 0xeb, 0xe9, 0x79, 0x45, 0x1b, 0xe8, 0x15, 0xd2,
  218. 0xf6, 0xe0, 0x75, 0x45, 0x27, 0xd2, 0x1b, 0x8a, 0xe6, 0xd1, 0xdb, 0x8a,
  219. 0x96, 0xd3, 0x7f, 0x91, 0x3e, 0xff, 0xef, 0x19, 0x3b, 0xf1, 0x07, 0xa3,
  220. 0x7f, 0x4c, 0xd1, 0xc9, 0xf4, 0x27, 0x45, 0x2d, 0xfa, 0xb3, 0xa2, 0xbd,
  221. 0xf4, 0x81, 0xa2, 0x45, 0x74, 0x5c, 0x51, 0x1f, 0x09, 0x35, 0x4f, 0x13,
  222. 0x28, 0x5b, 0xe8, 0xf2, 0x1e, 0x45, 0x0b, 0x28, 0x47, 0x51, 0x7d, 0x5e,
  223. 0x6a, 0x11, 0x61, 0x7b, 0x85, 0xee, 0x57, 0xa1, 0xa1, 0x3e, 0x43, 0x8b,
  224. 0x14, 0x9d, 0x4f, 0xc5, 0x8a, 0xce, 0xa3, 0x09, 0x42, 0xcf, 0x4b, 0x89,
  225. 0x91, 0x97, 0x9a, 0xf2, 0x65, 0x86, 0x4e, 0x34, 0x74, 0x92, 0xa2, 0x0b,
  226. 0x68, 0xb2, 0xa2, 0x5b, 0xa9, 0x5c, 0xe8, 0x79, 0x98, 0xa2, 0xe8, 0x16,
  227. 0xaa, 0x33, 0x74, 0xae, 0xa2, 0xa7, 0xd3, 0x1a, 0x45, 0x1b, 0xa9, 0xcd,
  228. 0xd0, 0x76, 0x43, 0x3b, 0x8c, 0x7c, 0xad, 0x49, 0x77, 0x1a, 0xda, 0xa5,
  229. 0xe8, 0x24, 0x5a, 0xa7, 0xe8, 0x99, 0xb4, 0x5e, 0xd1, 0x35, 0xd4, 0xad,
  230. 0x68, 0x88, 0x36, 0x28, 0xaa, 0xcf, 0x7f, 0xad, 0x39, 0xff, 0x9c, 0xde,
  231. 0xa8, 0xe8, 0x26, 0xda, 0xa4, 0xa8, 0xb6, 0x07, 0xac, 0x7f, 0xb6, 0xa2,
  232. 0x7d, 0x74, 0xae, 0xa2, 0x1b, 0x69, 0xb7, 0xa1, 0xe7, 0x2b, 0xba, 0x8a,
  233. 0x3e, 0x6b, 0xec, 0xf3, 0x5e, 0x45, 0x7b, 0x68, 0x9f, 0x49, 0x7f, 0xde,
  234. 0xe8, 0x5d, 0x62, 0xe8, 0x7e, 0x45, 0x6b, 0xe9, 0x52, 0xa1, 0xf7, 0xc3,
  235. 0x41, 0xa1, 0xf7, 0xc7, 0x97, 0x4c, 0xfa, 0x5a, 0x43, 0xbf, 0x6c, 0xe8,
  236. 0x21, 0xa1, 0xf7, 0xd7, 0x57, 0x4c, 0xfa, 0x3a, 0xa1, 0xf7, 0xd9, 0xf5,
  237. 0x42, 0xef, 0xeb, 0x1b, 0xcc, 0x7c, 0x7f, 0x55, 0xe8, 0x7d, 0x7d, 0xa3,
  238. 0x99, 0xf7, 0xef, 0x0a, 0x8e, 0x61, 0xa7, 0xd0, 0x17, 0x15, 0x3d, 0x85,
  239. 0x6e, 0x11, 0x1c, 0xc7, 0x56, 0xd1, 0x47, 0xc4, 0x34, 0x4c, 0xb5, 0xca,
  240. 0x5f, 0x48, 0xaa, 0x56, 0xd4, 0x4f, 0xdf, 0x16, 0x1c, 0xab, 0x6a, 0x3b,
  241. 0xd6, 0x88, 0x08, 0xf5, 0x77, 0x8a, 0xea, 0x72, 0x4d, 0xd8, 0x3f, 0x8f,
  242. 0x13, 0x53, 0x07, 0x3d, 0xa1, 0xe8, 0xb9, 0xf4, 0x92, 0xa2, 0xda, 0x3f,
  243. 0x70, 0xfe, 0x2a, 0x45, 0x4f, 0xa5, 0x2b, 0x05, 0xc7, 0xb0, 0xd3, 0xa9,
  244. 0x46, 0xf0, 0x3d, 0x4b, 0xd7, 0x77, 0x26, 0xda, 0xbb, 0x97, 0xf4, 0x5d,
  245. 0xce, 0x4b, 0x3a, 0x26, 0x3e, 0x56, 0xcd, 0x7e, 0x06, 0xb1, 0x01, 0xe8,
  246. 0xd9, 0x7c, 0x81, 0x22, 0x7d, 0xcf, 0xf3, 0x92, 0x8e, 0x77, 0x89, 0xb4,
  247. 0xfc, 0x42, 0xc8, 0xbf, 0x6a, 0xe4, 0xb3, 0x8c, 0x7c, 0xba, 0x4d, 0x7e,
  248. 0x05, 0xe4, 0xf7, 0x19, 0xf9, 0x6c, 0x93, 0xcf, 0xf5, 0x1f, 0x37, 0xf5,
  249. 0xdf, 0x0a, 0xfa, 0x92, 0x91, 0x57, 0xdb, 0xda, 0x4f, 0x97, 0x3f, 0x8c,
  250. 0xcc, 0xdf, 0x19, 0x39, 0xdf, 0x05, 0xc4, 0x09, 0xf2, 0xc7, 0x20, 0x2f,
  251. 0xec, 0xd6, 0x69, 0xbe, 0x1f, 0xf0, 0xfd, 0x85, 0xef, 0x01, 0x8e, 0x1a,
  252. 0x2d, 0x7f, 0x05, 0xf2, 0x56, 0x23, 0xe7, 0xbb, 0xd0, 0x97, 0x71, 0x21,
  253. 0xbc, 0x71, 0x9d, 0xae, 0xe7, 0xce, 0x75, 0x23, 0x79, 0x8f, 0xd9, 0xf8,
  254. 0x67, 0x8d, 0xfc, 0x97, 0x26, 0xef, 0xbf, 0x40, 0xff, 0x0c, 0x58, 0x46,
  255. 0x2e, 0xd0, 0x9f, 0xdc, 0xf5, 0x23, 0xfa, 0x13, 0xd6, 0x9b, 0xbb, 0x9b,
  256. 0xa1, 0x8b, 0x0c, 0x5d, 0xbd, 0x9e, 0x7d, 0xbb, 0x43, 0xe9, 0xbd, 0xde,
  257. 0xa6, 0xfb, 0x16, 0xf7, 0x3e, 0x8e, 0x74, 0xef, 0xf4, 0x7c, 0xea, 0x9d,
  258. 0x91, 0x4b, 0xbd, 0xa7, 0xe4, 0x51, 0xc0, 0x9f, 0x4b, 0x81, 0xca, 0x3c,
  259. 0x1a, 0xf4, 0x2f, 0xc6, 0xe8, 0xf3, 0x89, 0xef, 0x66, 0x42, 0xb5, 0xf5,
  260. 0xc7, 0x36, 0x7d, 0x77, 0xf6, 0xb9, 0x06, 0xbd, 0x73, 0x61, 0x7b, 0x3d,
  261. 0x72, 0xd0, 0x3b, 0x87, 0x29, 0x9d, 0x2e, 0x1d, 0x6a, 0x55, 0x7d, 0xa2,
  262. 0x50, 0x44, 0xbd, 0x3f, 0x43, 0x5e, 0xae, 0x35, 0x4d, 0x9c, 0x89, 0xda,
  263. 0x9f, 0x47, 0xd9, 0x69, 0x8e, 0x52, 0x8a, 0xd6, 0x3f, 0x45, 0x7d, 0xd2,
  264. 0xe3, 0x1c, 0xf4, 0xfe, 0x14, 0xbb, 0x32, 0xd7, 0xa9, 0xd2, 0xe4, 0x71,
  265. 0x71, 0xda, 0x45, 0xb9, 0xae, 0x78, 0xbd, 0x97, 0x02, 0xae, 0xa8, 0xff,
  266. 0x05, 0xf8, 0xb2, 0xaa, 0x57, 0xf9, 0xfd, 0xb6, 0x54, 0x6d, 0x96, 0xb4,
  267. 0xeb, 0xf9, 0xf3, 0x39, 0xa2, 0xde, 0x8d, 0xd0, 0xf4, 0xa0, 0xfe, 0x4d,
  268. 0x4c, 0xe9, 0x74, 0xe1, 0x50, 0x3b, 0x2d, 0x9f, 0xb8, 0x45, 0xd4, 0x29,
  269. 0xa3, 0xf5, 0xcf, 0xd0, 0x32, 0xe1, 0xb1, 0x14, 0x25, 0x8f, 0x63, 0xb0,
  270. 0x3e, 0x9f, 0x16, 0x38, 0xaa, 0xde, 0xb3, 0x50, 0x17, 0x8f, 0x79, 0x61,
  271. 0xbb, 0xbe, 0x67, 0x0e, 0x7a, 0x4f, 0x47, 0xaf, 0x72, 0x29, 0xea, 0x3f,
  272. 0x07, 0xf9, 0xf9, 0x4a, 0xca, 0xf2, 0xa5, 0xed, 0xfa, 0xbd, 0xfa, 0xa0,
  273. 0x7f, 0x19, 0x46, 0x3e, 0xe8, 0x5f, 0x62, 0xc6, 0x9f, 0xee, 0x4b, 0x47,
  274. 0xa6, 0x2f, 0x83, 0xde, 0x3c, 0xb4, 0xe8, 0x11, 0x83, 0xde, 0x5c, 0xa6,
  275. 0xe3, 0xf6, 0xe5, 0x29, 0xd3, 0x97, 0xa7, 0x54, 0x5f, 0xa2, 0xf5, 0x67,
  276. 0xd3, 0x42, 0xf4, 0x45, 0x9a, 0x9b, 0xf1, 0x8e, 0x76, 0xbd, 0x26, 0x5c,
  277. 0xbf, 0x0b, 0x25, 0x98, 0x1f, 0x32, 0xed, 0x27, 0xbc, 0x3f, 0x86, 0x16,
  278. 0x56, 0xc3, 0x9b, 0x63, 0xda, 0x77, 0xaa, 0x52, 0xfb, 0x4c, 0xff, 0x47,
  279. 0x56, 0x68, 0xa9, 0xea, 0x61, 0xb6, 0xea, 0x21, 0x62, 0xdd, 0x93, 0xc8,
  280. 0xd3, 0xe5, 0x6f, 0x3f, 0x89, 0x9c, 0xc7, 0xc0, 0xe3, 0xfb, 0x5e, 0xbb,
  281. 0xfe, 0xbc, 0xc1, 0xe7, 0x0a, 0x24, 0x72, 0x69, 0xde, 0x5e, 0x17, 0x05,
  282. 0x12, 0x39, 0xd4, 0x28, 0x79, 0x5c, 0x07, 0x64, 0x76, 0x4e, 0xa2, 0xfe,
  283. 0x11, 0x3a, 0x24, 0x73, 0xa5, 0xe9, 0x9f, 0xf0, 0xd1, 0x24, 0x29, 0x31,
  284. 0x8b, 0x4f, 0xc3, 0x7f, 0x78, 0x64, 0xa3, 0xf4, 0x20, 0x6d, 0x65, 0xd2,
  285. 0x0d, 0xd8, 0x13, 0x45, 0x18, 0xfb, 0x24, 0x84, 0x7e, 0xa3, 0xf3, 0xce,
  286. 0x40, 0xbd, 0xd8, 0x67, 0xc9, 0x1c, 0xbd, 0x2b, 0xb2, 0x3d, 0x56, 0x20,
  287. 0x95, 0x43, 0x07, 0x9c, 0xd9, 0x1e, 0x4e, 0xf7, 0x3b, 0xf5, 0x6c, 0xcd,
  288. 0x75, 0xb0, 0x56, 0x03, 0xaf, 0x93, 0xf7, 0xdf, 0x30, 0x3f, 0x1e, 0xeb,
  289. 0x65, 0xcb, 0xfa, 0x38, 0x5a, 0xff, 0x2c, 0x05, 0xad, 0x5c, 0x11, 0xf5,
  290. 0x7f, 0x0a, 0xde, 0x88, 0xa5, 0x81, 0x44, 0x3e, 0x4d, 0xb3, 0x26, 0x51,
  291. 0xbc, 0xbe, 0x08, 0x3b, 0x2a, 0x5a, 0x7f, 0x1b, 0x49, 0x8b, 0xfb, 0x1f,
  292. 0x48, 0xea, 0x11, 0xce, 0x25, 0x9f, 0xec, 0xc5, 0x38, 0xaa, 0x6e, 0x74,
  293. 0x60, 0x87, 0xf2, 0x38, 0x7f, 0x63, 0xe6, 0x21, 0x5e, 0x5f, 0x47, 0x5e,
  294. 0xd9, 0x8b, 0x71, 0xf4, 0x5a, 0x85, 0x18, 0xa3, 0x03, 0xad, 0xf0, 0x3c,
  295. 0xbd, 0xdf, 0xae, 0xcf, 0xbe, 0x4f, 0x06, 0xea, 0x0b, 0xd0, 0x06, 0xfa,
  296. 0x8a, 0xdd, 0xd9, 0x80, 0x79, 0xe6, 0x74, 0x60, 0x8e, 0x97, 0x12, 0x7e,
  297. 0x0f, 0x66, 0xae, 0x77, 0x6e, 0x01, 0x50, 0x48, 0xbc, 0x8b, 0x8a, 0x44,
  298. 0x19, 0xcd, 0xf7, 0x7a, 0x29, 0xe6, 0xad, 0x47, 0x1b, 0x3a, 0x67, 0x2a,
  299. 0x72, 0x5c, 0xe8, 0x65, 0xd4, 0xbf, 0xca, 0xec, 0x8d, 0x15, 0xa0, 0x55,
  300. 0xc7, 0xf9, 0x3c, 0x39, 0xf9, 0xfc, 0x77, 0xe8, 0xf7, 0x47, 0x3c, 0xdf,
  301. 0x68, 0x47, 0x3a, 0x89, 0x69, 0xa1, 0x0c, 0x24, 0x0a, 0x31, 0xeb, 0xd9,
  302. 0xa8, 0x6b, 0x1e, 0x9f, 0x24, 0xf4, 0xbe, 0x80, 0xaa, 0xfe, 0xc4, 0xb9,
  303. 0x51, 0xef, 0x16, 0xe5, 0x73, 0x15, 0x5f, 0xdf, 0x4b, 0x5b, 0x45, 0x2e,
  304. 0x4d, 0x93, 0x13, 0x28, 0xee, 0x2f, 0xe0, 0x53, 0x0c, 0xbd, 0x69, 0xb2,
  305. 0x0a, 0x23, 0xf7, 0x51, 0x20, 0x85, 0x9e, 0x0e, 0x15, 0x52, 0x7c, 0xc9,
  306. 0x22, 0x9a, 0x1b, 0xe8, 0x4d, 0x78, 0x55, 0xdd, 0x81, 0xa4, 0x57, 0x49,
  307. 0x12, 0xde, 0x6c, 0x8c, 0xd6, 0xe3, 0x28, 0x72, 0xfa, 0x28, 0xb1, 0x21,
  308. 0x87, 0xe6, 0xae, 0x64, 0x69, 0xd5, 0xa3, 0x6c, 0x53, 0x2c, 0x6d, 0x3b,
  309. 0x3a, 0xf4, 0x1c, 0xf5, 0x8a, 0x22, 0x9c, 0x62, 0xb6, 0x64, 0xbd, 0xb2,
  310. 0x18, 0x63, 0xc8, 0x41, 0x3b, 0xdc, 0xf7, 0xd9, 0x1d, 0xfa, 0xdd, 0x96,
  311. 0x4f, 0x16, 0x65, 0x4d, 0xa1, 0xc0, 0x35, 0x45, 0x38, 0x55, 0x21, 0x94,
  312. 0xcd, 0x71, 0x94, 0xb8, 0x60, 0x25, 0x2c, 0x87, 0xab, 0xd1, 0x72, 0x90,
  313. 0xbb, 0xb2, 0x50, 0xb0, 0x2c, 0x70, 0x50, 0xcb, 0x1d, 0x90, 0x0f, 0x2e,
  314. 0xd9, 0x46, 0x2d, 0xb7, 0xe5, 0x62, 0x3e, 0xdd, 0x18, 0x4f, 0x25, 0xea,
  315. 0xc8, 0x15, 0x55, 0xef, 0x9c, 0x63, 0x49, 0x9a, 0x7f, 0xb1, 0x9f, 0xa6,
  316. 0x89, 0x69, 0xa8, 0xad, 0x18, 0x6b, 0x33, 0x9b, 0xe6, 0x78, 0xc6, 0x94,
  317. 0x5d, 0xb7, 0x1d, 0x65, 0x3d, 0x56, 0xa3, 0xf5, 0x8b, 0x8f, 0xb9, 0xc4,
  318. 0x82, 0x8b, 0x9d, 0xa8, 0xa3, 0x06, 0x3d, 0x76, 0x57, 0x56, 0x3d, 0xc5,
  319. 0xe5, 0x06, 0xfd, 0xd5, 0x88, 0xbd, 0x50, 0x23, 0x2e, 0x04, 0x0e, 0x33,
  320. 0x96, 0x40, 0x87, 0x7e, 0xd7, 0x34, 0x8d, 0xb4, 0x45, 0x62, 0xcb, 0x97,
  321. 0x65, 0xce, 0xf4, 0xa7, 0x3b, 0xf4, 0xfb, 0x3f, 0x9f, 0x08, 0x6c, 0xd5,
  322. 0xed, 0x48, 0xca, 0x91, 0x25, 0x0e, 0x8c, 0x41, 0x4a, 0x07, 0xef, 0xfd,
  323. 0x42, 0xe1, 0xf3, 0xcd, 0x3b, 0x6d, 0x22, 0xb1, 0x3c, 0xd0, 0x37, 0x32,
  324. 0xce, 0xc1, 0xfa, 0x30, 0x2d, 0x73, 0xf2, 0x38, 0xde, 0xfb, 0x38, 0xea,
  325. 0xe5, 0x78, 0x0c, 0xb6, 0xc9, 0xdf, 0x8a, 0x3b, 0x04, 0x5a, 0xff, 0xcf,
  326. 0xb1, 0xda, 0xe7, 0x2a, 0xed, 0xaa, 0xdf, 0xf1, 0xbd, 0xc9, 0xa1, 0xfa,
  327. 0x93, 0xea, 0xd0, 0xf6, 0x24, 0x10, 0xd7, 0x7a, 0x2c, 0x29, 0x91, 0xca,
  328. 0xc6, 0xca, 0x46, 0xb6, 0xa6, 0x88, 0xab, 0x02, 0x83, 0x45, 0x76, 0xb9,
  329. 0x14, 0xfb, 0xc4, 0x97, 0xdc, 0xb7, 0xef, 0x74, 0x45, 0xf8, 0x44, 0x90,
  330. 0xb6, 0x6d, 0x3c, 0xc6, 0xbd, 0x1d, 0x7c, 0x4f, 0xc3, 0x2a, 0xf9, 0x4a,
  331. 0x94, 0x4d, 0x17, 0x28, 0xbd, 0xc5, 0x3b, 0x61, 0x94, 0xfd, 0xbe, 0xbc,
  332. 0x43, 0xbf, 0x5b, 0x2c, 0x72, 0x15, 0x63, 0x9f, 0xe4, 0x41, 0x8f, 0x67,
  333. 0x21, 0x90, 0x2c, 0xa1, 0xc0, 0x3c, 0x58, 0x68, 0xef, 0xe7, 0xa1, 0x95,
  334. 0x2b, 0x1a, 0x45, 0xf3, 0x48, 0x9e, 0xff, 0x32, 0x78, 0xcf, 0x11, 0x8d,
  335. 0xcf, 0x41, 0xc3, 0x63, 0xad, 0x87, 0xc3, 0x5d, 0x8f, 0x8b, 0xf1, 0xdd,
  336. 0x81, 0xab, 0xc8, 0x72, 0x2c, 0x38, 0x67, 0x12, 0x6d, 0x48, 0x4e, 0xa0,
  337. 0x06, 0xab, 0x84, 0x7c, 0xd6, 0x16, 0x70, 0x69, 0xfd, 0x40, 0xaa, 0x04,
  338. 0xfd, 0x5e, 0x8f, 0x91, 0xe4, 0x3a, 0x32, 0x2b, 0x58, 0x3f, 0x40, 0x2d,
  339. 0x4e, 0xd6, 0x6f, 0xb4, 0xdc, 0xb4, 0xe8, 0x1c, 0x27, 0xf9, 0x8a, 0xb8,
  340. 0x0c, 0x4e, 0x87, 0x7f, 0x3a, 0x6c, 0x44, 0xd4, 0x3b, 0x4d, 0x9d, 0xf5,
  341. 0xd1, 0x6d, 0x54, 0x3d, 0xc3, 0x6b, 0xc9, 0x67, 0xf3, 0xfb, 0x1d, 0xfa,
  342. 0xbd, 0x66, 0xaf, 0xaf, 0xd4, 0x8c, 0x93, 0x6f, 0x55, 0x71, 0x6c, 0x57,
  343. 0x9c, 0x47, 0xef, 0x44, 0xea, 0x2d, 0x2a, 0x53, 0x63, 0x16, 0xea, 0x97,
  344. 0xe8, 0xa7, 0x1d, 0xbc, 0x0f, 0xd8, 0xcf, 0x75, 0x93, 0xbe, 0xf1, 0xeb,
  345. 0xfc, 0x67, 0x32, 0xf9, 0x01, 0x95, 0x2f, 0xcd, 0x1b, 0xd1, 0x97, 0x3a,
  346. 0xb4, 0x5f, 0x0d, 0x78, 0xcb, 0x94, 0x7f, 0xb4, 0x8c, 0x4d, 0x78, 0x15,
  347. 0xf9, 0xb9, 0xca, 0x76, 0x96, 0xa1, 0x8f, 0xfc, 0xe6, 0x84, 0x6d, 0xe8,
  348. 0x44, 0xf4, 0xba, 0x4a, 0xd9, 0xd0, 0xb4, 0xde, 0x9b, 0x27, 0xd5, 0x9b,
  349. 0xa9, 0xf4, 0xd2, 0x7b, 0xf2, 0x6d, 0xb3, 0x27, 0xf5, 0x18, 0x36, 0xfb,
  350. 0x26, 0xd9, 0xea, 0x38, 0xd6, 0xa1, 0xfd, 0x40, 0xb7, 0x7f, 0x12, 0xf6,
  351. 0x73, 0x1c, 0xe5, 0x3c, 0x6a, 0xcc, 0x0e, 0xb3, 0x67, 0x3f, 0xb4, 0xcb,
  352. 0xeb, 0x13, 0xe4, 0xb5, 0xb4, 0x3c, 0x5d, 0x5e, 0xae, 0xb5, 0x97, 0xef,
  353. 0xcb, 0x94, 0x4f, 0xcb, 0xb3, 0x46, 0xc9, 0xcf, 0x1b, 0x23, 0xcf, 0x1f,
  354. 0x25, 0x4f, 0x66, 0xe4, 0xec, 0x25, 0x78, 0xce, 0x8a, 0xed, 0xf2, 0x25,
  355. 0x51, 0xf2, 0xb6, 0xe4, 0x8e, 0x9a, 0xab, 0x29, 0xa3, 0xca, 0x0f, 0x8e,
  356. 0xe9, 0xff, 0x8c, 0xb5, 0x7a, 0xec, 0xba, 0xff, 0x31, 0xf4, 0x7f, 0x64,
  357. 0xec, 0xd5, 0xa3, 0xca, 0x6e, 0x1d, 0xd3, 0xf6, 0x5c, 0x7b, 0xd9, 0x25,
  358. 0x3b, 0xd0, 0x76, 0x7e, 0xa6, 0xde, 0xe6, 0x51, 0xf5, 0xf6, 0xab, 0x7a,
  359. 0xf3, 0x55, 0x49, 0x49, 0xad, 0x90, 0xbd, 0xc0, 0xe7, 0xdc, 0xed, 0x2b,
  360. 0x89, 0xfb, 0x67, 0xe0, 0xbe, 0x35, 0xcd, 0x91, 0x83, 0xd9, 0xe7, 0x78,
  361. 0xa8, 0xf7, 0x60, 0x25, 0x52, 0xd5, 0xb0, 0x39, 0x9d, 0x74, 0x30, 0xbb,
  362. 0xf7, 0xe0, 0x14, 0xa4, 0x66, 0x21, 0xb5, 0x5a, 0xa5, 0xa6, 0x62, 0x1d,
  363. 0x2f, 0xc4, 0xd9, 0xca, 0x75, 0x4c, 0x72, 0x7e, 0x07, 0xeb, 0x88, 0x13,
  364. 0x03, 0x7e, 0xaa, 0xa3, 0x12, 0xe5, 0x26, 0x53, 0xb9, 0x03, 0x16, 0xc8,
  365. 0xff, 0x18, 0xee, 0x79, 0x1e, 0x47, 0x83, 0x03, 0xf7, 0x74, 0x0f, 0xa7,
  366. 0x09, 0xf7, 0xc5, 0xcd, 0x37, 0x54, 0x80, 0xbb, 0x97, 0x76, 0xd3, 0x96,
  367. 0xeb, 0xfd, 0xe0, 0xee, 0x42, 0x54, 0x1b, 0xf5, 0x7f, 0x5b, 0x3d, 0xbf,
  368. 0x83, 0x7b, 0xe5, 0x34, 0xd4, 0x19, 0xf7, 0x72, 0xbf, 0x8b, 0x1c, 0xc5,
  369. 0x34, 0x7d, 0xe9, 0x32, 0x3a, 0x55, 0xf0, 0x27, 0x00, 0x51, 0xbf, 0x03,
  370. 0xa3, 0x0e, 0x70, 0x9f, 0x9c, 0x1e, 0xec, 0x6c, 0x27, 0x71, 0x8d, 0x6e,
  371. 0xb4, 0xea, 0xb3, 0xa2, 0xde, 0x27, 0x4c, 0x4f, 0x3e, 0x23, 0x7c, 0xa7,
  372. 0x4e, 0x1f, 0x58, 0x8e, 0xf1, 0x6c, 0xcd, 0x9a, 0x46, 0x1d, 0x59, 0x2e,
  373. 0xb7, 0xaf, 0xb4, 0x3c, 0x2b, 0x47, 0x71, 0xd1, 0xfa, 0x47, 0x11, 0x4b,
  374. 0xe5, 0x5a, 0x0d, 0x56, 0x31, 0xec, 0xb3, 0x6f, 0xc6, 0xf4, 0xe5, 0x2b,
  375. 0xc8, 0xa7, 0x22, 0x2f, 0x78, 0x6d, 0x57, 0x87, 0xcb, 0xe1, 0xf4, 0x4d,
  376. 0xf0, 0x29, 0x1a, 0xad, 0x7f, 0x8e, 0xae, 0x71, 0x0c, 0xaa, 0xd5, 0xcb,
  377. 0x75, 0x44, 0xfd, 0x3e, 0x3a, 0xa8, 0xfc, 0x14, 0xdb, 0x16, 0x1e, 0xa3,
  378. 0x1e, 0xcb, 0x41, 0xaa, 0xba, 0x2e, 0xcf, 0x51, 0xf5, 0x0e, 0xf0, 0x7b,
  379. 0xe0, 0x77, 0xc0, 0xcf, 0x81, 0xe7, 0x71, 0x30, 0xd5, 0x67, 0x06, 0x23,
  380. 0x3f, 0x7b, 0x16, 0xd3, 0x3f, 0x95, 0x3e, 0xf1, 0x47, 0xcb, 0xf9, 0xb3,
  381. 0x8e, 0x12, 0xd8, 0x42, 0x7e, 0xf7, 0xe8, 0xe5, 0x7d, 0x61, 0x2d, 0xbc,
  382. 0x49, 0x2c, 0xb8, 0x51, 0x34, 0xdf, 0x20, 0xe4, 0xe9, 0xb7, 0x8a, 0x86,
  383. 0x9b, 0x85, 0xde, 0x4b, 0xbc, 0x5f, 0x1e, 0x58, 0x4b, 0xca, 0x1f, 0x0d,
  384. 0xfa, 0x1f, 0x82, 0xa7, 0x1f, 0xd9, 0x67, 0x2c, 0x7b, 0x24, 0x23, 0xbb,
  385. 0x2f, 0x23, 0xb3, 0xd4, 0x2f, 0xd1, 0x13, 0x6b, 0xf5, 0xf9, 0x1f, 0xac,
  386. 0xff, 0x21, 0x62, 0x80, 0x7c, 0x73, 0x2a, 0x89, 0x9e, 0x5f, 0xab, 0xcf,
  387. 0x7f, 0xb7, 0xbf, 0x42, 0xc5, 0xfe, 0x0e, 0xa3, 0xff, 0xb2, 0xd1, 0x8f,
  388. 0xd7, 0x5f, 0x45, 0x95, 0x16, 0xef, 0x2a, 0x87, 0x4a, 0xbf, 0x6e, 0xda,
  389. 0x88, 0x2f, 0xd9, 0x47, 0x95, 0xe6, 0x1c, 0x70, 0x3c, 0xc7, 0x79, 0x6f,
  390. 0xa7, 0x65, 0x1b, 0xbe, 0x05, 0x59, 0xba, 0x6f, 0xba, 0xbe, 0x0f, 0xd2,
  391. 0xb2, 0xfa, 0x3d, 0xa8, 0x4f, 0x97, 0x4b, 0xcb, 0x64, 0x67, 0x5a, 0x76,
  392. 0xbe, 0x4d, 0xa6, 0xc7, 0x94, 0xd3, 0x99, 0x1e, 0xd3, 0x91, 0xcc, 0x98,
  393. 0xdc, 0x68, 0x91, 0xf7, 0xbd, 0xcf, 0xc8, 0x86, 0x5d, 0xd7, 0x2a, 0xef,
  394. 0xa0, 0xdb, 0xd3, 0xfd, 0xac, 0xec, 0x34, 0xe3, 0x5d, 0xf2, 0x30, 0x79,
  395. 0xe7, 0xe6, 0xab, 0x7b, 0x00, 0xa7, 0xab, 0xd3, 0xf5, 0x2d, 0x79, 0x00,
  396. 0x71, 0x42, 0xfa, 0x1c, 0xeb, 0x7e, 0x2c, 0x4a, 0x97, 0xa9, 0x7f, 0x50,
  397. 0xcd, 0x51, 0xba, 0x0f, 0x4b, 0x32, 0x7d, 0xf8, 0xde, 0x98, 0x39, 0x5f,
  398. 0x95, 0x91, 0xfd, 0x20, 0x23, 0x73, 0x9a, 0xfa, 0xd6, 0xa6, 0x65, 0xf5,
  399. 0xdf, 0x47, 0x74, 0x37, 0xba, 0xdc, 0x59, 0x99, 0x72, 0xf7, 0x67, 0xca,
  400. 0x65, 0x99, 0x72, 0x9f, 0xee, 0xe4, 0x77, 0x86, 0x3c, 0x1f, 0x9f, 0xa5,
  401. 0x90, 0xdb, 0xf8, 0x48, 0x14, 0x6b, 0x90, 0x59, 0xf0, 0x63, 0x35, 0xc8,
  402. 0xdf, 0x40, 0x52, 0x14, 0x4a, 0x9f, 0xac, 0xfa, 0x5b, 0xda, 0x8e, 0x47,
  403. 0x3a, 0xf5, 0xfd, 0x6b, 0xb6, 0x28, 0xe7, 0x99, 0x41, 0x7d, 0xc5, 0xda,
  404. 0x63, 0x1e, 0xf7, 0xf9, 0xab, 0x3e, 0x2c, 0x22, 0xe9, 0xaf, 0xfa, 0x4b,
  405. 0xb1, 0x8a, 0x03, 0xaa, 0xde, 0x2f, 0x86, 0xdf, 0x01, 0xfd, 0x2f, 0x5f,
  406. 0x7d, 0xd5, 0x3b, 0xc5, 0x74, 0x11, 0xf3, 0xbf, 0x23, 0xe1, 0x56, 0xf5,
  407. 0x70, 0x9f, 0xd8, 0xaf, 0xe6, 0x90, 0x8e, 0xd5, 0x7d, 0xa4, 0x3f, 0x0f,
  408. 0x2b, 0x53, 0x32, 0xed, 0x57, 0x2f, 0xee, 0xd4, 0x3e, 0xa9, 0x7b, 0x49,
  409. 0x85, 0xcd, 0x7f, 0x73, 0xc4, 0xc7, 0x39, 0xf1, 0xfa, 0x7f, 0x21, 0x87,
  410. 0xa8, 0xfa, 0x90, 0x32, 0x7b, 0xec, 0x72, 0x33, 0x56, 0xae, 0x67, 0x33,
  411. 0xf6, 0x59, 0x3e, 0x8d, 0xd8, 0xce, 0xab, 0x3b, 0xf5, 0xe7, 0x70, 0x51,
  412. 0xef, 0x45, 0xea, 0x0e, 0xa0, 0xeb, 0x09, 0x54, 0x96, 0x53, 0x03, 0x7a,
  413. 0xc4, 0x34, 0xea, 0x5d, 0x4e, 0x1c, 0x51, 0x2f, 0xc0, 0x2d, 0xbc, 0xea,
  414. 0x7d, 0x1d, 0xd1, 0x12, 0xdd, 0xdc, 0xa9, 0xef, 0x7f, 0x3e, 0x6f, 0x81,
  415. 0x9a, 0x37, 0xae, 0xff, 0xae, 0x4e, 0xdd, 0x46, 0x77, 0xd7, 0x98, 0x7e,
  416. 0x21, 0x27, 0x7e, 0xd6, 0x17, 0xc9, 0x19, 0x34, 0x67, 0x9f, 0xf8, 0xec,
  417. 0x77, 0xa1, 0xbe, 0xf4, 0xfc, 0xdd, 0xd7, 0x99, 0xf6, 0x83, 0x53, 0x47,
  418. 0xd9, 0xf6, 0x87, 0x3a, 0xf5, 0x3d, 0x96, 0x6d, 0x22, 0xf7, 0x6f, 0x92,
  419. 0x98, 0x25, 0xd8, 0x26, 0x7a, 0xc1, 0x4f, 0xa5, 0xd3, 0xcc, 0x5e, 0xd5,
  420. 0xf3, 0xf2, 0x68, 0xa7, 0xfe, 0x1c, 0x91, 0xc7, 0x62, 0x65, 0xc6, 0x12,
  421. 0xf5, 0x5e, 0xaa, 0xe2, 0x0c, 0x1f, 0xee, 0x48, 0xf3, 0xb1, 0xaf, 0x02,
  422. 0x73, 0xa6, 0x20, 0x4a, 0x58, 0x87, 0x32, 0x55, 0x7f, 0xa4, 0x8c, 0x1f,
  423. 0x7e, 0xc1, 0xb4, 0xbf, 0xc1, 0xeb, 0x57, 0x73, 0x2b, 0x8d, 0xdf, 0x7e,
  424. 0xb9, 0x93, 0xdf, 0x43, 0x73, 0x9d, 0xfb, 0xd5, 0x7a, 0xaa, 0x38, 0x09,
  425. 0x63, 0xf6, 0x51, 0xd5, 0xdf, 0x2c, 0x33, 0x17, 0xaf, 0x76, 0x8e, 0xdc,
  426. 0xad, 0xd2, 0xf7, 0xad, 0xa3, 0x9d, 0xf6, 0xfb, 0x96, 0xf6, 0x17, 0xef,
  427. 0x7d, 0xc2, 0xba, 0x5d, 0x6e, 0xd6, 0x2d, 0xad, 0xff, 0xe1, 0x27, 0xe8,
  428. 0x5f, 0x91, 0x59, 0x67, 0xdd, 0x0f, 0x47, 0xd7, 0xd8, 0x7e, 0xe4, 0x8f,
  429. 0x93, 0x57, 0x62, 0xcb, 0xe3, 0x88, 0x8c, 0xcf, 0xdc, 0x94, 0x2e, 0x73,
  430. 0x37, 0xb0, 0x7c, 0x7f, 0xec, 0xee, 0xe7, 0xda, 0x3f, 0x43, 0x2b, 0x9d,
  431. 0xb9, 0xea, 0x3d, 0x58, 0xef, 0xa0, 0x65, 0xa8, 0x83, 0x36, 0x25, 0x5d,
  432. 0x88, 0x40, 0xeb, 0x88, 0x6f, 0xc7, 0x1c, 0x81, 0x6e, 0x1a, 0xcc, 0x42,
  433. 0xda, 0x45, 0x7c, 0x4b, 0x46, 0x5a, 0x6e, 0x4a, 0xb8, 0x8d, 0xae, 0x87,
  434. 0xdf, 0xb5, 0x75, 0x6d, 0x1a, 0x74, 0x42, 0x8e, 0x78, 0xc4, 0xbb, 0x59,
  435. 0xe9, 0x0f, 0x7a, 0xf7, 0xf2, 0x3c, 0xa2, 0x5c, 0x36, 0x62, 0xef, 0x99,
  436. 0xe4, 0xf3, 0xc5, 0x97, 0xb4, 0x50, 0x50, 0xf6, 0x06, 0xcb, 0x29, 0x00,
  437. 0x14, 0x0a, 0x51, 0x59, 0xf5, 0x92, 0x98, 0x53, 0xf5, 0x9e, 0x9e, 0x07,
  438. 0xde, 0x57, 0xa7, 0x77, 0xe9, 0x77, 0x07, 0xe3, 0xcf, 0x43, 0x60, 0x59,
  439. 0x25, 0xc5, 0xd7, 0x7f, 0x89, 0x1c, 0xeb, 0xaa, 0xfe, 0xca, 0xb6, 0x49,
  440. 0xfb, 0xed, 0xe5, 0x27, 0x2d, 0x33, 0x6f, 0xc5, 0xc7, 0x1f, 0xab, 0xf9,
  441. 0x5b, 0xb2, 0x9b, 0x1c, 0x41, 0x2e, 0xe3, 0xe1, 0xf7, 0xfa, 0xd0, 0x5d,
  442. 0xd7, 0xa5, 0x3f, 0xef, 0x0c, 0xec, 0x99, 0x8c, 0xfe, 0xf2, 0xdb, 0x1c,
  443. 0x0f, 0xfa, 0x3e, 0x89, 0xba, 0x2f, 0x82, 0x67, 0x45, 0xac, 0x97, 0x8d,
  444. 0x38, 0x31, 0xea, 0xad, 0x60, 0xea, 0x88, 0x7a, 0xa7, 0x30, 0x75, 0x46,
  445. 0xbd, 0x93, 0x40, 0x73, 0x5c, 0xee, 0x3d, 0xc3, 0x59, 0x5f, 0x30, 0xe7,
  446. 0x81, 0xf7, 0x86, 0x07, 0x6d, 0xb1, 0x8d, 0xfc, 0x74, 0x97, 0xfe, 0x8c,
  447. 0xdf, 0xe7, 0xed, 0x4e, 0xa0, 0x27, 0x1c, 0xe7, 0x0b, 0xc4, 0xf9, 0x42,
  448. 0x47, 0xdb, 0x51, 0xef, 0x30, 0x7a, 0x5c, 0x9d, 0xc5, 0x36, 0x83, 0xe5,
  449. 0x51, 0x6f, 0xa9, 0xa9, 0xb5, 0x84, 0xa9, 0xcb, 0x3d, 0x28, 0xf6, 0x0d,
  450. 0xbb, 0xae, 0xe4, 0xbd, 0xfa, 0x56, 0xac, 0xfe, 0x14, 0xda, 0x9f, 0x0d,
  451. 0x8b, 0xf2, 0x66, 0xd4, 0x9b, 0x42, 0xa9, 0xaa, 0xd7, 0xe1, 0xa8, 0xd4,
  452. 0x58, 0xd9, 0x36, 0x4c, 0x34, 0xb4, 0xc8, 0x20, 0xd7, 0xc4, 0xfc, 0x9f,
  453. 0xe9, 0xd2, 0x9f, 0xd9, 0x16, 0x39, 0x2a, 0xd0, 0x62, 0xf7, 0x5e, 0xf4,
  454. 0xc1, 0xa5, 0xfa, 0xe0, 0x6a, 0x14, 0x16, 0x7a, 0xd0, 0x98, 0x9d, 0x47,
  455. 0xe7, 0x08, 0xdc, 0x6c, 0x96, 0xf2, 0x49, 0x29, 0x86, 0xdd, 0xf1, 0x08,
  456. 0xdf, 0xb4, 0xb9, 0x95, 0x6e, 0x8a, 0x2d, 0x39, 0x95, 0x0e, 0x3d, 0x80,
  457. 0xf6, 0xde, 0xd5, 0xf2, 0xdf, 0xe3, 0xd6, 0x31, 0x01, 0xf2, 0x5c, 0xd1,
  458. 0x20, 0xde, 0xcc, 0xf0, 0x51, 0xff, 0x93, 0xbc, 0x9e, 0x4e, 0xae, 0x99,
  459. 0x7b, 0x9d, 0xc3, 0xbd, 0xbe, 0x48, 0x1c, 0xd4, 0xbd, 0xf6, 0x79, 0xab,
  460. 0x9e, 0xd5, 0x6b, 0xc2, 0xeb, 0x78, 0x7d, 0x97, 0x3e, 0x9f, 0xa3, 0xd7,
  461. 0x44, 0xcf, 0x04, 0xe7, 0xf1, 0xe8, 0x5d, 0xd8, 0x43, 0xf1, 0xf5, 0x07,
  462. 0xb0, 0x9a, 0x28, 0xfb, 0x27, 0x32, 0x9e, 0x86, 0xe8, 0x4e, 0xdb, 0x9e,
  463. 0xcd, 0x36, 0xfe, 0xee, 0x7e, 0xb3, 0xc6, 0xb1, 0x8d, 0xa7, 0x51, 0x60,
  464. 0xd8, 0x5e, 0x2b, 0xdf, 0xf5, 0xf4, 0x19, 0xf9, 0x11, 0xce, 0x08, 0x97,
  465. 0x29, 0x30, 0x6b, 0xfc, 0x24, 0xca, 0xf0, 0xbb, 0xdc, 0xee, 0xe7, 0xa1,
  466. 0x6d, 0xf1, 0x4c, 0x08, 0x4b, 0xad, 0x86, 0x28, 0x10, 0x51, 0x2f, 0xc7,
  467. 0xf2, 0x9e, 0x6c, 0x5e, 0x53, 0xdc, 0x3c, 0xdd, 0xbf, 0xb8, 0xea, 0x63,
  468. 0xd8, 0x73, 0x7e, 0x33, 0xed, 0x13, 0x55, 0x7f, 0xe8, 0x7e, 0x01, 0x33,
  469. 0x88, 0xf1, 0x96, 0xe3, 0x0e, 0xc5, 0xeb, 0xcf, 0x76, 0x94, 0x57, 0x6a,
  470. 0x0a, 0x53, 0x97, 0xfb, 0xf9, 0xe1, 0xac, 0xab, 0x79, 0xc4, 0x85, 0x55,
  471. 0xaf, 0x7c, 0xb2, 0xe6, 0x41, 0xad, 0xf9, 0xf8, 0x27, 0x6b, 0x5e, 0xc3,
  472. 0xb6, 0xd7, 0x3b, 0x99, 0xd3, 0x39, 0xbe, 0xc2, 0x45, 0x93, 0x67, 0x91,
  473. 0xaf, 0x72, 0x7a, 0x79, 0x0b, 0xec, 0xe7, 0xc5, 0xf4, 0x6f, 0xe4, 0x9b,
  474. 0xb4, 0xe0, 0x81, 0x4a, 0xe2, 0x5a, 0xb8, 0x8e, 0xef, 0x70, 0x1d, 0xfe,
  475. 0xa9, 0x4c, 0x85, 0xcf, 0xb9, 0xdc, 0x99, 0xeb, 0xdc, 0xbb, 0xe1, 0xa7,
  476. 0x13, 0xa2, 0x7e, 0xbf, 0xce, 0x29, 0x59, 0xee, 0xca, 0x75, 0xed, 0x1d,
  477. 0xf8, 0x69, 0x49, 0xba, 0xde, 0x97, 0x3d, 0x1e, 0x51, 0xf5, 0x1a, 0xfa,
  478. 0x71, 0x71, 0xb1, 0xe0, 0x0f, 0xaa, 0xbe, 0x77, 0xd5, 0xeb, 0x1e, 0x91,
  479. 0xd5, 0xe8, 0x29, 0xa3, 0x7f, 0x74, 0x04, 0x33, 0x69, 0xe0, 0x63, 0x7b,
  480. 0x7f, 0xfe, 0x37, 0x3d, 0xe1, 0x9a, 0xaa, 0x7e, 0xf5, 0xcf, 0xf7, 0xe0,
  481. 0x6a, 0xd3, 0x83, 0x53, 0xfe, 0xcf, 0x3d, 0xb8, 0x5a, 0xf5, 0x00, 0xcb,
  482. 0x6c, 0xf3, 0xc1, 0xfc, 0xdd, 0x91, 0x3a, 0x43, 0xd9, 0xba, 0xf2, 0xe7,
  483. 0x6d, 0x49, 0xb5, 0xf7, 0xa4, 0x8a, 0xef, 0x5b, 0xd6, 0x69, 0x7f, 0x8f,
  484. 0x3e, 0x22, 0x46, 0xe6, 0xb7, 0x26, 0x93, 0xac, 0x8b, 0x84, 0xaf, 0x78,
  485. 0xfa, 0x72, 0xc4, 0xc8, 0xce, 0xad, 0x2e, 0xc4, 0xc8, 0x2a, 0xde, 0x7d,
  486. 0x14, 0x91, 0x07, 0xdf, 0x71, 0xdd, 0xe8, 0x77, 0x1e, 0xec, 0x42, 0x1e,
  487. 0x47, 0x04, 0xbe, 0xe9, 0xd3, 0x10, 0x21, 0x5b, 0x1c, 0x21, 0x67, 0x21,
  488. 0xee, 0xed, 0x70, 0x48, 0x8b, 0x23, 0xe3, 0x41, 0x59, 0xf5, 0x6e, 0x9e,
  489. 0xac, 0x7a, 0x1b, 0x78, 0x0b, 0x38, 0xca, 0xfb, 0xbd, 0x10, 0x7d, 0x9b,
  490. 0xac, 0xce, 0x33, 0xac, 0xa1, 0x3c, 0xbd, 0xa4, 0xa1, 0xcc, 0x5a, 0x58,
  491. 0xb5, 0xa0, 0xba, 0x79, 0x96, 0xcd, 0x9e, 0xc7, 0xd6, 0x8d, 0x9c, 0x8d,
  492. 0xf4, 0xbb, 0xc7, 0x9d, 0xeb, 0x74, 0x1c, 0xd1, 0x20, 0xdd, 0xea, 0x8d,
  493. 0xd0, 0xdd, 0xfc, 0x99, 0x23, 0xf9, 0x96, 0x54, 0x7d, 0xa4, 0xdf, 0xc9,
  494. 0xf2, 0x98, 0x2e, 0x5a, 0x37, 0x9e, 0xef, 0xd7, 0x9e, 0x1e, 0xe3, 0xaa,
  495. 0x5f, 0x48, 0x7e, 0x11, 0xa8, 0x64, 0x6f, 0xd9, 0xc5, 0x33, 0xf4, 0x3e,
  496. 0x7f, 0xef, 0x97, 0x7f, 0xb4, 0xc7, 0xd4, 0xdf, 0x59, 0xaa, 0x47, 0x5e,
  497. 0x83, 0xc9, 0x4f, 0xff, 0x2c, 0x3f, 0x41, 0x8f, 0xbf, 0x9f, 0xd4, 0x85,
  498. 0xbc, 0x8d, 0x27, 0xe8, 0xf5, 0x9f, 0x90, 0x4e, 0x9d, 0x50, 0xee, 0x1c,
  499. 0x60, 0x0f, 0xf2, 0x2e, 0x3d, 0x21, 0x9f, 0x3f, 0x73, 0x3e, 0x50, 0xa2,
  500. 0xe3, 0x8f, 0x22, 0x44, 0x1c, 0x9c, 0x3f, 0xd5, 0xac, 0x53, 0x39, 0xc6,
  501. 0x56, 0x66, 0x74, 0x05, 0x69, 0x9d, 0xf4, 0x1d, 0x5c, 0x66, 0x90, 0xab,
  502. 0xd2, 0xb9, 0x46, 0x27, 0xfd, 0x3d, 0xa4, 0x79, 0x86, 0xd6, 0x1a, 0x9a,
  503. 0x95, 0xd1, 0xd7, 0xf1, 0x45, 0xad, 0x89, 0x16, 0x38, 0xaf, 0xc2, 0xd4,
  504. 0x79, 0x8a, 0xd1, 0xad, 0x36, 0xf9, 0xb5, 0x66, 0xfe, 0x1b, 0xe1, 0x4d,
  505. 0x39, 0xbf, 0xc9, 0xf4, 0x4b, 0xda, 0xfa, 0xd0, 0x44, 0xcb, 0x49, 0xaf,
  506. 0x6d, 0x3a, 0xad, 0xeb, 0x4f, 0xf7, 0xd3, 0x91, 0xe1, 0xcd, 0x7b, 0x3b,
  507. 0x33, 0x72, 0x69, 0x64, 0xd2, 0xc8, 0x74, 0xdf, 0xa4, 0xa9, 0xdf, 0xad,
  508. 0x62, 0x46, 0x9d, 0xd7, 0x64, 0xe8, 0x62, 0x43, 0x97, 0xaa, 0x1a, 0x2c,
  509. 0x23, 0x67, 0xbb, 0x3f, 0xd2, 0x8e, 0xbe, 0xc3, 0x5a, 0x8a, 0x2e, 0x35,
  510. 0xf3, 0xa5, 0xef, 0xc4, 0x4c, 0xb3, 0x0d, 0xcd, 0x33, 0x65, 0x0b, 0xa9,
  511. 0x46, 0xe9, 0x16, 0xdb, 0xfa, 0x5a, 0x8c, 0xd1, 0x72, 0xca, 0x65, 0xe3,
  512. 0xd3, 0x63, 0x49, 0xaf, 0x45, 0xb9, 0xa1, 0x15, 0x99, 0xf9, 0x5b, 0x6a,
  513. 0xe6, 0xb4, 0x50, 0x7d, 0xae, 0xa1, 0xe7, 0xae, 0xd6, 0xe4, 0x2d, 0x55,
  514. 0x79, 0x0e, 0xb5, 0x26, 0x23, 0x75, 0x35, 0x9a, 0xbc, 0x46, 0xdb, 0xf8,
  515. 0x1b, 0x55, 0x4a, 0x7f, 0xff, 0x88, 0xe9, 0x52, 0xd2, 0xe7, 0x77, 0xa9,
  516. 0xad, 0x1c, 0x63, 0x99, 0xa1, 0x2d, 0x66, 0xac, 0x2c, 0x29, 0xb0, 0xf1,
  517. 0xe9, 0xef, 0x8a, 0x31, 0x37, 0x32, 0xc7, 0x05, 0x99, 0xb5, 0x9b, 0x66,
  518. 0xe4, 0x5e, 0x53, 0xe7, 0x64, 0xd3, 0x4e, 0x6d, 0x46, 0x53, 0xf7, 0xad,
  519. 0x36, 0xa3, 0x2d, 0xb2, 0x49, 0x78, 0x48, 0xe4, 0x91, 0xa8, 0x22, 0x59,
  520. 0xb5, 0x86, 0x10, 0xec, 0x88, 0x66, 0x72, 0x35, 0x87, 0xa3, 0xe1, 0xd4,
  521. 0x99, 0x24, 0xcf, 0x6c, 0x22, 0xc7, 0x99, 0x4d, 0x78, 0xba, 0xf8, 0x39,
  522. 0xb3, 0x87, 0xf2, 0x5a, 0xb6, 0x07, 0xa3, 0xdb, 0x42, 0x67, 0x05, 0x53,
  523. 0x7d, 0xdb, 0x43, 0x09, 0x2a, 0x69, 0x89, 0xed, 0x88, 0xc7, 0xa2, 0xa1,
  524. 0x68, 0xaa, 0x2b, 0x14, 0x4a, 0xf4, 0x84, 0x43, 0x3b, 0x6b, 0xcf, 0x0d,
  525. 0x0e, 0x07, 0xc9, 0xd3, 0x12, 0x8b, 0x46, 0x43, 0x7d, 0xa9, 0x70, 0x2c,
  526. 0x4a, 0x62, 0x25, 0xc9, 0x95, 0xad, 0x24, 0x5a, 0x49, 0xb6, 0xce, 0x04,
  527. 0x5a, 0xc9, 0x6a, 0x6d, 0xe5, 0xc4, 0x1a, 0x30, 0x6b, 0xda, 0xc1, 0xb4,
  528. 0x93, 0x58, 0x43, 0x72, 0x0d, 0xa3, 0x9d, 0x2a, 0xd6, 0x0c, 0xf5, 0x85,
  529. 0x96, 0xf6, 0xf5, 0x85, 0x92, 0xc9, 0xf0, 0xd6, 0x70, 0x24, 0x9c, 0xda,
  530. 0xbd, 0x36, 0xd6, 0x1f, 0xea, 0x4a, 0xc4, 0x86, 0xc3, 0xfd, 0x68, 0xb1,
  531. 0xb4, 0x2d, 0xb4, 0x7b, 0x6b, 0x2c, 0x98, 0xe8, 0x5f, 0x1e, 0x4e, 0xee,
  532. 0x08, 0x27, 0x93, 0xed, 0xe1, 0x64, 0x2a, 0x14, 0x85, 0x40, 0xa0, 0xa6,
  533. 0x76, 0xd4, 0xdd, 0xce, 0x75, 0xb7, 0xa3, 0xee, 0xf6, 0x35, 0xad, 0xe4,
  534. 0xc0, 0x83, 0x93, 0xed, 0x48, 0x2a, 0x21, 0x04, 0x8e, 0x76, 0x96, 0x80,
  535. 0x6d, 0xa7, 0x92, 0xf6, 0x60, 0xb4, 0x3f, 0x11, 0x0b, 0xf7, 0xd7, 0x05,
  536. 0xe3, 0xf1, 0xba, 0xa5, 0xe8, 0xef, 0x30, 0xda, 0x6b, 0xa2, 0xf9, 0xa3,
  537. 0xf3, 0xe3, 0xf1, 0x48, 0xb8, 0x2f, 0xc8, 0x83, 0x99, 0x91, 0xd6, 0x69,
  538. 0x0f, 0x0f, 0x84, 0xfa, 0x76, 0xf7, 0x45, 0x42, 0x2d, 0xc1, 0x48, 0x64,
  539. 0x6b, 0xb0, 0xef, 0xbc, 0x64, 0x13, 0x4d, 0x3c, 0x59, 0x29, 0xbb, 0xa8,
  540. 0x2f, 0x16, 0x45, 0x7f, 0x53, 0x75, 0x2d, 0x4c, 0x77, 0xa5, 0xec, 0xa2,
  541. 0x6d, 0x89, 0x60, 0x7c, 0x7b, 0xb8, 0x2f, 0x59, 0xd7, 0x12, 0x8c, 0x0e,
  542. 0x07, 0x51, 0xe1, 0x94, 0x71, 0x44, 0xb1, 0x48, 0x2c, 0xb1, 0x32, 0x1c,
  543. 0x49, 0x85, 0x12, 0x27, 0x97, 0x77, 0x04, 0x53, 0x89, 0xf0, 0xae, 0x26,
  544. 0x9a, 0xf9, 0x77, 0xe5, 0xa3, 0xaa, 0x2a, 0x1b, 0xab, 0xda, 0x15, 0x0c,
  545. 0x47, 0x53, 0xe3, 0x4b, 0x62, 0x4a, 0x52, 0x3a, 0x56, 0xb2, 0x1e, 0x6b,
  546. 0xde, 0x44, 0x93, 0x32, 0x82, 0x58, 0xb2, 0x6e, 0xd9, 0x50, 0x38, 0xd2,
  547. 0x3f, 0xa3, 0x67, 0xc5, 0xfa, 0xee, 0xd6, 0xce, 0xb5, 0x4d, 0x54, 0x34,
  548. 0x5a, 0x16, 0xed, 0x8f, 0x84, 0x9a, 0xa8, 0xd8, 0x9e, 0xd9, 0xba, 0x2c,
  549. 0x1c, 0xed, 0xe7, 0x3e, 0x8d, 0xd4, 0xcf, 0x33, 0x55, 0xb7, 0xa2, 0x3f,
  550. 0x9c, 0x0a, 0x6e, 0x65, 0xf5, 0xb2, 0xd1, 0x82, 0xee, 0x50, 0x44, 0x6f,
  551. 0x35, 0x7b, 0xcb, 0x5a, 0x12, 0x0f, 0x46, 0xcd, 0x56, 0x1d, 0x5b, 0x0a,
  552. 0xb2, 0xa8, 0xae, 0xef, 0x94, 0x93, 0x48, 0xba, 0x31, 0x4d, 0xd1, 0x6d,
  553. 0x6a, 0x00, 0x5c, 0xc1, 0x09, 0x95, 0x07, 0xf0, 0xc8, 0x54, 0xee, 0xcb,
  554. 0xc8, 0x86, 0x52, 0xe1, 0x08, 0xcf, 0x5d, 0xc2, 0x36, 0xd4, 0x4c, 0x5e,
  555. 0x13, 0xcd, 0xca, 0x64, 0x0e, 0xe3, 0xb4, 0xd4, 0xb5, 0x6c, 0x8f, 0x25,
  556. 0x42, 0x31, 0x35, 0x7f, 0xa1, 0xc4, 0x8c, 0x95, 0x89, 0xe0, 0x8e, 0xcc,
  557. 0x8e, 0x6a, 0xa2, 0xf2, 0xbf, 0xa3, 0x6b, 0x9f, 0x1e, 0x25, 0xc5, 0xb9,
  558. 0x58, 0x31, 0x1c, 0x8a, 0x8e, 0x9a, 0x7e, 0x25, 0xe8, 0x88, 0xf1, 0xdc,
  559. 0x18, 0xd9, 0xcc, 0xd1, 0x32, 0x3e, 0xb1, 0x33, 0x3a, 0xa3, 0x2b, 0x63,
  560. 0x7d, 0x43, 0x49, 0x7d, 0xb2, 0xd3, 0xe7, 0xc9, 0xbe, 0x52, 0x19, 0x55,
  561. 0xfb, 0x24, 0x66, 0x32, 0x57, 0x25, 0x62, 0x43, 0xf1, 0x26, 0x5a, 0x38,
  562. 0x56, 0x12, 0x48, 0x84, 0x42, 0x9d, 0x5b, 0x93, 0xa1, 0xc4, 0x30, 0xc6,
  563. 0xd6, 0x19, 0x5d, 0x15, 0x89, 0x6d, 0x0d, 0x46, 0xda, 0x83, 0xbb, 0x63,
  564. 0x43, 0xa9, 0x91, 0x66, 0xa6, 0xfe, 0xfd, 0x72, 0x4d, 0x34, 0x67, 0xb4,
  565. 0x42, 0xd0, 0x6e, 0x1a, 0xea, 0x46, 0x19, 0x8a, 0x8e, 0x60, 0x34, 0xb8,
  566. 0x8d, 0x8b, 0xcc, 0xfd, 0x87, 0x8b, 0xb0, 0x6d, 0x69, 0x8d, 0x0e, 0xc4,
  567. 0xc6, 0xf4, 0xff, 0x13, 0xca, 0xa4, 0xed, 0x51, 0x13, 0xd5, 0x8e, 0x2e,
  568. 0x17, 0x8e, 0xc6, 0x87, 0x52, 0x3b, 0x42, 0xa9, 0xed, 0xb1, 0xfe, 0xba,
  569. 0x65, 0xc1, 0x24, 0x2a, 0x47, 0x7a, 0xc4, 0x1a, 0xda, 0x37, 0xdb, 0x18,
  570. 0x7d, 0xde, 0xe1, 0xb1, 0x84, 0xee, 0xce, 0xac, 0x93, 0xab, 0x8d, 0xa9,
  571. 0xb2, 0xe6, 0x13, 0x74, 0x3b, 0x14, 0x9f, 0x99, 0x9d, 0xba, 0xf6, 0xbe,
  572. 0xd8, 0x8e, 0xba, 0xc4, 0x8e, 0x64, 0xa4, 0xee, 0x5c, 0xd8, 0xda, 0xba,
  573. 0x31, 0x36, 0x7c, 0xc6, 0x28, 0x23, 0xdf, 0x44, 0xd5, 0x9f, 0x5c, 0xc0,
  574. 0xd6, 0x9b, 0xc5, 0x9f, 0xa8, 0xfd, 0x77, 0x2d, 0x7c, 0x13, 0xad, 0xfc,
  575. 0xc4, 0x0a, 0x4e, 0xe2, 0x03, 0x66, 0x8c, 0xde, 0x38, 0x8d, 0xff, 0xdb,
  576. 0x7a, 0x78, 0xcf, 0x7d, 0x52, 0x51, 0x3e, 0xfd, 0x6a, 0x72, 0x03, 0xc1,
  577. 0xc4, 0xb6, 0x10, 0x4e, 0x56, 0xe5, 0x27, 0x15, 0x69, 0xa2, 0x69, 0xed,
  578. 0xfd, 0xc1, 0xc8, 0x70, 0xf8, 0xbc, 0x3a, 0xd8, 0x97, 0x58, 0x4a, 0xb9,
  579. 0x86, 0xba, 0x15, 0xd1, 0xbe, 0x48, 0x2c, 0x09, 0x33, 0xd3, 0x12, 0x09,
  580. 0x26, 0x95, 0xcd, 0x1f, 0xab, 0xd3, 0x8a, 0xc9, 0x4d, 0x18, 0x79, 0xe5,
  581. 0x38, 0xf2, 0x8e, 0xd0, 0x8e, 0xad, 0x46, 0x21, 0x04, 0x95, 0x8a, 0x71,
  582. 0x54, 0xba, 0xc3, 0xdb, 0xa2, 0xc1, 0xd4, 0x50, 0x42, 0x59, 0x4f, 0x76,
  583. 0xd1, 0x75, 0x11, 0x2c, 0x31, 0x4c, 0x4a, 0x30, 0xd1, 0x1d, 0x1a, 0x1c,
  584. 0x0a, 0x45, 0xfb, 0x20, 0x29, 0xb4, 0x4b, 0x74, 0x73, 0xd3, 0x6c, 0x59,
  585. 0xad, 0x91, 0x48, 0x68, 0x5b, 0x30, 0xa2, 0x57, 0x6e, 0xc5, 0xae, 0xbe,
  586. 0x50, 0x5c, 0x2f, 0xf8, 0x8c, 0x71, 0x74, 0x12, 0xdb, 0x86, 0x76, 0x60,
  587. 0xec, 0x36, 0xad, 0x22, 0xbb, 0x16, 0x7c, 0x9f, 0xda, 0x8a, 0x95, 0xb6,
  588. 0xcc, 0xb5, 0xb1, 0xee, 0xa1, 0xbe, 0xed, 0x7a, 0xaf, 0xda, 0xca, 0xf9,
  589. 0x6c, 0x2a, 0x9d, 0x5b, 0xcf, 0x55, 0x0e, 0xa6, 0xc2, 0x96, 0xd7, 0x1d,
  590. 0xea, 0x1b, 0x4a, 0x60, 0x0f, 0x9d, 0xa4, 0x88, 0xb6, 0xe1, 0x7c, 0x46,
  591. 0x46, 0xf2, 0x12, 0xa1, 0x01, 0xf6, 0x18, 0xe8, 0xc6, 0x70, 0x4c, 0x7b,
  592. 0x68, 0xbd, 0x88, 0xb6, 0x2a, 0x26, 0x8d, 0xa3, 0xae, 0xbb, 0xd6, 0x44,
  593. 0x13, 0xb4, 0x4c, 0x19, 0xf5, 0xa5, 0x89, 0x44, 0x70, 0x37, 0xef, 0x9b,
  594. 0x26, 0x5a, 0x3f, 0x5e, 0x76, 0xf3, 0x58, 0x1f, 0xd0, 0x3c, 0xce, 0x44,
  595. 0x8c, 0x93, 0xa5, 0xc2, 0xae, 0x02, 0x5b, 0x9d, 0x5c, 0x1d, 0x79, 0x4f,
  596. 0xc8, 0x68, 0xa2, 0x8e, 0x13, 0x72, 0xfe, 0x8f, 0x2d, 0xba, 0xbb, 0x97,
  597. 0xb7, 0x9d, 0xdd, 0xba, 0x36, 0x40, 0x8e, 0xc0, 0xa6, 0xae, 0x15, 0x54,
  598. 0x70, 0xc2, 0x3e, 0xa7, 0x5c, 0xfb, 0x19, 0x23, 0xd1, 0x43, 0xb2, 0x07,
  599. 0xc1, 0x54, 0x0f, 0xa2, 0x2c, 0x47, 0x0f, 0x87, 0x75, 0x4e, 0x7e, 0x22,
  600. 0xe4, 0xea, 0x59, 0x43, 0xae, 0x9e, 0x35, 0xad, 0x2b, 0x57, 0x22, 0xe0,
  601. 0xea, 0x59, 0xa3, 0x04, 0x6b, 0x58, 0x60, 0xf5, 0x20, 0xce, 0xc3, 0xa3,
  602. 0x9d, 0xb3, 0x39, 0x2e, 0xeb, 0x59, 0xb3, 0x19, 0xda, 0xcc, 0xb4, 0x73,
  603. 0x1d, 0xed, 0x4a, 0xb5, 0x5d, 0xab, 0x72, 0x18, 0xd7, 0x03, 0x25, 0x64,
  604. 0x70, 0xbe, 0x5b, 0x11, 0xd5, 0x54, 0xbb, 0x2a, 0xda, 0xbe, 0x99, 0xd9,
  605. 0xcd, 0x6b, 0xd4, 0x13, 0xf1, 0x5f, 0xcf, 0x66, 0x34, 0xba, 0x59, 0xa9,
  606. 0x88, 0xcd, 0x64, 0x6d, 0x66, 0x55, 0x3c, 0xda, 0x99, 0x85, 0x18, 0x8a,
  607. 0xce, 0xcd, 0x6b, 0x38, 0xed, 0x00, 0xe1, 0x0c, 0x96, 0xa0, 0x59, 0xd7,
  608. 0xe6, 0x76, 0x95, 0xed, 0x64, 0xca, 0xf9, 0xe8, 0x52, 0x2f, 0xc2, 0xd6,
  609. 0xde, 0x56, 0xf2, 0xf5, 0x8e, 0x3d, 0x14, 0x45, 0xbd, 0xe3, 0xec, 0x49,
  610. 0x8f, 0xf6, 0x18, 0x33, 0xea, 0xeb, 0xeb, 0x33, 0xfc, 0x1c, 0xf0, 0x39,
  611. 0x23, 0xbc, 0x2d, 0x31, 0x4a, 0x32, 0xd7, 0x9e, 0x98, 0x67, 0x4f, 0xcc,
  612. 0xb7, 0x27, 0x16, 0xd8, 0x13, 0x0b, 0xed, 0x89, 0x45, 0xf6, 0x44, 0x83,
  613. 0x3d, 0xd1, 0x68, 0xeb, 0x8d, 0xbd, 0x99, 0xb9, 0xf6, 0x6e, 0xce, 0xb3,
  614. 0xf1, 0xf3, 0x6d, 0xfc, 0x02, 0x1b, 0xbf, 0xd0, 0xc6, 0x2f, 0xb2, 0xf1,
  615. 0x0d, 0x36, 0xbe, 0x71, 0xa4, 0x81, 0x95, 0x91, 0xe0, 0xb6, 0x24, 0xe5,
  616. 0x8d, 0xf2, 0xa2, 0x54, 0x1c, 0x1c, 0xc7, 0x5b, 0x93, 0x2b, 0xa8, 0xef,
  617. 0x09, 0x39, 0x9a, 0xb6, 0x07, 0xb7, 0x86, 0x22, 0x94, 0x15, 0x34, 0x81,
  618. 0x36, 0x59, 0xc1, 0xfe, 0x7e, 0x9a, 0x88, 0xc7, 0xf8, 0x01, 0x04, 0x39,
  619. 0x83, 0x03, 0x88, 0x60, 0xc9, 0xab, 0x08, 0xef, 0x56, 0xed, 0xbc, 0xfa,
  620. 0x29, 0x3b, 0x68, 0x8c, 0x50, 0x92, 0xc4, 0x56, 0x2a, 0xe4, 0x90, 0x6a,
  621. 0xd9, 0x50, 0x2a, 0x15, 0x8b, 0x76, 0x25, 0xd0, 0x09, 0x28, 0xb8, 0xb6,
  622. 0x86, 0x06, 0x10, 0x51, 0x41, 0xa4, 0xa8, 0xbd, 0xac, 0x6b, 0x6b, 0x0c,
  623. 0x9a, 0x3b, 0x40, 0x55, 0x84, 0x4a, 0xae, 0xbe, 0x20, 0x5c, 0x61, 0x3f,
  624. 0x79, 0x35, 0xb5, 0xdd, 0x6e, 0x20, 0xe1, 0x60, 0x9d, 0xf2, 0xfa, 0x46,
  625. 0x5d, 0x8c, 0xdc, 0x7d, 0xa6, 0x26, 0x27, 0xee, 0x08, 0xc1, 0x04, 0x15,
  626. 0xb0, 0x95, 0x0f, 0xd9, 0xca, 0x95, 0xaa, 0x0c, 0x9b, 0x7b, 0x36, 0x17,
  627. 0x02, 0x72, 0xf4, 0xc1, 0x19, 0x52, 0x0e, 0x3f, 0x55, 0x9c, 0xbd, 0x34,
  628. 0x45, 0xf9, 0x99, 0x44, 0x4b, 0x6c, 0x28, 0x9a, 0x62, 0x61, 0x26, 0x8a,
  629. 0x67, 0x21, 0x12, 0x81, 0x44, 0x30, 0x9a, 0xc4, 0x28, 0x76, 0xa0, 0x23,
  630. 0xa8, 0x08, 0xa1, 0x7b, 0x52, 0x15, 0xa0, 0x62, 0x73, 0xe1, 0x48, 0x2e,
  631. 0x53, 0x83, 0xd4, 0x03, 0x44, 0xf7, 0x4c, 0x6b, 0xce, 0x3e, 0x55, 0xe3,
  632. 0xe4, 0xbe, 0x44, 0x28, 0x98, 0x1a, 0xeb, 0x94, 0x39, 0x16, 0x21, 0x47,
  633. 0x7f, 0x78, 0x60, 0x80, 0xdc, 0xfd, 0x31, 0x15, 0x9e, 0x92, 0x08, 0x51,
  634. 0x56, 0xc8, 0xc4, 0xe2, 0xe4, 0x49, 0x73, 0xad, 0x51, 0xb2, 0x42, 0xd1,
  635. 0x7e, 0x88, 0xa2, 0xfd, 0xc9, 0xb3, 0xc2, 0xa9, 0xed, 0xe4, 0x0c, 0x71,
  636. 0xc8, 0x49, 0xfe, 0x01, 0x84, 0xf3, 0xe3, 0x56, 0x9c, 0x5c, 0xb6, 0x9b,
  637. 0xe7, 0x9c, 0xb2, 0x59, 0x43, 0x85, 0xa0, 0x54, 0x04, 0x36, 0x9c, 0xdc,
  638. 0xae, 0x7c, 0x27, 0x3b, 0x45, 0x25, 0x77, 0x0e, 0x28, 0x59, 0xee, 0xc0,
  639. 0x48, 0x94, 0xda, 0x4f, 0x39, 0x2a, 0xc5, 0x7e, 0xb5, 0xb5, 0x9f, 0xdc,
  640. 0x2a, 0x81, 0xdc, 0xfc, 0x01, 0xee, 0x62, 0x20, 0xbc, 0x23, 0xb4, 0x36,
  641. 0x18, 0x8d, 0x25, 0xc9, 0x33, 0x30, 0x14, 0x89, 0xe8, 0xb0, 0x8a, 0x26,
  642. 0xc3, 0x7c, 0x8d, 0xea, 0xc7, 0x4a, 0x5b, 0x0d, 0xe5, 0x27, 0x0a, 0x47,
  643. 0x5d, 0x3a, 0xb3, 0x95, 0x54, 0xad, 0x5b, 0x41, 0x86, 0xed, 0x08, 0x26,
  644. 0xcf, 0x43, 0x93, 0x13, 0x38, 0x63, 0xe4, 0xae, 0x97, 0x5e, 0x46, 0x2f,
  645. 0xb2, 0x5b, 0x82, 0x89, 0x50, 0xaa, 0x0b, 0x03, 0x51, 0x25, 0x8b, 0x39,
  646. 0x07, 0xfe, 0xb6, 0x15, 0xb7, 0x9b, 0x5d, 0x2b, 0x63, 0x09, 0xbd, 0x3e,
  647. 0x79, 0x26, 0x17, 0xfb, 0x3d, 0x94, 0x48, 0x52, 0x16, 0x27, 0xd9, 0xca,
  648. 0x50, 0x11, 0x73, 0xe9, 0x79, 0xe0, 0x2b, 0xc9, 0x8a, 0xa8, 0x6e, 0x6c,
  649. 0x54, 0x66, 0x77, 0x2a, 0x98, 0x48, 0x91, 0x47, 0x65, 0xeb, 0x86, 0x73,
  650. 0xd8, 0x91, 0xa5, 0x97, 0x27, 0x97, 0x13, 0xbc, 0x0c, 0x3c, 0x25, 0x34,
  651. 0x11, 0xa9, 0x95, 0x7a, 0xa6, 0x4e, 0x34, 0xeb, 0xfe, 0x93, 0x8a, 0x54,
  652. 0x37, 0xcd, 0x1c, 0xac, 0x0e, 0x85, 0xb7, 0x6d, 0x4f, 0xa9, 0x7a, 0x56,
  653. 0x83, 0x8b, 0x70, 0x2a, 0xd4, 0xbf, 0x3e, 0xb4, 0x0d, 0xe3, 0x5b, 0x86,
  654. 0x27, 0xb6, 0xf5, 0x78, 0x22, 0xee, 0x39, 0x0f, 0x47, 0xd5, 0x6a, 0x9f,
  655. 0xf5, 0x09, 0xe9, 0xcc, 0x51, 0x11, 0x2a, 0x9d, 0x9a, 0xce, 0x0e, 0xec,
  656. 0x8e, 0x87, 0x30, 0x53, 0x1c, 0x2f, 0xf6, 0x84, 0x13, 0xa9, 0xa1, 0x60,
  657. 0x24, 0x1d, 0xb1, 0xb1, 0x44, 0x0d, 0xb5, 0x35, 0x9a, 0x4c, 0x05, 0x11,
  658. 0xbd, 0xa8, 0x85, 0x19, 0x25, 0xe5, 0x16, 0xdb, 0x8d, 0x7f, 0xef, 0x8c,
  659. 0x76, 0x63, 0x87, 0x87, 0xa2, 0x6a, 0x42, 0xd0, 0x58, 0x10, 0xf3, 0x96,
  660. 0x0a, 0xa9, 0x31, 0xe9, 0xa6, 0xd5, 0x3a, 0xac, 0x85, 0xee, 0x70, 0x88,
  661. 0xfb, 0xa6, 0x6a, 0x33, 0x23, 0xd7, 0x67, 0x2e, 0x77, 0x24, 0x83, 0x37,
  662. 0x1c, 0x52, 0xeb, 0x83, 0x3b, 0x37, 0xa6, 0x99, 0x4d, 0xaa, 0x2f, 0xeb,
  663. 0x63, 0xb1, 0x54, 0xa6, 0x74, 0xe6, 0x56, 0xca, 0xa3, 0x2f, 0xb4, 0x67,
  664. 0xe8, 0x35, 0xe3, 0x0d, 0xd2, 0xbd, 0x1b, 0x46, 0x6c, 0x47, 0x37, 0x7c,
  665. 0x69, 0x18, 0x23, 0xc8, 0x47, 0x8e, 0x9e, 0xfc, 0xf5, 0xea, 0x90, 0xb2,
  666. 0x46, 0x00, 0x01, 0x5c, 0x64, 0xed, 0xd0, 0x0e, 0xde, 0x22, 0x7a, 0x4f,
  667. 0x6c, 0xe0, 0xcb, 0x71, 0x24, 0x1c, 0xc5, 0xe4, 0xb2, 0x56, 0x52, 0x15,
  668. 0xdb, 0x10, 0x0d, 0xb3, 0x8d, 0x60, 0x2d, 0xa5, 0x74, 0xe2, 0x2d, 0x4a,
  669. 0x0d, 0xaf, 0x27, 0x9c, 0xb1, 0xc4, 0x5c, 0xe6, 0x2c, 0x9c, 0xba, 0xd8,
  670. 0xce, 0x40, 0xec, 0x3c, 0x4c, 0x4b, 0x79, 0x26, 0xad, 0x94, 0x22, 0x21,
  671. 0x44, 0xc4, 0xf1, 0x48, 0x70, 0xb7, 0x3e, 0xf1, 0x0e, 0x48, 0x37, 0xaa,
  672. 0xe7, 0x26, 0x12, 0xdb, 0xa9, 0x0c, 0x47, 0x10, 0x46, 0x71, 0xd4, 0x71,
  673. 0x59, 0x1d, 0xe3, 0x56, 0x0a, 0x8c, 0x24, 0x1e, 0xef, 0x0a, 0xaa, 0xf3,
  674. 0xe8, 0xcd, 0x64, 0xac, 0x0f, 0x25, 0x61, 0x8c, 0x33, 0x39, 0xcb, 0x32,
  675. 0xd6, 0x98, 0xf2, 0x74, 0xce, 0x72, 0x63, 0x5e, 0x4c, 0x12, 0x4b, 0xb9,
  676. 0x3c, 0xb6, 0x13, 0x5e, 0x21, 0x93, 0xdc, 0x10, 0xa7, 0xe2, 0x4c, 0x42,
  677. 0x2d, 0xf3, 0xea, 0x70, 0x7f, 0x3f, 0x3a, 0x6f, 0x5a, 0xed, 0x88, 0xa1,
  678. 0x49, 0x55, 0x66, 0x54, 0x46, 0x22, 0xb8, 0x2d, 0x5d, 0xa7, 0xca, 0x40,
  679. 0x35, 0xa6, 0x4e, 0xf5, 0x82, 0x83, 0x8a, 0x4c, 0x22, 0x94, 0x60, 0xf3,
  680. 0x69, 0x4e, 0x79, 0xd6, 0xf6, 0x60, 0x52, 0x5b, 0xa4, 0xdc, 0xed, 0xb0,
  681. 0x00, 0xe9, 0x06, 0xa9, 0x94, 0x53, 0xdd, 0xb1, 0x01, 0xb3, 0x95, 0x13,
  682. 0xb1, 0x1d, 0x7a, 0xd6, 0x50, 0x00, 0x75, 0x29, 0x6b, 0xe5, 0xd8, 0x1e,
  683. 0x43, 0x9c, 0x26, 0xc2, 0xe4, 0xc1, 0x91, 0xeb, 0x54, 0xe1, 0x64, 0x92,
  684. 0xac, 0xf0, 0x8e, 0x1d, 0x54, 0xc0, 0x2f, 0xd5, 0xc2, 0xc1, 0x48, 0x4b,
  685. 0x30, 0x9e, 0xec, 0x60, 0x23, 0x9f, 0x67, 0x32, 0xb0, 0x33, 0x78, 0x93,
  686. 0x14, 0x8c, 0x24, 0xf5, 0x16, 0xc9, 0x31, 0x19, 0xda, 0x4a, 0x86, 0xd3,
  687. 0x27, 0x82, 0x72, 0x15, 0x7b, 0xb6, 0xbe, 0xe2, 0x51, 0x21, 0x6c, 0x7d,
  688. 0x28, 0xa1, 0x1a, 0x5f, 0xaa, 0x4d, 0x0e, 0x65, 0xa1, 0x33, 0x3d, 0xc1,
  689. 0xc8, 0x10, 0x1c, 0x57, 0x18, 0x31, 0xee, 0x79, 0xb0, 0xd3, 0xe1, 0x64,
  690. 0xe6, 0xa4, 0x64, 0x85, 0x93, 0x9d, 0xf1, 0x20, 0x82, 0x7e, 0x14, 0x4d,
  691. 0x66, 0x4e, 0xbb, 0x7a, 0xb3, 0x05, 0x1b, 0x81, 0xac, 0x18, 0xe2, 0xf0,
  692. 0x15, 0xbb, 0xe2, 0x70, 0x2b, 0x41, 0xbd, 0x81, 0xd9, 0x96, 0xc0, 0xa1,
  693. 0x86, 0x93, 0x66, 0x77, 0x90, 0xfb, 0xbc, 0xd0, 0xee, 0x16, 0x1e, 0x42,
  694. 0xe9, 0x79, 0x27, 0x79, 0x1d, 0x97, 0x97, 0x16, 0x74, 0x6f, 0xe7, 0x25,
  695. 0x71, 0x46, 0x94, 0x5b, 0xcf, 0xc3, 0x9e, 0x82, 0x97, 0xc6, 0x20, 0xd6,
  696. 0xe2, 0x6e, 0x44, 0x8e, 0x48, 0x68, 0x20, 0x45, 0xae, 0x48, 0x28, 0xba,
  697. 0x0d, 0x0e, 0xc3, 0x11, 0xe1, 0x08, 0xd7, 0x65, 0x86, 0x25, 0xa2, 0xe4,
  698. 0x88, 0xf2, 0x86, 0xf0, 0x44, 0x47, 0x8e, 0xa5, 0x23, 0xca, 0x3e, 0xc6,
  699. 0x1d, 0x0d, 0xed, 0x5c, 0xcb, 0x22, 0x66, 0xd4, 0xe4, 0x64, 0x45, 0xd3,
  700. 0xce, 0x2a, 0x37, 0x6a, 0x37, 0xdc, 0x2e, 0x1e, 0x33, 0x66, 0xd2, 0x15,
  701. 0xdb, 0xca, 0x3e, 0x91, 0x1c, 0x31, 0x2e, 0xef, 0x8b, 0x0d, 0x0c, 0x24,
  702. 0x43, 0xa9, 0x65, 0x6a, 0x08, 0xea, 0x50, 0x27, 0x21, 0x89, 0xf4, 0x6f,
  703. 0x57, 0xcf, 0x9d, 0x54, 0x18, 0x8b, 0xa6, 0xdf, 0xf3, 0xb5, 0x28, 0xbf,
  704. 0x08, 0xf3, 0x35, 0x92, 0xb5, 0x3c, 0x94, 0x4c, 0x25, 0x62, 0xbb, 0x79,
  705. 0x2f, 0x8f, 0x64, 0x9a, 0xfd, 0x6e, 0x2b, 0x99, 0xde, 0xf0, 0x93, 0x47,
  706. 0xb2, 0xba, 0x83, 0xc3, 0xa1, 0xf4, 0x2a, 0x68, 0x03, 0x64, 0xd3, 0x57,
  707. 0x4b, 0x3e, 0xba, 0x8a, 0xee, 0x54, 0x2c, 0x1e, 0x47, 0x56, 0x29, 0xdc,
  708. 0x8a, 0xea, 0xc7, 0x09, 0x37, 0x7f, 0x0c, 0x2b, 0x8a, 0xfd, 0xbd, 0x93,
  709. 0xf2, 0x62, 0xf6, 0x57, 0x38, 0x94, 0x1f, 0x1b, 0x15, 0x2a, 0x51, 0x6e,
  710. 0x2c, 0xaa, 0xce, 0xa7, 0xf2, 0x04, 0x94, 0x1d, 0x8b, 0xa6, 0x0f, 0x57,
  711. 0x9e, 0x62, 0x3b, 0x86, 0x22, 0xa9, 0x70, 0x9c, 0x57, 0x55, 0x25, 0x71,
  712. 0x40, 0xb2, 0x38, 0x0c, 0x53, 0x45, 0xa1, 0xd1, 0x1d, 0x3e, 0x3f, 0x94,
  713. 0xf1, 0xba, 0x48, 0xc2, 0xeb, 0x2c, 0xc5, 0xb9, 0xeb, 0x57, 0x32, 0x24,
  714. 0xd2, 0x32, 0x93, 0x5c, 0x1f, 0xda, 0x81, 0xb6, 0x54, 0xd2, 0x1e, 0x51,
  715. 0xa1, 0x0f, 0x7a, 0x5f, 0xa9, 0x3e, 0xb8, 0x62, 0x7a, 0x03, 0xba, 0x35,
  716. 0x3d, 0x1b, 0x19, 0x7a, 0xa1, 0xb2, 0xd0, 0xe8, 0xd2, 0x54, 0x0a, 0xb6,
  717. 0xce, 0x89, 0x0e, 0x72, 0x78, 0x17, 0x57, 0xa7, 0x94, 0x09, 0x32, 0x3d,
  718. 0x71, 0xec, 0xef, 0xa8, 0x36, 0xb2, 0x79, 0xf1, 0x51, 0x47, 0xd6, 0x19,
  719. 0x57, 0xfe, 0xb4, 0x22, 0x1e, 0x8b, 0x0f, 0x45, 0x4e, 0x1a, 0xcb, 0x14,
  720. 0xc2, 0x75, 0xa6, 0x46, 0xbd, 0x66, 0x23, 0x2b, 0x9e, 0xc2, 0x45, 0x06,
  721. 0x21, 0x5b, 0x42, 0xbf, 0xd1, 0xa5, 0x69, 0x09, 0x78, 0x2d, 0x6c, 0xe3,
  722. 0xc4, 0xc9, 0x5f, 0xf6, 0x52, 0x79, 0x42, 0x0d, 0xf3, 0x24, 0x31, 0xa9,
  723. 0x47, 0x4b, 0x79, 0x3a, 0x28, 0x17, 0xd1, 0x26, 0x0f, 0x4d, 0xad, 0x1d,
  724. 0x39, 0x13, 0xca, 0x83, 0x0a, 0x18, 0x96, 0xa4, 0xdd, 0x41, 0xe4, 0x27,
  725. 0x47, 0x7b, 0x07, 0x0b, 0xfb, 0x93, 0x33, 0x53, 0xb6, 0xb7, 0xb4, 0x5c,
  726. 0x44, 0xbb, 0x4f, 0xe5, 0xdb, 0x4b, 0xed, 0xa9, 0x56, 0x3d, 0xbb, 0xca,
  727. 0xac, 0x14, 0x27, 0xc7, 0xf1, 0xc1, 0x54, 0x84, 0xdc, 0xd6, 0x1d, 0x1c,
  728. 0x82, 0xf2, 0xbe, 0x4c, 0xea, 0xee, 0x70, 0x8d, 0xed, 0xe9, 0x23, 0x49,
  729. 0x65, 0x48, 0x8d, 0xfb, 0x32, 0x50, 0xe9, 0x65, 0xfc, 0x17, 0xb9, 0x39,
  730. 0xc5, 0x63, 0x9b, 0x90, 0x4c, 0xfb, 0xb0, 0x0d, 0x61, 0x9b, 0x77, 0x99,
  731. 0x3c, 0x6e, 0x36, 0xc7, 0x2d, 0xc1, 0x94, 0xea, 0x76, 0x20, 0x84, 0x10,
  732. 0x26, 0x11, 0x4c, 0xec, 0x4e, 0x3b, 0x33, 0x44, 0x33, 0x94, 0x93, 0xd4,
  733. 0x7e, 0x4b, 0x9d, 0xec, 0xbc, 0xe4, 0x28, 0x7f, 0xe5, 0x49, 0x27, 0x31,
  734. 0x6e, 0x9e, 0x95, 0xb3, 0xc2, 0x91, 0xc8, 0xda, 0x58, 0x4a, 0x6d, 0xfe,
  735. 0xdc, 0x24, 0x2c, 0x4c, 0xc6, 0x42, 0xe7, 0x71, 0x2a, 0x63, 0xa1, 0xc9,
  736. 0xa9, 0xb7, 0x55, 0xbe, 0x22, 0x7a, 0x38, 0xdc, 0x56, 0x5e, 0x12, 0x47,
  737. 0x6b, 0x24, 0xe9, 0x4a, 0xaa, 0xb7, 0x04, 0xe8, 0xc2, 0xd0, 0xd6, 0xf4,
  738. 0xeb, 0x10, 0xca, 0x46, 0xc2, 0xe4, 0x97, 0x25, 0xf5, 0x68, 0x5a, 0x47,
  739. 0xba, 0x64, 0xc2, 0x06, 0x57, 0x4a, 0xc7, 0x4f, 0x59, 0x9a, 0x22, 0x0a,
  740. 0x76, 0xa8, 0x28, 0x6c, 0x6a, 0x6a, 0x74, 0x14, 0xb5, 0xea, 0xc4, 0x68,
  741. 0x70, 0xfa, 0x38, 0x0a, 0x63, 0x82, 0xc3, 0xaa, 0xb1, 0x4a, 0x27, 0x89,
  742. 0xbb, 0x4e, 0xfd, 0x07, 0x34, 0x79, 0x9f, 0x4d, 0x19, 0xab, 0x37, 0x2a,
  743. 0x68, 0xaa, 0x18, 0x2b, 0xb7, 0x87, 0x24, 0xe3, 0x0c, 0x6b, 0x74, 0x84,
  744. 0xe2, 0x3f, 0x41, 0xa1, 0x75, 0x8c, 0x6f, 0x1a, 0xa3, 0x31, 0xc6, 0x05,
  745. 0x9d, 0x38, 0x35, 0xdd, 0xe3, 0x6d, 0xe7, 0x13, 0x07, 0xdc, 0x7d, 0x92,
  746. 0x5d, 0xe5, 0x48, 0x6d, 0x0f, 0x27, 0xb1, 0x4c, 0x78, 0xce, 0xa8, 0x37,
  747. 0x74, 0x0e, 0x72, 0x39, 0x1e, 0xce, 0x4a, 0xc5, 0xf4, 0xeb, 0x21, 0xb2,
  748. 0xb0, 0x1d, 0x90, 0xc9, 0x33, 0x50, 0x39, 0x14, 0xef, 0x87, 0xf9, 0x48,
  749. 0x87, 0xd0, 0x99, 0x5d, 0xcf, 0xce, 0xde, 0x04, 0xcb, 0x33, 0xb5, 0x8a,
  750. 0x4e, 0x99, 0x70, 0x9c, 0x55, 0x74, 0x40, 0xc6, 0x8a, 0x99, 0x00, 0x7c,
  751. 0x8a, 0x5d, 0x75, 0x1c, 0x79, 0xa5, 0x5d, 0x3e, 0xaa, 0xad, 0x8c, 0x4a,
  752. 0xd6, 0x50, 0x6a, 0xa0, 0x41, 0x45, 0x76, 0x62, 0x98, 0x9c, 0xc3, 0xca,
  753. 0xad, 0xbb, 0x15, 0xe9, 0x1c, 0x20, 0x07, 0xbf, 0xf1, 0x25, 0x17, 0x3f,
  754. 0xb1, 0xf7, 0x0a, 0x98, 0xda, 0xed, 0x75, 0x36, 0x67, 0x04, 0x62, 0x1b,
  755. 0x92, 0x88, 0x26, 0x87, 0x4f, 0x8c, 0x09, 0x8b, 0x86, 0xc7, 0x89, 0xa9,
  756. 0xf3, 0x4c, 0xa6, 0x89, 0xd0, 0x3d, 0xc3, 0x23, 0x87, 0x50, 0xc0, 0xff,
  757. 0xee, 0xdc, 0x8e, 0x23, 0x2c, 0x76, 0x91, 0xdc, 0x55, 0x0f, 0xcc, 0x01,
  758. 0xe6, 0x02, 0xf3, 0x80, 0xf9, 0x24, 0x76, 0xd3, 0x4d, 0x0e, 0xeb, 0xbb,
  759. 0xd6, 0x2f, 0xc4, 0x35, 0x96, 0x3b, 0xbf, 0xb9, 0xa6, 0xa6, 0x76, 0x17,
  760. 0xed, 0x71, 0x8a, 0x17, 0x85, 0xbb, 0xa2, 0xcd, 0x92, 0x97, 0x5b, 0xb2,
  761. 0xdd, 0xa2, 0x97, 0x84, 0x6c, 0x9b, 0x3e, 0xb1, 0xdd, 0xb2, 0xbe, 0x68,
  762. 0x35, 0x6f, 0x76, 0x88, 0xdf, 0xca, 0xc5, 0x03, 0xf4, 0xa6, 0x43, 0xbe,
  763. 0x28, 0x0e, 0x5a, 0xac, 0x25, 0x32, 0x5a, 0xeb, 0xa0, 0x24, 0xa1, 0xd4,
  764. 0xb6, 0x9a, 0xae, 0x74, 0x42, 0x7e, 0x35, 0xaa, 0xdc, 0x45, 0x07, 0xd3,
  765. 0x6c, 0x73, 0x33, 0xbd, 0xef, 0xd0, 0xfc, 0xa8, 0x62, 0x5d, 0x93, 0xda,
  766. 0x74, 0xb1, 0x56, 0x7a, 0xc8, 0x21, 0xfe, 0x24, 0xdd, 0xf9, 0xf4, 0x63,
  767. 0x87, 0xe3, 0x4f, 0x68, 0xfd, 0x59, 0xf1, 0x7d, 0xe1, 0xce, 0x0f, 0xd3,
  768. 0xb7, 0x1c, 0x8e, 0x83, 0xd6, 0x11, 0xeb, 0x72, 0xeb, 0x25, 0xc1, 0x35,
  769. 0xde, 0xe7, 0x70, 0x71, 0xf2, 0xd7, 0xf2, 0x71, 0xf9, 0x13, 0xf9, 0x23,
  770. 0xc9, 0x59, 0x77, 0x8f, 0xd6, 0x78, 0x42, 0x97, 0xff, 0x81, 0x78, 0x16,
  771. 0x03, 0x91, 0x13, 0x2f, 0x91, 0xe7, 0x56, 0xdc, 0x6e, 0x89, 0x1f, 0xcb,
  772. 0xe6, 0xa9, 0x16, 0x3d, 0x2e, 0xe4, 0xc7, 0xb5, 0xfb, 0x6b, 0x1f, 0x6d,
  773. 0x3d, 0x43, 0xe4, 0x3b, 0xc5, 0x92, 0x9a, 0xdb, 0x77, 0xd1, 0xcd, 0x4e,
  774. 0x4c, 0xc1, 0xeb, 0xe9, 0x29, 0xa0, 0x9f, 0x38, 0xc9, 0x5d, 0xb1, 0x7f,
  775. 0x77, 0x4d, 0xed, 0xb9, 0x67, 0x84, 0xbb, 0x26, 0xd3, 0x37, 0x39, 0xd9,
  776. 0x26, 0xf3, 0xaa, 0xe5, 0x50, 0x45, 0xdb, 0xee, 0xb0, 0x25, 0x1e, 0x90,
  777. 0x32, 0x6c, 0xd1, 0x9d, 0xb2, 0xf9, 0x82, 0x17, 0xde, 0xa3, 0x7d, 0x6e,
  778. 0x49, 0xf7, 0xa0, 0xe0, 0xe6, 0x1a, 0xba, 0xdc, 0x2d, 0xbe, 0x67, 0xb9,
  779. 0x9b, 0xe4, 0xe4, 0xe7, 0xe5, 0xf6, 0x8a, 0xc7, 0x2c, 0xfa, 0xa1, 0x9c,
  780. 0x52, 0xf3, 0xa9, 0xf6, 0xcf, 0x5a, 0xe2, 0x51, 0x39, 0xfd, 0x8d, 0xb6,
  781. 0x76, 0xb9, 0xab, 0xc2, 0x29, 0x84, 0xcb, 0x25, 0xe8, 0x2e, 0xb7, 0x3c,
  782. 0x68, 0x41, 0x35, 0x9f, 0xee, 0x71, 0x8b, 0x57, 0xd0, 0xc5, 0xa7, 0xe4,
  783. 0xf9, 0x15, 0x7f, 0xb4, 0xe8, 0x55, 0xd1, 0x50, 0x73, 0xb5, 0x93, 0xe8,
  784. 0x11, 0x37, 0xa4, 0x77, 0x8b, 0x23, 0x18, 0xcb, 0xa3, 0x53, 0xe9, 0x3d,
  785. 0x4b, 0x10, 0xea, 0x6f, 0xa6, 0xbf, 0x58, 0xe4, 0xae, 0xee, 0xb5, 0xe4,
  786. 0xbb, 0x32, 0xff, 0x32, 0x4b, 0x1c, 0x95, 0x53, 0x6a, 0x77, 0xfd, 0xd5,
  787. 0xa2, 0xe7, 0x85, 0x3c, 0xb7, 0x59, 0x14, 0x16, 0x86, 0x9b, 0x65, 0xb2,
  788. 0xc2, 0x49, 0xcd, 0x22, 0xc7, 0x45, 0xf4, 0x1f, 0x96, 0xee, 0x95, 0x5c,
  789. 0xb4, 0x49, 0xae, 0xd9, 0x59, 0x43, 0xaf, 0xa0, 0xd7, 0xdc, 0xde, 0x89,
  790. 0xf4, 0x4d, 0x54, 0x99, 0x7f, 0x98, 0xde, 0xd2, 0xe4, 0x5a, 0x29, 0xde,
  791. 0xe4, 0xe9, 0xbf, 0x51, 0x22, 0x49, 0x37, 0x49, 0xf1, 0x16, 0xa7, 0xbe,
  792. 0xa2, 0x52, 0xd7, 0xa9, 0xe7, 0xd7, 0xd5, 0xf3, 0x06, 0x29, 0xef, 0x17,
  793. 0x3f, 0x47, 0xef, 0xe8, 0x6b, 0x2a, 0xfd, 0x55, 0xc9, 0x7b, 0x21, 0x9f,
  794. 0x0e, 0xa9, 0xd4, 0xf5, 0x19, 0xe9, 0xcd, 0x52, 0x90, 0xc3, 0xfa, 0x81,
  795. 0x5c, 0x12, 0x46, 0x62, 0xb5, 0xf5, 0x8c, 0x78, 0x43, 0xde, 0x2c, 0xdd,
  796. 0xd5, 0xf2, 0x3f, 0xa9, 0x49, 0xfe, 0x5e, 0xee, 0x94, 0x77, 0x5b, 0x3b,
  797. 0x77, 0xc9, 0x8f, 0x77, 0xbd, 0x76, 0xa9, 0x90, 0x4e, 0xcf, 0xb2, 0x9a,
  798. 0xe6, 0xda, 0xe6, 0xe6, 0x33, 0x7b, 0x2d, 0x7a, 0x52, 0x78, 0x2e, 0xb4,
  799. 0xc4, 0x53, 0xa2, 0xa5, 0xf9, 0xf6, 0x4a, 0xcb, 0x7a, 0x50, 0x9e, 0x29,
  800. 0x4a, 0x4b, 0xeb, 0xa7, 0x58, 0xf2, 0x88, 0x94, 0x32, 0x4f, 0x14, 0xe6,
  801. 0x3b, 0xe5, 0x2e, 0xb9, 0x06, 0x43, 0x75, 0x0a, 0xa7, 0xe5, 0xf2, 0xc8,
  802. 0xfa, 0x5b, 0x9d, 0x1e, 0x17, 0xb9, 0x84, 0x4b, 0xba, 0xac, 0x99, 0x33,
  803. 0xe5, 0x50, 0xb5, 0x53, 0xce, 0x94, 0x89, 0x6a, 0x6a, 0xd1, 0x43, 0x4c,
  804. 0x13, 0xf9, 0x80, 0xf5, 0x83, 0x71, 0xd3, 0x16, 0x33, 0x0f, 0x2a, 0xd6,
  805. 0xa1, 0xd9, 0x87, 0x46, 0x2b, 0x9c, 0x58, 0xd2, 0x99, 0xd6, 0x7a, 0xf8,
  806. 0xc4, 0xf2, 0x36, 0xf6, 0xc4, 0x42, 0xe3, 0xf7, 0xe2, 0x88, 0x14, 0x98,
  807. 0x91, 0xfc, 0x36, 0x8b, 0xde, 0x91, 0x16, 0x3d, 0x26, 0xc5, 0xed, 0xbc,
  808. 0x68, 0x53, 0x9a, 0x64, 0xa8, 0xba, 0xb3, 0x6e, 0xf1, 0xda, 0xb5, 0xb5,
  809. 0x72, 0xdb, 0x1a, 0xba, 0x9a, 0x57, 0xe7, 0x0b, 0xe5, 0xf4, 0x05, 0xde,
  810. 0x07, 0x6d, 0xf4, 0x36, 0xcf, 0x32, 0x8e, 0xce, 0x6d, 0xb2, 0x6a, 0xde,
  811. 0xc4, 0xb6, 0x5e, 0xfa, 0xb1, 0x4b, 0xde, 0x6f, 0xfd, 0x90, 0x6b, 0xbb,
  812. 0x51, 0x88, 0xd7, 0x30, 0xef, 0x57, 0x4c, 0xea, 0xa5, 0xe7, 0xdc, 0xbc,
  813. 0x14, 0xbf, 0x55, 0x0b, 0xb2, 0xdf, 0xca, 0x14, 0x98, 0x33, 0x79, 0x3f,
  814. 0xff, 0x45, 0x3c, 0xb7, 0xec, 0xe2, 0xe7, 0x51, 0x97, 0xbc, 0x57, 0x3c,
  815. 0xcc, 0x6b, 0xf5, 0x86, 0x4b, 0xdc, 0xcb, 0xf4, 0x69, 0x4d, 0xd1, 0xdc,
  816. 0xfb, 0x9a, 0xbb, 0xbc, 0x9c, 0x5e, 0xc9, 0x68, 0xbd, 0x6b, 0xb4, 0x5e,
  817. 0x32, 0xf4, 0x75, 0xa7, 0xf8, 0x0d, 0x56, 0xf4, 0x5c, 0x8b, 0xfe, 0x43,
  818. 0xd4, 0xb6, 0xb5, 0xd5, 0xec, 0xdf, 0xdf, 0xd6, 0x71, 0x5b, 0xed, 0x7e,
  819. 0x39, 0xbc, 0x66, 0x1e, 0x5d, 0x23, 0xc4, 0x23, 0xba, 0xa6, 0xcb, 0x5c,
  820. 0xf2, 0x2e, 0xeb, 0x46, 0x8c, 0xf3, 0xf2, 0xc9, 0x35, 0xf4, 0x05, 0x29,
  821. 0x5e, 0x46, 0xf6, 0xa5, 0xa2, 0xa4, 0xc0, 0x4f, 0xd7, 0x5b, 0xf2, 0xb0,
  822. 0x44, 0xb2, 0x62, 0xbf, 0x9c, 0x5c, 0x81, 0x53, 0x7a, 0x86, 0x2c, 0x68,
  823. 0xaa, 0x6d, 0x0b, 0xc9, 0xa1, 0x35, 0x5b, 0xe4, 0xee, 0x35, 0xf4, 0xb8,
  824. 0x65, 0x1d, 0x96, 0xcf, 0xb2, 0x7e, 0x93, 0x2c, 0xbc, 0x44, 0x26, 0x2a,
  825. 0x5e, 0xe8, 0xbd, 0xfd, 0x52, 0xcb, 0xf9, 0x2d, 0x4b, 0xd6, 0x85, 0x16,
  826. 0xd3, 0x43, 0xa6, 0x70, 0xfe, 0x7e, 0x7f, 0xf9, 0xb5, 0xb4, 0xd7, 0xe5,
  827. 0x7c, 0x54, 0xdc, 0x2f, 0x6f, 0xb3, 0x8e, 0xc9, 0x87, 0xb8, 0x6b, 0x1f,
  828. 0x38, 0x1d, 0xf7, 0x59, 0x07, 0xe4, 0x93, 0xf2, 0x67, 0x68, 0xf8, 0x8c,
  829. 0xfd, 0x9b, 0xe9, 0x7e, 0xa1, 0x1a, 0xde, 0x2f, 0x9f, 0xa4, 0x0a, 0x79,
  830. 0xe4, 0x73, 0xb0, 0x41, 0xd9, 0x77, 0x0b, 0xd8, 0x20, 0xf7, 0x2d, 0x96,
  831. 0x25, 0x7f, 0x42, 0x9b, 0xe4, 0xc3, 0x9f, 0xab, 0x16, 0x45, 0x05, 0xf5,
  832. 0x1a, 0xde, 0x76, 0x2b, 0xe7, 0x21, 0x29, 0xcf, 0x68, 0xb6, 0x72, 0xdf,
  833. 0x92, 0xcb, 0xcf, 0x10, 0xc2, 0xf2, 0xdc, 0x22, 0x65, 0x8d, 0x28, 0xcf,
  834. 0x5b, 0xec, 0xf4, 0x38, 0x73, 0xe7, 0x38, 0x73, 0xce, 0x75, 0x79, 0x6a,
  835. 0x45, 0x51, 0xa9, 0xbc, 0xa0, 0xa9, 0xd9, 0x95, 0x7b, 0x86, 0xa8, 0x98,
  836. 0xc0, 0xf9, 0xa3, 0x33, 0xe5, 0x72, 0x51, 0x81, 0x63, 0xe1, 0x12, 0xdf,
  837. 0xc7, 0xf2, 0xf8, 0x2d, 0x71, 0x95, 0x75, 0xa6, 0xf0, 0x95, 0xc9, 0x82,
  838. 0x6a, 0x19, 0xae, 0x80, 0x29, 0xfa, 0xb9, 0x68, 0x9a, 0xea, 0x24, 0xc5,
  839. 0x34, 0x4e, 0x77, 0xd2, 0x1b, 0x73, 0x67, 0xd2, 0x41, 0x97, 0x78, 0x84,
  840. 0x0f, 0xdd, 0x43, 0x2e, 0x71, 0x3f, 0xdb, 0xbe, 0x72, 0xfa, 0x40, 0x5a,
  841. 0x87, 0xad, 0xbf, 0xc8, 0x3f, 0xcb, 0xf4, 0x1a, 0xce, 0x9f, 0xd4, 0xdc,
  842. 0x46, 0xb2, 0x4e, 0xdc, 0x65, 0x95, 0xd5, 0xca, 0x7a, 0xf9, 0x6d, 0xe1,
  843. 0x98, 0xf4, 0x90, 0x2c, 0xcd, 0x95, 0x73, 0x91, 0x53, 0xee, 0x29, 0x75,
  844. 0x94, 0x2e, 0x2c, 0x75, 0x95, 0x0e, 0x94, 0xba, 0x4b, 0x9b, 0x81, 0x4f,
  845. 0xe1, 0xd7, 0x33, 0xa2, 0x95, 0xaf, 0x59, 0x1f, 0xd8, 0xc9, 0xba, 0x80,
  846. 0x1b, 0x05, 0x82, 0xa5, 0x3e, 0x55, 0x60, 0x75, 0x69, 0xb6, 0xae, 0xb7,
  847. 0x5a, 0xab, 0x49, 0xa8, 0x45, 0x46, 0x4a, 0x94, 0xcb, 0x39, 0x5c, 0x42,
  848. 0x94, 0xcd, 0xd6, 0x79, 0xd9, 0xc8, 0x3b, 0x4f, 0xd7, 0x92, 0x85, 0x5a,
  849. 0xec, 0x4d, 0xe6, 0x68, 0x55, 0x67, 0x59, 0x75, 0xd9, 0xac, 0xb2, 0x9a,
  850. 0xb2, 0x99, 0x65, 0x55, 0x69, 0x3d, 0xe7, 0x68, 0x3d, 0x72, 0xb8, 0x5c,
  851. 0x39, 0x52, 0xf8, 0xf8, 0x77, 0xd1, 0x45, 0x7b, 0x1c, 0x87, 0x6a, 0x2c,
  852. 0xcf, 0xd3, 0x35, 0x4e, 0xcf, 0x8f, 0x6a, 0x85, 0xe7, 0x8a, 0x3a, 0xe1,
  853. 0xb9, 0x0b, 0x78, 0xba, 0xae, 0x41, 0x1c, 0xaa, 0x17, 0xe2, 0xae, 0x7a,
  854. 0x29, 0x9e, 0x06, 0x7d, 0x1b, 0xb8, 0x62, 0x0e, 0xd2, 0x08, 0x0a, 0x84,
  855. 0x2c, 0x90, 0x42, 0xfd, 0xb6, 0xec, 0xd9, 0xe3, 0x38, 0x38, 0x6f, 0xb9,
  856. 0x38, 0x3c, 0x4f, 0x8a, 0x1b, 0xe6, 0x93, 0x14, 0x8e, 0xa2, 0x03, 0x7e,
  857. 0xe1, 0x5b, 0x8d, 0x4a, 0x8f, 0x2c, 0x68, 0x15, 0x2f, 0x2f, 0x10, 0x62,
  858. 0xdf, 0x22, 0x21, 0x6e, 0x02, 0x6e, 0x68, 0x80, 0x58, 0x4c, 0x90, 0xe2,
  859. 0x80, 0xbf, 0x03, 0xa5, 0x8e, 0x36, 0xac, 0x15, 0x57, 0x34, 0x92, 0xe5,
  860. 0xa2, 0x52, 0x2e, 0x21, 0x7c, 0x9d, 0x28, 0xf3, 0xdc, 0xe9, 0xe2, 0x52,
  861. 0xff, 0x9e, 0x26, 0x3c, 0x0e, 0xf1, 0xe3, 0xbb, 0x4d, 0x42, 0x3e, 0x01,
  862. 0xbc, 0xd7, 0x44, 0x42, 0xe4, 0x4c, 0xf2, 0x6d, 0xe0, 0xbe, 0x36, 0xf7,
  863. 0x88, 0xc3, 0xcd, 0x42, 0xbc, 0x08, 0x1c, 0x03, 0x0e, 0x62, 0x97, 0x1c,
  864. 0x06, 0x5e, 0x04, 0x8e, 0x01, 0x07, 0xcf, 0x14, 0xe2, 0xbb, 0xc0, 0x73,
  865. 0xc0, 0xdb, 0x67, 0x92, 0x7b, 0xfe, 0xd4, 0xc9, 0x3e, 0xd5, 0x57, 0x9f,
  866. 0xfe, 0x0d, 0xa2, 0x8e, 0x4b, 0x17, 0xa3, 0xf2, 0xd7, 0x96, 0xe1, 0x71,
  867. 0x9c, 0x1f, 0x87, 0x5a, 0xb8, 0x2d, 0x7e, 0x3c, 0xc1, 0x8f, 0xd7, 0xf8,
  868. 0x71, 0x9c, 0x1f, 0x87, 0x96, 0xe3, 0x71, 0x98, 0x1f, 0xcf, 0xf1, 0xe3,
  869. 0x6d, 0x7e, 0x5c, 0xba, 0x02, 0x8f, 0x9b, 0xf8, 0xf1, 0x20, 0x3f, 0x5e,
  870. 0xe4, 0xc7, 0x7b, 0xfc, 0xb8, 0x62, 0x25, 0x1e, 0x77, 0xac, 0x74, 0xed,
  871. 0x95, 0x24, 0x00, 0x4b, 0x3e, 0xb6, 0x92, 0xa9, 0x64, 0x78, 0xfe, 0xba,
  872. 0x92, 0x69, 0x5a, 0xf6, 0xcf, 0x60, 0x02, 0xe0, 0xf9, 0x02, 0xf8, 0x7f,
  873. 0x14, 0xd0, 0x4f, 0x89, 0xdf, 0xac, 0xc2, 0x4c, 0xac, 0xc6, 0x4c, 0x00,
  874. 0x47, 0x81, 0xe3, 0xab, 0x2d, 0x71, 0xa4, 0xd5, 0x45, 0xcf, 0xb5, 0x96,
  875. 0x88, 0xe3, 0xad, 0x42, 0x1c, 0x59, 0x83, 0x19, 0x02, 0x8e, 0x01, 0x97,
  876. 0xb6, 0x61, 0x71, 0x80, 0xa7, 0x81, 0xe3, 0xc0, 0x81, 0x76, 0x21, 0x6e,
  877. 0x05, 0x8e, 0x00, 0x2f, 0x76, 0x40, 0xbe, 0x56, 0x88, 0x07, 0x81, 0x03,
  878. 0x9d, 0x40, 0x17, 0x74, 0xd7, 0x09, 0xc7, 0xcb, 0xc0, 0xdb, 0xeb, 0xb0,
  879. 0xb0, 0xeb, 0x9d, 0xe2, 0x68, 0x0f, 0xea, 0x39, 0x4b, 0x8a, 0x4b, 0x37,
  880. 0x4a, 0x71, 0xd7, 0xc6, 0xcc, 0xff, 0xdf, 0x12, 0x36, 0x9a, 0xfe, 0xbf,
  881. 0xa4, 0xfc, 0x9d, 0xab, 0xf4, 0xff, 0x26, 0xe5, 0xef, 0x62, 0xa5, 0xff,
  882. 0x3f, 0x29, 0x7f, 0xd7, 0x2a, 0xfd, 0x3f, 0x4a, 0xf9, 0x7b, 0x58, 0xe9,
  883. 0xff, 0x53, 0xea, 0xa2, 0x91, 0xff, 0x55, 0x6a, 0x79, 0xf5, 0xdf, 0x51,
  884. 0xf0, 0xf7, 0x16, 0x85, 0x5f, 0xff, 0x7f, 0xb3, 0x43, 0xe0, 0x5d, 0x7e,
  885. 0xad, 0xc3, 0x7f, 0xdb, 0x2f, 0xbc, 0xba, 0x7e, 0xfe, 0x7b, 0x7f, 0xe9,
  886. 0xd7, 0xed, 0xf2, 0xff, 0x36, 0xb5, 0x8c, 0x3e, 0xff, 0xdd, 0xba, 0xc3,
  887. 0xaf, 0xbf, 0x5b, 0xc9, 0x7f, 0xeb, 0x4e, 0xa6, 0xac, 0xfa, 0x9f, 0x00,
  888. 0x5e, 0xdd, 0x57, 0xfe, 0x3f, 0xaa, 0xff, 0x03, 0x52, 0x5b, 0x3b, 0x13,
  889. 0x80, 0x55, 0x00, 0x00, 0x00, 0x00,
  890. };
  891. //==============================================================================
  892. #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra
  893. bool juce_handleNotificationIntent (void*);
  894. void juce_firebaseDeviceNotificationsTokenRefreshed (void*);
  895. void juce_firebaseRemoteNotificationReceived (void*);
  896. void juce_firebaseRemoteMessagesDeleted();
  897. void juce_firebaseRemoteMessageSent(void*);
  898. void juce_firebaseRemoteMessageSendError (void*, void*);
  899. #endif
  900. #if JUCE_IN_APP_PURCHASES && JUCE_MODULE_AVAILABLE_juce_product_unlocking
  901. void juce_handleOnResume();
  902. #else
  903. static void juce_handleOnResume() {}
  904. #endif
  905. //==============================================================================
  906. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  907. METHOD (create, "<init>", "(II)V")
  908. DECLARE_JNI_CLASS (AndroidLayoutParams, "android/view/ViewGroup$LayoutParams")
  909. #undef JNI_CLASS_MEMBERS
  910. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  911. METHOD (addView, "addView", "(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V") \
  912. METHOD (removeView, "removeView", "(Landroid/view/View;)V") \
  913. METHOD (updateViewLayout, "updateViewLayout", "(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V")
  914. DECLARE_JNI_CLASS (AndroidViewManager, "android/view/ViewManager")
  915. #undef JNI_CLASS_MEMBERS
  916. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  917. METHOD (create, "<init>", "(IIIIIII)V") \
  918. FIELD (gravity, "gravity", "I") \
  919. FIELD (windowAnimations, "windowAnimations", "I")
  920. DECLARE_JNI_CLASS (AndroidWindowManagerLayoutParams, "android/view/WindowManager$LayoutParams")
  921. #undef JNI_CLASS_MEMBERS
  922. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  923. FIELD (layoutInDisplayCutoutMode, "layoutInDisplayCutoutMode", "I")
  924. DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowManagerLayoutParams28, "android/view/WindowManager$LayoutParams", 28)
  925. #undef JNI_CLASS_MEMBERS
  926. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  927. METHOD (getDisplayCutout, "getDisplayCutout", "()Landroid/view/DisplayCutout;") \
  928. METHOD (consumeDisplayCutout, "consumeDisplayCutout", "()Landroid/view/WindowInsets;")
  929. DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets28, "android/view/WindowInsets", 28)
  930. #undef JNI_CLASS_MEMBERS
  931. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  932. METHOD (getInsets, "getInsets", "(I)Landroid/graphics/Insets;") \
  933. STATICFIELD (CONSUMED, "CONSUMED", "Landroid/view/WindowInsets;")
  934. DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets30, "android/view/WindowInsets", 30)
  935. #undef JNI_CLASS_MEMBERS
  936. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  937. METHOD (getSafeInsetBottom, "getSafeInsetBottom", "()I") \
  938. METHOD (getSafeInsetLeft, "getSafeInsetLeft", "()I") \
  939. METHOD (getSafeInsetRight, "getSafeInsetRight", "()I") \
  940. METHOD (getSafeInsetTop, "getSafeInsetTop", "()I")
  941. DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidDisplayCutout, "android/view/DisplayCutout", 28)
  942. #undef JNI_CLASS_MEMBERS
  943. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  944. FIELD (bottom, "bottom", "I") \
  945. FIELD (left, "left", "I") \
  946. FIELD (right, "right", "I") \
  947. FIELD (top, "top", "I")
  948. DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidGraphicsInsets, "android/graphics/Insets", 29)
  949. #undef JNI_CLASS_MEMBERS
  950. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  951. STATICMETHOD (ime, "ime", "()I") \
  952. STATICMETHOD (displayCutout, "displayCutout", "()I")
  953. DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsetsType, "android/view/WindowInsets$Type", 30)
  954. #undef JNI_CLASS_MEMBERS
  955. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  956. FIELD (first, "first", "Ljava/lang/Object;") \
  957. FIELD (second, "second", "Ljava/lang/Object;") \
  958. DECLARE_JNI_CLASS (AndroidPair, "android/util/Pair")
  959. #undef JNI_CLASS_MEMBERS
  960. //==============================================================================
  961. namespace
  962. {
  963. enum
  964. {
  965. SYSTEM_UI_FLAG_VISIBLE = 0,
  966. SYSTEM_UI_FLAG_LOW_PROFILE = 1,
  967. SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2,
  968. SYSTEM_UI_FLAG_FULLSCREEN = 4,
  969. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512,
  970. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024,
  971. SYSTEM_UI_FLAG_IMMERSIVE = 2048,
  972. SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 4096
  973. };
  974. constexpr int fullScreenFlags = SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
  975. constexpr int FLAG_NOT_FOCUSABLE = 0x8;
  976. }
  977. //==============================================================================
  978. static bool supportsDisplayCutout()
  979. {
  980. return getAndroidSDKVersion() >= 28;
  981. }
  982. static BorderSize<int> androidDisplayCutoutToBorderSize (LocalRef<jobject> displayCutout, double displayScale)
  983. {
  984. if (displayCutout == nullptr)
  985. return {};
  986. auto* env = getEnv();
  987. const auto getInset = [&] (jmethodID methodID)
  988. {
  989. return roundToInt (env->CallIntMethod (displayCutout, methodID) / displayScale);
  990. };
  991. return { getInset (AndroidDisplayCutout.getSafeInsetTop),
  992. getInset (AndroidDisplayCutout.getSafeInsetLeft),
  993. getInset (AndroidDisplayCutout.getSafeInsetBottom),
  994. getInset (AndroidDisplayCutout.getSafeInsetRight) };
  995. }
  996. static BorderSize<int> androidInsetsToBorderSize (LocalRef<jobject> insets, double displayScale)
  997. {
  998. if (insets == nullptr)
  999. return {};
  1000. auto* env = getEnv();
  1001. const auto getInset = [&] (jfieldID fieldID)
  1002. {
  1003. return roundToInt (env->GetIntField (insets, fieldID) / displayScale);
  1004. };
  1005. return { getInset (AndroidGraphicsInsets.top),
  1006. getInset (AndroidGraphicsInsets.left),
  1007. getInset (AndroidGraphicsInsets.bottom),
  1008. getInset (AndroidGraphicsInsets.right) };
  1009. }
  1010. class JuceInsets
  1011. {
  1012. template <typename Display>
  1013. static auto tieDisplay (Display& d) { return std::tie (d.safeAreaInsets, d.keyboardInsets); }
  1014. public:
  1015. BorderSize<int> displayCutout, keyboard;
  1016. static auto tie ( Displays::Display& d) { return tieDisplay (d); }
  1017. static auto tie (const Displays::Display& d) { return tieDisplay (d); }
  1018. auto tie() const { return std::tie (displayCutout, keyboard); }
  1019. };
  1020. static JuceInsets getInsetsFromAndroidWindowInsets (LocalRef<jobject> windowInsets, double scale)
  1021. {
  1022. auto* env = getEnv();
  1023. if (windowInsets == nullptr)
  1024. return {};
  1025. const auto displayCutout = [&]() -> BorderSize<int>
  1026. {
  1027. if (AndroidWindowInsets28.getDisplayCutout == nullptr)
  1028. return {};
  1029. const LocalRef<jobject> insets { env->CallObjectMethod (windowInsets, AndroidWindowInsets28.getDisplayCutout) };
  1030. return androidDisplayCutoutToBorderSize (insets, scale);
  1031. }();
  1032. const auto keyboard = [&]() -> BorderSize<int>
  1033. {
  1034. if (AndroidWindowInsetsType.ime == nullptr || AndroidWindowInsets30.getInsets == nullptr)
  1035. return {};
  1036. const auto mask = env->CallStaticIntMethod (AndroidWindowInsetsType, AndroidWindowInsetsType.ime);
  1037. const LocalRef<jobject> insets { env->CallObjectMethod (windowInsets, AndroidWindowInsets30.getInsets, mask) };
  1038. return androidInsetsToBorderSize (insets, scale);
  1039. }();
  1040. return { displayCutout, keyboard };
  1041. }
  1042. /* The usage of the KeyPress class relies on its keyCode member having the standard ASCII values
  1043. represent ASCII keycodes. However in the native Android keycodes the values for special keys
  1044. e.g. RETURN, F1-F12 overlap with the ASCII range. Hence we need to translate them.
  1045. */
  1046. static constexpr int translateAndroidKeyCode (int keyCode) noexcept
  1047. {
  1048. switch (keyCode)
  1049. {
  1050. case 7: return '0';
  1051. case 8: return '1';
  1052. case 9: return '2';
  1053. case 10: return '3';
  1054. case 11: return '4';
  1055. case 12: return '5';
  1056. case 13: return '6';
  1057. case 14: return '7';
  1058. case 15: return '8';
  1059. case 16: return '9';
  1060. case 17: return '*';
  1061. case 18: return '#';
  1062. case 19: return KeyPress::upKey; // KEYCODE_DPAD_UP
  1063. case 20: return KeyPress::downKey; // KEYCODE_DPAD_DOWN
  1064. case 21: return KeyPress::leftKey; // KEYCODE_DPAD_LEFT
  1065. case 22: return KeyPress::rightKey; // KEYCODE_DPAD_RIGHT
  1066. case 29: return 'A';
  1067. case 30: return 'B';
  1068. case 31: return 'C';
  1069. case 32: return 'D';
  1070. case 33: return 'E';
  1071. case 34: return 'F';
  1072. case 35: return 'G';
  1073. case 36: return 'H';
  1074. case 37: return 'I';
  1075. case 38: return 'J';
  1076. case 39: return 'K';
  1077. case 40: return 'L';
  1078. case 41: return 'M';
  1079. case 42: return 'N';
  1080. case 43: return 'O';
  1081. case 44: return 'P';
  1082. case 45: return 'Q';
  1083. case 46: return 'R';
  1084. case 47: return 'S';
  1085. case 48: return 'T';
  1086. case 49: return 'U';
  1087. case 50: return 'V';
  1088. case 51: return 'W';
  1089. case 52: return 'X';
  1090. case 53: return 'Y';
  1091. case 54: return 'Z';
  1092. case 55: return ',';
  1093. case 56: return '.';
  1094. case 61: return KeyPress::tabKey; // KEYCODE_TAB
  1095. case 62: return KeyPress::spaceKey; // KEYCODE_SPACE
  1096. case 66: return KeyPress::returnKey; // KEYCODE_ENTER
  1097. case 67: return KeyPress::backspaceKey; // KEYCODE_DEL
  1098. case 68: return '`';
  1099. case 69: return '-';
  1100. case 70: return '=';
  1101. case 71: return '[';
  1102. case 72: return ']';
  1103. case 73: return '\\';
  1104. case 74: return ';';
  1105. case 75: return '\'';
  1106. case 76: return '/';
  1107. case 77: return '@';
  1108. case 81: return '+';
  1109. case 85: return KeyPress::playKey; // KEYCODE_MEDIA_PLAY_PAUSE
  1110. case 86: return KeyPress::stopKey; // KEYCODE_MEDIA_STOP
  1111. case 87: return KeyPress::fastForwardKey; // KEYCODE_MEDIA_NEXT
  1112. case 88: return KeyPress::rewindKey; // KEYCODE_MEDIA_PREVIOUS
  1113. case 92: return KeyPress::pageUpKey; // KEYCODE_PAGE_UP
  1114. case 93: return KeyPress::pageDownKey; // KEYCODE_PAGE_DOWN
  1115. case 111: return KeyPress::escapeKey; // KEYCODE_ESCAPE
  1116. case 112: return KeyPress::deleteKey; // KEYCODE_FORWARD_DEL
  1117. case 122: return KeyPress::homeKey; // KEYCODE_MOVE_HOME
  1118. case 123: return KeyPress::endKey; // KEYCODE_MOVE_END
  1119. case 124: return KeyPress::insertKey; // KEYCODE_INSERT
  1120. case 131: return KeyPress::F1Key; // KEYCODE_F1
  1121. case 132: return KeyPress::F2Key; // KEYCODE_F2
  1122. case 133: return KeyPress::F3Key; // KEYCODE_F3
  1123. case 134: return KeyPress::F4Key; // KEYCODE_F4
  1124. case 135: return KeyPress::F5Key; // KEYCODE_F5
  1125. case 136: return KeyPress::F6Key; // KEYCODE_F6
  1126. case 137: return KeyPress::F7Key; // KEYCODE_F7
  1127. case 138: return KeyPress::F8Key; // KEYCODE_F8
  1128. case 139: return KeyPress::F9Key; // KEYCODE_F9
  1129. case 140: return KeyPress::F10Key; // KEYCODE_F10
  1130. case 141: return KeyPress::F11Key; // KEYCODE_F11
  1131. case 142: return KeyPress::F12Key; // KEYCODE_F12
  1132. case 144: return '0';
  1133. case 145: return '1';
  1134. case 146: return '2';
  1135. case 147: return '3';
  1136. case 148: return '4';
  1137. case 149: return '5';
  1138. case 150: return '6';
  1139. case 151: return '7';
  1140. case 152: return '8';
  1141. case 153: return '9';
  1142. case 154: return '/';
  1143. case 155: return '*';
  1144. case 156: return '-';
  1145. case 157: return '+';
  1146. case 158: return '.';
  1147. case 159: return ',';
  1148. case 161: return '=';
  1149. case 162: return '(';
  1150. case 163: return ')';
  1151. default: return 0;
  1152. }
  1153. }
  1154. static constexpr int translateAndroidKeyboardFlags (int javaFlags) noexcept
  1155. {
  1156. constexpr int metaShiftOn = 0x1;
  1157. constexpr int metaAltOn = 0x02;
  1158. constexpr int metaCtrlOn = 0x1000;
  1159. int flags = 0;
  1160. if ((javaFlags & metaShiftOn) != 0) flags |= ModifierKeys::shiftModifier;
  1161. if ((javaFlags & metaAltOn) != 0) flags |= ModifierKeys::altModifier;
  1162. if ((javaFlags & metaCtrlOn) != 0) flags |= ModifierKeys::ctrlModifier;
  1163. return flags;
  1164. }
  1165. //==============================================================================
  1166. class AndroidComponentPeer : public ComponentPeer,
  1167. private Timer
  1168. {
  1169. public:
  1170. AndroidComponentPeer (Component& comp, int windowStyleFlags, void* nativeViewHandle)
  1171. : ComponentPeer (comp, windowStyleFlags)
  1172. {
  1173. auto* env = getEnv();
  1174. // NB: must not put this in the initialiser list, as it invokes a callback,
  1175. // which will fail if the peer is only half-constructed.
  1176. view = GlobalRef (LocalRef<jobject> (env->NewObject (ComponentPeerView, ComponentPeerView.create,
  1177. getAppContext().get(), (jboolean) component.isOpaque(),
  1178. (jlong) this)));
  1179. if (nativeViewHandle != nullptr)
  1180. {
  1181. viewGroupIsWindow = false;
  1182. // we don't know if the user is holding on to a local ref to this, so
  1183. // explicitly create a new one
  1184. auto nativeView = LocalRef<jobject> (env->NewLocalRef (static_cast<jobject> (nativeViewHandle)));
  1185. if (env->IsInstanceOf (nativeView.get(), AndroidActivity))
  1186. {
  1187. viewGroup = GlobalRef (nativeView);
  1188. env->CallVoidMethod (viewGroup.get(), AndroidActivity.setContentView, view.get());
  1189. }
  1190. else if (env->IsInstanceOf (nativeView.get(), AndroidViewGroup))
  1191. {
  1192. viewGroup = GlobalRef (nativeView);
  1193. LocalRef<jobject> layoutParams (env->NewObject (AndroidLayoutParams, AndroidLayoutParams.create, -2, -2));
  1194. env->CallVoidMethod (view.get(), AndroidView.setLayoutParams, layoutParams.get());
  1195. env->CallVoidMethod ((jobject) viewGroup.get(), AndroidViewGroup.addView, view.get());
  1196. }
  1197. else
  1198. {
  1199. // the native handle you passed as a second argument to Component::addToDesktop must
  1200. // either be an Activity or a ViewGroup
  1201. jassertfalse;
  1202. }
  1203. }
  1204. else
  1205. {
  1206. viewGroupIsWindow = true;
  1207. LocalRef<jobject> viewLayoutParams (env->NewObject (AndroidLayoutParams, AndroidLayoutParams.create, -2, -2));
  1208. env->CallVoidMethod (view.get(), AndroidView.setLayoutParams, viewLayoutParams.get());
  1209. auto physicalBounds = (comp.getBoundsInParent().toFloat() * scale).toNearestInt();
  1210. view.callVoidMethod (AndroidView.layout,
  1211. physicalBounds.getX(), physicalBounds.getY(), physicalBounds.getRight(), physicalBounds.getBottom());
  1212. LocalRef<jobject> windowLayoutParams (env->NewObject (AndroidWindowManagerLayoutParams, AndroidWindowManagerLayoutParams.create,
  1213. physicalBounds.getWidth(), physicalBounds.getHeight(),
  1214. physicalBounds.getX(), physicalBounds.getY(),
  1215. TYPE_APPLICATION, FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_NO_LIMITS | FLAG_NOT_FOCUSABLE,
  1216. component.isOpaque() ? PIXEL_FORMAT_OPAQUE : PIXEL_FORMAT_TRANSPARENT));
  1217. env->SetIntField (windowLayoutParams.get(), AndroidWindowManagerLayoutParams.gravity, GRAVITY_LEFT | GRAVITY_TOP);
  1218. env->SetIntField (windowLayoutParams.get(), AndroidWindowManagerLayoutParams.windowAnimations, 0x01030000 /* android.R.style.Animation */);
  1219. if (supportsDisplayCutout())
  1220. {
  1221. if (const auto fieldID = AndroidWindowManagerLayoutParams28.layoutInDisplayCutoutMode)
  1222. env->SetIntField (windowLayoutParams, fieldID, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS);
  1223. }
  1224. if (Desktop::getInstance().getKioskModeComponent() != nullptr)
  1225. setNavBarsHidden (true);
  1226. LocalRef<jobject> activity (getCurrentActivity());
  1227. if (activity == nullptr)
  1228. activity = getMainActivity();
  1229. viewGroup = GlobalRef (LocalRef<jobject> (env->CallObjectMethod (activity.get(), AndroidContext.getSystemService, javaString ("window").get())));
  1230. env->CallVoidMethod (viewGroup.get(), AndroidViewManager.addView, view.get(), windowLayoutParams.get());
  1231. }
  1232. if (supportsDisplayCutout())
  1233. {
  1234. if (const auto methodID = AndroidView23.setOnApplyWindowInsetsListener)
  1235. {
  1236. env->CallVoidMethod (view,
  1237. methodID,
  1238. CreateJavaInterface (new ViewWindowInsetsListener,
  1239. "android/view/View$OnApplyWindowInsetsListener").get());
  1240. }
  1241. }
  1242. if (isFocused())
  1243. handleFocusGain();
  1244. }
  1245. ~AndroidComponentPeer() override
  1246. {
  1247. stopTimer();
  1248. auto* env = getEnv();
  1249. env->CallVoidMethod (view, ComponentPeerView.clear);
  1250. frontWindow = nullptr;
  1251. GlobalRef localView (view);
  1252. GlobalRef localViewGroup (viewGroup);
  1253. callOnMessageThread ([env, localView, localViewGroup]
  1254. {
  1255. if (env->IsInstanceOf (localViewGroup.get(), AndroidActivity))
  1256. env->CallVoidMethod (localViewGroup.get(), AndroidActivity.setContentView, nullptr);
  1257. else
  1258. env->CallVoidMethod (localViewGroup.get(), AndroidViewManager.removeView, localView.get());
  1259. });
  1260. }
  1261. void* getNativeHandle() const override
  1262. {
  1263. return (void*) view.get();
  1264. }
  1265. void setVisible (bool shouldBeVisible) override
  1266. {
  1267. GlobalRef localView (view);
  1268. callOnMessageThread ([localView, shouldBeVisible]
  1269. {
  1270. localView.callVoidMethod (ComponentPeerView.setVisible, shouldBeVisible);
  1271. });
  1272. }
  1273. void setTitle (const String& title) override
  1274. {
  1275. view.callVoidMethod (ComponentPeerView.setViewName, javaString (title).get());
  1276. }
  1277. void setBounds (const Rectangle<int>& userRect, bool isNowFullScreen) override
  1278. {
  1279. auto bounds = (userRect.toFloat() * scale).toNearestInt();
  1280. if (MessageManager::getInstance()->isThisTheMessageThread())
  1281. {
  1282. fullScreen = isNowFullScreen;
  1283. view.callVoidMethod (AndroidView.layout,
  1284. bounds.getX(), bounds.getY(), bounds.getRight(), bounds.getBottom());
  1285. if (viewGroup != nullptr && viewGroupIsWindow)
  1286. {
  1287. auto* env = getEnv();
  1288. LocalRef<jobject> windowLayoutParams (env->NewObject (AndroidWindowManagerLayoutParams, AndroidWindowManagerLayoutParams.create,
  1289. bounds.getWidth(), bounds.getHeight(), bounds.getX(), bounds.getY(),
  1290. TYPE_APPLICATION, FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_NO_LIMITS,
  1291. component.isOpaque() ? PIXEL_FORMAT_OPAQUE : PIXEL_FORMAT_TRANSPARENT));
  1292. env->SetIntField (windowLayoutParams.get(), AndroidWindowManagerLayoutParams.gravity, GRAVITY_LEFT | GRAVITY_TOP);
  1293. env->CallVoidMethod (viewGroup.get(), AndroidViewManager.updateViewLayout, view.get(), windowLayoutParams.get());
  1294. }
  1295. }
  1296. else
  1297. {
  1298. GlobalRef localView (view);
  1299. MessageManager::callAsync ([localView, bounds]
  1300. {
  1301. localView.callVoidMethod (AndroidView.layout,
  1302. bounds.getX(), bounds.getY(), bounds.getRight(), bounds.getBottom());
  1303. });
  1304. }
  1305. }
  1306. Rectangle<int> getBounds() const override
  1307. {
  1308. Rectangle<int> bounds (view.callIntMethod (AndroidView.getLeft),
  1309. view.callIntMethod (AndroidView.getTop),
  1310. view.callIntMethod (AndroidView.getWidth),
  1311. view.callIntMethod (AndroidView.getHeight));
  1312. return (bounds.toFloat() / scale).toNearestInt();
  1313. }
  1314. void handleScreenSizeChange() override
  1315. {
  1316. ComponentPeer::handleScreenSizeChange();
  1317. if (isFullScreen())
  1318. setFullScreen (true);
  1319. }
  1320. Point<int> getScreenPosition() const
  1321. {
  1322. auto* env = getEnv();
  1323. LocalRef<jintArray> position (env->NewIntArray (2));
  1324. env->CallVoidMethod (view.get(), AndroidView.getLocationOnScreen, position.get());
  1325. jint* const screenPosition = env->GetIntArrayElements (position.get(), nullptr);
  1326. Point<int> pos (screenPosition[0], screenPosition[1]);
  1327. env->ReleaseIntArrayElements (position.get(), screenPosition, 0);
  1328. return pos;
  1329. }
  1330. Point<float> localToGlobal (Point<float> relativePosition) override
  1331. {
  1332. return relativePosition + (getScreenPosition().toFloat() / scale);
  1333. }
  1334. using ComponentPeer::localToGlobal;
  1335. Point<float> globalToLocal (Point<float> screenPosition) override
  1336. {
  1337. return screenPosition - (getScreenPosition().toFloat() / scale);
  1338. }
  1339. using ComponentPeer::globalToLocal;
  1340. void setMinimised (bool /*shouldBeMinimised*/) override
  1341. {
  1342. // n/a
  1343. }
  1344. bool isMinimised() const override
  1345. {
  1346. return false;
  1347. }
  1348. void setFullScreen (bool shouldBeFullScreen) override
  1349. {
  1350. if (shouldNavBarsBeHidden (shouldBeFullScreen))
  1351. {
  1352. if (isTimerRunning())
  1353. return;
  1354. startTimer (500);
  1355. }
  1356. else
  1357. {
  1358. setNavBarsHidden (false);
  1359. }
  1360. auto newBounds = [&]
  1361. {
  1362. if (navBarsHidden || shouldBeFullScreen)
  1363. if (auto* display = Desktop::getInstance().getDisplays().getPrimaryDisplay())
  1364. return navBarsHidden ? display->totalArea
  1365. : display->userArea;
  1366. return lastNonFullscreenBounds.isEmpty() ? getBounds() : lastNonFullscreenBounds;
  1367. }();
  1368. if (! newBounds.isEmpty())
  1369. setBounds (newBounds, shouldBeFullScreen);
  1370. component.repaint();
  1371. }
  1372. bool isFullScreen() const override
  1373. {
  1374. return fullScreen;
  1375. }
  1376. void setIcon (const Image& /*newIcon*/) override
  1377. {
  1378. // n/a
  1379. }
  1380. bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override
  1381. {
  1382. return isPositiveAndBelow (localPos.x, component.getWidth())
  1383. && isPositiveAndBelow (localPos.y, component.getHeight())
  1384. && ((! trueIfInAChildWindow) || view.callBooleanMethod (ComponentPeerView.containsPoint,
  1385. (float) localPos.x * scale,
  1386. (float) localPos.y * scale));
  1387. }
  1388. OptionalBorderSize getFrameSizeIfPresent() const override
  1389. {
  1390. // TODO
  1391. return {};
  1392. }
  1393. BorderSize<int> getFrameSize() const override
  1394. {
  1395. // TODO
  1396. return {};
  1397. }
  1398. bool setAlwaysOnTop (bool /*alwaysOnTop*/) override
  1399. {
  1400. // TODO
  1401. return false;
  1402. }
  1403. void toFront (bool makeActive) override
  1404. {
  1405. // Avoid calling bringToFront excessively: it's very slow
  1406. if (frontWindow != this)
  1407. {
  1408. view.callVoidMethod (AndroidView.bringToFront);
  1409. frontWindow = this;
  1410. }
  1411. if (makeActive)
  1412. grabFocus();
  1413. handleBroughtToFront();
  1414. }
  1415. void toBehind (ComponentPeer*) override
  1416. {
  1417. // TODO
  1418. }
  1419. //==============================================================================
  1420. void handleMouseDownCallback (int index, Point<float> sysPos, int64 time)
  1421. {
  1422. lastMousePos = sysPos / scale;
  1423. auto pos = globalToLocal (lastMousePos);
  1424. // this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before.
  1425. handleMouseEvent (MouseInputSource::InputSourceType::touch,
  1426. pos,
  1427. ModifierKeys::currentModifiers.withoutMouseButtons(),
  1428. MouseInputSource::defaultPressure,
  1429. MouseInputSource::defaultOrientation,
  1430. time,
  1431. {},
  1432. index);
  1433. if (isValidPeer (this))
  1434. handleMouseDragCallback (index, sysPos, time);
  1435. }
  1436. void handleMouseDragCallback (int index, Point<float> sysPos, int64 time)
  1437. {
  1438. lastMousePos = sysPos / scale;
  1439. auto pos = globalToLocal (lastMousePos);
  1440. jassert (index < 64);
  1441. touchesDown = (touchesDown | (1 << (index & 63)));
  1442. ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withoutMouseButtons().withFlags (ModifierKeys::leftButtonModifier);
  1443. handleMouseEvent (MouseInputSource::InputSourceType::touch,
  1444. pos,
  1445. ModifierKeys::currentModifiers.withoutMouseButtons().withFlags (ModifierKeys::leftButtonModifier),
  1446. MouseInputSource::defaultPressure,
  1447. MouseInputSource::defaultOrientation,
  1448. time,
  1449. {},
  1450. index);
  1451. }
  1452. void handleMouseUpCallback (int index, Point<float> sysPos, int64 time)
  1453. {
  1454. lastMousePos = sysPos / scale;
  1455. auto pos = globalToLocal (lastMousePos);
  1456. jassert (index < 64);
  1457. touchesDown = (touchesDown & ~(1 << (index & 63)));
  1458. if (touchesDown == 0)
  1459. ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withoutMouseButtons();
  1460. handleMouseEvent (MouseInputSource::InputSourceType::touch,
  1461. pos,
  1462. ModifierKeys::currentModifiers.withoutMouseButtons(),
  1463. MouseInputSource::defaultPressure,
  1464. MouseInputSource::defaultOrientation,
  1465. time,
  1466. {},
  1467. index);
  1468. handleMouseEvent (MouseInputSource::InputSourceType::touch,
  1469. MouseInputSource::offscreenMousePos,
  1470. ModifierKeys::currentModifiers.withoutMouseButtons(),
  1471. MouseInputSource::defaultPressure,
  1472. MouseInputSource::defaultOrientation,
  1473. time,
  1474. {},
  1475. index);
  1476. }
  1477. void handleAccessibilityHoverCallback (int command, Point<float> sysPos, int64)
  1478. {
  1479. enum
  1480. {
  1481. TYPE_VIEW_HOVER_ENTER = 0x00000080,
  1482. TYPE_VIEW_HOVER_EXIT = 0x00000100,
  1483. ACTION_HOVER_ENTER = 0x00000009,
  1484. ACTION_HOVER_MOVE = 0x00000007,
  1485. ACTION_HOVER_EXIT = 0x0000000a
  1486. };
  1487. if (auto* topHandler = component.getAccessibilityHandler())
  1488. {
  1489. if (auto* virtualHandler = topHandler->getChildAt ((sysPos / scale).roundToInt()))
  1490. {
  1491. switch (command)
  1492. {
  1493. case ACTION_HOVER_ENTER:
  1494. case ACTION_HOVER_MOVE:
  1495. AccessibilityNativeHandle::sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_ENTER, 0);
  1496. break;
  1497. case ACTION_HOVER_EXIT:
  1498. AccessibilityNativeHandle::sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_EXIT, 0);
  1499. break;
  1500. }
  1501. }
  1502. }
  1503. }
  1504. static void handleKeyDownCallback (JNIEnv*, AndroidComponentPeer& t, int k, int kc, int kbFlags)
  1505. {
  1506. ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withOnlyMouseButtons()
  1507. .withFlags (translateAndroidKeyboardFlags (kbFlags));
  1508. t.handleKeyPress (translateAndroidKeyCode (k), static_cast<juce_wchar> (kc));
  1509. }
  1510. static void handleKeyUpCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t, [[maybe_unused]] int k, [[maybe_unused]] int kc)
  1511. {
  1512. }
  1513. static void handleBackButtonCallback (JNIEnv* env, AndroidComponentPeer& t)
  1514. {
  1515. bool handled = false;
  1516. if (auto* app = JUCEApplicationBase::getInstance())
  1517. handled = app->backButtonPressed();
  1518. if (t.isKioskModeComponent())
  1519. t.setNavBarsHidden (t.navBarsHidden);
  1520. if (! handled)
  1521. {
  1522. LocalRef<jobject> activity (getCurrentActivity());
  1523. if (activity != nullptr)
  1524. {
  1525. if (const auto finishMethod = AndroidActivity.finish)
  1526. env->CallVoidMethod (activity.get(), finishMethod);
  1527. }
  1528. }
  1529. }
  1530. static void handleKeyboardHiddenCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t)
  1531. {
  1532. Component::unfocusAllComponents();
  1533. }
  1534. static void handleAppPausedCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t) {}
  1535. static void handleAppResumedCallback (JNIEnv*, AndroidComponentPeer& t)
  1536. {
  1537. if (t.isKioskModeComponent())
  1538. t.setNavBarsHidden (t.navBarsHidden);
  1539. }
  1540. static jlong handleGetFocusedTextInputTargetCallback (JNIEnv*, AndroidComponentPeer& t)
  1541. {
  1542. return reinterpret_cast<jlong> (t.findCurrentTextInputTarget());
  1543. }
  1544. static void handleMovedOrResizedCallback (JNIEnv*, AndroidComponentPeer& t)
  1545. {
  1546. t.handleMovedOrResized();
  1547. }
  1548. //==============================================================================
  1549. AccessibilityNativeHandle* getNativeHandleForViewId (jint virtualViewId) const
  1550. {
  1551. if (auto* handler = (virtualViewId == HOST_VIEW_ID
  1552. ? component.getAccessibilityHandler()
  1553. : AccessibilityNativeHandle::getAccessibilityHandlerForVirtualViewId (virtualViewId)))
  1554. {
  1555. return handler->getNativeImplementation();
  1556. }
  1557. return nullptr;
  1558. }
  1559. static jobject getNativeViewCallback (JNIEnv*, const AndroidComponentPeer& t, jint virtualViewId)
  1560. {
  1561. if (auto* handle = t.getNativeHandleForViewId (virtualViewId))
  1562. return handle->getNativeView (virtualViewId);
  1563. return nullptr;
  1564. }
  1565. static jboolean populateAccessibilityNodeInfoCallback (JNIEnv*, const AndroidComponentPeer& t, jint virtualViewId, jobject info)
  1566. {
  1567. if (auto* handle = t.getNativeHandleForViewId (virtualViewId))
  1568. {
  1569. handle->populateNodeInfo (info, virtualViewId);
  1570. return true;
  1571. }
  1572. return false;
  1573. }
  1574. static jboolean handlePerformActionCallback (JNIEnv*, const AndroidComponentPeer& t, jint virtualViewId, jint action, jobject arguments)
  1575. {
  1576. if (auto* handle = t.getNativeHandleForViewId (virtualViewId))
  1577. return handle->performAction (action, arguments);
  1578. return false;
  1579. }
  1580. static jobject getFocusViewIdForHandler (JNIEnv* env, const AccessibilityHandler* handler)
  1581. {
  1582. if (handler != nullptr)
  1583. return env->NewObject (JavaInteger,
  1584. JavaInteger.constructor,
  1585. handler->getNativeImplementation()->getVirtualViewId());
  1586. return nullptr;
  1587. }
  1588. static jobject getInputFocusViewIdCallback (JNIEnv* env, AndroidComponentPeer& t)
  1589. {
  1590. if (auto* comp = dynamic_cast<Component*> (t.findCurrentTextInputTarget()))
  1591. return getFocusViewIdForHandler (env, comp->getAccessibilityHandler());
  1592. return nullptr;
  1593. }
  1594. static jobject getAccessibilityFocusViewIdCallback (JNIEnv* env, const AndroidComponentPeer& t)
  1595. {
  1596. if (auto* handler = t.component.getAccessibilityHandler())
  1597. {
  1598. if (auto* modal = Component::getCurrentlyModalComponent())
  1599. {
  1600. if (! t.component.isParentOf (modal)
  1601. && t.component.isCurrentlyBlockedByAnotherModalComponent())
  1602. {
  1603. if (auto* modalHandler = modal->getAccessibilityHandler())
  1604. {
  1605. if (auto* focusChild = modalHandler->getChildFocus())
  1606. return getFocusViewIdForHandler (env, focusChild);
  1607. return getFocusViewIdForHandler (env, modalHandler);
  1608. }
  1609. }
  1610. }
  1611. if (auto* focusChild = handler->getChildFocus())
  1612. return getFocusViewIdForHandler (env, focusChild);
  1613. }
  1614. return nullptr;
  1615. }
  1616. //==============================================================================
  1617. bool isFocused() const override
  1618. {
  1619. if (view != nullptr)
  1620. return view.callBooleanMethod (AndroidView.hasFocus);
  1621. return false;
  1622. }
  1623. void grabFocus() override
  1624. {
  1625. if (view != nullptr)
  1626. view.callBooleanMethod (AndroidView.requestFocus);
  1627. }
  1628. static void handleFocusChangeCallback (JNIEnv*, AndroidComponentPeer& t, bool hasFocus)
  1629. {
  1630. if (t.isFullScreen())
  1631. t.setFullScreen (true);
  1632. if (hasFocus)
  1633. t.handleFocusGain();
  1634. else
  1635. t.handleFocusLoss();
  1636. }
  1637. void textInputRequired (Point<int>, TextInputTarget& target) override
  1638. {
  1639. const auto region = target.getHighlightedRegion();
  1640. view.callVoidMethod (ComponentPeerView.showKeyboard,
  1641. static_cast<jint> (target.getKeyboardType()),
  1642. static_cast<jint> (region.getStart()),
  1643. static_cast<jint> (region.getEnd()));
  1644. }
  1645. void closeInputMethodContext() override
  1646. {
  1647. getEnv()->CallVoidMethod (view, ComponentPeerView.closeInputMethodContext);
  1648. }
  1649. void dismissPendingTextInput() override
  1650. {
  1651. closeInputMethodContext();
  1652. view.callVoidMethod (ComponentPeerView.hideKeyboard);
  1653. if (! isTimerRunning())
  1654. startTimer (500);
  1655. }
  1656. //==============================================================================
  1657. static void handleDoFrameCallback (JNIEnv*, AndroidComponentPeer& t, [[maybe_unused]] int64 frameTimeNanos)
  1658. {
  1659. t.vBlankListeners.call ([] (auto& l) { l.onVBlank(); });
  1660. }
  1661. static void handlePaintCallback (JNIEnv* env, AndroidComponentPeer& t, jobject canvas, jobject paint)
  1662. {
  1663. jobject rect = env->CallObjectMethod (canvas, AndroidCanvas.getClipBounds);
  1664. auto left = env->GetIntField (rect, AndroidRect.left);
  1665. auto top = env->GetIntField (rect, AndroidRect.top);
  1666. auto right = env->GetIntField (rect, AndroidRect.right);
  1667. auto bottom = env->GetIntField (rect, AndroidRect.bottom);
  1668. env->DeleteLocalRef (rect);
  1669. auto clip = Rectangle<int>::leftTopRightBottom (left, top, right, bottom);
  1670. if (clip.isEmpty())
  1671. return;
  1672. auto sizeNeeded = clip.getWidth() * clip.getHeight();
  1673. if (t.sizeAllocated < sizeNeeded)
  1674. {
  1675. t.buffer.clear();
  1676. t.sizeAllocated = sizeNeeded;
  1677. t.buffer = GlobalRef (LocalRef<jobject> ((jobject) env->NewIntArray (sizeNeeded)));
  1678. }
  1679. if (jint* dest = env->GetIntArrayElements ((jintArray) t.buffer.get(), nullptr))
  1680. {
  1681. {
  1682. Image temp (new PreallocatedImage (clip.getWidth(), clip.getHeight(),
  1683. dest, ! t.component.isOpaque()));
  1684. {
  1685. LowLevelGraphicsSoftwareRenderer g (temp);
  1686. g.setOrigin (-clip.getPosition());
  1687. g.addTransform (AffineTransform::scale (t.scale));
  1688. t.handlePaint (g);
  1689. }
  1690. }
  1691. env->ReleaseIntArrayElements ((jintArray) t.buffer.get(), dest, 0);
  1692. env->CallVoidMethod (canvas, AndroidCanvas.drawBitmap, (jintArray) t.buffer.get(), 0, clip.getWidth(),
  1693. (jfloat) clip.getX(), (jfloat) clip.getY(),
  1694. clip.getWidth(), clip.getHeight(), true, paint);
  1695. }
  1696. }
  1697. void repaint (const Rectangle<int>& userArea) override
  1698. {
  1699. auto area = (userArea.toFloat() * scale).toNearestInt();
  1700. GlobalRef localView (view);
  1701. callOnMessageThread ([area, localView]
  1702. {
  1703. localView.callVoidMethod (AndroidView.invalidate,
  1704. area.getX(), area.getY(), area.getRight(), area.getBottom());
  1705. });
  1706. }
  1707. void performAnyPendingRepaintsNow() override
  1708. {
  1709. // TODO
  1710. }
  1711. void setAlpha (float /*newAlpha*/) override
  1712. {
  1713. // TODO
  1714. }
  1715. StringArray getAvailableRenderingEngines() override
  1716. {
  1717. return StringArray ("Software Renderer");
  1718. }
  1719. //==============================================================================
  1720. static Point<float> lastMousePos;
  1721. static int64 touchesDown;
  1722. //==============================================================================
  1723. struct StartupActivityCallbackListener : public ActivityLifecycleCallbacks
  1724. {
  1725. void onActivityStarted (jobject /*activity*/) override
  1726. {
  1727. auto* env = getEnv();
  1728. LocalRef<jobject> appContext (getAppContext());
  1729. if (appContext.get() != nullptr)
  1730. {
  1731. env->CallVoidMethod (appContext.get(),
  1732. AndroidApplication.unregisterActivityLifecycleCallbacks,
  1733. activityCallbackListener.get());
  1734. clear();
  1735. activityCallbackListener.clear();
  1736. forceDisplayUpdate();
  1737. }
  1738. }
  1739. };
  1740. private:
  1741. template <auto Member>
  1742. static void mouseCallbackWrapper (JNIEnv*, AndroidComponentPeer& t, jint i, jfloat x, jfloat y, jlong time) { return (t.*Member) (i, Point<float> { x, y }, time); }
  1743. //==============================================================================
  1744. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  1745. METHOD (create, "<init>", "(Landroid/content/Context;ZJ)V") \
  1746. METHOD (clear, "clear", "()V") \
  1747. METHOD (setViewName, "setViewName", "(Ljava/lang/String;)V") \
  1748. METHOD (setVisible, "setVisible", "(Z)V") \
  1749. METHOD (isVisible, "isVisible", "()Z") \
  1750. METHOD (containsPoint, "containsPoint", "(II)Z") \
  1751. METHOD (showKeyboard, "showKeyboard", "(III)V") \
  1752. METHOD (hideKeyboard, "hideKeyboard", "()V") \
  1753. METHOD (closeInputMethodContext, "closeInputMethodContext", "()V") \
  1754. METHOD (setSystemUiVisibilityCompat, "setSystemUiVisibilityCompat", "(I)V") \
  1755. CALLBACK (generatedCallback<&AndroidComponentPeer::handleDoFrameCallback>, "handleDoFrame", "(JJ)V") \
  1756. CALLBACK (generatedCallback<&AndroidComponentPeer::handlePaintCallback>, "handlePaint", "(JLandroid/graphics/Canvas;Landroid/graphics/Paint;)V") \
  1757. CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyDownCallback>, "handleKeyDown", "(JIII)V") \
  1758. CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyUpCallback>, "handleKeyUp", "(JII)V") \
  1759. CALLBACK (generatedCallback<&AndroidComponentPeer::handleBackButtonCallback>, "handleBackButton", "(J)V") \
  1760. CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyboardHiddenCallback>, "handleKeyboardHidden", "(J)V") \
  1761. CALLBACK (generatedCallback<&AndroidComponentPeer::handleGetFocusedTextInputTargetCallback>, "getFocusedTextInputTargetPointer", "(J)J") \
  1762. CALLBACK (generatedCallback<&AndroidComponentPeer::handleMovedOrResizedCallback>, "viewSizeChanged", "(J)V") \
  1763. CALLBACK (generatedCallback<&AndroidComponentPeer::handleFocusChangeCallback>, "focusChanged", "(JZ)V") \
  1764. CALLBACK (generatedCallback<&AndroidComponentPeer::handleAppPausedCallback>, "handleAppPaused", "(J)V") \
  1765. CALLBACK (generatedCallback<&AndroidComponentPeer::handleAppResumedCallback>, "handleAppResumed", "(J)V") \
  1766. CALLBACK (generatedCallback<&AndroidComponentPeer::getNativeViewCallback>, "getNativeView", "(JI)Landroid/view/View;") \
  1767. CALLBACK (generatedCallback<&AndroidComponentPeer::populateAccessibilityNodeInfoCallback>, "populateAccessibilityNodeInfo", "(JILandroid/view/accessibility/AccessibilityNodeInfo;)Z") \
  1768. CALLBACK (generatedCallback<&AndroidComponentPeer::handlePerformActionCallback>, "handlePerformAction", "(JIILandroid/os/Bundle;)Z") \
  1769. CALLBACK (generatedCallback<&AndroidComponentPeer::getInputFocusViewIdCallback>, "getInputFocusViewId", "(J)Ljava/lang/Integer;") \
  1770. CALLBACK (generatedCallback<&AndroidComponentPeer::getAccessibilityFocusViewIdCallback>, "getAccessibilityFocusViewId", "(J)Ljava/lang/Integer;") \
  1771. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetIsTextInputActive>, "textInputTargetIsTextInputActive", "(J)Z") \
  1772. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetHighlightedRegionBegin>, "textInputTargetGetHighlightedRegionBegin", "(J)I") \
  1773. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetHighlightedRegionEnd>, "textInputTargetGetHighlightedRegionEnd", "(J)I") \
  1774. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetSetHighlightedRegion>, "textInputTargetSetHighlightedRegion", "(JII)V") \
  1775. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetTextInRange>, "textInputTargetGetTextInRange", "(JII)Ljava/lang/String;") \
  1776. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetInsertTextAtCaret>, "textInputTargetInsertTextAtCaret", "(JLjava/lang/String;)V") \
  1777. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetCaretPosition>, "textInputTargetGetCaretPosition", "(J)I") \
  1778. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetTotalNumChars>, "textInputTargetGetTotalNumChars", "(J)I") \
  1779. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetCharIndexForPoint>, "textInputTargetGetCharIndexForPoint", "(JLandroid/graphics/Point;)I") \
  1780. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetKeyboardType>, "textInputTargetGetKeyboardType", "(J)I") \
  1781. CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetSetTemporaryUnderlining>, "textInputTargetSetTemporaryUnderlining", "(JLjava/util/List;)V") \
  1782. CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseDownCallback>>, "handleMouseDown", "(JIFFJ)V") \
  1783. CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseDragCallback>>, "handleMouseDrag", "(JIFFJ)V") \
  1784. CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseUpCallback>>, "handleMouseUp", "(JIFFJ)V") \
  1785. CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleAccessibilityHoverCallback>>, "handleAccessibilityHover", "(JIFFJ)V") \
  1786. DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/rmsl/juce/ComponentPeerView", 16, javaComponentPeerView)
  1787. #undef JNI_CLASS_MEMBERS
  1788. static jboolean textInputTargetIsTextInputActive (JNIEnv*, const TextInputTarget& t)
  1789. {
  1790. return t.isTextInputActive();
  1791. }
  1792. static jint textInputTargetGetHighlightedRegionBegin (JNIEnv*, const TextInputTarget& t)
  1793. {
  1794. return t.getHighlightedRegion().getStart();
  1795. }
  1796. static jint textInputTargetGetHighlightedRegionEnd (JNIEnv*, const TextInputTarget& t)
  1797. {
  1798. return t.getHighlightedRegion().getEnd();
  1799. }
  1800. static void textInputTargetSetHighlightedRegion (JNIEnv*, TextInputTarget& t, jint b, jint e)
  1801. {
  1802. t.setHighlightedRegion ({ b, e });
  1803. }
  1804. static jstring textInputTargetGetTextInRange (JNIEnv* env, const TextInputTarget& t, jint b, jint e)
  1805. {
  1806. return env->NewStringUTF (t.getTextInRange ({ b, e }).toUTF8());
  1807. }
  1808. static void textInputTargetInsertTextAtCaret (JNIEnv*, TextInputTarget& t, jstring text)
  1809. {
  1810. t.insertTextAtCaret (juceString (text));
  1811. }
  1812. static jint textInputTargetGetCaretPosition (JNIEnv*, const TextInputTarget& t)
  1813. {
  1814. return t.getCaretPosition();
  1815. }
  1816. static jint textInputTargetGetTotalNumChars (JNIEnv*, const TextInputTarget& t)
  1817. {
  1818. return t.getTotalNumChars();
  1819. }
  1820. static jint textInputTargetGetCharIndexForPoint (JNIEnv* env, const TextInputTarget& t, jobject point)
  1821. {
  1822. return t.getCharIndexForPoint ({ env->GetIntField (point, AndroidPoint.x),
  1823. env->GetIntField (point, AndroidPoint.y) });
  1824. }
  1825. static jint textInputTargetGetKeyboardType (JNIEnv*, TextInputTarget& t)
  1826. {
  1827. return t.getKeyboardType();
  1828. }
  1829. static std::optional<Range<int>> getRangeFromPair (JNIEnv* env, jobject pair)
  1830. {
  1831. if (pair == nullptr)
  1832. return {};
  1833. const auto first = env->GetObjectField (pair, AndroidPair.first);
  1834. const auto second = env->GetObjectField (pair, AndroidPair.second);
  1835. if (first == nullptr || second == nullptr)
  1836. return {};
  1837. const auto begin = env->CallIntMethod (first, JavaInteger.intValue);
  1838. const auto end = env->CallIntMethod (second, JavaInteger.intValue);
  1839. return Range<int> { begin, end };
  1840. }
  1841. static Array<Range<int>> javaListOfPairToArrayOfRange (JNIEnv* env, jobject list)
  1842. {
  1843. if (list == nullptr)
  1844. return {};
  1845. Array<Range<int>> result;
  1846. for (jint i = 0; i < env->CallIntMethod (list, JavaList.size); ++i)
  1847. if (const auto range = getRangeFromPair (env, env->CallObjectMethod (list, JavaList.get, i)))
  1848. result.add (*range);
  1849. return result;
  1850. }
  1851. static void textInputTargetSetTemporaryUnderlining (JNIEnv* env, TextInputTarget& t, jobject list)
  1852. {
  1853. t.setTemporaryUnderlining (javaListOfPairToArrayOfRange (env, list));
  1854. }
  1855. //==============================================================================
  1856. class ViewWindowInsetsListener : public juce::AndroidInterfaceImplementer
  1857. {
  1858. public:
  1859. jobject onApplyWindowInsets (LocalRef<jobject>, LocalRef<jobject> insets)
  1860. {
  1861. auto* env = getEnv();
  1862. const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay();
  1863. const auto newInsets = getInsetsFromAndroidWindowInsets (insets, mainDisplay.scale);
  1864. if (newInsets.tie() != JuceInsets::tie (mainDisplay))
  1865. forceDisplayUpdate();
  1866. if (const auto fieldId = AndroidWindowInsets30.CONSUMED)
  1867. return env->GetStaticObjectField (AndroidWindowInsets30, fieldId);
  1868. return env->CallObjectMethod (insets, AndroidWindowInsets28.consumeDisplayCutout);
  1869. }
  1870. private:
  1871. jobject invoke (jobject proxy, jobject method, jobjectArray args) override
  1872. {
  1873. auto* env = getEnv();
  1874. auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
  1875. if (methodName == "onApplyWindowInsets")
  1876. {
  1877. jassert (env->GetArrayLength (args) == 2);
  1878. LocalRef<jobject> windowView (env->GetObjectArrayElement (args, 0));
  1879. LocalRef<jobject> insets (env->GetObjectArrayElement (args, 1));
  1880. return onApplyWindowInsets (std::move (windowView), std::move (insets));
  1881. }
  1882. // invoke base class
  1883. return AndroidInterfaceImplementer::invoke (proxy, method, args);
  1884. }
  1885. };
  1886. //==============================================================================
  1887. struct PreallocatedImage : public ImagePixelData
  1888. {
  1889. PreallocatedImage (int width_, int height_, jint* data_, bool hasAlpha_)
  1890. : ImagePixelData (Image::ARGB, width_, height_), data (data_), hasAlpha (hasAlpha_)
  1891. {
  1892. if (hasAlpha_)
  1893. zeromem (data_, static_cast<size_t> (width * height) * sizeof (jint));
  1894. }
  1895. ~PreallocatedImage() override
  1896. {
  1897. if (hasAlpha)
  1898. {
  1899. auto pix = (PixelARGB*) data;
  1900. for (int i = width * height; --i >= 0;)
  1901. {
  1902. pix->unpremultiply();
  1903. ++pix;
  1904. }
  1905. }
  1906. }
  1907. std::unique_ptr<ImageType> createType() const override
  1908. {
  1909. return std::make_unique<SoftwareImageType>();
  1910. }
  1911. std::unique_ptr<LowLevelGraphicsContext> createLowLevelContext() override
  1912. {
  1913. return std::make_unique<LowLevelGraphicsSoftwareRenderer> (Image (this));
  1914. }
  1915. void initialiseBitmapData (Image::BitmapData& bm, int x, int y, Image::BitmapData::ReadWriteMode /*mode*/) override
  1916. {
  1917. bm.lineStride = width * static_cast<int> (sizeof (jint));
  1918. bm.pixelStride = static_cast<int> (sizeof (jint));
  1919. bm.pixelFormat = Image::ARGB;
  1920. const auto offset = (size_t) x + (size_t) y * (size_t) width;
  1921. bm.data = (uint8*) (data + offset);
  1922. bm.size = sizeof (jint) * (((size_t) height * (size_t) width) - offset);
  1923. }
  1924. ImagePixelData::Ptr clone() override
  1925. {
  1926. auto s = new PreallocatedImage (width, height, nullptr, hasAlpha);
  1927. s->allocatedData.malloc (sizeof (jint) * static_cast<size_t> (width * height));
  1928. s->data = s->allocatedData;
  1929. memcpy (s->data, data, sizeof (jint) * static_cast<size_t> (width * height));
  1930. return s;
  1931. }
  1932. private:
  1933. jint* data;
  1934. HeapBlock<jint> allocatedData;
  1935. bool hasAlpha;
  1936. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PreallocatedImage)
  1937. };
  1938. //==============================================================================
  1939. void timerCallback() override
  1940. {
  1941. setNavBarsHidden (shouldNavBarsBeHidden (fullScreen));
  1942. setFullScreen (fullScreen);
  1943. stopTimer();
  1944. }
  1945. bool isKioskModeComponent() const
  1946. {
  1947. if (auto* kiosk = Desktop::getInstance().getKioskModeComponent())
  1948. return kiosk->getPeer() == this;
  1949. return false;
  1950. }
  1951. bool shouldNavBarsBeHidden (bool shouldBeFullScreen) const
  1952. {
  1953. return (shouldBeFullScreen && isKioskModeComponent());
  1954. }
  1955. void setNavBarsHidden (bool hidden)
  1956. {
  1957. if (navBarsHidden != hidden)
  1958. {
  1959. navBarsHidden = hidden;
  1960. view.callVoidMethod (ComponentPeerView.setSystemUiVisibilityCompat,
  1961. (navBarsHidden ? (jint) (fullScreenFlags) : (jint) (SYSTEM_UI_FLAG_VISIBLE)));
  1962. }
  1963. }
  1964. template <typename Callback>
  1965. static void callOnMessageThread (Callback&& callback)
  1966. {
  1967. if (MessageManager::getInstance()->isThisTheMessageThread())
  1968. callback();
  1969. else
  1970. MessageManager::callAsync (std::forward<Callback> (callback));
  1971. }
  1972. //==============================================================================
  1973. friend class Displays;
  1974. static AndroidComponentPeer* frontWindow;
  1975. static GlobalRef activityCallbackListener;
  1976. static constexpr int GRAVITY_LEFT = 0x3, GRAVITY_TOP = 0x30;
  1977. static constexpr int TYPE_APPLICATION = 0x2;
  1978. static constexpr int FLAG_NOT_TOUCH_MODAL = 0x20, FLAG_LAYOUT_IN_SCREEN = 0x100, FLAG_LAYOUT_NO_LIMITS = 0x200;
  1979. static constexpr int PIXEL_FORMAT_OPAQUE = -1, PIXEL_FORMAT_TRANSPARENT = -2;
  1980. static constexpr int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS = 0x3;
  1981. GlobalRef view, viewGroup, buffer;
  1982. bool viewGroupIsWindow = false, fullScreen = false, navBarsHidden = false;
  1983. int sizeAllocated = 0;
  1984. float scale = (float) Desktop::getInstance().getDisplays().getPrimaryDisplay()->scale;
  1985. //==============================================================================
  1986. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AndroidComponentPeer)
  1987. };
  1988. Point<float> AndroidComponentPeer::lastMousePos;
  1989. int64 AndroidComponentPeer::touchesDown = 0;
  1990. AndroidComponentPeer* AndroidComponentPeer::frontWindow = nullptr;
  1991. GlobalRef AndroidComponentPeer::activityCallbackListener;
  1992. //==============================================================================
  1993. ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindow)
  1994. {
  1995. return new AndroidComponentPeer (*this, styleFlags, nativeWindow);
  1996. }
  1997. //==============================================================================
  1998. bool Desktop::canUseSemiTransparentWindows() noexcept
  1999. {
  2000. return true;
  2001. }
  2002. class Desktop::NativeDarkModeChangeDetectorImpl : public ActivityLifecycleCallbacks
  2003. {
  2004. public:
  2005. NativeDarkModeChangeDetectorImpl()
  2006. {
  2007. LocalRef<jobject> appContext (getAppContext());
  2008. if (appContext != nullptr)
  2009. {
  2010. auto* env = getEnv();
  2011. myself = GlobalRef (CreateJavaInterface (this, "android/app/Application$ActivityLifecycleCallbacks"));
  2012. env->CallVoidMethod (appContext.get(), AndroidApplication.registerActivityLifecycleCallbacks, myself.get());
  2013. }
  2014. }
  2015. ~NativeDarkModeChangeDetectorImpl() override
  2016. {
  2017. LocalRef<jobject> appContext (getAppContext());
  2018. if (appContext != nullptr && myself != nullptr)
  2019. {
  2020. auto* env = getEnv();
  2021. env->CallVoidMethod (appContext.get(),
  2022. AndroidApplication.unregisterActivityLifecycleCallbacks,
  2023. myself.get());
  2024. clear();
  2025. myself.clear();
  2026. }
  2027. }
  2028. bool isDarkModeEnabled() const noexcept { return darkModeEnabled; }
  2029. void onActivityStarted (jobject /*activity*/) override
  2030. {
  2031. const auto isEnabled = getDarkModeSetting();
  2032. if (darkModeEnabled != isEnabled)
  2033. {
  2034. darkModeEnabled = isEnabled;
  2035. Desktop::getInstance().darkModeChanged();
  2036. }
  2037. }
  2038. private:
  2039. static bool getDarkModeSetting()
  2040. {
  2041. auto* env = getEnv();
  2042. const LocalRef<jobject> resources (env->CallObjectMethod (getAppContext().get(), AndroidContext.getResources));
  2043. const LocalRef<jobject> configuration (env->CallObjectMethod (resources, AndroidResources.getConfiguration));
  2044. const auto uiMode = env->GetIntField (configuration, AndroidConfiguration.uiMode);
  2045. return ((uiMode & UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES);
  2046. }
  2047. static constexpr int UI_MODE_NIGHT_MASK = 0x00000030,
  2048. UI_MODE_NIGHT_NO = 0x00000010,
  2049. UI_MODE_NIGHT_UNDEFINED = 0x00000000,
  2050. UI_MODE_NIGHT_YES = 0x00000020;
  2051. GlobalRef myself;
  2052. bool darkModeEnabled = getDarkModeSetting();
  2053. //==============================================================================
  2054. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl)
  2055. };
  2056. std::unique_ptr<Desktop::NativeDarkModeChangeDetectorImpl> Desktop::createNativeDarkModeChangeDetectorImpl()
  2057. {
  2058. return std::make_unique<NativeDarkModeChangeDetectorImpl>();
  2059. }
  2060. bool Desktop::isDarkModeActive() const
  2061. {
  2062. return nativeDarkModeChangeDetectorImpl->isDarkModeEnabled();
  2063. }
  2064. double Desktop::getDefaultMasterScale()
  2065. {
  2066. return 1.0;
  2067. }
  2068. Desktop::DisplayOrientation Desktop::getCurrentOrientation() const
  2069. {
  2070. enum
  2071. {
  2072. ROTATION_0 = 0,
  2073. ROTATION_90 = 1,
  2074. ROTATION_180 = 2,
  2075. ROTATION_270 = 3
  2076. };
  2077. JNIEnv* env = getEnv();
  2078. LocalRef<jstring> windowServiceString (javaString ("window"));
  2079. LocalRef<jobject> windowManager = LocalRef<jobject> (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get()));
  2080. if (windowManager.get() != nullptr)
  2081. {
  2082. LocalRef<jobject> display = LocalRef<jobject> (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));
  2083. if (display.get() != nullptr)
  2084. {
  2085. int rotation = env->CallIntMethod (display, AndroidDisplay.getRotation);
  2086. switch (rotation)
  2087. {
  2088. case ROTATION_0: return upright;
  2089. case ROTATION_90: return rotatedAntiClockwise;
  2090. case ROTATION_180: return upsideDown;
  2091. case ROTATION_270: return rotatedClockwise;
  2092. }
  2093. }
  2094. }
  2095. jassertfalse;
  2096. return upright;
  2097. }
  2098. bool detail::MouseInputSourceList::addSource()
  2099. {
  2100. addSource (sources.size(), MouseInputSource::InputSourceType::touch);
  2101. return true;
  2102. }
  2103. bool detail::MouseInputSourceList::canUseTouch() const
  2104. {
  2105. return true;
  2106. }
  2107. Point<float> MouseInputSource::getCurrentRawMousePosition()
  2108. {
  2109. return AndroidComponentPeer::lastMousePos;
  2110. }
  2111. void MouseInputSource::setRawMousePosition (Point<float>)
  2112. {
  2113. // not needed
  2114. }
  2115. //==============================================================================
  2116. bool KeyPress::isKeyCurrentlyDown (int /*keyCode*/)
  2117. {
  2118. // TODO
  2119. return false;
  2120. }
  2121. JUCE_API void JUCE_CALLTYPE Process::hide()
  2122. {
  2123. auto* env = getEnv();
  2124. LocalRef<jobject> currentActivity (getCurrentActivity().get());
  2125. if (env->CallBooleanMethod (currentActivity.get(), AndroidActivity.moveTaskToBack, true) == 0)
  2126. {
  2127. GlobalRef intent (LocalRef<jobject> (env->NewObject (AndroidIntent, AndroidIntent.constructor)));
  2128. env->CallObjectMethod (intent, AndroidIntent.setAction, javaString ("android.intent.action.MAIN") .get());
  2129. env->CallObjectMethod (intent, AndroidIntent.addCategory, javaString ("android.intent.category.HOME").get());
  2130. env->CallVoidMethod (currentActivity.get(), AndroidContext.startActivity, intent.get());
  2131. }
  2132. }
  2133. //==============================================================================
  2134. // TODO
  2135. JUCE_API bool JUCE_CALLTYPE Process::isForegroundProcess() { return true; }
  2136. JUCE_API void JUCE_CALLTYPE Process::makeForegroundProcess() {}
  2137. //==============================================================================
  2138. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  2139. METHOD (show, "show", "()V") \
  2140. METHOD (getWindow, "getWindow", "()Landroid/view/Window;")
  2141. DECLARE_JNI_CLASS (AndroidDialog, "android/app/Dialog")
  2142. #undef JNI_CLASS_MEMBERS
  2143. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  2144. METHOD (construct, "<init>", "(Landroid/content/Context;)V") \
  2145. METHOD (create, "create", "()Landroid/app/AlertDialog;") \
  2146. METHOD (setTitle, "setTitle", "(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;") \
  2147. METHOD (setMessage, "setMessage", "(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;") \
  2148. METHOD (setCancelable, "setCancelable", "(Z)Landroid/app/AlertDialog$Builder;") \
  2149. METHOD (setOnCancelListener, "setOnCancelListener", "(Landroid/content/DialogInterface$OnCancelListener;)Landroid/app/AlertDialog$Builder;") \
  2150. METHOD (setPositiveButton, "setPositiveButton", "(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;") \
  2151. METHOD (setNegativeButton, "setNegativeButton", "(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;") \
  2152. METHOD (setNeutralButton, "setNeutralButton", "(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;")
  2153. DECLARE_JNI_CLASS (AndroidAlertDialogBuilder, "android/app/AlertDialog$Builder")
  2154. #undef JNI_CLASS_MEMBERS
  2155. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  2156. METHOD (dismiss, "dismiss", "()V")
  2157. DECLARE_JNI_CLASS (AndroidDialogInterface, "android/content/DialogInterface")
  2158. #undef JNI_CLASS_MEMBERS
  2159. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  2160. DECLARE_JNI_CLASS (AndroidDialogOnClickListener, "android/content/DialogInterface$OnClickListener")
  2161. #undef JNI_CLASS_MEMBERS
  2162. //==============================================================================
  2163. class DialogListener : public juce::AndroidInterfaceImplementer
  2164. {
  2165. public:
  2166. explicit DialogListener (std::function<void()> cb) : callback (std::move (cb)) {}
  2167. jobject invoke (jobject proxy, jobject method, jobjectArray args) override
  2168. {
  2169. auto* env = getEnv();
  2170. auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
  2171. if (methodName == "onCancel" || methodName == "onClick")
  2172. {
  2173. auto* dialog = env->GetObjectArrayElement (args, 0);
  2174. env->CallVoidMethod (dialog, AndroidDialogInterface.dismiss);
  2175. NullCheckedInvocation::invoke (callback);
  2176. return nullptr;
  2177. }
  2178. // invoke base class
  2179. return AndroidInterfaceImplementer::invoke (proxy, method, args);
  2180. }
  2181. private:
  2182. std::function<void()> callback;
  2183. };
  2184. //==============================================================================
  2185. static bool androidScreenSaverEnabled = true;
  2186. void Desktop::setScreenSaverEnabled (bool shouldEnable)
  2187. {
  2188. constexpr auto FLAG_KEEP_SCREEN_ON = 0x80;
  2189. if (shouldEnable != androidScreenSaverEnabled)
  2190. {
  2191. LocalRef<jobject> activity (getMainActivity());
  2192. if (activity != nullptr)
  2193. {
  2194. auto* env = getEnv();
  2195. LocalRef<jobject> mainWindow (env->CallObjectMethod (activity.get(), AndroidActivity.getWindow));
  2196. env->CallVoidMethod (mainWindow.get(), AndroidWindow.setFlags, shouldEnable ? 0 : FLAG_KEEP_SCREEN_ON, FLAG_KEEP_SCREEN_ON);
  2197. }
  2198. androidScreenSaverEnabled = shouldEnable;
  2199. }
  2200. }
  2201. bool Desktop::isScreenSaverEnabled()
  2202. {
  2203. return androidScreenSaverEnabled;
  2204. }
  2205. //==============================================================================
  2206. void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, [[maybe_unused]] bool allowMenusAndBars)
  2207. {
  2208. if (AndroidComponentPeer* peer = dynamic_cast<AndroidComponentPeer*> (kioskComp->getPeer()))
  2209. peer->setFullScreen (enableOrDisable);
  2210. else
  2211. jassertfalse; // (this should have been checked by the caller)
  2212. }
  2213. //==============================================================================
  2214. static jint getAndroidOrientationFlag (int orientations) noexcept
  2215. {
  2216. enum
  2217. {
  2218. SCREEN_ORIENTATION_LANDSCAPE = 0,
  2219. SCREEN_ORIENTATION_PORTRAIT = 1,
  2220. SCREEN_ORIENTATION_USER = 2,
  2221. SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8,
  2222. SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9,
  2223. SCREEN_ORIENTATION_USER_LANDSCAPE = 11,
  2224. SCREEN_ORIENTATION_USER_PORTRAIT = 12,
  2225. };
  2226. switch (orientations)
  2227. {
  2228. case Desktop::upright: return (jint) SCREEN_ORIENTATION_PORTRAIT;
  2229. case Desktop::upsideDown: return (jint) SCREEN_ORIENTATION_REVERSE_PORTRAIT;
  2230. case Desktop::upright + Desktop::upsideDown: return (jint) SCREEN_ORIENTATION_USER_PORTRAIT;
  2231. case Desktop::rotatedAntiClockwise: return (jint) SCREEN_ORIENTATION_LANDSCAPE;
  2232. case Desktop::rotatedClockwise: return (jint) SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
  2233. case Desktop::rotatedClockwise + Desktop::rotatedAntiClockwise: return (jint) SCREEN_ORIENTATION_USER_LANDSCAPE;
  2234. default: return (jint) SCREEN_ORIENTATION_USER;
  2235. }
  2236. }
  2237. void Desktop::allowedOrientationsChanged()
  2238. {
  2239. LocalRef<jobject> activity (getMainActivity());
  2240. if (activity != nullptr)
  2241. getEnv()->CallVoidMethod (activity.get(), AndroidActivity.setRequestedOrientation, getAndroidOrientationFlag (allowedOrientations));
  2242. }
  2243. //==============================================================================
  2244. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  2245. METHOD (create, "<init>", "()V") \
  2246. FIELD (density, "density", "F") \
  2247. FIELD (widthPixels, "widthPixels", "I") \
  2248. FIELD (heightPixels, "heightPixels", "I")
  2249. DECLARE_JNI_CLASS (AndroidDisplayMetrics, "android/util/DisplayMetrics")
  2250. #undef JNI_CLASS_MEMBERS
  2251. //==============================================================================
  2252. class LayoutChangeListener : public juce::AndroidInterfaceImplementer
  2253. {
  2254. public:
  2255. virtual void onLayoutChange (LocalRef<jobject> view, int left, int top, int right, int bottom,
  2256. int oldLeft, int oldTop, int oldRight, int oldBottom) = 0;
  2257. private:
  2258. jobject invoke (jobject proxy, jobject method, jobjectArray args) override
  2259. {
  2260. auto* env = getEnv();
  2261. auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
  2262. if (methodName == "onLayoutChange")
  2263. {
  2264. jassert (env->GetArrayLength (args) == 9);
  2265. LocalRef<jobject> view (env->GetObjectArrayElement (args, 0));
  2266. int dims[8];
  2267. for (int i = 1; i < 9; ++i)
  2268. {
  2269. LocalRef<jobject> integer (env->GetObjectArrayElement (args, i));
  2270. dims[i - 1] = env->CallIntMethod (integer.get(), JavaInteger.intValue);
  2271. }
  2272. onLayoutChange (std::move (view), dims[0], dims[1], dims[2], dims[3],
  2273. dims[4], dims[5], dims[6], dims[7]);
  2274. return nullptr;
  2275. }
  2276. // invoke base class
  2277. return AndroidInterfaceImplementer::invoke (proxy, method, args);
  2278. }
  2279. std::unique_ptr<ModalComponentManager::Callback> callback;
  2280. };
  2281. //==============================================================================
  2282. struct MainActivityWindowLayoutListener : public LayoutChangeListener
  2283. {
  2284. MainActivityWindowLayoutListener (std::function<void()>&& updateDisplaysCb)
  2285. : forceDisplayUpdate (std::move (updateDisplaysCb))
  2286. {
  2287. }
  2288. void onLayoutChange (LocalRef<jobject> /*view*/, int left, int top, int right, int bottom,
  2289. int oldLeft, int oldTop, int oldRight, int oldBottom) override
  2290. {
  2291. auto newBounds = Rectangle<int>::leftTopRightBottom (left, top, right, bottom);
  2292. auto oldBounds = Rectangle<int>::leftTopRightBottom (oldLeft, oldTop, oldRight, oldBottom);
  2293. if (newBounds != oldBounds)
  2294. {
  2295. const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay();
  2296. auto userArea = (newBounds.toFloat() / mainDisplay.scale).toNearestInt();
  2297. if (userArea != mainDisplay.userArea)
  2298. forceDisplayUpdate();
  2299. }
  2300. }
  2301. std::function<void()> forceDisplayUpdate;
  2302. };
  2303. //==============================================================================
  2304. void Displays::findDisplays (float masterScale)
  2305. {
  2306. auto* env = getEnv();
  2307. LocalRef<jobject> usableSize (makeAndroidPoint ({}));
  2308. LocalRef<jstring> windowServiceString (javaString ("window"));
  2309. LocalRef<jobject> displayMetrics (env->NewObject (AndroidDisplayMetrics, AndroidDisplayMetrics.create));
  2310. LocalRef<jobject> windowManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get()));
  2311. LocalRef<jobject> display (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));
  2312. if (const auto getRealMetricsMethod = AndroidDisplay17.getRealMetrics)
  2313. env->CallVoidMethod (display, getRealMetricsMethod, displayMetrics.get());
  2314. else
  2315. env->CallVoidMethod (display, AndroidDisplay.getMetrics, displayMetrics.get());
  2316. env->CallVoidMethod (display, AndroidDisplay.getSize, usableSize.get());
  2317. Display d;
  2318. d.isMain = true;
  2319. d.scale = env->GetFloatField (displayMetrics.get(), AndroidDisplayMetrics.density);
  2320. d.dpi = (d.scale * 160.f);
  2321. d.scale *= masterScale;
  2322. d.totalArea = Rectangle<int> (env->GetIntField (displayMetrics.get(), AndroidDisplayMetrics.widthPixels),
  2323. env->GetIntField (displayMetrics.get(), AndroidDisplayMetrics.heightPixels)) / d.scale;
  2324. d.userArea = Rectangle<int> (env->GetIntField (usableSize.get(), AndroidPoint.x),
  2325. env->GetIntField (usableSize.get(), AndroidPoint.y)) / d.scale;
  2326. // unfortunately usableSize still contains the nav bar
  2327. // the best workaround is to try to get the size of the top-level view of
  2328. // the main activity
  2329. LocalRef<jobject> activity (getMainActivity());
  2330. if (activity != nullptr)
  2331. {
  2332. LocalRef<jobject> mainWindow (env->CallObjectMethod (activity.get(), AndroidActivity.getWindow));
  2333. LocalRef<jobject> decorView (env->CallObjectMethod (mainWindow.get(), AndroidWindow.getDecorView));
  2334. LocalRef<jobject> contentView (env->CallObjectMethod (decorView.get(), AndroidView.findViewById, 0x01020002 /* android.R.id.content */));
  2335. if (contentView != nullptr)
  2336. {
  2337. Rectangle<int> activityArea (env->CallIntMethod (contentView.get(), AndroidView.getLeft),
  2338. env->CallIntMethod (contentView.get(), AndroidView.getTop),
  2339. env->CallIntMethod (contentView.get(), AndroidView.getWidth),
  2340. env->CallIntMethod (contentView.get(), AndroidView.getHeight));
  2341. if (! activityArea.isEmpty())
  2342. d.userArea = activityArea / d.scale;
  2343. if (const auto getRootWindowInsetsMethodId = AndroidView23.getRootWindowInsets)
  2344. {
  2345. LocalRef<jobject> insets (env->CallObjectMethod (contentView.get(), getRootWindowInsetsMethodId));
  2346. JuceInsets::tie (d) = getInsetsFromAndroidWindowInsets (insets, d.scale).tie();
  2347. }
  2348. static bool hasAddedMainActivityListener = false;
  2349. if (! hasAddedMainActivityListener)
  2350. {
  2351. hasAddedMainActivityListener = true;
  2352. env->CallVoidMethod (contentView.get(), AndroidView.addOnLayoutChangeListener,
  2353. CreateJavaInterface (new MainActivityWindowLayoutListener ([this] { refresh(); }),
  2354. "android/view/View$OnLayoutChangeListener").get());
  2355. }
  2356. }
  2357. }
  2358. else
  2359. {
  2360. // the main activity may have not started yet so add an activity listener
  2361. if (AndroidComponentPeer::activityCallbackListener == nullptr)
  2362. {
  2363. LocalRef<jobject> appContext (getAppContext());
  2364. if (appContext.get() != nullptr)
  2365. {
  2366. AndroidComponentPeer::activityCallbackListener = GlobalRef (CreateJavaInterface (
  2367. new AndroidComponentPeer::StartupActivityCallbackListener,
  2368. "android/app/Application$ActivityLifecycleCallbacks"));
  2369. env->CallVoidMethod (appContext.get(),
  2370. AndroidApplication.registerActivityLifecycleCallbacks,
  2371. AndroidComponentPeer::activityCallbackListener.get());
  2372. }
  2373. }
  2374. }
  2375. displays.add (d);
  2376. }
  2377. //==============================================================================
  2378. Image detail::WindowingHelpers::createIconForFile (const File& /*file*/)
  2379. {
  2380. return {};
  2381. }
  2382. //==============================================================================
  2383. class MouseCursor::PlatformSpecificHandle
  2384. {
  2385. public:
  2386. PlatformSpecificHandle (const MouseCursor::StandardCursorType) {}
  2387. PlatformSpecificHandle (const detail::CustomMouseCursorInfo&) {}
  2388. static void showInWindow (PlatformSpecificHandle*, ComponentPeer*) {}
  2389. };
  2390. //==============================================================================
  2391. bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& /*files*/, bool /*canMove*/,
  2392. Component* /*srcComp*/, std::function<void()> /*callback*/)
  2393. {
  2394. jassertfalse; // no such thing on Android!
  2395. return false;
  2396. }
  2397. bool DragAndDropContainer::performExternalDragDropOfText (const String& /*text*/, Component* /*srcComp*/,
  2398. std::function<void()> /*callback*/)
  2399. {
  2400. jassertfalse; // no such thing on Android!
  2401. return false;
  2402. }
  2403. //==============================================================================
  2404. void LookAndFeel::playAlertSound()
  2405. {
  2406. }
  2407. //==============================================================================
  2408. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  2409. METHOD (getText, "getText", "()Ljava/lang/CharSequence;") \
  2410. METHOD (setText, "setText", "(Ljava/lang/CharSequence;)V")
  2411. DECLARE_JNI_CLASS (AndroidClipboardManager, "android/content/ClipboardManager")
  2412. #undef JNI_CLASS_MEMBERS
  2413. //==============================================================================
  2414. void SystemClipboard::copyTextToClipboard (const String& text)
  2415. {
  2416. auto* env = getEnv();
  2417. LocalRef<jobject> clipboardManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, javaString ("clipboard").get()));
  2418. env->CallVoidMethod (clipboardManager.get(), AndroidClipboardManager.setText, javaString(text).get());
  2419. }
  2420. String SystemClipboard::getTextFromClipboard()
  2421. {
  2422. auto* env = getEnv();
  2423. LocalRef<jobject> clipboardManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, javaString ("clipboard").get()));
  2424. LocalRef<jobject> charSequence (env->CallObjectMethod (clipboardManager.get(), AndroidClipboardManager.getText));
  2425. if (charSequence == nullptr)
  2426. return {};
  2427. return juceString(LocalRef<jstring> ((jstring) env->CallObjectMethod(charSequence.get(), JavaCharSequence.toString)));
  2428. }
  2429. //==============================================================================
  2430. constexpr int extendedKeyModifier = 0x10000;
  2431. const int KeyPress::spaceKey = ' ';
  2432. const int KeyPress::returnKey = extendedKeyModifier + 2;
  2433. const int KeyPress::escapeKey = extendedKeyModifier + 3;
  2434. const int KeyPress::backspaceKey = extendedKeyModifier + 4;
  2435. const int KeyPress::leftKey = extendedKeyModifier + 5;
  2436. const int KeyPress::rightKey = extendedKeyModifier + 6;
  2437. const int KeyPress::upKey = extendedKeyModifier + 7;
  2438. const int KeyPress::downKey = extendedKeyModifier + 8;
  2439. const int KeyPress::pageUpKey = extendedKeyModifier + 9;
  2440. const int KeyPress::pageDownKey = extendedKeyModifier + 10;
  2441. const int KeyPress::endKey = extendedKeyModifier + 11;
  2442. const int KeyPress::homeKey = extendedKeyModifier + 12;
  2443. const int KeyPress::deleteKey = extendedKeyModifier + 13;
  2444. const int KeyPress::insertKey = extendedKeyModifier + 14;
  2445. const int KeyPress::tabKey = extendedKeyModifier + 15;
  2446. const int KeyPress::F1Key = extendedKeyModifier + 16;
  2447. const int KeyPress::F2Key = extendedKeyModifier + 17;
  2448. const int KeyPress::F3Key = extendedKeyModifier + 18;
  2449. const int KeyPress::F4Key = extendedKeyModifier + 19;
  2450. const int KeyPress::F5Key = extendedKeyModifier + 20;
  2451. const int KeyPress::F6Key = extendedKeyModifier + 21;
  2452. const int KeyPress::F7Key = extendedKeyModifier + 22;
  2453. const int KeyPress::F8Key = extendedKeyModifier + 23;
  2454. const int KeyPress::F9Key = extendedKeyModifier + 24;
  2455. const int KeyPress::F10Key = extendedKeyModifier + 25;
  2456. const int KeyPress::F11Key = extendedKeyModifier + 26;
  2457. const int KeyPress::F12Key = extendedKeyModifier + 27;
  2458. const int KeyPress::F13Key = extendedKeyModifier + 28;
  2459. const int KeyPress::F14Key = extendedKeyModifier + 29;
  2460. const int KeyPress::F15Key = extendedKeyModifier + 30;
  2461. const int KeyPress::F16Key = extendedKeyModifier + 31;
  2462. const int KeyPress::F17Key = extendedKeyModifier + 32;
  2463. const int KeyPress::F18Key = extendedKeyModifier + 33;
  2464. const int KeyPress::F19Key = extendedKeyModifier + 34;
  2465. const int KeyPress::F20Key = extendedKeyModifier + 35;
  2466. const int KeyPress::F21Key = extendedKeyModifier + 36;
  2467. const int KeyPress::F22Key = extendedKeyModifier + 37;
  2468. const int KeyPress::F23Key = extendedKeyModifier + 38;
  2469. const int KeyPress::F24Key = extendedKeyModifier + 39;
  2470. const int KeyPress::F25Key = extendedKeyModifier + 40;
  2471. const int KeyPress::F26Key = extendedKeyModifier + 41;
  2472. const int KeyPress::F27Key = extendedKeyModifier + 42;
  2473. const int KeyPress::F28Key = extendedKeyModifier + 43;
  2474. const int KeyPress::F29Key = extendedKeyModifier + 44;
  2475. const int KeyPress::F30Key = extendedKeyModifier + 45;
  2476. const int KeyPress::F31Key = extendedKeyModifier + 46;
  2477. const int KeyPress::F32Key = extendedKeyModifier + 47;
  2478. const int KeyPress::F33Key = extendedKeyModifier + 48;
  2479. const int KeyPress::F34Key = extendedKeyModifier + 49;
  2480. const int KeyPress::F35Key = extendedKeyModifier + 50;
  2481. const int KeyPress::numberPad0 = extendedKeyModifier + 51;
  2482. const int KeyPress::numberPad1 = extendedKeyModifier + 52;
  2483. const int KeyPress::numberPad2 = extendedKeyModifier + 53;
  2484. const int KeyPress::numberPad3 = extendedKeyModifier + 54;
  2485. const int KeyPress::numberPad4 = extendedKeyModifier + 55;
  2486. const int KeyPress::numberPad5 = extendedKeyModifier + 56;
  2487. const int KeyPress::numberPad6 = extendedKeyModifier + 57;
  2488. const int KeyPress::numberPad7 = extendedKeyModifier + 58;
  2489. const int KeyPress::numberPad8 = extendedKeyModifier + 59;
  2490. const int KeyPress::numberPad9 = extendedKeyModifier + 60;
  2491. const int KeyPress::numberPadAdd = extendedKeyModifier + 61;
  2492. const int KeyPress::numberPadSubtract = extendedKeyModifier + 62;
  2493. const int KeyPress::numberPadMultiply = extendedKeyModifier + 63;
  2494. const int KeyPress::numberPadDivide = extendedKeyModifier + 64;
  2495. const int KeyPress::numberPadSeparator = extendedKeyModifier + 65;
  2496. const int KeyPress::numberPadDecimalPoint = extendedKeyModifier + 66;
  2497. const int KeyPress::numberPadEquals = extendedKeyModifier + 67;
  2498. const int KeyPress::numberPadDelete = extendedKeyModifier + 68;
  2499. const int KeyPress::playKey = extendedKeyModifier + 69;
  2500. const int KeyPress::stopKey = extendedKeyModifier + 70;
  2501. const int KeyPress::fastForwardKey = extendedKeyModifier + 71;
  2502. const int KeyPress::rewindKey = extendedKeyModifier + 72;
  2503. //==============================================================================
  2504. #ifdef JUCE_PUSH_NOTIFICATIONS_ACTIVITY
  2505. struct JuceActivityNewIntentListener
  2506. {
  2507. #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
  2508. CALLBACK (appNewIntent, "appNewIntent", "(Landroid/content/Intent;)V") \
  2509. CALLBACK (appOnResume, "appOnResume", "()V")
  2510. DECLARE_JNI_CLASS (JavaActivity, JUCE_PUSH_NOTIFICATIONS_ACTIVITY)
  2511. #undef JNI_CLASS_MEMBERS
  2512. static void JNICALL appNewIntent (JNIEnv*, jobject /*activity*/, jobject intentData)
  2513. {
  2514. juce_handleNotificationIntent (static_cast<void*> (intentData));
  2515. }
  2516. static void JNICALL appOnResume (JNIEnv*, jobject)
  2517. {
  2518. juce_handleOnResume();
  2519. }
  2520. };
  2521. #endif
  2522. } // namespace juce