1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/accessibility_events.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/values.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_accessibility_api_constants.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace keys = extension_accessibility_api_constants;
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SendAccessibilityNotification(
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationType type, AccessibilityControlInfo* info) {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile *profile = info->profile();
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (profile->ShouldSendAccessibilityEvents()) {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        type,
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Source<Profile>(profile),
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Details<AccessibilityControlInfo>(info));
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityControlInfo::AccessibilityControlInfo(
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Profile* profile, const std::string& control_name)
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : profile_(profile), name_(control_name) {
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
32731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityControlInfo::~AccessibilityControlInfo() {
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccessibilityControlInfo::SerializeToDict(DictionaryValue *dict) const {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetString(keys::kNameKey, name_);
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  dict->SetString(keys::kTypeKey, type());
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityWindowInfo::AccessibilityWindowInfo(Profile* profile,
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                 const std::string& window_name)
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, window_name) {
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityWindowInfo::type() const {
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeWindow;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityButtonInfo::AccessibilityButtonInfo(Profile* profile,
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                 const std::string& button_name)
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, button_name) {
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityButtonInfo::type() const {
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeButton;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityLinkInfo::AccessibilityLinkInfo(Profile* profile,
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                             const std::string& link_name)
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : AccessibilityControlInfo(profile, link_name) { }
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityLinkInfo::type() const {
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeLink;
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
66731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityRadioButtonInfo::AccessibilityRadioButtonInfo(
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Profile* profile,
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const std::string& name,
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    bool checked,
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int item_index,
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int item_count)
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, name),
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      checked_(checked),
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item_index_(item_index),
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item_count_(item_count) {
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityRadioButtonInfo::type() const {
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeRadioButton;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccessibilityRadioButtonInfo::SerializeToDict(
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DictionaryValue *dict) const {
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AccessibilityControlInfo::SerializeToDict(dict);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetBoolean(keys::kCheckedKey, checked_);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemIndexKey, item_index_);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemCountKey, item_count_);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityCheckboxInfo::AccessibilityCheckboxInfo(Profile* profile,
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     const std::string& name,
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     bool checked)
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, name),
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      checked_(checked) {
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityCheckboxInfo::type() const {
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeCheckbox;
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccessibilityCheckboxInfo::SerializeToDict(DictionaryValue *dict) const {
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AccessibilityControlInfo::SerializeToDict(dict);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetBoolean(keys::kCheckedKey, checked_);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityTabInfo::AccessibilityTabInfo(Profile* profile,
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           const std::string& tab_name,
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           int tab_index,
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           int tab_count)
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, tab_name),
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      tab_index_(tab_index),
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      tab_count_(tab_count) {
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityTabInfo::type() const {
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeTab;
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccessibilityTabInfo::SerializeToDict(DictionaryValue *dict) const {
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AccessibilityControlInfo::SerializeToDict(dict);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemIndexKey, tab_index_);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemCountKey, tab_count_);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityComboBoxInfo::AccessibilityComboBoxInfo(Profile* profile,
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     const std::string& name,
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     const std::string& value,
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     int item_index,
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     int item_count)
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, name),
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      value_(value),
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item_index_(item_index),
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item_count_(item_count) {
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityComboBoxInfo::type() const {
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeComboBox;
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccessibilityComboBoxInfo::SerializeToDict(DictionaryValue *dict) const {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AccessibilityControlInfo::SerializeToDict(dict);
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetString(keys::kValueKey, value_);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemIndexKey, item_index_);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemCountKey, item_count_);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityTextBoxInfo::AccessibilityTextBoxInfo(Profile* profile,
148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                   const std::string& name,
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                   bool password)
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, name),
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      value_(""),
152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      password_(password),
153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      selection_start_(0),
154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      selection_end_(0) {
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityTextBoxInfo::type() const {
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeTextBox;
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccessibilityTextBoxInfo::SerializeToDict(DictionaryValue *dict) const {
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AccessibilityControlInfo::SerializeToDict(dict);
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetString(keys::kValueKey, value_);
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetBoolean(keys::kPasswordKey, password_);
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kSelectionStartKey, selection_start_);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kSelectionEndKey, selection_end_);
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityListBoxInfo::AccessibilityListBoxInfo(Profile* profile,
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                   const std::string& name,
171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                   const std::string& value,
172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                   int item_index,
173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                   int item_count)
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, name),
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      value_(value),
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item_index_(item_index),
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item_count_(item_count) {
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityListBoxInfo::type() const {
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeListBox;
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccessibilityListBoxInfo::SerializeToDict(DictionaryValue *dict) const {
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AccessibilityControlInfo::SerializeToDict(dict);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetString(keys::kValueKey, value_);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemIndexKey, item_index_);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemCountKey, item_count_);
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityMenuInfo::AccessibilityMenuInfo(Profile* profile,
192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                             const std::string& menu_name)
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, menu_name) {
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityMenuInfo::type() const {
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeMenu;
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
200731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAccessibilityMenuItemInfo::AccessibilityMenuItemInfo(Profile* profile,
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     const std::string& name,
202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     bool has_submenu,
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     int item_index,
204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     int item_count)
205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : AccessibilityControlInfo(profile, name),
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      has_submenu_(has_submenu),
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item_index_(item_index),
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      item_count_(item_count) {
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* AccessibilityMenuItemInfo::type() const {
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return keys::kTypeMenuItem;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccessibilityMenuItemInfo::SerializeToDict(DictionaryValue *dict) const {
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AccessibilityControlInfo::SerializeToDict(dict);
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetBoolean(keys::kHasSubmenuKey, has_submenu_);
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemIndexKey, item_index_);
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dict->SetInteger(keys::kItemCountKey, item_count_);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
221