| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 cr.define('hotword.constants', function() { | 5 cr.define('hotword.constants', function() { |
| 6 'use strict'; | 6 'use strict'; |
| 7 | 7 |
| 8 /** | 8 /** |
| 9 * Number of seconds of audio to record when logging is enabled. | 9 * Number of seconds of audio to record when logging is enabled. |
| 10 * @const {number} | 10 * @const {number} |
| 11 */ | 11 */ |
| 12 var AUDIO_LOG_SECONDS = 2; | 12 var AUDIO_LOG_SECONDS = 2; |
| 13 | 13 |
| 14 /** | 14 /** |
| 15 * Timeout in seconds, for detecting false positives with a hotword stream. | 15 * Timeout in seconds, for detecting false positives with a hotword stream. |
| 16 * @const {number} | 16 * @const {number} |
| 17 */ | 17 */ |
| 18 var HOTWORD_STREAM_TIMEOUT_SECONDS = 2; | 18 var HOTWORD_STREAM_TIMEOUT_SECONDS = 2; |
| 19 | 19 |
| 20 /** | 20 /** |
| 21 * Hotword data shared module extension's ID. | 21 * Hotword data shared module extension's ID. |
| 22 * @const {string} | 22 * @const {string} |
| 23 */ | 23 */ |
| 24 var SHARED_MODULE_ID = 'lccekmodgklaepjeofjdjpbminllajkg'; | 24 var SHARED_MODULE_ID = 'lccekmodgklaepjeofjdjpbminllajkg'; |
| 25 | 25 |
| 26 /** | 26 /** |
| 27 * Path to shared module data. | 27 * Path to shared module data. |
| 28 * @const {string} | 28 * @const {string} |
| 29 */ | 29 */ |
| 30 var SHARED_MODULE_ROOT = '_modules/' + SHARED_MODULE_ID; | 30 var SHARED_MODULE_ROOT = '_modules/' + SHARED_MODULE_ID; |
| 31 | 31 |
| 32 /** | 32 /** |
| 33 * Name used by the content scripts to create communications Ports. | 33 * Name used by the content scripts to create communications Ports. |
| 34 * @const {string} | 34 * @const {string} |
| 35 */ | 35 */ |
| 36 var CLIENT_PORT_NAME = 'chwcpn'; | 36 var CLIENT_PORT_NAME = 'chwcpn'; |
| 37 | 37 |
| 38 /** | 38 /** |
| 39 * The field name to specify the command among pages. | 39 * The field name to specify the command among pages. |
| 40 * @const {string} | 40 * @const {string} |
| 41 */ | 41 */ |
| 42 var COMMAND_FIELD_NAME = 'cmd'; | 42 var COMMAND_FIELD_NAME = 'cmd'; |
| 43 | 43 |
| 44 /** | 44 /** |
| 45 * The speaker model file name. | 45 * The speaker model file name. |
| 46 * @const {string} | 46 * @const {string} |
| 47 */ | 47 */ |
| 48 var SPEAKER_MODEL_FILE_NAME = 'speaker_model.data'; | 48 var SPEAKER_MODEL_FILE_NAME = 'speaker_model.data'; |
| 49 | 49 |
| 50 /** | 50 /** |
| 51 * The training utterance file name prefix. | 51 * The training utterance file name prefix. |
| 52 * @const {string} | 52 * @const {string} |
| 53 */ | 53 */ |
| 54 var UTTERANCE_FILE_PREFIX = 'utterance-'; | 54 var UTTERANCE_FILE_PREFIX = 'utterance-'; |
| 55 | 55 |
| 56 /** | 56 /** |
| 57 * The training utterance file extension. | 57 * The training utterance file extension. |
| 58 * @const {string} | 58 * @const {string} |
| 59 */ | 59 */ |
| 60 var UTTERANCE_FILE_EXTENSION = '.raw'; | 60 var UTTERANCE_FILE_EXTENSION = '.raw'; |
| 61 | 61 |
| 62 /** | 62 /** |
| 63 * The number of training utterances required to train the speaker model. | 63 * The number of training utterances required to train the speaker model. |
| 64 * @const {number} | 64 * @const {number} |
| 65 */ | 65 */ |
| 66 var NUM_TRAINING_UTTERANCES = 3; | 66 var NUM_TRAINING_UTTERANCES = 3; |
| 67 | 67 |
| 68 /** | 68 /** |
| 69 * The size of the file system requested for reading the speaker model and | 69 * The size of the file system requested for reading the speaker model and |
| 70 * utterances. This number should always be larger than the combined file size, | 70 * utterances. This number should always be larger than the combined file |
| 71 * currently 576338 bytes as of February 2015. | 71 * size, |
| 72 * @const {number} | 72 * currently 576338 bytes as of February 2015. |
| 73 */ | 73 * @const {number} |
| 74 var FILE_SYSTEM_SIZE_BYTES = 1048576; | 74 */ |
| 75 | 75 var FILE_SYSTEM_SIZE_BYTES = 1048576; |
| 76 /** | 76 |
| 77 * Time to wait for expected messages, in milliseconds. | 77 /** |
| 78 * @enum {number} | 78 * Time to wait for expected messages, in milliseconds. |
| 79 */ | 79 * @enum {number} |
| 80 var TimeoutMs = { | 80 */ |
| 81 SHORT: 200, | 81 var TimeoutMs = {SHORT: 200, NORMAL: 500, LONG: 2000}; |
| 82 NORMAL: 500, | 82 |
| 83 LONG: 2000 | 83 /** |
| 84 }; | 84 * The URL of the files used by the plugin. |
| 85 | 85 * @enum {string} |
| 86 /** | 86 */ |
| 87 * The URL of the files used by the plugin. | 87 var File = { |
| 88 * @enum {string} | 88 RECOGNIZER_CONFIG: 'hotword.data', |
| 89 */ | 89 }; |
| 90 var File = { | 90 |
| 91 RECOGNIZER_CONFIG: 'hotword.data', | 91 /** |
| 92 }; | 92 * Errors emitted by the NaClManager. |
| 93 | 93 * @enum {string} |
| 94 /** | 94 */ |
| 95 * Errors emitted by the NaClManager. | 95 var Error = { |
| 96 * @enum {string} | 96 NACL_CRASH: 'nacl_crash', |
| 97 */ | 97 TIMEOUT: 'timeout', |
| 98 var Error = { | 98 }; |
| 99 NACL_CRASH: 'nacl_crash', | 99 |
| 100 TIMEOUT: 'timeout', | 100 /** |
| 101 }; | 101 * Event types supported by NaClManager. |
| 102 | 102 * @enum {string} |
| 103 /** | 103 */ |
| 104 * Event types supported by NaClManager. | 104 var Event = { |
| 105 * @enum {string} | 105 READY: 'ready', |
| 106 */ | 106 TRIGGER: 'trigger', |
| 107 var Event = { | 107 SPEAKER_MODEL_SAVED: 'speaker model saved', |
| 108 READY: 'ready', | 108 ERROR: 'error', |
| 109 TRIGGER: 'trigger', | 109 TIMEOUT: 'timeout', |
| 110 SPEAKER_MODEL_SAVED: 'speaker model saved', | 110 }; |
| 111 ERROR: 'error', | 111 |
| 112 TIMEOUT: 'timeout', | 112 /** |
| 113 }; | 113 * Messages for communicating with the NaCl recognizer plugin. These must |
| 114 | 114 * match |
| 115 /** | 115 * constants in <google3>/hotword_plugin.c |
| 116 * Messages for communicating with the NaCl recognizer plugin. These must match | 116 * @enum {string} |
| 117 * constants in <google3>/hotword_plugin.c | 117 */ |
| 118 * @enum {string} | 118 var NaClPlugin = { |
| 119 */ | 119 RESTART: 'r', |
| 120 var NaClPlugin = { | 120 SAMPLE_RATE_PREFIX: 'h', |
| 121 RESTART: 'r', | 121 MODEL_PREFIX: 'm', |
| 122 SAMPLE_RATE_PREFIX: 'h', | 122 STOP: 's', |
| 123 MODEL_PREFIX: 'm', | 123 LOG: 'l', |
| 124 STOP: 's', | 124 DSP: 'd', |
| 125 LOG: 'l', | 125 BEGIN_SPEAKER_MODEL: 'b', |
| 126 DSP: 'd', | 126 ADAPT_SPEAKER_MODEL: 'a', |
| 127 BEGIN_SPEAKER_MODEL: 'b', | 127 FINISH_SPEAKER_MODEL: 'f', |
| 128 ADAPT_SPEAKER_MODEL: 'a', | 128 SPEAKER_MODEL_SAVED: 'sm_saved', |
| 129 FINISH_SPEAKER_MODEL: 'f', | 129 REQUEST_MODEL: 'model', |
| 130 SPEAKER_MODEL_SAVED: 'sm_saved', | 130 MODEL_LOADED: 'model_loaded', |
| 131 REQUEST_MODEL: 'model', | 131 READY_FOR_AUDIO: 'audio', |
| 132 MODEL_LOADED: 'model_loaded', | 132 STOPPED: 'stopped', |
| 133 READY_FOR_AUDIO: 'audio', | 133 HOTWORD_DETECTED: 'hotword', |
| 134 STOPPED: 'stopped', | 134 MS_CONFIGURED: 'ms_configured', |
| 135 HOTWORD_DETECTED: 'hotword', | 135 TIMEOUT: 'timeout' |
| 136 MS_CONFIGURED: 'ms_configured', | 136 }; |
| 137 TIMEOUT: 'timeout' | 137 |
| 138 }; | 138 /** |
| 139 | 139 * Messages sent from the injected scripts to the Google page. |
| 140 /** | 140 * @enum {string} |
| 141 * Messages sent from the injected scripts to the Google page. | 141 */ |
| 142 * @enum {string} | 142 var CommandToPage = { |
| 143 */ | 143 HOTWORD_VOICE_TRIGGER: 'vt', |
| 144 var CommandToPage = { | 144 HOTWORD_STARTED: 'hs', |
| 145 HOTWORD_VOICE_TRIGGER: 'vt', | 145 HOTWORD_ENDED: 'hd', |
| 146 HOTWORD_STARTED: 'hs', | 146 HOTWORD_TIMEOUT: 'ht', |
| 147 HOTWORD_ENDED: 'hd', | 147 HOTWORD_ERROR: 'he' |
| 148 HOTWORD_TIMEOUT: 'ht', | 148 }; |
| 149 HOTWORD_ERROR: 'he' | 149 |
| 150 }; | 150 /** |
| 151 | 151 * Messages sent from the Google page to the extension or to the |
| 152 /** | 152 * injected script and then passed to the extension. |
| 153 * Messages sent from the Google page to the extension or to the | 153 * @enum {string} |
| 154 * injected script and then passed to the extension. | 154 */ |
| 155 * @enum {string} | 155 var CommandFromPage = { |
| 156 */ | 156 SPEECH_START: 'ss', |
| 157 var CommandFromPage = { | 157 SPEECH_END: 'se', |
| 158 SPEECH_START: 'ss', | 158 SPEECH_RESET: 'sr', |
| 159 SPEECH_END: 'se', | 159 SHOWING_HOTWORD_START: 'shs', |
| 160 SPEECH_RESET: 'sr', | 160 SHOWING_ERROR_MESSAGE: 'sem', |
| 161 SHOWING_HOTWORD_START: 'shs', | 161 SHOWING_TIMEOUT_MESSAGE: 'stm', |
| 162 SHOWING_ERROR_MESSAGE: 'sem', | 162 CLICKED_RESUME: 'hcc', |
| 163 SHOWING_TIMEOUT_MESSAGE: 'stm', | 163 CLICKED_RESTART: 'hcr', |
| 164 CLICKED_RESUME: 'hcc', | 164 CLICKED_DEBUG: 'hcd', |
| 165 CLICKED_RESTART: 'hcr', | 165 WAKE_UP_HELPER: 'wuh', |
| 166 CLICKED_DEBUG: 'hcd', | 166 // Command specifically for the opt-in promo below this line. |
| 167 WAKE_UP_HELPER: 'wuh', | 167 // User has explicitly clicked 'no'. |
| 168 // Command specifically for the opt-in promo below this line. | 168 CLICKED_NO_OPTIN: 'hcno', |
| 169 // User has explicitly clicked 'no'. | 169 // User has opted in. |
| 170 CLICKED_NO_OPTIN: 'hcno', | 170 CLICKED_OPTIN: 'hco', |
| 171 // User has opted in. | 171 // User clicked on the microphone. |
| 172 CLICKED_OPTIN: 'hco', | 172 PAGE_WAKEUP: 'wu' |
| 173 // User clicked on the microphone. | 173 }; |
| 174 PAGE_WAKEUP: 'wu' | 174 |
| 175 }; | 175 /** |
| 176 | 176 * Source of a hotwording session request. |
| 177 /** | 177 * @enum {string} |
| 178 * Source of a hotwording session request. | 178 */ |
| 179 * @enum {string} | 179 var SessionSource = { |
| 180 */ | 180 LAUNCHER: 'launcher', |
| 181 var SessionSource = { | 181 NTP: 'ntp', |
| 182 LAUNCHER: 'launcher', | 182 ALWAYS: 'always', |
| 183 NTP: 'ntp', | 183 TRAINING: 'training' |
| 184 ALWAYS: 'always', | 184 }; |
| 185 TRAINING: 'training' | 185 |
| 186 }; | 186 /** |
| 187 | 187 * The mode to start the hotword recognizer in. |
| 188 /** | 188 * @enum {string} |
| 189 * The mode to start the hotword recognizer in. | 189 */ |
| 190 * @enum {string} | 190 var RecognizerStartMode = { |
| 191 */ | 191 NORMAL: 'normal', |
| 192 var RecognizerStartMode = { | 192 NEW_MODEL: 'new model', |
| 193 NORMAL: 'normal', | 193 ADAPT_MODEL: 'adapt model' |
| 194 NEW_MODEL: 'new model', | 194 }; |
| 195 ADAPT_MODEL: 'adapt model' | 195 |
| 196 }; | 196 /** |
| 197 | 197 * MediaStream open success/errors to be reported via UMA. |
| 198 /** | 198 * DO NOT remove or renumber values in this enum. Only add new ones. |
| 199 * MediaStream open success/errors to be reported via UMA. | 199 * @enum {number} |
| 200 * DO NOT remove or renumber values in this enum. Only add new ones. | 200 */ |
| 201 * @enum {number} | 201 var UmaMediaStreamOpenResult = { |
| 202 */ | 202 SUCCESS: 0, |
| 203 var UmaMediaStreamOpenResult = { | 203 UNKNOWN: 1, |
| 204 SUCCESS: 0, | 204 NOT_SUPPORTED: 2, |
| 205 UNKNOWN: 1, | 205 PERMISSION_DENIED: 3, |
| 206 NOT_SUPPORTED: 2, | 206 CONSTRAINT_NOT_SATISFIED: 4, |
| 207 PERMISSION_DENIED: 3, | 207 OVERCONSTRAINED: 5, |
| 208 CONSTRAINT_NOT_SATISFIED: 4, | 208 NOT_FOUND: 6, |
| 209 OVERCONSTRAINED: 5, | 209 ABORT: 7, |
| 210 NOT_FOUND: 6, | 210 SOURCE_UNAVAILABLE: 8, |
| 211 ABORT: 7, | 211 PERMISSION_DISMISSED: 9, |
| 212 SOURCE_UNAVAILABLE: 8, | 212 INVALID_STATE: 10, |
| 213 PERMISSION_DISMISSED: 9, | 213 DEVICES_NOT_FOUND: 11, |
| 214 INVALID_STATE: 10, | 214 INVALID_SECURITY_ORIGIN: 12, |
| 215 DEVICES_NOT_FOUND: 11, | 215 MAX: 12 |
| 216 INVALID_SECURITY_ORIGIN: 12, | 216 }; |
| 217 MAX: 12 | 217 |
| 218 }; | 218 /** |
| 219 | 219 * UMA metrics. |
| 220 /** | 220 * DO NOT change these enum values. |
| 221 * UMA metrics. | 221 * @enum {string} |
| 222 * DO NOT change these enum values. | 222 */ |
| 223 * @enum {string} | 223 var UmaMetrics = { |
| 224 */ | 224 TRIGGER: 'Hotword.HotwordTrigger', |
| 225 var UmaMetrics = { | 225 MEDIA_STREAM_RESULT: 'Hotword.HotwordMediaStreamResult', |
| 226 TRIGGER: 'Hotword.HotwordTrigger', | 226 NACL_PLUGIN_LOAD_RESULT: 'Hotword.HotwordNaClPluginLoadResult', |
| 227 MEDIA_STREAM_RESULT: 'Hotword.HotwordMediaStreamResult', | 227 NACL_MESSAGE_TIMEOUT: 'Hotword.HotwordNaClMessageTimeout', |
| 228 NACL_PLUGIN_LOAD_RESULT: 'Hotword.HotwordNaClPluginLoadResult', | 228 TRIGGER_SOURCE: 'Hotword.HotwordTriggerSource' |
| 229 NACL_MESSAGE_TIMEOUT: 'Hotword.HotwordNaClMessageTimeout', | 229 }; |
| 230 TRIGGER_SOURCE: 'Hotword.HotwordTriggerSource' | 230 |
| 231 }; | 231 /** |
| 232 | 232 * Message waited for by NaCl plugin, to be reported via UMA. |
| 233 /** | 233 * DO NOT remove or renumber values in this enum. Only add new ones. |
| 234 * Message waited for by NaCl plugin, to be reported via UMA. | 234 * @enum {number} |
| 235 * DO NOT remove or renumber values in this enum. Only add new ones. | 235 */ |
| 236 * @enum {number} | 236 var UmaNaClMessageTimeout = { |
| 237 */ | 237 REQUEST_MODEL: 0, |
| 238 var UmaNaClMessageTimeout = { | 238 MODEL_LOADED: 1, |
| 239 REQUEST_MODEL: 0, | 239 READY_FOR_AUDIO: 2, |
| 240 MODEL_LOADED: 1, | 240 STOPPED: 3, |
| 241 READY_FOR_AUDIO: 2, | 241 HOTWORD_DETECTED: 4, |
| 242 STOPPED: 3, | 242 MS_CONFIGURED: 5, |
| 243 HOTWORD_DETECTED: 4, | 243 MAX: 5 |
| 244 MS_CONFIGURED: 5, | 244 }; |
| 245 MAX: 5 | 245 |
| 246 }; | 246 /** |
| 247 | 247 * NaCl plugin load success/errors to be reported via UMA. |
| 248 /** | 248 * DO NOT remove or renumber values in this enum. Only add new ones. |
| 249 * NaCl plugin load success/errors to be reported via UMA. | 249 * @enum {number} |
| 250 * DO NOT remove or renumber values in this enum. Only add new ones. | 250 */ |
| 251 * @enum {number} | 251 var UmaNaClPluginLoadResult = |
| 252 */ | 252 {SUCCESS: 0, UNKNOWN: 1, CRASH: 2, NO_MODULE_FOUND: 3, MAX: 3}; |
| 253 var UmaNaClPluginLoadResult = { | 253 |
| 254 SUCCESS: 0, | 254 /** |
| 255 UNKNOWN: 1, | 255 * Source of hotword triggering, to be reported via UMA. |
| 256 CRASH: 2, | 256 * DO NOT remove or renumber values in this enum. Only add new ones. |
| 257 NO_MODULE_FOUND: 3, | 257 * @enum {number} |
| 258 MAX: 3 | 258 */ |
| 259 }; | 259 var UmaTriggerSource = |
| 260 | 260 {LAUNCHER: 0, NTP_GOOGLE_COM: 1, ALWAYS_ON: 2, TRAINING: 3, MAX: 3}; |
| 261 /** | 261 |
| 262 * Source of hotword triggering, to be reported via UMA. | 262 /** |
| 263 * DO NOT remove or renumber values in this enum. Only add new ones. | 263 * The browser UI language. |
| 264 * @enum {number} | 264 * @const {string} |
| 265 */ | 265 */ |
| 266 var UmaTriggerSource = { | 266 var UI_LANGUAGE = (chrome.i18n && chrome.i18n.getUILanguage) ? |
| 267 LAUNCHER: 0, | 267 chrome.i18n.getUILanguage() : |
| 268 NTP_GOOGLE_COM: 1, | 268 ''; |
| 269 ALWAYS_ON: 2, | 269 |
| 270 TRAINING: 3, | 270 return { |
| 271 MAX: 3 | 271 AUDIO_LOG_SECONDS: AUDIO_LOG_SECONDS, |
| 272 }; | 272 CLIENT_PORT_NAME: CLIENT_PORT_NAME, |
| 273 | 273 COMMAND_FIELD_NAME: COMMAND_FIELD_NAME, |
| 274 /** | 274 FILE_SYSTEM_SIZE_BYTES: FILE_SYSTEM_SIZE_BYTES, |
| 275 * The browser UI language. | 275 HOTWORD_STREAM_TIMEOUT_SECONDS: HOTWORD_STREAM_TIMEOUT_SECONDS, |
| 276 * @const {string} | 276 NUM_TRAINING_UTTERANCES: NUM_TRAINING_UTTERANCES, |
| 277 */ | 277 SHARED_MODULE_ID: SHARED_MODULE_ID, |
| 278 var UI_LANGUAGE = (chrome.i18n && chrome.i18n.getUILanguage) ? | 278 SHARED_MODULE_ROOT: SHARED_MODULE_ROOT, |
| 279 chrome.i18n.getUILanguage() : ''; | 279 SPEAKER_MODEL_FILE_NAME: SPEAKER_MODEL_FILE_NAME, |
| 280 | 280 UI_LANGUAGE: UI_LANGUAGE, |
| 281 return { | 281 UTTERANCE_FILE_EXTENSION: UTTERANCE_FILE_EXTENSION, |
| 282 AUDIO_LOG_SECONDS: AUDIO_LOG_SECONDS, | 282 UTTERANCE_FILE_PREFIX: UTTERANCE_FILE_PREFIX, |
| 283 CLIENT_PORT_NAME: CLIENT_PORT_NAME, | 283 CommandToPage: CommandToPage, |
| 284 COMMAND_FIELD_NAME: COMMAND_FIELD_NAME, | 284 CommandFromPage: CommandFromPage, |
| 285 FILE_SYSTEM_SIZE_BYTES: FILE_SYSTEM_SIZE_BYTES, | 285 Error: Error, |
| 286 HOTWORD_STREAM_TIMEOUT_SECONDS: HOTWORD_STREAM_TIMEOUT_SECONDS, | 286 Event: Event, |
| 287 NUM_TRAINING_UTTERANCES: NUM_TRAINING_UTTERANCES, | 287 File: File, |
| 288 SHARED_MODULE_ID: SHARED_MODULE_ID, | 288 NaClPlugin: NaClPlugin, |
| 289 SHARED_MODULE_ROOT: SHARED_MODULE_ROOT, | 289 RecognizerStartMode: RecognizerStartMode, |
| 290 SPEAKER_MODEL_FILE_NAME: SPEAKER_MODEL_FILE_NAME, | 290 SessionSource: SessionSource, |
| 291 UI_LANGUAGE: UI_LANGUAGE, | 291 TimeoutMs: TimeoutMs, |
| 292 UTTERANCE_FILE_EXTENSION: UTTERANCE_FILE_EXTENSION, | 292 UmaMediaStreamOpenResult: UmaMediaStreamOpenResult, |
| 293 UTTERANCE_FILE_PREFIX: UTTERANCE_FILE_PREFIX, | 293 UmaMetrics: UmaMetrics, |
| 294 CommandToPage: CommandToPage, | 294 UmaNaClMessageTimeout: UmaNaClMessageTimeout, |
| 295 CommandFromPage: CommandFromPage, | 295 UmaNaClPluginLoadResult: UmaNaClPluginLoadResult, |
| 296 Error: Error, | 296 UmaTriggerSource: UmaTriggerSource |
| 297 Event: Event, | 297 }; |
| 298 File: File, | |
| 299 NaClPlugin: NaClPlugin, | |
| 300 RecognizerStartMode: RecognizerStartMode, | |
| 301 SessionSource: SessionSource, | |
| 302 TimeoutMs: TimeoutMs, | |
| 303 UmaMediaStreamOpenResult: UmaMediaStreamOpenResult, | |
| 304 UmaMetrics: UmaMetrics, | |
| 305 UmaNaClMessageTimeout: UmaNaClMessageTimeout, | |
| 306 UmaNaClPluginLoadResult: UmaNaClPluginLoadResult, | |
| 307 UmaTriggerSource: UmaTriggerSource | |
| 308 }; | |
| 309 | 298 |
| 310 }); | 299 }); |
| OLD | NEW |